@cleocode/lafs 2026.4.0 → 2026.4.4

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 (131) hide show
  1. package/README.md +97 -68
  2. package/dist/src/a2a/bindings/grpc.d.ts +117 -11
  3. package/dist/src/a2a/bindings/grpc.d.ts.map +1 -1
  4. package/dist/src/a2a/bindings/grpc.js +79 -8
  5. package/dist/src/a2a/bindings/grpc.js.map +1 -1
  6. package/dist/src/a2a/bindings/http.d.ts +129 -14
  7. package/dist/src/a2a/bindings/http.d.ts.map +1 -1
  8. package/dist/src/a2a/bindings/http.js +93 -12
  9. package/dist/src/a2a/bindings/http.js.map +1 -1
  10. package/dist/src/a2a/bindings/index.d.ts +80 -7
  11. package/dist/src/a2a/bindings/index.d.ts.map +1 -1
  12. package/dist/src/a2a/bindings/index.js +69 -2
  13. package/dist/src/a2a/bindings/index.js.map +1 -1
  14. package/dist/src/a2a/bindings/jsonrpc.d.ts +193 -9
  15. package/dist/src/a2a/bindings/jsonrpc.d.ts.map +1 -1
  16. package/dist/src/a2a/bindings/jsonrpc.js +152 -9
  17. package/dist/src/a2a/bindings/jsonrpc.js.map +1 -1
  18. package/dist/src/a2a/bridge.d.ts +232 -37
  19. package/dist/src/a2a/bridge.d.ts.map +1 -1
  20. package/dist/src/a2a/bridge.js +172 -24
  21. package/dist/src/a2a/bridge.js.map +1 -1
  22. package/dist/src/a2a/extensions.d.ts +221 -12
  23. package/dist/src/a2a/extensions.d.ts.map +1 -1
  24. package/dist/src/a2a/extensions.js +175 -11
  25. package/dist/src/a2a/extensions.js.map +1 -1
  26. package/dist/src/a2a/index.d.ts +2 -0
  27. package/dist/src/a2a/index.d.ts.map +1 -1
  28. package/dist/src/a2a/index.js +2 -0
  29. package/dist/src/a2a/index.js.map +1 -1
  30. package/dist/src/a2a/streaming.d.ts +274 -2
  31. package/dist/src/a2a/streaming.d.ts.map +1 -1
  32. package/dist/src/a2a/streaming.js +245 -2
  33. package/dist/src/a2a/streaming.js.map +1 -1
  34. package/dist/src/a2a/task-lifecycle.d.ts +339 -19
  35. package/dist/src/a2a/task-lifecycle.d.ts.map +1 -1
  36. package/dist/src/a2a/task-lifecycle.js +302 -19
  37. package/dist/src/a2a/task-lifecycle.js.map +1 -1
  38. package/dist/src/budgetEnforcement.d.ts +88 -14
  39. package/dist/src/budgetEnforcement.d.ts.map +1 -1
  40. package/dist/src/budgetEnforcement.js +132 -19
  41. package/dist/src/budgetEnforcement.js.map +1 -1
  42. package/dist/src/circuit-breaker/index.d.ts +254 -9
  43. package/dist/src/circuit-breaker/index.d.ts.map +1 -1
  44. package/dist/src/circuit-breaker/index.js +218 -9
  45. package/dist/src/circuit-breaker/index.js.map +1 -1
  46. package/dist/src/compliance.d.ts +176 -0
  47. package/dist/src/compliance.d.ts.map +1 -1
  48. package/dist/src/compliance.js +100 -0
  49. package/dist/src/compliance.js.map +1 -1
  50. package/dist/src/conformance.d.ts +52 -0
  51. package/dist/src/conformance.d.ts.map +1 -1
  52. package/dist/src/conformance.js +41 -0
  53. package/dist/src/conformance.js.map +1 -1
  54. package/dist/src/conformanceProfiles.d.ts +66 -0
  55. package/dist/src/conformanceProfiles.d.ts.map +1 -1
  56. package/dist/src/conformanceProfiles.js +51 -0
  57. package/dist/src/conformanceProfiles.js.map +1 -1
  58. package/dist/src/deprecationRegistry.d.ts +80 -0
  59. package/dist/src/deprecationRegistry.d.ts.map +1 -1
  60. package/dist/src/deprecationRegistry.js +50 -0
  61. package/dist/src/deprecationRegistry.js.map +1 -1
  62. package/dist/src/discovery.d.ts +344 -63
  63. package/dist/src/discovery.d.ts.map +1 -1
  64. package/dist/src/discovery.js +67 -13
  65. package/dist/src/discovery.js.map +1 -1
  66. package/dist/src/envelope.d.ts +252 -0
  67. package/dist/src/envelope.d.ts.map +1 -1
  68. package/dist/src/envelope.js +165 -0
  69. package/dist/src/envelope.js.map +1 -1
  70. package/dist/src/errorRegistry.d.ts +159 -0
  71. package/dist/src/errorRegistry.d.ts.map +1 -1
  72. package/dist/src/errorRegistry.js +115 -0
  73. package/dist/src/errorRegistry.js.map +1 -1
  74. package/dist/src/fieldExtraction.d.ts +125 -25
  75. package/dist/src/fieldExtraction.d.ts.map +1 -1
  76. package/dist/src/fieldExtraction.js +85 -16
  77. package/dist/src/fieldExtraction.js.map +1 -1
  78. package/dist/src/flagResolver.d.ts +75 -9
  79. package/dist/src/flagResolver.d.ts.map +1 -1
  80. package/dist/src/flagResolver.js +20 -4
  81. package/dist/src/flagResolver.js.map +1 -1
  82. package/dist/src/flagSemantics.d.ts +76 -1
  83. package/dist/src/flagSemantics.d.ts.map +1 -1
  84. package/dist/src/flagSemantics.js +66 -0
  85. package/dist/src/flagSemantics.js.map +1 -1
  86. package/dist/src/health/index.d.ts +87 -6
  87. package/dist/src/health/index.d.ts.map +1 -1
  88. package/dist/src/health/index.js +54 -6
  89. package/dist/src/health/index.js.map +1 -1
  90. package/dist/src/index.d.ts +12 -1
  91. package/dist/src/index.d.ts.map +1 -1
  92. package/dist/src/index.js +12 -1
  93. package/dist/src/index.js.map +1 -1
  94. package/dist/src/mviProjection.d.ts +42 -6
  95. package/dist/src/mviProjection.d.ts.map +1 -1
  96. package/dist/src/mviProjection.js +31 -5
  97. package/dist/src/mviProjection.js.map +1 -1
  98. package/dist/src/native-loader.d.ts +49 -0
  99. package/dist/src/native-loader.d.ts.map +1 -0
  100. package/dist/src/native-loader.js +56 -0
  101. package/dist/src/native-loader.js.map +1 -0
  102. package/dist/src/problemDetails.d.ts +70 -4
  103. package/dist/src/problemDetails.d.ts.map +1 -1
  104. package/dist/src/problemDetails.js +21 -3
  105. package/dist/src/problemDetails.js.map +1 -1
  106. package/dist/src/shutdown/index.d.ts +96 -7
  107. package/dist/src/shutdown/index.d.ts.map +1 -1
  108. package/dist/src/shutdown/index.js +72 -7
  109. package/dist/src/shutdown/index.js.map +1 -1
  110. package/dist/src/tokenEstimator.d.ts +97 -11
  111. package/dist/src/tokenEstimator.d.ts.map +1 -1
  112. package/dist/src/tokenEstimator.js +90 -11
  113. package/dist/src/tokenEstimator.js.map +1 -1
  114. package/dist/src/types.d.ts +467 -2
  115. package/dist/src/types.d.ts.map +1 -1
  116. package/dist/src/types.js +64 -0
  117. package/dist/src/types.js.map +1 -1
  118. package/dist/src/validateEnvelope.d.ts +59 -1
  119. package/dist/src/validateEnvelope.d.ts.map +1 -1
  120. package/dist/src/validateEnvelope.js +75 -9
  121. package/dist/src/validateEnvelope.js.map +1 -1
  122. package/dist/tsconfig.build.tsbuildinfo +1 -1
  123. package/lafs.md +3 -4
  124. package/package.json +6 -3
  125. package/dist/src/mcpAdapter.d.ts +0 -29
  126. package/dist/src/mcpAdapter.d.ts.map +0 -1
  127. package/dist/src/mcpAdapter.js +0 -286
  128. package/dist/src/mcpAdapter.js.map +0 -1
  129. package/schemas/v1/conformance-profiles.d.ts +0 -15
  130. package/schemas/v1/envelope.schema.d.ts +0 -14
  131. package/schemas/v1/error-registry.d.ts +0 -24
@@ -1,68 +1,168 @@
1
+ /**
2
+ * Field extraction resolution for LAFS envelopes.
3
+ *
4
+ * Implements section 9.2 of the LAFS spec: `--field` extracts a single value
5
+ * as plain text (no envelope), `--fields` filters the JSON envelope to a subset,
6
+ * and `--mvi` controls envelope verbosity.
7
+ *
8
+ * @remarks
9
+ * This module provides both resolution (flag parsing) and runtime extraction/filtering
10
+ * functions. The resolution layer is consumed by the unified resolver in `flagResolver.ts`.
11
+ *
12
+ * @since 1.5.0
13
+ */
1
14
  import type { LAFSEnvelope, MVILevel } from './types.js';
15
+ /**
16
+ * Input flags for the field extraction layer.
17
+ *
18
+ * @remarks
19
+ * Mutually exclusive: `fieldFlag` and `fieldsFlag` cannot both be set.
20
+ * Providing both causes an `E_FIELD_CONFLICT` error during resolution.
21
+ */
2
22
  export interface FieldExtractionInput {
3
- /** --field <name>: extract single field as plain text, no envelope */
23
+ /**
24
+ * `--field <name>`: extract a single field as plain text, discarding the envelope.
25
+ * @defaultValue undefined
26
+ */
4
27
  fieldFlag?: string;
5
- /** --fields <a,b,c>: filter result to these fields, preserve envelope */
28
+ /**
29
+ * `--fields <a,b,c>`: filter result to these fields while preserving the envelope.
30
+ * Accepts a comma-separated string or an array of field names.
31
+ * @defaultValue undefined
32
+ */
6
33
  fieldsFlag?: string | string[];
7
- /** --mvi <level>: envelope verbosity (client-requestable levels only) */
34
+ /**
35
+ * `--mvi <level>`: requested envelope verbosity level (client-requestable levels only).
36
+ * The `'custom'` level is server-set and not valid here.
37
+ * @defaultValue undefined
38
+ */
8
39
  mviFlag?: MVILevel | string;
9
40
  }
41
+ /**
42
+ * Resolved field extraction configuration.
43
+ *
44
+ * @remarks
45
+ * Produced by {@link resolveFieldExtraction}. Contains the parsed and validated
46
+ * field extraction settings ready for use by extraction and filtering functions.
47
+ */
10
48
  export interface FieldExtractionResolution {
11
- /** When set: extract this field as plain text, discard envelope. */
49
+ /**
50
+ * When set, extract this field as plain text, discarding the envelope.
51
+ * @defaultValue undefined
52
+ */
12
53
  field?: string;
13
- /** When set: filter result to these fields (envelope preserved). */
54
+ /**
55
+ * When set, filter the result to these fields (envelope is preserved).
56
+ * @defaultValue undefined
57
+ */
14
58
  fields?: string[];
15
- /** Resolved MVI level. Defaults to 'standard'. */
59
+ /** Resolved MVI level. Falls back to `'minimal'` when no valid flag is provided. */
16
60
  mvi: MVILevel;
17
- /** Which input determined the mvi value: 'flag' when mviFlag was valid, 'default' otherwise. */
61
+ /** Which input determined the mvi value: `'flag'` when mviFlag was valid, `'default'` otherwise. */
18
62
  mviSource: 'flag' | 'default';
19
63
  /**
20
- * True when _fields are requested, indicating the server SHOULD set
21
- * _meta.mvi = 'custom' in the response per §9.1.
64
+ * True when `fields` are requested, indicating the server SHOULD set
65
+ * `_meta.mvi = 'custom'` in the response per section 9.1.
22
66
  * Separate from the client-resolved mvi level.
23
67
  */
24
68
  expectsCustomMvi: boolean;
25
69
  }
70
+ /**
71
+ * Resolve field extraction flags into a validated configuration.
72
+ *
73
+ * @param input - The field extraction flag inputs
74
+ * @returns The resolved extraction configuration with mvi level and source
75
+ *
76
+ * @remarks
77
+ * Parses and validates the `--field`, `--fields`, and `--mvi` flags. Throws
78
+ * `E_FIELD_CONFLICT` if both `--field` and `--fields` are provided. The `'custom'`
79
+ * MVI level is server-set per section 9.1 and is rejected as a client-requested value;
80
+ * invalid or absent `--mvi` falls back to `'minimal'`.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const resolution = resolveFieldExtraction({ fieldsFlag: 'id,title' });
85
+ * // => { fields: ['id', 'title'], mvi: 'minimal', mviSource: 'default', expectsCustomMvi: true }
86
+ * ```
87
+ *
88
+ * @throws {@link LAFSFlagError} When both `fieldFlag` and `fieldsFlag` are set.
89
+ */
26
90
  export declare function resolveFieldExtraction(input: FieldExtractionInput): FieldExtractionResolution;
27
91
  /**
28
92
  * Extract a named field from a LAFS result object.
29
93
  *
94
+ * @param result - The envelope result value (object, array, or null)
95
+ * @param field - The field name to extract
96
+ * @returns The extracted value, or `undefined` if not found at any level
97
+ *
98
+ * @remarks
30
99
  * Handles four result shapes:
31
- * 1. Direct array: result[0][field] (list operations where result IS an array)
32
- * 2. Direct: result[field] (flat result object)
33
- * 3. Nested: result.<key>[field] (wrapper-entity, e.g. result.task.title)
34
- * 4. Array value: result.<key>[0][field] (wrapper-array, e.g. result.items[0].title)
100
+ * 1. Direct array: `result[0][field]` (list operations where result IS an array)
101
+ * 2. Direct: `result[field]` (flat result object)
102
+ * 3. Nested: `result.<key>[field]` (wrapper-entity, e.g. `result.task.title`)
103
+ * 4. Array value: `result.<key>[0][field]` (wrapper-array, e.g. `result.items[0].title`)
35
104
  *
36
105
  * Returns the value from the first match only. For array results (shapes 1
37
106
  * and 4), returns the first element's field value only. To extract from all
38
- * elements, iterate the array or use applyFieldFilter().
107
+ * elements, iterate the array or use {@link applyFieldFilter}.
39
108
  *
40
109
  * When multiple wrapper keys contain the requested field (shapes 3 and 4),
41
110
  * the first key in property insertion order wins.
42
111
  *
43
- * Returns undefined if not found at any level.
112
+ * @example
113
+ * ```ts
114
+ * const result = { task: { id: 'T1', title: 'Fix bug' } };
115
+ * extractFieldFromResult(result, 'title'); // => 'Fix bug'
116
+ * ```
44
117
  */
45
118
  export declare function extractFieldFromResult(result: LAFSEnvelope['result'], field: string): unknown;
46
- /** Convenience wrapper — extracts a field from an envelope's result. */
119
+ /**
120
+ * Extract a named field from an envelope's result.
121
+ *
122
+ * @param envelope - The LAFS envelope to extract from
123
+ * @param field - The field name to extract
124
+ * @returns The extracted value, or `undefined` if not found
125
+ *
126
+ * @remarks
127
+ * Convenience wrapper around {@link extractFieldFromResult} that accepts
128
+ * the full envelope and delegates to the result extraction logic.
129
+ *
130
+ * @example
131
+ * ```ts
132
+ * const value = extractFieldFromEnvelope(envelope, 'title');
133
+ * ```
134
+ */
47
135
  export declare function extractFieldFromEnvelope(envelope: LAFSEnvelope, field: string): unknown;
48
136
  /**
49
137
  * Filter result fields in a LAFS envelope to the requested subset.
50
138
  *
51
- * Handles the same four result shapes as extractFieldFromResult:
52
- * 1. Direct array: project each element
53
- * 2. Flat result: project top-level keys
54
- * 3. Wrapper-entity: project nested entity's keys, preserve wrapper
55
- * 4. Wrapper-array: project each element's keys, preserve wrapper
139
+ * @param envelope - The LAFS envelope whose result will be filtered
140
+ * @param fields - Array of field names to retain in the result
141
+ * @returns A new envelope with the filtered result and `_meta.mvi` set to `'custom'`
56
142
  *
57
- * Sets _meta.mvi = 'custom' per §9.1.
58
- * Returns a new envelope with a new _meta object. Result values are not
143
+ * @remarks
144
+ * Handles the same four result shapes as {@link extractFieldFromResult}:
145
+ * 1. Direct array: project each element
146
+ * 2. Flat result: project top-level keys
147
+ * 3. Wrapper-entity: project nested entity's keys, preserve wrapper
148
+ * 4. Wrapper-array: project each element's keys, preserve wrapper
149
+ *
150
+ * Sets `_meta.mvi = 'custom'` per section 9.1.
151
+ * Returns a new envelope with a new `_meta` object. Result values are not
59
152
  * deep-cloned; nested object references are shared with the original.
60
- * Unknown field names are silently omitted per §9.2.
153
+ * Unknown field names are silently omitted per section 9.2.
61
154
  *
62
155
  * When result is a wrapper (shapes 3/4) with multiple keys, each key is
63
156
  * projected independently. Primitive values at the wrapper level (numbers,
64
- * strings, booleans) are preserved as-is — _fields is applied to nested
157
+ * strings, booleans) are preserved as-is; field filtering is applied to nested
65
158
  * entity or array keys only, not to the wrapper's own primitive keys.
159
+ *
160
+ * @example
161
+ * ```ts
162
+ * const filtered = applyFieldFilter(envelope, ['id', 'title']);
163
+ * // filtered.result contains only 'id' and 'title' fields
164
+ * // filtered._meta.mvi === 'custom'
165
+ * ```
66
166
  */
67
167
  export declare function applyFieldFilter(envelope: LAFSEnvelope, fields: string[]): LAFSEnvelope;
68
168
  //# sourceMappingURL=fieldExtraction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fieldExtraction.d.ts","sourceRoot":"","sources":["../../src/fieldExtraction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,yEAAyE;IACzE,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kDAAkD;IAClD,GAAG,EAAE,QAAQ,CAAC;IACd,gGAAgG;IAChG,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,yBAAyB,CAmC7F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA4B7F;AAED,wEAAwE;AACxE,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAuCvF"}
1
+ {"version":3,"file":"fieldExtraction.d.ts","sourceRoot":"","sources":["../../src/fieldExtraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGzD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,oFAAoF;IACpF,GAAG,EAAE,QAAQ,CAAC;IACd,oGAAoG;IACpG,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,yBAAyB,CAmC7F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA4B7F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAuCvF"}
@@ -1,5 +1,38 @@
1
+ /**
2
+ * Field extraction resolution for LAFS envelopes.
3
+ *
4
+ * Implements section 9.2 of the LAFS spec: `--field` extracts a single value
5
+ * as plain text (no envelope), `--fields` filters the JSON envelope to a subset,
6
+ * and `--mvi` controls envelope verbosity.
7
+ *
8
+ * @remarks
9
+ * This module provides both resolution (flag parsing) and runtime extraction/filtering
10
+ * functions. The resolution layer is consumed by the unified resolver in `flagResolver.ts`.
11
+ *
12
+ * @since 1.5.0
13
+ */
1
14
  import { LAFSFlagError } from './flagSemantics.js';
2
15
  import { isMVILevel } from './types.js';
16
+ /**
17
+ * Resolve field extraction flags into a validated configuration.
18
+ *
19
+ * @param input - The field extraction flag inputs
20
+ * @returns The resolved extraction configuration with mvi level and source
21
+ *
22
+ * @remarks
23
+ * Parses and validates the `--field`, `--fields`, and `--mvi` flags. Throws
24
+ * `E_FIELD_CONFLICT` if both `--field` and `--fields` are provided. The `'custom'`
25
+ * MVI level is server-set per section 9.1 and is rejected as a client-requested value;
26
+ * invalid or absent `--mvi` falls back to `'minimal'`.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const resolution = resolveFieldExtraction({ fieldsFlag: 'id,title' });
31
+ * // => { fields: ['id', 'title'], mvi: 'minimal', mviSource: 'default', expectsCustomMvi: true }
32
+ * ```
33
+ *
34
+ * @throws {@link LAFSFlagError} When both `fieldFlag` and `fieldsFlag` are set.
35
+ */
3
36
  export function resolveFieldExtraction(input) {
4
37
  if (input.fieldFlag && input.fieldsFlag) {
5
38
  throw new LAFSFlagError('E_FIELD_CONFLICT', 'Cannot combine --field and --fields: --field extracts a single value ' +
@@ -30,20 +63,29 @@ export function resolveFieldExtraction(input) {
30
63
  /**
31
64
  * Extract a named field from a LAFS result object.
32
65
  *
66
+ * @param result - The envelope result value (object, array, or null)
67
+ * @param field - The field name to extract
68
+ * @returns The extracted value, or `undefined` if not found at any level
69
+ *
70
+ * @remarks
33
71
  * Handles four result shapes:
34
- * 1. Direct array: result[0][field] (list operations where result IS an array)
35
- * 2. Direct: result[field] (flat result object)
36
- * 3. Nested: result.<key>[field] (wrapper-entity, e.g. result.task.title)
37
- * 4. Array value: result.<key>[0][field] (wrapper-array, e.g. result.items[0].title)
72
+ * 1. Direct array: `result[0][field]` (list operations where result IS an array)
73
+ * 2. Direct: `result[field]` (flat result object)
74
+ * 3. Nested: `result.<key>[field]` (wrapper-entity, e.g. `result.task.title`)
75
+ * 4. Array value: `result.<key>[0][field]` (wrapper-array, e.g. `result.items[0].title`)
38
76
  *
39
77
  * Returns the value from the first match only. For array results (shapes 1
40
78
  * and 4), returns the first element's field value only. To extract from all
41
- * elements, iterate the array or use applyFieldFilter().
79
+ * elements, iterate the array or use {@link applyFieldFilter}.
42
80
  *
43
81
  * When multiple wrapper keys contain the requested field (shapes 3 and 4),
44
82
  * the first key in property insertion order wins.
45
83
  *
46
- * Returns undefined if not found at any level.
84
+ * @example
85
+ * ```ts
86
+ * const result = { task: { id: 'T1', title: 'Fix bug' } };
87
+ * extractFieldFromResult(result, 'title'); // => 'Fix bug'
88
+ * ```
47
89
  */
48
90
  export function extractFieldFromResult(result, field) {
49
91
  if (result === null || typeof result !== 'object')
@@ -76,28 +118,55 @@ export function extractFieldFromResult(result, field) {
76
118
  }
77
119
  return undefined;
78
120
  }
79
- /** Convenience wrapper — extracts a field from an envelope's result. */
121
+ /**
122
+ * Extract a named field from an envelope's result.
123
+ *
124
+ * @param envelope - The LAFS envelope to extract from
125
+ * @param field - The field name to extract
126
+ * @returns The extracted value, or `undefined` if not found
127
+ *
128
+ * @remarks
129
+ * Convenience wrapper around {@link extractFieldFromResult} that accepts
130
+ * the full envelope and delegates to the result extraction logic.
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * const value = extractFieldFromEnvelope(envelope, 'title');
135
+ * ```
136
+ */
80
137
  export function extractFieldFromEnvelope(envelope, field) {
81
138
  return extractFieldFromResult(envelope.result, field);
82
139
  }
83
140
  /**
84
141
  * Filter result fields in a LAFS envelope to the requested subset.
85
142
  *
86
- * Handles the same four result shapes as extractFieldFromResult:
87
- * 1. Direct array: project each element
88
- * 2. Flat result: project top-level keys
89
- * 3. Wrapper-entity: project nested entity's keys, preserve wrapper
90
- * 4. Wrapper-array: project each element's keys, preserve wrapper
143
+ * @param envelope - The LAFS envelope whose result will be filtered
144
+ * @param fields - Array of field names to retain in the result
145
+ * @returns A new envelope with the filtered result and `_meta.mvi` set to `'custom'`
91
146
  *
92
- * Sets _meta.mvi = 'custom' per §9.1.
93
- * Returns a new envelope with a new _meta object. Result values are not
147
+ * @remarks
148
+ * Handles the same four result shapes as {@link extractFieldFromResult}:
149
+ * 1. Direct array: project each element
150
+ * 2. Flat result: project top-level keys
151
+ * 3. Wrapper-entity: project nested entity's keys, preserve wrapper
152
+ * 4. Wrapper-array: project each element's keys, preserve wrapper
153
+ *
154
+ * Sets `_meta.mvi = 'custom'` per section 9.1.
155
+ * Returns a new envelope with a new `_meta` object. Result values are not
94
156
  * deep-cloned; nested object references are shared with the original.
95
- * Unknown field names are silently omitted per §9.2.
157
+ * Unknown field names are silently omitted per section 9.2.
96
158
  *
97
159
  * When result is a wrapper (shapes 3/4) with multiple keys, each key is
98
160
  * projected independently. Primitive values at the wrapper level (numbers,
99
- * strings, booleans) are preserved as-is — _fields is applied to nested
161
+ * strings, booleans) are preserved as-is; field filtering is applied to nested
100
162
  * entity or array keys only, not to the wrapper's own primitive keys.
163
+ *
164
+ * @example
165
+ * ```ts
166
+ * const filtered = applyFieldFilter(envelope, ['id', 'title']);
167
+ * // filtered.result contains only 'id' and 'title' fields
168
+ * // filtered._meta.mvi === 'custom'
169
+ * ```
101
170
  */
102
171
  export function applyFieldFilter(envelope, fields) {
103
172
  if (fields.length === 0 || envelope.result === null)
@@ -1 +1 @@
1
- {"version":3,"file":"fieldExtraction.js","sourceRoot":"","sources":["../../src/fieldExtraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fieldExtraction.js","sourceRoot":"","sources":["../../src/fieldExtraction.ts"],"names":[],"mappings":"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"}
@@ -8,40 +8,106 @@
8
8
  */
9
9
  import { type FieldExtractionResolution } from './fieldExtraction.js';
10
10
  import { type FlagResolution } from './flagSemantics.js';
11
- /** Combined input for both format and field extraction layers. */
11
+ /**
12
+ * Combined input for both format and field extraction layers.
13
+ *
14
+ * @remarks
15
+ * Merges the format-layer flags (sections 5.1-5.3) with the field extraction
16
+ * flags (section 9.2) into a single input object for {@link resolveFlags}.
17
+ */
12
18
  export interface UnifiedFlagInput {
19
+ /**
20
+ * Request human-readable output (`--human` flag).
21
+ * @defaultValue undefined
22
+ */
13
23
  human?: boolean;
24
+ /**
25
+ * Request JSON output (`--json` flag).
26
+ * @defaultValue undefined
27
+ */
14
28
  json?: boolean;
29
+ /**
30
+ * Suppress non-essential output for scripting (`--quiet` flag).
31
+ * @defaultValue undefined
32
+ */
15
33
  quiet?: boolean;
34
+ /**
35
+ * Explicit format override, taking highest precedence in the format layer.
36
+ * @defaultValue undefined
37
+ */
16
38
  requestedFormat?: 'json' | 'human';
39
+ /**
40
+ * Project-level default format from configuration.
41
+ * @defaultValue undefined
42
+ */
17
43
  projectDefault?: 'json' | 'human';
44
+ /**
45
+ * User-level default format from configuration.
46
+ * @defaultValue undefined
47
+ */
18
48
  userDefault?: 'json' | 'human';
19
49
  /**
20
50
  * TTY detection hint. When true, defaults to human format if no
21
51
  * explicit format flag or project/user default is set.
22
52
  * CLI tools should pass `process.stdout.isTTY ?? false`.
53
+ * @defaultValue undefined
23
54
  */
24
55
  tty?: boolean;
56
+ /**
57
+ * Extract a single field as plain text, discarding the envelope (`--field` flag).
58
+ * @defaultValue undefined
59
+ */
25
60
  field?: string;
61
+ /**
62
+ * Filter result to these fields while preserving the envelope (`--fields` flag).
63
+ * Accepts a comma-separated string or an array of field names.
64
+ * @defaultValue undefined
65
+ */
26
66
  fields?: string | string[];
67
+ /**
68
+ * Requested MVI verbosity level (`--mvi` flag).
69
+ * @defaultValue undefined
70
+ */
27
71
  mvi?: string;
28
72
  }
29
- /** Combined resolution result with cross-layer warnings. */
73
+ /**
74
+ * Combined resolution result with cross-layer warnings.
75
+ *
76
+ * @remarks
77
+ * Contains the independently resolved format and field extraction layers plus
78
+ * any cross-layer interaction warnings produced during validation (section 5.4).
79
+ */
30
80
  export interface UnifiedFlagResolution {
31
- /** Resolved format layer. */
81
+ /** Resolved format layer from the format precedence chain. */
32
82
  format: FlagResolution;
33
- /** Resolved field extraction layer. */
83
+ /** Resolved field extraction layer from field/fields/mvi flags. */
34
84
  fields: FieldExtractionResolution;
35
- /** Warnings for cross-layer interactions (non-fatal). */
85
+ /** Warnings for cross-layer interactions (non-fatal, informational only). */
36
86
  warnings: string[];
37
87
  }
38
88
  /**
39
89
  * Resolve all flags across both layers and validate cross-layer semantics.
40
90
  *
41
- * Per §5.4, cross-layer combinations are valid but MAY produce warnings.
42
- * Format-layer conflicts (E_FORMAT_CONFLICT) and field-layer conflicts
43
- * (E_FIELD_CONFLICT) still throw as before — they are delegated to the
44
- * existing single-layer resolvers.
91
+ * @param input - Combined format and field extraction flags
92
+ * @returns The unified resolution containing format, fields, and any cross-layer warnings
93
+ *
94
+ * @remarks
95
+ * Delegates to {@link resolveOutputFormat} for the format layer and
96
+ * {@link resolveFieldExtraction} for the field extraction layer, then performs
97
+ * cross-layer validation per section 5.4. Cross-layer combinations are valid but
98
+ * MAY produce informational warnings. Format-layer conflicts (`E_FORMAT_CONFLICT`)
99
+ * and field-layer conflicts (`E_FIELD_CONFLICT`) still throw as before; they are
100
+ * delegated to the existing single-layer resolvers.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * const result = resolveFlags({ human: true, field: 'title' });
105
+ * // result.format => { format: 'human', source: 'flag', quiet: false }
106
+ * // result.fields => { field: 'title', mvi: 'minimal', ... }
107
+ * // result.warnings => ['Cross-layer: --human + --field "title". ...']
108
+ * ```
109
+ *
110
+ * @throws {@link LAFSFlagError} When format or field layer flags conflict.
45
111
  */
46
112
  export declare function resolveFlags(input: UnifiedFlagInput): UnifiedFlagResolution;
47
113
  //# sourceMappingURL=flagResolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flagResolver.d.ts","sourceRoot":"","sources":["../../src/flagResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,yBAAyB,EAA0B,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,oBAAoB,CAAC;AAG9E,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAE/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B;;;;OAIG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,4DAA4D;AAC5D,MAAM,WAAW,qBAAqB;IACpC,6BAA6B;IAC7B,MAAM,EAAE,cAAc,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,yBAAyB,CAAC;IAClC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,qBAAqB,CAqC3E"}
1
+ {"version":3,"file":"flagResolver.d.ts","sourceRoot":"","sources":["../../src/flagResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,KAAK,yBAAyB,EAA0B,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,KAAK,cAAc,EAAuB,MAAM,oBAAoB,CAAC;AAG9E;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,MAAM,EAAE,cAAc,CAAC;IACvB,mEAAmE;IACnE,MAAM,EAAE,yBAAyB,CAAC;IAClC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,qBAAqB,CAqC3E"}
@@ -11,10 +11,26 @@ import { resolveOutputFormat } from './flagSemantics.js';
11
11
  /**
12
12
  * Resolve all flags across both layers and validate cross-layer semantics.
13
13
  *
14
- * Per §5.4, cross-layer combinations are valid but MAY produce warnings.
15
- * Format-layer conflicts (E_FORMAT_CONFLICT) and field-layer conflicts
16
- * (E_FIELD_CONFLICT) still throw as before — they are delegated to the
17
- * existing single-layer resolvers.
14
+ * @param input - Combined format and field extraction flags
15
+ * @returns The unified resolution containing format, fields, and any cross-layer warnings
16
+ *
17
+ * @remarks
18
+ * Delegates to {@link resolveOutputFormat} for the format layer and
19
+ * {@link resolveFieldExtraction} for the field extraction layer, then performs
20
+ * cross-layer validation per section 5.4. Cross-layer combinations are valid but
21
+ * MAY produce informational warnings. Format-layer conflicts (`E_FORMAT_CONFLICT`)
22
+ * and field-layer conflicts (`E_FIELD_CONFLICT`) still throw as before; they are
23
+ * delegated to the existing single-layer resolvers.
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * const result = resolveFlags({ human: true, field: 'title' });
28
+ * // result.format => { format: 'human', source: 'flag', quiet: false }
29
+ * // result.fields => { field: 'title', mvi: 'minimal', ... }
30
+ * // result.warnings => ['Cross-layer: --human + --field "title". ...']
31
+ * ```
32
+ *
33
+ * @throws {@link LAFSFlagError} When format or field layer flags conflict.
18
34
  */
19
35
  export function resolveFlags(input) {
20
36
  const formatInput = {
@@ -1 +1 @@
1
- {"version":3,"file":"flagResolver.js","sourceRoot":"","sources":["../../src/flagResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAkC,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAuB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAkC9E;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,KAAuB;IAClD,MAAM,WAAW,GAAc;QAC7B,SAAS,EAAE,KAAK,CAAC,KAAK;QACtB,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;IACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEhD,MAAM,UAAU,GAAyB;QACvC,SAAS,EAAE,KAAK,CAAC,KAAK;QACtB,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,OAAO,EAAE,KAAK,CAAC,GAAG;KACnB,CAAC;IACF,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAElD,gCAAgC;IAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CACX,mCAAmC,MAAM,CAAC,KAAK,KAAK;YAClD,gEAAgE,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,QAAQ,CAAC,IAAI,CACX,oCAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAC/D,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"flagResolver.js","sourceRoot":"","sources":["../../src/flagResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAkC,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAuB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAkF9E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,YAAY,CAAC,KAAuB;IAClD,MAAM,WAAW,GAAc;QAC7B,SAAS,EAAE,KAAK,CAAC,KAAK;QACtB,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC;IACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEhD,MAAM,UAAU,GAAyB;QACvC,SAAS,EAAE,KAAK,CAAC,KAAK;QACtB,UAAU,EAAE,KAAK,CAAC,MAAM;QACxB,OAAO,EAAE,KAAK,CAAC,GAAG;KACnB,CAAC;IACF,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAElD,gCAAgC;IAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CACX,mCAAmC,MAAM,CAAC,KAAK,KAAK;YAClD,gEAAgE,CACnE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,QAAQ,CAAC,IAAI,CACX,oCAAoC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAC/D,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC"}
@@ -1,17 +1,92 @@
1
+ /**
2
+ * Flag semantics for LAFS output format resolution.
3
+ *
4
+ * Implements the precedence chain defined in LAFS spec sections 5.1-5.3:
5
+ * explicit flag > project config > user config > TTY detection > default (json).
6
+ *
7
+ * @remarks
8
+ * This module is the single-layer resolver for format flags. For cross-layer
9
+ * resolution that also includes field extraction, use {@link resolveFlags} from
10
+ * `flagResolver.ts`.
11
+ *
12
+ * @since 1.0.0
13
+ */
1
14
  import type { FlagInput, LAFSError, LAFSErrorCategory } from './types.js';
15
+ /**
16
+ * Result of resolving output format flags.
17
+ *
18
+ * @remarks
19
+ * Captures both the resolved format and which configuration layer determined it,
20
+ * enabling diagnostics and cross-layer validation in the unified resolver.
21
+ */
2
22
  export interface FlagResolution {
23
+ /** The resolved output format: `'json'` for machine-readable or `'human'` for human-readable. */
3
24
  format: 'json' | 'human';
25
+ /** Which configuration layer determined the format value. */
4
26
  source: 'flag' | 'project' | 'user' | 'default';
5
- /** When true, suppress non-essential output for scripting */
27
+ /** When true, suppress non-essential output for scripting. */
6
28
  quiet: boolean;
7
29
  }
30
+ /**
31
+ * Error thrown when LAFS flag validation fails.
32
+ *
33
+ * @remarks
34
+ * Wraps a registered LAFS error code with category and retryability information
35
+ * looked up from the error registry. The most common error is `E_FORMAT_CONFLICT`
36
+ * when `--human` and `--json` are used together.
37
+ */
8
38
  export declare class LAFSFlagError extends Error implements LAFSError {
39
+ /** The LAFS error code (e.g. `'E_FORMAT_CONFLICT'`). */
9
40
  code: string;
41
+ /** The error category resolved from the error registry. */
10
42
  category: LAFSErrorCategory;
43
+ /** Whether the operation that produced this error can be retried. */
11
44
  retryable: boolean;
45
+ /** Milliseconds to wait before retrying, or `null` if not applicable. */
12
46
  retryAfterMs: number | null;
47
+ /** Additional structured details about the error. */
13
48
  details: Record<string, unknown>;
49
+ /**
50
+ * Create a new LAFSFlagError.
51
+ *
52
+ * @param code - A registered LAFS error code (e.g. `'E_FORMAT_CONFLICT'`)
53
+ * @param message - Human-readable description of the error
54
+ * @param details - Optional structured details to attach to the error
55
+ *
56
+ * @remarks
57
+ * Looks up the error code in the LAFS error registry to populate
58
+ * `category` and `retryable`. Falls back to `'CONTRACT'` category
59
+ * and non-retryable if the code is not found.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * throw new LAFSFlagError(
64
+ * 'E_FORMAT_CONFLICT',
65
+ * 'Cannot combine --human and --json.',
66
+ * );
67
+ * ```
68
+ */
14
69
  constructor(code: string, message: string, details?: Record<string, unknown>);
15
70
  }
71
+ /**
72
+ * Resolve the output format from flag inputs using the LAFS precedence chain.
73
+ *
74
+ * @param input - The flag inputs including explicit flags, project/user defaults, and TTY state
75
+ * @returns The resolved format, its source layer, and quiet mode status
76
+ *
77
+ * @remarks
78
+ * Precedence (highest to lowest): explicit `requestedFormat` > `--human`/`--json` flag >
79
+ * project default > user default > TTY detection > protocol default (`'json'`).
80
+ * Throws `LAFSFlagError` with code `E_FORMAT_CONFLICT` if both `--human` and `--json`
81
+ * are set simultaneously.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * const resolution = resolveOutputFormat({ humanFlag: true });
86
+ * // => { format: 'human', source: 'flag', quiet: false }
87
+ * ```
88
+ *
89
+ * @throws {@link LAFSFlagError} When `humanFlag` and `jsonFlag` are both truthy.
90
+ */
16
91
  export declare function resolveOutputFormat(input: FlagInput): FlagResolution;
17
92
  //# sourceMappingURL=flagSemantics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flagSemantics.d.ts","sourceRoot":"","sources":["../../src/flagSemantics.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,6DAA6D;IAC7D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,aAAc,SAAQ,KAAM,YAAW,SAAS;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAErB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAUjF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CA+BpE"}
1
+ {"version":3,"file":"flagSemantics.d.ts","sourceRoot":"","sources":["../../src/flagSemantics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,6DAA6D;IAC7D,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAChD,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,qBAAa,aAAc,SAAQ,KAAM,YAAW,SAAS;IAC3D,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC;;;;;;;;;;;;;;;;;;;OAmBG;gBACS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAUjF;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CA+BpE"}