@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.
- package/README.md +25 -0
- package/dist/commands/delivery-checks.d.ts +4 -1
- package/dist/commands/delivery-checks.d.ts.map +1 -1
- package/dist/commands/delivery-checks.js +18 -5
- package/dist/commands/delivery-checks.js.map +1 -1
- package/dist/commands/flow-ai.d.ts +20 -0
- package/dist/commands/flow-ai.d.ts.map +1 -0
- package/dist/commands/flow-ai.js +35 -0
- package/dist/commands/flow-ai.js.map +1 -0
- package/dist/commands/flow-bcf.d.ts +3 -0
- package/dist/commands/flow-bcf.d.ts.map +1 -0
- package/dist/commands/flow-bcf.js +87 -0
- package/dist/commands/flow-bcf.js.map +1 -0
- package/dist/commands/flow-host.d.ts +5 -1
- package/dist/commands/flow-host.d.ts.map +1 -1
- package/dist/commands/flow-host.js +9 -1
- package/dist/commands/flow-host.js.map +1 -1
- package/dist/commands/flow-review.d.ts +28 -0
- package/dist/commands/flow-review.d.ts.map +1 -0
- package/dist/commands/flow-review.js +154 -0
- package/dist/commands/flow-review.js.map +1 -0
- package/dist/commands/flow-tracking.d.ts +4 -0
- package/dist/commands/flow-tracking.d.ts.map +1 -1
- package/dist/commands/flow-tracking.js +25 -4
- package/dist/commands/flow-tracking.js.map +1 -1
- package/dist/commands/flow.d.ts.map +1 -1
- package/dist/commands/flow.js +129 -27
- package/dist/commands/flow.js.map +1 -1
- package/dist/commands/ids-audit-lint.d.ts +3 -0
- package/dist/commands/ids-audit-lint.d.ts.map +1 -0
- package/dist/commands/ids-audit-lint.js +129 -0
- package/dist/commands/ids-audit-lint.js.map +1 -0
- package/dist/commands/ids-diff.d.ts +2 -0
- package/dist/commands/ids-diff.d.ts.map +1 -0
- package/dist/commands/ids-diff.js +61 -0
- package/dist/commands/ids-diff.js.map +1 -0
- package/dist/commands/ids-explain.d.ts +2 -0
- package/dist/commands/ids-explain.d.ts.map +1 -0
- package/dist/commands/ids-explain.js +53 -0
- package/dist/commands/ids-explain.js.map +1 -0
- package/dist/commands/ids-fmt.d.ts +2 -0
- package/dist/commands/ids-fmt.d.ts.map +1 -0
- package/dist/commands/ids-fmt.js +54 -0
- package/dist/commands/ids-fmt.js.map +1 -0
- package/dist/commands/ids-subcommand.d.ts +31 -0
- package/dist/commands/ids-subcommand.d.ts.map +1 -0
- package/dist/commands/ids-subcommand.js +101 -0
- package/dist/commands/ids-subcommand.js.map +1 -0
- package/dist/commands/ids.d.ts.map +1 -1
- package/dist/commands/ids.js +25 -2
- package/dist/commands/ids.js.map +1 -1
- package/dist/commands/info.js +11 -11
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/semantic-file.d.ts +2 -0
- package/dist/commands/semantic-file.d.ts.map +1 -0
- package/dist/commands/semantic-file.js +24 -0
- package/dist/commands/semantic-file.js.map +1 -0
- package/dist/commands/semantic-serve.d.ts +2 -0
- package/dist/commands/semantic-serve.d.ts.map +1 -0
- package/dist/commands/semantic-serve.js +48 -0
- package/dist/commands/semantic-serve.js.map +1 -0
- package/dist/commands/semantic.d.ts +3 -0
- package/dist/commands/semantic.d.ts.map +1 -0
- package/dist/commands/semantic.js +130 -0
- package/dist/commands/semantic.js.map +1 -0
- package/dist/geometry-report.d.ts.map +1 -1
- package/dist/geometry-report.js +2 -1
- package/dist/geometry-report.js.map +1 -1
- package/dist/headless-backend-store-authoring.d.ts +4 -4
- package/dist/headless-backend-store-authoring.d.ts.map +1 -1
- package/dist/headless-backend-store-authoring.js +7 -5
- package/dist/headless-backend-store-authoring.js.map +1 -1
- package/dist/headless-backend.d.ts.map +1 -1
- package/dist/headless-backend.js +1 -57
- package/dist/headless-backend.js.map +1 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +14 -2
- package/dist/help.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/out-flag-commands.js +1 -1
- package/dist/out-flag-commands.js.map +1 -1
- package/dist/output.d.ts +11 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +13 -0
- package/dist/output.js.map +1 -1
- 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;
|
|
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
|
|
13
|
-
* the `@ifc-lite/rules` engine itself could
|
|
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.
|
|
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":"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
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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[]
|
|
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;
|
|
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;
|
|
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[];
|