@ifc-lite/cli 0.38.2 → 0.40.0

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 (87) hide show
  1. package/README.md +25 -0
  2. package/dist/commands/delivery-checks.d.ts +4 -1
  3. package/dist/commands/delivery-checks.d.ts.map +1 -1
  4. package/dist/commands/delivery-checks.js +18 -5
  5. package/dist/commands/delivery-checks.js.map +1 -1
  6. package/dist/commands/flow-ai.d.ts +20 -0
  7. package/dist/commands/flow-ai.d.ts.map +1 -0
  8. package/dist/commands/flow-ai.js +35 -0
  9. package/dist/commands/flow-ai.js.map +1 -0
  10. package/dist/commands/flow-bcf.d.ts +3 -0
  11. package/dist/commands/flow-bcf.d.ts.map +1 -0
  12. package/dist/commands/flow-bcf.js +87 -0
  13. package/dist/commands/flow-bcf.js.map +1 -0
  14. package/dist/commands/flow-host.d.ts +5 -1
  15. package/dist/commands/flow-host.d.ts.map +1 -1
  16. package/dist/commands/flow-host.js +9 -1
  17. package/dist/commands/flow-host.js.map +1 -1
  18. package/dist/commands/flow-review.d.ts +28 -0
  19. package/dist/commands/flow-review.d.ts.map +1 -0
  20. package/dist/commands/flow-review.js +154 -0
  21. package/dist/commands/flow-review.js.map +1 -0
  22. package/dist/commands/flow-tracking.d.ts +4 -0
  23. package/dist/commands/flow-tracking.d.ts.map +1 -1
  24. package/dist/commands/flow-tracking.js +25 -4
  25. package/dist/commands/flow-tracking.js.map +1 -1
  26. package/dist/commands/flow.d.ts.map +1 -1
  27. package/dist/commands/flow.js +129 -27
  28. package/dist/commands/flow.js.map +1 -1
  29. package/dist/commands/ids-audit-lint.d.ts +3 -0
  30. package/dist/commands/ids-audit-lint.d.ts.map +1 -0
  31. package/dist/commands/ids-audit-lint.js +129 -0
  32. package/dist/commands/ids-audit-lint.js.map +1 -0
  33. package/dist/commands/ids-diff.d.ts +2 -0
  34. package/dist/commands/ids-diff.d.ts.map +1 -0
  35. package/dist/commands/ids-diff.js +61 -0
  36. package/dist/commands/ids-diff.js.map +1 -0
  37. package/dist/commands/ids-explain.d.ts +2 -0
  38. package/dist/commands/ids-explain.d.ts.map +1 -0
  39. package/dist/commands/ids-explain.js +53 -0
  40. package/dist/commands/ids-explain.js.map +1 -0
  41. package/dist/commands/ids-fmt.d.ts +2 -0
  42. package/dist/commands/ids-fmt.d.ts.map +1 -0
  43. package/dist/commands/ids-fmt.js +54 -0
  44. package/dist/commands/ids-fmt.js.map +1 -0
  45. package/dist/commands/ids-subcommand.d.ts +31 -0
  46. package/dist/commands/ids-subcommand.d.ts.map +1 -0
  47. package/dist/commands/ids-subcommand.js +101 -0
  48. package/dist/commands/ids-subcommand.js.map +1 -0
  49. package/dist/commands/ids.d.ts.map +1 -1
  50. package/dist/commands/ids.js +25 -2
  51. package/dist/commands/ids.js.map +1 -1
  52. package/dist/commands/info.js +11 -11
  53. package/dist/commands/info.js.map +1 -1
  54. package/dist/commands/semantic-file.d.ts +2 -0
  55. package/dist/commands/semantic-file.d.ts.map +1 -0
  56. package/dist/commands/semantic-file.js +24 -0
  57. package/dist/commands/semantic-file.js.map +1 -0
  58. package/dist/commands/semantic-serve.d.ts +2 -0
  59. package/dist/commands/semantic-serve.d.ts.map +1 -0
  60. package/dist/commands/semantic-serve.js +48 -0
  61. package/dist/commands/semantic-serve.js.map +1 -0
  62. package/dist/commands/semantic.d.ts +3 -0
  63. package/dist/commands/semantic.d.ts.map +1 -0
  64. package/dist/commands/semantic.js +130 -0
  65. package/dist/commands/semantic.js.map +1 -0
  66. package/dist/geometry-report.d.ts.map +1 -1
  67. package/dist/geometry-report.js +2 -1
  68. package/dist/geometry-report.js.map +1 -1
  69. package/dist/headless-backend-store-authoring.d.ts +4 -4
  70. package/dist/headless-backend-store-authoring.d.ts.map +1 -1
  71. package/dist/headless-backend-store-authoring.js +7 -5
  72. package/dist/headless-backend-store-authoring.js.map +1 -1
  73. package/dist/headless-backend.d.ts.map +1 -1
  74. package/dist/headless-backend.js +1 -57
  75. package/dist/headless-backend.js.map +1 -1
  76. package/dist/help.d.ts.map +1 -1
  77. package/dist/help.js +14 -2
  78. package/dist/help.js.map +1 -1
  79. package/dist/index.js +4 -0
  80. package/dist/index.js.map +1 -1
  81. package/dist/out-flag-commands.js +1 -1
  82. package/dist/out-flag-commands.js.map +1 -1
  83. package/dist/output.d.ts +11 -0
  84. package/dist/output.d.ts.map +1 -1
  85. package/dist/output.js +13 -0
  86. package/dist/output.js.map +1 -1
  87. package/package.json +26 -22
package/README.md CHANGED
@@ -92,6 +92,29 @@ v0 ops mirror `bim.mutate`'s method names exactly: `setProperty`, `setAttribute`
92
92
 
93
93
  Determinism: the same model plus the same op sequence yields byte-identical reward lines (sorted arrays, no timestamps, fixed-precision floats).
94
94
 
95
+ ## Durable Flow BCF writes
96
+
97
+ Flow BCF API creates persist a credential-free intent before sending in
98
+ `IFCLITE_BCF_OUTBOX_DIR` (default `~/.ifc-lite/bcf-outbox`). Preserve
99
+ this directory across restarts. Unknown outcomes block identical writes until review:
100
+
101
+ ```bash
102
+ ifc-lite flow bcf list
103
+ ifc-lite flow bcf check <entryId> --allow-host bcf.example.com --token-env BCF_TOKEN
104
+ # Only if this read sees the full collection in the original write access scope:
105
+ ifc-lite flow bcf check <entryId> --allow-host bcf.example.com --token-env BCF_TOKEN --confirm-full-read-access
106
+ ifc-lite flow bcf reconcile <entryId> --guid <checkedGuid>
107
+ # Only after a complete empty check with explicitly confirmed full read visibility:
108
+ ifc-lite flow bcf confirm-absent <entryId>
109
+ ```
110
+
111
+ Check reads the recorded target using a fresh explicit host grant and an environment
112
+ variable reference for the token. Review the actual server object before reconciling a
113
+ checked candidate. Reconciliation records its GUID durably and never sends a write.
114
+ Only an explicitly full-visibility complete empty check permits `confirm-absent`, which releases the
115
+ intent for a later deliberate rerun and sends nothing itself. Unavailable or ambiguous
116
+ checks do not permit release. Token presence is not proof of visibility: `--confirm-full-read-access` asserts that this authorized read sees the full target collection under the same access scope as the original write. Omit `--token-env` for a genuinely public server; the visibility assertion remains required for absence. The journal retains this proof marker, without storing credential or principal identity. Older markerless absent checks stay readable but require a fresh asserted check before release. Storage errors and secret-bearing payloads refuse the effect.
117
+
95
118
  ## Links
96
119
 
97
120
  - Docs: https://ifclite.dev/docs/
@@ -100,3 +123,5 @@ Determinism: the same model plus the same op sequence yields byte-identical rewa
100
123
  ## License
101
124
 
102
125
  MPL-2.0
126
+
127
+ Semantic datasets use the same shared profile and provider engine as the viewer. Run `ifc-lite semantic --help` for `validate`, `query`, `assets`, and authenticated HTTPS `serve`; see the [headless semantic guide](https://ifclite.dev/docs/guide/semantic-headless/).
@@ -45,6 +45,7 @@ export interface IdsCheckResult {
45
45
  passedSpecifications?: number;
46
46
  failedSpecifications?: number;
47
47
  notApplicableSpecifications?: number;
48
+ erroredSpecifications?: number;
48
49
  totalEntities?: number;
49
50
  passedEntities?: number;
50
51
  failedEntities?: number;
@@ -61,7 +62,9 @@ export interface IdsCheckResult {
61
62
  * pass nor fail (`notApplicableSpecifications`) — if EVERY specification
62
63
  * lands there (nothing was definitively satisfied OR violated), the check
63
64
  * reports `error` rather than a `pass` that would rest on zero actual
64
- * evidence.
65
+ * evidence. A specification the validator could not evaluate (its `error`
66
+ * set) makes the check `error` too, as an unevaluable rule does in
67
+ * `runRulesCheck`, with the validator's reasons.
65
68
  */
66
69
  export declare function runIdsCheck(modelPath: string, store: IfcDataStore, idsPath: string): Promise<IdsCheckResult>;
67
70
  export { runRulesCheck, type RulesCheckResult } from './delivery-checks-rules.js';
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-checks.d.ts","sourceRoot":"","sources":["../../src/commands/delivery-checks.ts"],"names":[],"mappings":"AAiCA,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIlF,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+FAA+F;AAC/F,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,cAAc,CAAC,CA0C9F;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sHAAsH;AACtH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,qBAAqB,CAchG;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+GD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA6ClH;AAMD,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"delivery-checks.d.ts","sourceRoot":"","sources":["../../src/commands/delivery-checks.ts"],"names":[],"mappings":"AAiCA,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIlF,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;OASG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+FAA+F;AAC/F,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,cAAc,CAAC,CA0C9F;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sHAAsH;AACtH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,qBAAqB,CAchG;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAuHD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAmDlH;AAMD,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -9,9 +9,9 @@
9
9
  * - `fail` — the check ran and found a violation.
10
10
  * - `error` — the check could NOT be run (unreadable model, unreadable or
11
11
  * unparsable IDS/rules file, an IDS document declaring zero
12
- * specifications, or — for `rules` — a `.rules.json` rule
13
- * the `@ifc-lite/rules` engine itself could not evaluate,
14
- * `SpecificationResult.error` set). An unevaluable check must
12
+ * specifications, or a `.rules.json` rule or IDS specification
13
+ * the `@ifc-lite/rules` or `@ifc-lite/ids` engine itself could
14
+ * not evaluate, `SpecificationResult.error` set). An unevaluable check must
15
15
  * never be folded into `pass`: a delivery report that
16
16
  * silently skips a rule and still reads as clean is worse
17
17
  * than no report.
@@ -138,6 +138,7 @@ function summarizeIdsReport(report) {
138
138
  let passedSpecifications = 0;
139
139
  let failedSpecifications = 0;
140
140
  let notApplicableSpecifications = 0;
141
+ let erroredSpecifications = 0;
141
142
  let totalEntities = 0;
142
143
  let passedEntities = 0;
143
144
  let failedEntities = 0;
@@ -149,7 +150,11 @@ function summarizeIdsReport(report) {
149
150
  else
150
151
  failedEntities++;
151
152
  }
152
- if (spec.status === 'fail') {
153
+ if (spec.error !== undefined) {
154
+ // Could not be evaluated: its 'fail' status is not a violation.
155
+ erroredSpecifications++;
156
+ }
157
+ else if (spec.status === 'fail') {
153
158
  failedSpecifications++;
154
159
  }
155
160
  else if (isVacuousSpecification(spec)) {
@@ -164,6 +169,7 @@ function summarizeIdsReport(report) {
164
169
  passedSpecifications,
165
170
  failedSpecifications,
166
171
  notApplicableSpecifications,
172
+ erroredSpecifications,
167
173
  totalEntities,
168
174
  passedEntities,
169
175
  failedEntities,
@@ -180,7 +186,9 @@ function summarizeIdsReport(report) {
180
186
  * pass nor fail (`notApplicableSpecifications`) — if EVERY specification
181
187
  * lands there (nothing was definitively satisfied OR violated), the check
182
188
  * reports `error` rather than a `pass` that would rest on zero actual
183
- * evidence.
189
+ * evidence. A specification the validator could not evaluate (its `error`
190
+ * set) makes the check `error` too, as an unevaluable rule does in
191
+ * `runRulesCheck`, with the validator's reasons.
184
192
  */
185
193
  export async function runIdsCheck(modelPath, store, idsPath) {
186
194
  const base = { type: 'ids', model: modelPath, source: idsPath };
@@ -216,6 +224,11 @@ export async function runIdsCheck(modelPath, store, idsPath) {
216
224
  if (s.totalSpecifications === 0) {
217
225
  return { ...base, status: 'error', error: 'declares zero specifications', ...s };
218
226
  }
227
+ if (s.erroredSpecifications > 0) {
228
+ const reasons = report.specificationResults.flatMap(spec => (spec.error !== undefined ? [spec.error] : []));
229
+ const error = `${s.erroredSpecifications} of ${s.totalSpecifications} specification(s) could not be evaluated (${reasons.join('; ')})`;
230
+ return { ...base, status: 'error', ...s, error };
231
+ }
219
232
  const evaluated = s.passedSpecifications + s.failedSpecifications;
220
233
  const status = s.failedSpecifications > 0 ? 'fail' : evaluated > 0 ? 'pass' : 'error';
221
234
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-checks.js","sourceRoot":"","sources":["../../src/commands/delivery-checks.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAqB,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAwB,MAAM,eAAe,CAAC;AA2B9E,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY;IACrD,IAAI,KAAiB,CAAC;IACtB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAuB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,2BAA4B,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3G,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;IAC5B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9B,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAgB,CAAC;QAC7G,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAyB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC3E,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC;QACtB,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;IAC1B,CAAC;AACH,CAAC;AAaD,sHAAsH;AACtH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAmB;IACvE,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACnE,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACxC,UAAU;QACV,YAAY;QACZ,SAAS;QACT,MAAM;KACP,CAAC;AACJ,CAAC;AAyCD;;;;;;;;;;;;;GAaG;AACH,SAAS,sBAAsB,CAAC,IAA4B;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,CAAC,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;AAC/F,CAAC;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,kBAAkB,CAAC,MAAyB;IACnD,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,2BAA2B,GAAG,CAAC,CAAC;IACpC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAC/C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,aAAa,EAAE,CAAC;YAChB,IAAI,MAAM,CAAC,MAAM;gBAAE,cAAc,EAAE,CAAC;;gBAC/B,cAAc,EAAE,CAAC;QACxB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,oBAAoB,EAAE,CAAC;QACzB,CAAC;aAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,2BAA2B,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,oBAAoB,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO;QACL,mBAAmB,EAAE,MAAM,CAAC,oBAAoB,CAAC,MAAM;QACvD,oBAAoB;QACpB,oBAAoB;QACpB,2BAA2B;QAC3B,aAAa;QACb,cAAc;QACd,cAAc;KACf,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAmB,EAAE,OAAe;IACvF,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,KAAc,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAEzE,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAuB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC7F,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,wBAAyB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE;YACnC,QAAQ;YACR,SAAS,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;YACjD,MAAM,EAAE,IAAI;YACZ,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAsB,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAuB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,CAAC,mBAAmB,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,8BAA8B,EAAE,GAAG,CAAC,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,GAAG,CAAC,CAAC,oBAAoB,CAAC;IAClE,MAAM,MAAM,GAAgB,CAAC,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAEnG,OAAO;QACL,GAAG,IAAI;QACP,MAAM;QACN,GAAG,CAAC;QACJ,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,gEAAgE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3G,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,uEAAuE;AACvE,8EAA8E;AAC9E,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAyB,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"delivery-checks.js","sourceRoot":"","sources":["../../src/commands/delivery-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The CLI's AI service for `ai.*` Flow nodes (#6923).
3
+ *
4
+ * Opt-in through the environment, never through the graph:
5
+ *
6
+ * IFC_LITE_AI_MODEL model id sent to the provider (required)
7
+ * IFC_LITE_AI_API_KEY bearer key (required; never logged, never in a checkpoint)
8
+ * IFC_LITE_AI_BASE_URL OpenAI-compatible endpoint, default https://openrouter.ai/api/v1
9
+ *
10
+ * Without both required variables the host does not list the `ai` feature,
11
+ * so a graph with AI nodes fails availability before anything runs. Every
12
+ * request goes through the shared `@ifc-lite/ai` core against ONE root budget
13
+ * for the whole run, restored from the checkpoint on resume so a pause never
14
+ * resets what was spent.
15
+ */
16
+ import { type RootBudget } from '@ifc-lite/ai';
17
+ import { type FlowAiConfig } from '@ifc-lite/ai/chat-completions';
18
+ import { type FlowAiService } from '@ifc-lite/flow-nodes/ai';
19
+ export declare function createCliAiService(config: FlowAiConfig, budget?: RootBudget, transport?: import("@ifc-lite/ai").AiTransport<string>): FlowAiService;
20
+ //# sourceMappingURL=flow-ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-ai.d.ts","sourceRoot":"","sources":["../../src/commands/flow-ai.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,UAA6C,EAAE,SAAS,6CAAmC,GAAG,aAAa,CAU3K"}
@@ -0,0 +1,35 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * The CLI's AI service for `ai.*` Flow nodes (#6923).
6
+ *
7
+ * Opt-in through the environment, never through the graph:
8
+ *
9
+ * IFC_LITE_AI_MODEL model id sent to the provider (required)
10
+ * IFC_LITE_AI_API_KEY bearer key (required; never logged, never in a checkpoint)
11
+ * IFC_LITE_AI_BASE_URL OpenAI-compatible endpoint, default https://openrouter.ai/api/v1
12
+ *
13
+ * Without both required variables the host does not list the `ai` feature,
14
+ * so a graph with AI nodes fails availability before anything runs. Every
15
+ * request goes through the shared `@ifc-lite/ai` core against ONE root budget
16
+ * for the whole run, restored from the checkpoint on resume so a pause never
17
+ * resets what was spent.
18
+ */
19
+ import { createRootBudget, runModelRequest } from '@ifc-lite/ai';
20
+ import { chatCompletionsTransport } from '@ifc-lite/ai/chat-completions';
21
+ import { FLOW_AI_BUDGET } from '@ifc-lite/flow-nodes/ai';
22
+ const ROUTE_CEILING = 8_192;
23
+ const TIMEOUT_MS = 120_000;
24
+ export function createCliAiService(config, budget = createRootBudget(FLOW_AI_BUDGET), transport = chatCompletionsTransport(config)) {
25
+ return {
26
+ model: config.model,
27
+ request: (call) => runModelRequest({
28
+ model: config.model, route: 'cli', transport, budget, routeCeiling: ROUTE_CEILING, timeoutMs: TIMEOUT_MS,
29
+ prepareInput: () => JSON.stringify({ messages: [call.prompt], system: call.system, outputSchema: call.outputSchema }),
30
+ messages: [call.prompt], system: call.system, promptVersion: call.promptVersion, maxOutputTokens: call.maxOutputTokens, signal: call.signal,
31
+ outputSchema: call.outputSchema,
32
+ }),
33
+ };
34
+ }
35
+ //# sourceMappingURL=flow-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-ai.js","sourceRoot":"","sources":["../../src/commands/flow-ai.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAmB,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,wBAAwB,EAAqB,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAsB,MAAM,yBAAyB,CAAC;AAE7E,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,SAAqB,gBAAgB,CAAC,cAAc,CAAC,EAAE,SAAS,GAAG,wBAAwB,CAAC,MAAM,CAAC;IAC1J,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU;YACxG,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YACrH,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;YAC3I,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Inspect a recorded target with fresh permission; reconciliation never sends a write. */
2
+ export declare function flowBcfCommand(args: string[]): Promise<void>;
3
+ //# sourceMappingURL=flow-bcf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-bcf.d.ts","sourceRoot":"","sources":["../../src/commands/flow-bcf.ts"],"names":[],"mappings":"AAUA,2FAA2F;AAC3F,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DlE"}
@@ -0,0 +1,87 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { parseCapabilities } from '@ifc-lite/extensions';
5
+ import { createNativeBcfWriteGateway } from '@ifc-lite/flow-nodes/bcf-publication-node';
6
+ import { fatal, printJson } from '../output.js';
7
+ const USAGE = 'Usage: ifc-lite flow bcf list [--page-size N] [--after <cursor>] | check <entryId> --allow-host <host> [--token-env NAME] [--confirm-owner-stopped] [--confirm-full-read-access] | reconcile <entryId> --guid <checkedGuid> | confirm-absent <entryId>';
8
+ /** Inspect a recorded target with fresh permission; reconciliation never sends a write. */
9
+ export async function flowBcfCommand(args) {
10
+ const [action, ...rest] = args;
11
+ const values = new Map();
12
+ const positional = [];
13
+ let confirmOwnerStopped = false;
14
+ let confirmFullReadAccess = false;
15
+ for (let i = 0; i < rest.length; i += 1) {
16
+ const argument = rest[i];
17
+ if (argument === '--json')
18
+ continue;
19
+ if (argument === '--confirm-full-read-access') {
20
+ if (confirmFullReadAccess)
21
+ fatal('Duplicate --confirm-full-read-access');
22
+ confirmFullReadAccess = true;
23
+ continue;
24
+ }
25
+ if (argument === '--confirm-owner-stopped') {
26
+ if (confirmOwnerStopped)
27
+ fatal('Duplicate --confirm-owner-stopped');
28
+ confirmOwnerStopped = true;
29
+ continue;
30
+ }
31
+ if (argument.startsWith('--')) {
32
+ if (!['--allow-host', '--token-env', '--guid', '--after', '--page-size'].includes(argument))
33
+ fatal(`Unknown BCF option ${argument}`);
34
+ const value = rest[++i];
35
+ if (!value || value.startsWith('--') || values.has(argument))
36
+ fatal(`${argument} needs one value`);
37
+ values.set(argument, value);
38
+ }
39
+ else
40
+ positional.push(argument);
41
+ }
42
+ const gateway = createNativeBcfWriteGateway();
43
+ if (action === 'list' && positional.length === 0 && !confirmOwnerStopped && !confirmFullReadAccess
44
+ && [...values.keys()].every(key => ['--after', '--page-size'].includes(key))) {
45
+ if (!values.size)
46
+ printJson(await gateway.list());
47
+ else {
48
+ const size = values.get('--page-size');
49
+ if (size !== undefined && !/^[1-9][0-9]{0,3}$/.test(size))
50
+ fatal('--page-size needs an integer from 1 to 1000');
51
+ printJson(await gateway.listPage({ cursor: values.get('--after'), limit: size === undefined ? undefined : Number(size) }));
52
+ }
53
+ return;
54
+ }
55
+ const [entryId] = positional;
56
+ if (positional.length !== 1)
57
+ fatal(USAGE);
58
+ if (action === 'check') {
59
+ if ([...values.keys()].some(key => !['--allow-host', '--token-env'].includes(key)))
60
+ fatal(USAGE);
61
+ const host = values.get('--allow-host');
62
+ // A capability permits a hostname, never a URL, wildcard, credentials, or arbitrary route.
63
+ if (!host || !/^[a-zA-Z0-9.-]+$/.test(host))
64
+ fatal('--allow-host needs an explicit hostname');
65
+ const grants = parseCapabilities([`network.fetch:${host}`]);
66
+ if (!grants.ok)
67
+ fatal(grants.errors.map(error => error.message).join('; '));
68
+ const tokenName = values.get('--token-env');
69
+ if (tokenName && !/^[A-Za-z_][A-Za-z0-9_]*$/.test(tokenName))
70
+ fatal('--token-env needs an environment variable name');
71
+ const token = tokenName ? process.env[tokenName] : undefined;
72
+ if (tokenName && !token?.trim())
73
+ fatal(`Environment variable ${tokenName} is empty or unset`);
74
+ printJson(await gateway.check(entryId, { networkGrants: grants.value, token, confirmOwnerStopped, confirmFullReadAccess }));
75
+ return;
76
+ }
77
+ if (action === 'confirm-absent' && values.size === 0 && !confirmOwnerStopped && !confirmFullReadAccess) {
78
+ printJson(await gateway.confirmAbsent(entryId));
79
+ return;
80
+ }
81
+ if (action === 'reconcile' && values.size === 1 && values.has('--guid') && !confirmOwnerStopped && !confirmFullReadAccess) {
82
+ printJson(await gateway.reconcile(entryId, values.get('--guid')));
83
+ return;
84
+ }
85
+ fatal(USAGE);
86
+ }
87
+ //# sourceMappingURL=flow-bcf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-bcf.js","sourceRoot":"","sources":["../../src/commands/flow-bcf.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AACxF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,KAAK,GAAG,wPAAwP,CAAC;AAEvQ,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,QAAQ,KAAK,QAAQ;YAAE,SAAS;QACpC,IAAI,QAAQ,KAAK,4BAA4B,EAAE,CAAC;YAC9C,IAAI,qBAAqB;gBAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACzE,qBAAqB,GAAG,IAAI,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,KAAK,yBAAyB,EAAE,CAAC;YAC3C,IAAI,mBAAmB;gBAAE,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACpE,mBAAmB,GAAG,IAAI,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;YACrI,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAC;YACnG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;;YAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,OAAO,GAAG,2BAA2B,EAAE,CAAC;IAC9C,IAAI,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,qBAAqB;WAC7F,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/E,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,SAAS,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;aAC7C,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAChH,SAAS,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7H,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC;IAC7B,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACjG,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACxC,2FAA2F;QAC3F,IAAI,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,SAAS,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtH,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7D,IAAI,SAAS,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;YAAE,KAAK,CAAC,wBAAwB,SAAS,oBAAoB,CAAC,CAAC;QAC9F,SAAS,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;QAC5H,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACvG,SAAS,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1H,SAAS,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,CAAC;AACf,CAAC"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import type { Capability } from '@ifc-lite/extensions';
11
11
  import type { FlowHost } from '@ifc-lite/flow-nodes';
12
+ import type { FlowAiService } from '@ifc-lite/flow-nodes/ai';
12
13
  import type { IfcDataStore } from '@ifc-lite/parser';
13
14
  import { type BimContext } from '@ifc-lite/sdk';
14
15
  import { HeadlessBackend } from '../headless-backend.js';
@@ -22,5 +23,8 @@ export interface CliFlowSession {
22
23
  /** The model the graph is working on now: the command-line one, or the last one it opened. */
23
24
  active(): HeadlessModel;
24
25
  }
25
- export declare function createCliFlowSession(initial: HeadlessModel, networkGrants: readonly Capability[]): CliFlowSession;
26
+ export declare function createCliFlowSession(initial: HeadlessModel, networkGrants: readonly Capability[], ai?: FlowAiService, publication?: {
27
+ directory?: string;
28
+ secrets?: readonly string[];
29
+ }): CliFlowSession;
26
30
  //# sourceMappingURL=flow-host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow-host.d.ts","sourceRoot":"","sources":["../../src/commands/flow-host.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,8FAA8F;IAC9F,MAAM,IAAI,aAAa,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,UAAU,EAAE,GAAG,cAAc,CAqBjH"}
1
+ {"version":3,"file":"flow-host.d.ts","sourceRoot":"","sources":["../../src/commands/flow-host.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,8FAA8F;IAC9F,MAAM,IAAI,aAAa,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,UAAU,EAAE,EAAE,EAAE,CAAC,EAAE,aAAa,EAAE,WAAW,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAAG,cAAc,CA2B5M"}
@@ -1,22 +1,30 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { createNativeBcfWriteGateway } from '@ifc-lite/flow-nodes/bcf-publication-node';
5
+ import { createDataAccessor } from '@ifc-lite/ids/bridge';
4
6
  import { createBimContext } from '@ifc-lite/sdk';
5
7
  import { HeadlessBackend } from '../headless-backend.js';
6
8
  import { parseIfcBytes } from '../loader.js';
7
- export function createCliFlowSession(initial, networkGrants) {
9
+ export function createCliFlowSession(initial, networkGrants, ai, publication = {}) {
8
10
  let active = initial;
9
11
  const host = {
10
12
  get bim() { return active.bim; },
13
+ // Present only when the environment names a provider (`flow-ai.ts`).
14
+ ...(ai ? { ai } : {}),
11
15
  // `networkGrants` is always the graph's own declared capabilities: a
12
16
  // trusted local run is still not trusted to reach a host the graph never
13
17
  // declared (see `FlowHost.networkGrants`).
14
18
  networkGrants,
19
+ bcfWrites: createNativeBcfWriteGateway(publication),
15
20
  get defaultModelId() { return active.bim.model.activeId() ?? undefined; },
16
21
  // `table.joinByKey`'s tag/property strategies reuse `@ifc-lite/mutations`'
17
22
  // csv-match.ts index builder, which needs the raw entity table + mutation
18
23
  // view rather than per-ref BimContext accessors (see host.ts's TableAccess).
19
24
  tables: (modelId) => active.backend.tableAccess(modelId),
25
+ // `ids.validate` reads through the same mutation view, so it sees what an
26
+ // earlier node in the run wrote.
27
+ idsAccessor: () => createDataAccessor(active.store, undefined, active.backend.tableAccess().mutationView),
20
28
  async openModel(bytes, name) {
21
29
  const store = await parseIfcBytes(bytes, name);
22
30
  const backend = new HeadlessBackend(store, name);
@@ -1 +1 @@
1
- {"version":3,"file":"flow-host.js","sourceRoot":"","sources":["../../src/commands/flow-host.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAe/D,OAAO,EAAE,gBAAgB,EAAmB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAc7C,MAAM,UAAU,oBAAoB,CAAC,OAAsB,EAAE,aAAoC;IAC/F,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,MAAM,IAAI,GAAa;QACrB,IAAI,GAAG,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,qEAAqE;QACrE,yEAAyE;QACzE,2CAA2C;QAC3C,aAAa;QACb,IAAI,cAAc,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;QACzE,2EAA2E;QAC3E,0EAA0E;QAC1E,6EAA6E;QAC7E,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;QACxD,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI;YACzB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAChE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"flow-host.js","sourceRoot":"","sources":["../../src/commands/flow-host.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAe/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,2CAA2C,CAAC;AAExF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAmB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAc7C,MAAM,UAAU,oBAAoB,CAAC,OAAsB,EAAE,aAAoC,EAAE,EAAkB,EAAE,cAAmE,EAAE;IAC1L,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,MAAM,IAAI,GAAa;QACrB,IAAI,GAAG,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,qEAAqE;QACrE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,qEAAqE;QACrE,yEAAyE;QACzE,2CAA2C;QAC3C,aAAa;QACb,SAAS,EAAE,2BAA2B,CAAC,WAAW,CAAC;QACnD,IAAI,cAAc,KAAK,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;QACzE,2EAA2E;QAC3E,0EAA0E;QAC1E,6EAA6E;QAC7E,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;QACxD,0EAA0E;QAC1E,iCAAiC;QACjC,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC;QACzG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI;YACzB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACjD,MAAM,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAChE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type FlowDocument, type RunResult } from '@ifc-lite/flow';
2
+ import { createCheckpoint, graphDigest, type FlowCheckpoint } from '@ifc-lite/flow/checkpoint';
3
+ import { FileCheckpointStore } from '@ifc-lite/flow/checkpoint-file';
4
+ /** Exit code of a run that stopped at a review checkpoint: not a failure, not done. */
5
+ export declare const PAUSED_FOR_REVIEW = 3;
6
+ /** Build the exact portable proposal before persisting model or tracking effects. */
7
+ export declare function preparePause(input: Parameters<typeof createCheckpoint>[0], redaction: ReadonlyMap<string, string>): FlowCheckpoint;
8
+ /** Refuse an existing destination before a resume consumes its approval. */
9
+ export declare function checkPauseDestination(path: string): Promise<void>;
10
+ /** Save the already-validated exact proposal, with atomic collision refusal. */
11
+ export declare function savePause(path: string, checkpoint: FlowCheckpoint): Promise<FlowCheckpoint>;
12
+ export declare function reportPause(checkpoint: FlowCheckpoint, path: string): void;
13
+ export declare function reviewCommand(args: string[], path: string | undefined, json: boolean, approve: string | undefined): Promise<void>;
14
+ /** Ids of the nodes a checkpoint restores. */
15
+ export declare function checkpointNodes(path: string): Promise<string[]>;
16
+ export interface Resume {
17
+ readonly store: FileCheckpointStore;
18
+ readonly checkpoint: FlowCheckpoint;
19
+ readonly owner: string;
20
+ }
21
+ /** Claim a reviewed checkpoint for this process, after recovering an abandoned claim. */
22
+ export declare function claimForResume(path: string, doc: FlowDocument, inputs: Record<string, unknown>, sourceDigest: string, registry: NonNullable<Parameters<typeof graphDigest>[2]>, requiresAiBudget?: boolean): Promise<Resume>;
23
+ export declare function finishResume(resume: Resume, result: RunResult): Promise<FlowCheckpoint>;
24
+ /** A failed persistence step must not turn a consumed claim into completed. */
25
+ export declare function failResume(resume: Resume, message: string): Promise<FlowCheckpoint>;
26
+ /** #7039: checkpoint writes must not alias model outputs or another journal. */
27
+ export declare function checkDistinctDestinations(paths: readonly string[]): Promise<void>;
28
+ //# sourceMappingURL=flow-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-review.d.ts","sourceRoot":"","sources":["../../src/commands/flow-review.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EACmD,gBAAgB,EAAoB,WAAW,EAChD,KAAK,cAAc,EAC3E,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAErE,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAcnC,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAMlI;AAED,4EAA4E;AAC5E,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;AAED,gFAAgF;AAChF,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAIjG;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG1E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvI;AAED,8CAA8C;AAC9C,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMrE;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yFAAyF;AACzF,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAehO;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAM7F;AAED,+EAA+E;AAC/E,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAEzF;AAED,gFAAgF;AAChF,wBAAsB,yBAAyB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvF"}
@@ -0,0 +1,154 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * `ifc-lite flow` review checkpoints (#6923): pause, review, resume.
6
+ *
7
+ * flow run <graph> <model> --checkpoint cp.json [--out paused.ifc] exits 3 when it paused for review
8
+ * flow review <cp.json> [--approve <proposal digest> | --reject] [--json]
9
+ * flow resume <graph> <model> --checkpoint cp.json [--out done.ifc] [--next-checkpoint cp2.json]
10
+ *
11
+ * The approval names the proposal digest the reviewer was shown, so an
12
+ * approval cannot apply to a proposal it did not see. A resume claims the
13
+ * checkpoint once (compare-and-swap on the file), checks that the graph,
14
+ * Player inputs and the model it starts from are the ones the pause
15
+ * recorded, runs only what was paused (completed nodes are restored, never
16
+ * re-executed), and records completed or partially committed.
17
+ */
18
+ import { randomUUID } from 'node:crypto';
19
+ import { restoreRootBudget } from '@ifc-lite/ai';
20
+ import { realpath, stat } from 'node:fs/promises';
21
+ import { dirname, basename, join, resolve } from 'node:path';
22
+ import { approveCheckpoint, checkpointProposal, claimCheckpoint, createCheckpoint, finishCheckpoint, graphDigest, recoverCheckpoint, rejectCheckpoint, updateCheckpoint } from '@ifc-lite/flow/checkpoint';
23
+ import { redactDeep } from '@ifc-lite/flow-nodes';
24
+ import { fatal, printJson } from '../output.js';
25
+ import { FileCheckpointStore } from '@ifc-lite/flow/checkpoint-file';
26
+ /** Exit code of a run that stopped at a review checkpoint: not a failure, not done. */
27
+ export const PAUSED_FOR_REVIEW = 3;
28
+ const LEASE_MS = 10 * 60_000;
29
+ function describe(checkpoint) {
30
+ const lines = [`checkpoint ${checkpoint.id} (${checkpoint.state}) for "${checkpoint.graphName}"`, ` proposal digest ${checkpoint.proposalDigest}`];
31
+ for (const [nodeId, ports] of checkpointProposal(checkpoint)) {
32
+ for (const [port, data] of ports) {
33
+ const value = data.kind === 'item' ? data.value : data.kind === 'list' ? data.items : Object.fromEntries(data.branches);
34
+ lines.push(` ${nodeId}.${port}: ${JSON.stringify(value)}`);
35
+ }
36
+ }
37
+ return lines;
38
+ }
39
+ /** Build the exact portable proposal before persisting model or tracking effects. */
40
+ export function preparePause(input, redaction) {
41
+ const checkpoint = createCheckpoint(input);
42
+ if (JSON.stringify(checkpoint.outputs) !== JSON.stringify(redactDeep(checkpoint.outputs, redaction))) {
43
+ throw new Error('the paused outputs contain a secret; no checkpoint can be saved or displayed');
44
+ }
45
+ return checkpoint;
46
+ }
47
+ /** Refuse an existing destination before a resume consumes its approval. */
48
+ export async function checkPauseDestination(path) {
49
+ if (await stat(path).then(() => true, () => false))
50
+ throw new Error(`${path} already exists; a checkpoint is never overwritten`);
51
+ }
52
+ /** Save the already-validated exact proposal, with atomic collision refusal. */
53
+ export async function savePause(path, checkpoint) {
54
+ await checkPauseDestination(path);
55
+ if (!(await new FileCheckpointStore(path).write(checkpoint, null)))
56
+ throw new Error(`${path} is being written by another process`);
57
+ return checkpoint;
58
+ }
59
+ export function reportPause(checkpoint, path) {
60
+ for (const line of describe(checkpoint))
61
+ process.stdout.write(`${line}\n`);
62
+ process.stdout.write(`paused for review: approve with\n ifc-lite flow review ${path} --approve ${checkpoint.proposalDigest}\n`);
63
+ }
64
+ export async function reviewCommand(args, path, json, approve) {
65
+ if (!path)
66
+ fatal('Usage: ifc-lite flow review <checkpoint.json> [--approve <proposal digest> | --reject] [--json]');
67
+ const store = new FileCheckpointStore(path);
68
+ const { checkpoint } = await store.load();
69
+ const reject = args.includes('--reject');
70
+ if (approve !== undefined && reject)
71
+ fatal('pass either --approve or --reject');
72
+ let next = checkpoint;
73
+ try {
74
+ if (approve !== undefined)
75
+ next = await updateCheckpoint(store, checkpoint.id, (c) => approveCheckpoint(c, approve));
76
+ else if (reject)
77
+ next = await updateCheckpoint(store, checkpoint.id, (c) => rejectCheckpoint(c));
78
+ }
79
+ catch (error) {
80
+ fatal(error.message);
81
+ }
82
+ if (json)
83
+ return printJson({ id: next.id, state: next.state, proposalDigest: next.proposalDigest, reviewNodes: next.reviewNodes,
84
+ proposal: Object.fromEntries([...checkpointProposal(next).keys()].map(node => [node, next.outputs[node]])) });
85
+ for (const line of describe(next))
86
+ process.stdout.write(`${line}\n`);
87
+ }
88
+ /** Ids of the nodes a checkpoint restores. */
89
+ export async function checkpointNodes(path) {
90
+ try {
91
+ return Object.keys((await new FileCheckpointStore(path).load()).checkpoint.outputs);
92
+ }
93
+ catch (error) {
94
+ fatal(`cannot read checkpoint ${path}: ${error.message}`);
95
+ }
96
+ }
97
+ /** Claim a reviewed checkpoint for this process, after recovering an abandoned claim. */
98
+ export async function claimForResume(path, doc, inputs, sourceDigest, registry, requiresAiBudget = false) {
99
+ const store = new FileCheckpointStore(path);
100
+ const owner = `cli:${process.pid}:${randomUUID()}`;
101
+ try {
102
+ const { checkpoint } = await store.load();
103
+ if (checkpoint.graphId !== doc.id)
104
+ fatal(`${path} belongs to graph "${checkpoint.graphId}", not "${doc.id}"`);
105
+ if (recoverCheckpoint(checkpoint))
106
+ await updateCheckpoint(store, checkpoint.id, (c) => recoverCheckpoint(c) ?? c);
107
+ const claimed = await updateCheckpoint(store, checkpoint.id, (c) => {
108
+ if (requiresAiBudget && !restoreRootBudget(c.budget))
109
+ throw new Error('resuming downstream AI nodes requires the original root budget receipt; no new allowance can be granted');
110
+ return claimCheckpoint(c, { owner, graphDigest: graphDigest(doc, inputs, registry), sourceDigest, leaseMs: LEASE_MS });
111
+ });
112
+ return { store, checkpoint: claimed, owner };
113
+ }
114
+ catch (error) {
115
+ fatal(error.message);
116
+ }
117
+ }
118
+ export async function finishResume(resume, result) {
119
+ const failed = result.log.find((l) => l.level === 'error');
120
+ return updateCheckpoint(resume.store, resume.checkpoint.id, (c) => finishCheckpoint(c, resume.owner, {
121
+ ok: result.ok,
122
+ ...(failed ? { message: `${failed.nodeId}: ${failed.message}` } : result.review.length ? { message: `paused again at ${result.review.join(', ')}` } : {}),
123
+ }));
124
+ }
125
+ /** A failed persistence step must not turn a consumed claim into completed. */
126
+ export async function failResume(resume, message) {
127
+ return updateCheckpoint(resume.store, resume.checkpoint.id, c => finishCheckpoint(c, resume.owner, { ok: false, message }));
128
+ }
129
+ /** #7039: checkpoint writes must not alias model outputs or another journal. */
130
+ export async function checkDistinctDestinations(paths) {
131
+ const names = new Set();
132
+ const files = new Set();
133
+ for (const path of paths) {
134
+ const absolute = resolve(path);
135
+ const canonical = await realpath(absolute).catch(async (error) => {
136
+ if (error.code !== 'ENOENT')
137
+ throw error;
138
+ return join(await realpath(dirname(absolute)), basename(absolute));
139
+ });
140
+ const info = await stat(absolute).catch((error) => {
141
+ if (error.code !== 'ENOENT')
142
+ throw error;
143
+ return null;
144
+ });
145
+ const identity = info ? `${info.dev}:${info.ino}` : undefined;
146
+ if (names.has(canonical) || (identity !== undefined && files.has(identity))) {
147
+ throw new Error('checkpoint, next checkpoint, output and tracking destinations must be distinct');
148
+ }
149
+ names.add(canonical);
150
+ if (identity !== undefined)
151
+ files.add(identity);
152
+ }
153
+ }
154
+ //# sourceMappingURL=flow-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-review.js","sourceRoot":"","sources":["../../src/commands/flow-review.ts"],"names":[],"mappings":"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"}
@@ -4,10 +4,14 @@ export declare class FileTrackingStore implements TrackingStore {
4
4
  readonly pinnedTo: string;
5
5
  private sets;
6
6
  private dirty;
7
+ private exists;
8
+ private writePath;
7
9
  /** Pin recorded in the file that was loaded, when any. */
8
10
  loadedPin: string | undefined;
9
11
  constructor(path: string, pinnedTo: string);
10
12
  static open(path: string, pinnedTo: string): Promise<FileTrackingStore>;
13
+ /** Bind review to the effective sidecar and its canonical destination, including planned writes. */
14
+ fingerprint(): string;
11
15
  load(trackingKey: string): TrackedSet | undefined;
12
16
  save(set: TrackedSet): void;
13
17
  keys(): readonly string[];