@bilig/workbook 0.55.0 → 0.58.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 +178 -333
- package/dist/check.d.ts +1 -1
- package/dist/check.js +12 -4
- package/dist/check.js.map +1 -1
- package/dist/describe.d.ts +15 -1
- package/dist/describe.js +18 -0
- package/dist/describe.js.map +1 -1
- package/dist/find.d.ts +12 -0
- package/dist/find.js +56 -8
- package/dist/find.js.map +1 -1
- package/dist/guards.js +23 -2
- package/dist/guards.js.map +1 -1
- package/dist/input.js +2 -2
- package/dist/input.js.map +1 -1
- package/dist/model.js +149 -42
- package/dist/model.js.map +1 -1
- package/dist/ops.d.ts +21 -1
- package/dist/readback.js +14 -3
- package/dist/readback.js.map +1 -1
- package/dist/result.d.ts +17 -2
- package/dist/result.js +3 -0
- package/dist/result.js.map +1 -1
- package/dist/run.d.ts +9 -2
- package/dist/run.js +92 -3
- package/dist/run.js.map +1 -1
- package/dist/verify.d.ts +1 -1
- package/dist/verify.js +15 -0
- package/dist/verify.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,364 +1,209 @@
|
|
|
1
1
|
# @bilig/workbook
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Generic workbook intent for agents and runtimes.
|
|
4
4
|
|
|
5
5
|
Build `@bilig/workbook` so an agent would love using it: simple, generic,
|
|
6
6
|
predictable, inspectable, verifiable, and never dependent on hardcoded business
|
|
7
7
|
models or human spreadsheet UI assumptions.
|
|
8
8
|
|
|
9
|
-
Use this package when a consumer
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- `findTable`, `findColumn`, `findRange`, `findName`, `findRows`
|
|
20
|
-
- `find`
|
|
21
|
-
- `workbookRefKinds`
|
|
22
|
-
- `isWorkbookRefKind`
|
|
23
|
-
- `isWorkbookRef`
|
|
24
|
-
- `workbookRowOperators`
|
|
25
|
-
- `isWorkbookRowOperator`
|
|
26
|
-
- `check`
|
|
27
|
-
- `describeModel`
|
|
28
|
-
- `describeRef`
|
|
29
|
-
- `describePlan`
|
|
30
|
-
- `describePlanResult`
|
|
31
|
-
- `describeRunResult`
|
|
32
|
-
- `describeRuntimeRequirements`
|
|
33
|
-
- `verifyPlan`
|
|
34
|
-
- `verifyModel`
|
|
35
|
-
- `runWorkbookPlan`
|
|
36
|
-
- `runWorkbookAction`
|
|
37
|
-
- `verifyWorkbookReadbacks`
|
|
38
|
-
- `normalizeWorkbookActionInputDescription`
|
|
39
|
-
- `workbookActionInputDescriptionKinds`
|
|
40
|
-
- `isWorkbookActionInputDescriptionKind`
|
|
41
|
-
- `isWorkbookActionInputDescription`
|
|
42
|
-
- `isWorkbookActionInput`
|
|
43
|
-
- `builtInWorkbookCheckKinds`
|
|
44
|
-
- `isBuiltInWorkbookCheckKind`
|
|
45
|
-
- `workbookRunErrorCodes`
|
|
46
|
-
- `isWorkbookRunErrorCode`
|
|
47
|
-
- `formula`
|
|
48
|
-
- `workbook.addOp(op, { target?, message? })` inside model actions
|
|
49
|
-
- `WorkbookModel`
|
|
50
|
-
- `WorkbookAction`
|
|
51
|
-
- `WorkbookActionConfig`
|
|
52
|
-
- `WorkbookActionDefinition`
|
|
53
|
-
- `WorkbookActionContext`
|
|
54
|
-
- `WorkbookCheckContext`
|
|
55
|
-
- `WorkbookFindWorkbook`
|
|
56
|
-
- `WorkbookCheckWorkbook`
|
|
57
|
-
- `WorkbookActionWorkbook`
|
|
58
|
-
- `WorkbookModelWorkbook`
|
|
59
|
-
- `WorkbookFindNamespace`
|
|
60
|
-
- `WorkbookRef`
|
|
61
|
-
- `WorkbookRefKind`
|
|
62
|
-
- `WorkbookRangeRef`
|
|
63
|
-
- `WorkbookNameRef`
|
|
64
|
-
- `WorkbookTableRef`
|
|
65
|
-
- `WorkbookColumnRef`
|
|
66
|
-
- `WorkbookRowsRef`
|
|
67
|
-
- `WorkbookRowOperator`
|
|
68
|
-
- `WorkbookActionInput`
|
|
69
|
-
- `WorkbookActionInputDescription`
|
|
70
|
-
- `WorkbookActionInputDescriptionKind`
|
|
71
|
-
- `WorkbookActionInspection`
|
|
72
|
-
- `WorkbookAddOpOptions`
|
|
73
|
-
- `WorkbookActionPlanResult`
|
|
74
|
-
- `WorkbookModelDescription`
|
|
75
|
-
- `WorkbookRefDescription`
|
|
76
|
-
- `WorkbookActionPlanDescription`
|
|
77
|
-
- `WorkbookActionPlanResultDescription`
|
|
78
|
-
- `WorkbookRunResultDescription`
|
|
79
|
-
- `WorkbookUndoRefDescription`
|
|
80
|
-
- `WorkbookRuntimeRequirements`
|
|
81
|
-
- `WorkbookRuntimeRequirement`
|
|
82
|
-
- `WorkbookRuntimeCapability`
|
|
83
|
-
- `WorkbookPlanVerification`
|
|
84
|
-
- `WorkbookPlanIssue`
|
|
85
|
-
- `WorkbookModelVerification`
|
|
86
|
-
- `WorkbookModelActionVerification`
|
|
87
|
-
- `WorkbookModelVerificationOptions`
|
|
88
|
-
- `WorkbookRunAdapter`
|
|
89
|
-
- `WorkbookRunApplyResult`
|
|
90
|
-
- `WorkbookRunReadback`
|
|
91
|
-
- `WorkbookReadbackVerification`
|
|
92
|
-
- `WorkbookReadbackIssue`
|
|
93
|
-
- `WorkbookReadbackIssueCode`
|
|
94
|
-
- `WorkbookCheckExpectation`
|
|
95
|
-
- `WorkbookCheckExpectationDescription`
|
|
96
|
-
- `WorkbookBuiltInCheckKind`
|
|
97
|
-
- `WorkbookCustomCheckOptions`
|
|
98
|
-
- `WorkbookReadbackCheckOptions`
|
|
99
|
-
- `WorkbookRawFormulaOptions`
|
|
100
|
-
- `WorkbookRunResult`
|
|
101
|
-
- `WorkbookRunError`
|
|
102
|
-
- `WorkbookRunErrorCode`
|
|
103
|
-
- `WorkbookCheckResult`
|
|
104
|
-
|
|
105
|
-
The low-level operation language remains available:
|
|
106
|
-
|
|
107
|
-
- `WorkbookOp`
|
|
108
|
-
- `WorkbookTxn`
|
|
109
|
-
- `EngineOp`
|
|
110
|
-
- `EngineOpBatch`
|
|
111
|
-
- `isEngineOpBatch`
|
|
112
|
-
|
|
113
|
-
Formula helpers create portable formula expressions with `@bilig/formula`.
|
|
114
|
-
Calculation and workbook execution stay in `@bilig/core` and the app runtime.
|
|
115
|
-
Use `planWorkbookAction` when an action name comes from an agent or user input;
|
|
116
|
-
it returns `planned` or structured `failed` results instead of requiring
|
|
117
|
-
exception control flow.
|
|
118
|
-
`defineModel` returns frozen, normalized model metadata. Model and action names
|
|
119
|
-
must be non-empty and already trimmed, while descriptions and input metadata are
|
|
120
|
-
trimmed and frozen so the manifest an agent inspected cannot be mutated later by
|
|
121
|
-
the caller.
|
|
122
|
-
Actions can also accept a JSON-safe input:
|
|
9
|
+
Use this package when a consumer wants to define their own workbook model and
|
|
10
|
+
hand a runtime a portable plan. The package does not import the engine, start a
|
|
11
|
+
server, calculate formulas, ship revenue/quote/forecast models, or depend on
|
|
12
|
+
`zod`, `effect`, `@bilig/core`, `@bilig/headless`, or `@bilig/agent-api`.
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
pnpm add @bilig/workbook
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## The Shape
|
|
123
19
|
|
|
124
20
|
```ts
|
|
125
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
defineModel,
|
|
23
|
+
describePlan,
|
|
24
|
+
describeRunResult,
|
|
25
|
+
describeRuntimeRequirements,
|
|
26
|
+
formula,
|
|
27
|
+
planWorkbookAction,
|
|
28
|
+
runWorkbookPlan,
|
|
29
|
+
verifyPlan,
|
|
30
|
+
} from "@bilig/workbook";
|
|
126
31
|
|
|
127
32
|
export const model = defineModel({
|
|
128
|
-
name:
|
|
33
|
+
name: "generic-row-calculator",
|
|
129
34
|
|
|
130
35
|
find(workbook) {
|
|
36
|
+
const table = workbook.findTable({
|
|
37
|
+
headers: ["Item", "Quantity", "Rate", "Status", "Total"],
|
|
38
|
+
});
|
|
39
|
+
const rows = workbook.findRows({
|
|
40
|
+
table,
|
|
41
|
+
where: { column: "Status", op: "eq", value: "ready" },
|
|
42
|
+
});
|
|
43
|
+
|
|
131
44
|
return {
|
|
132
|
-
|
|
133
|
-
|
|
45
|
+
table,
|
|
46
|
+
rows,
|
|
47
|
+
quantity: rows.column("Quantity"),
|
|
48
|
+
rate: rows.column("Rate"),
|
|
49
|
+
total: rows.column("Total"),
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
checks({ refs, workbook }) {
|
|
54
|
+
return [workbook.check.exists(refs.table), workbook.check.noFormulaErrors(refs.total)];
|
|
134
55
|
},
|
|
135
56
|
|
|
136
57
|
actions: {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const value = input.value
|
|
142
|
-
if (typeof value !== 'number') {
|
|
143
|
-
throw new Error('numeric value required')
|
|
144
|
-
}
|
|
145
|
-
workbook.writeValue(refs.output, value)
|
|
58
|
+
recompute({ refs, workbook }) {
|
|
59
|
+
const expected = formula.multiply(refs.quantity, refs.rate);
|
|
60
|
+
workbook.writeFormula(refs.total, expected);
|
|
61
|
+
workbook.check.formulaEquals(refs.total, expected);
|
|
146
62
|
},
|
|
147
63
|
},
|
|
148
|
-
})
|
|
149
|
-
```
|
|
64
|
+
});
|
|
150
65
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
Inputs must be plain JSON values: strings, finite numbers, booleans, `null`,
|
|
154
|
-
arrays without holes, and plain objects. This package intentionally does not add
|
|
155
|
-
schema dependencies; consumers own their own input validation inside actions.
|
|
156
|
-
Use `verifyModel(model, { inputs: { write: { value: 12 } } })` when whole-model
|
|
157
|
-
verification needs parameters for specific actions.
|
|
66
|
+
const planned = planWorkbookAction(model, "recompute");
|
|
67
|
+
if (planned.status === "failed") throw new Error(planned.errors[0]?.message);
|
|
158
68
|
|
|
159
|
-
|
|
160
|
-
|
|
69
|
+
const staticProof = verifyPlan(planned.plan);
|
|
70
|
+
const requirements = describeRuntimeRequirements(planned.plan);
|
|
71
|
+
const planForLogs = describePlan(planned.plan);
|
|
161
72
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
write: {
|
|
165
|
-
description: 'Write a consumer-provided value',
|
|
166
|
-
input: {
|
|
167
|
-
kind: 'object',
|
|
168
|
-
fields: {
|
|
169
|
-
value: { kind: 'number', required: true },
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
run({ refs, workbook, input }) {
|
|
173
|
-
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
174
|
-
throw new Error('input object required')
|
|
175
|
-
}
|
|
176
|
-
const value = input.value
|
|
177
|
-
if (typeof value !== 'number') {
|
|
178
|
-
throw new Error('numeric value required')
|
|
179
|
-
}
|
|
180
|
-
workbook.writeValue(refs.output, value)
|
|
181
|
-
},
|
|
182
|
-
},
|
|
183
|
-
}
|
|
73
|
+
const result = await runWorkbookPlan(planned.plan, adapter);
|
|
74
|
+
const resultForLogs = describeRunResult(result);
|
|
184
75
|
```
|
|
185
76
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
`
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
`
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
`
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
`
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
or test needs the same generic planned checks outside a model callback.
|
|
250
|
-
Use `check.valueEquals(ref, value)` and `check.formulaEquals(ref, formula)` when
|
|
251
|
-
an action should carry machine-readable readback expectations for runtime
|
|
252
|
-
verification. `formulaEquals` stores normalized formula text plus explicit model
|
|
253
|
-
refs used by that formula, so an agent can inspect the post-action proof target
|
|
254
|
-
without depending on a rendered spreadsheet UI.
|
|
255
|
-
Use `check.custom({ kind, message, target, refs })` for consumer-defined
|
|
256
|
-
invariants; the package does not need to know what the model means. `target`
|
|
257
|
-
names the main ref, and `refs` names any supporting refs the invariant depends
|
|
258
|
-
on so agents can describe and verify the full check contract.
|
|
259
|
-
Custom check kinds cannot reuse built-in names. Use the frozen
|
|
260
|
-
`builtInWorkbookCheckKinds` list or `isBuiltInWorkbookCheckKind` guard when a
|
|
261
|
-
consumer-facing tool needs to validate check kinds before planning.
|
|
262
|
-
|
|
263
|
-
Model callback phases are deliberately scoped. `find(workbook)` receives only
|
|
264
|
-
the find API; `checks({ workbook })` receives find helpers plus `workbook.check`;
|
|
265
|
-
actions receive find helpers, checks, and mutation planning methods. That keeps
|
|
266
|
-
discovery and proof declaration separate from workbook mutation intent.
|
|
267
|
-
|
|
268
|
-
Use `describeModel` when an agent needs a JSON-safe manifest of model name,
|
|
269
|
-
model description, sorted action names, per-action descriptions, optional input
|
|
270
|
-
descriptions, and whether model-level checks exist without running `find`,
|
|
271
|
-
checks, or actions.
|
|
272
|
-
Use `describeRef` and `describePlan` when an agent needs JSON-safe intent for
|
|
273
|
-
logs, comparisons, approvals, or runtime handoff. Descriptions keep the same
|
|
274
|
-
generic action input, refs, commands, checks, changes, and ops, but omit
|
|
275
|
-
consumer-private `refs` object shape and helper functions such as
|
|
276
|
-
`table.column()`.
|
|
277
|
-
Use `describePlanResult` when the same JSON-safe handoff is needed for either
|
|
278
|
-
planned or failed action planning.
|
|
279
|
-
Use `describeRunResult` after execution when an agent needs the same JSON-safe
|
|
280
|
-
shape for `done` or `failed` run results. It preserves changed summaries,
|
|
281
|
-
checks, errors, and undo ops, but describes workbook refs without helper
|
|
282
|
-
functions such as `table.column()` or `rows.column()`.
|
|
283
|
-
Run errors use a stable `WorkbookRunErrorCode` union rather than arbitrary
|
|
284
|
-
strings. Use the frozen `workbookRunErrorCodes` list and `isWorkbookRunErrorCode`
|
|
285
|
-
guard when an adapter, logger, or approval layer needs to branch on known
|
|
286
|
-
failure classes. Runtime adapters should use `apply_failed` for apply
|
|
287
|
-
exceptions and `runtime_rejected` for intentional runtime refusal with a
|
|
288
|
-
specific message instead of inventing new public codes.
|
|
289
|
-
Use `describeRuntimeRequirements(plan)` before runtime handoff when an agent
|
|
290
|
-
needs to inspect what the adapter must do. It returns a JSON-safe list of
|
|
291
|
-
generic `apply`, `read`, and `verify` requirements with boring capabilities
|
|
292
|
-
such as `writeFormula`, `writeValue`, `format`, `clear`, `applyOp`, `read`, and
|
|
293
|
-
`verifyCheck`. Command-derived concrete single-cell ops are not repeated as
|
|
294
|
-
extra `applyOp` requirements, while explicit or manually assembled ops still
|
|
295
|
-
appear as `applyOp`. It does not execute anything and it does not import the
|
|
296
|
-
engine.
|
|
297
|
-
|
|
298
|
-
Use `verifyPlan` before runtime handoff when an agent needs to prove a planned
|
|
299
|
-
action is internally consistent. It checks for non-JSON-safe action input,
|
|
300
|
-
unresolved refs, unparsable formulas, duplicate resolved refs, and missing
|
|
301
|
-
concrete ops for write, clear, and number-format commands that already target a
|
|
302
|
-
known single cell. Custom check targets and supporting refs must also resolve
|
|
303
|
-
through the model's `refsUsed` contract. Formula readback expectation inputs
|
|
304
|
-
must also resolve through `refsUsed`, and expectation formulas must be parseable.
|
|
305
|
-
Checks must start as `planned`; consumer code cannot mark a check passed or
|
|
306
|
-
failed before runtime proof.
|
|
307
|
-
Low-level `addOp` commands must contain valid `WorkbookOp` values, must still
|
|
308
|
-
appear in `plan.ops`, and must match their declared `target` when the op exposes
|
|
309
|
-
a concrete address or range.
|
|
310
|
-
Use `verifyModel` to plan and verify every action in a consumer-defined model
|
|
311
|
-
with one JSON-safe result. Pass `inputs` when specific actions require
|
|
312
|
-
parameters. Each successfully planned action also includes its runtime
|
|
313
|
-
requirements, so an agent can inspect the action manifest, planned intent,
|
|
314
|
-
static verification result, and adapter handoff checklist from the same object.
|
|
315
|
-
|
|
316
|
-
Use `runWorkbookPlan(plan, adapter)` or
|
|
317
|
-
`runWorkbookAction(model, actionName, adapter, input)` when an agent needs a
|
|
318
|
-
generic apply-and-prove loop. The adapter owns runtime execution and semantic
|
|
319
|
-
readback:
|
|
77
|
+
That is the core flow:
|
|
78
|
+
|
|
79
|
+
1. `defineModel` freezes a consumer-defined model.
|
|
80
|
+
2. `find` returns generic refs.
|
|
81
|
+
3. `checks` declares facts the runtime must prove.
|
|
82
|
+
4. An action builds workbook intent.
|
|
83
|
+
5. `verifyPlan` checks the plan without running an engine.
|
|
84
|
+
6. `describeRuntimeRequirements` tells an adapter what it must apply, read, and prove.
|
|
85
|
+
7. `runWorkbookPlan` applies the plan through a runtime-owned adapter and returns a boring result with check proof and apply proof when the adapter provides it.
|
|
86
|
+
|
|
87
|
+
## Public Contract
|
|
88
|
+
|
|
89
|
+
The main API is intentionally small:
|
|
90
|
+
|
|
91
|
+
- model: `defineModel`, `inspectModel`, `planWorkbookAction`, `buildWorkbookActionPlan`
|
|
92
|
+
- selectors: `findTable`, `findColumn`, `findRange`, `findName`, `findRows`, `find`
|
|
93
|
+
- checks: `check.exists`, `check.noFormulaErrors`, `check.valueEquals`, `check.formulaEquals`, `check.custom`
|
|
94
|
+
- formulas: `formula.add`, `formula.subtract`, `formula.multiply`, `formula.divide`, `formula.sum`, `formula.call`, `formula.raw`, `formula.text`
|
|
95
|
+
- proof: `verifyPlan`, `verifyModel`, `verifyWorkbookReadbacks`
|
|
96
|
+
- descriptions: `describeModel`, `describeRef`, `describePlan`, `describePlanResult`, `describeRuntimeRequirements`, `describeRunResult`
|
|
97
|
+
- runtime handoff: `runWorkbookPlan`, `runWorkbookAction`, `WorkbookRunAdapter`
|
|
98
|
+
- low-level language: `WorkbookOp`, `WorkbookTxn`, `EngineOp`, `EngineOpBatch`, `isEngineOpBatch`
|
|
99
|
+
|
|
100
|
+
Stable data helpers are exported for generic tool builders:
|
|
101
|
+
|
|
102
|
+
- `workbookRefKinds`, `isWorkbookRefKind`, `isWorkbookRef`
|
|
103
|
+
- `workbookRowOperators`, `workbookRowOperatorValueTypes`, `isWorkbookRowOperator`, `isWorkbookRowValueCompatible`
|
|
104
|
+
- `builtInWorkbookCheckKinds`, `isBuiltInWorkbookCheckKind`
|
|
105
|
+
- `workbookActionInputDescriptionKinds`, `isWorkbookActionInputDescriptionKind`, `isWorkbookActionInputDescription`, `isWorkbookActionInput`
|
|
106
|
+
- `workbookRunErrorCodes`, `isWorkbookRunErrorCode`
|
|
107
|
+
|
|
108
|
+
## Selectors
|
|
109
|
+
|
|
110
|
+
Selectors are not a human spreadsheet UI. They are stable intent for runtimes and
|
|
111
|
+
agents.
|
|
112
|
+
|
|
113
|
+
- `findTable({ headers })` means "find a table with all these headers." Header
|
|
114
|
+
order is normalized, duplicate headers are rejected, and matching is
|
|
115
|
+
case-sensitive after trimming.
|
|
116
|
+
- `findRows({ table, where })` means "find rows in this table matching this
|
|
117
|
+
predicate." `eq` and `neq` accept any JSON literal; `contains` and
|
|
118
|
+
`startsWith` accept strings; ordered comparisons accept numbers or strings.
|
|
119
|
+
- `findRange` is the escape hatch for an explicit range when the consumer really
|
|
120
|
+
has one. It validates and canonicalizes addresses before runtime handoff.
|
|
121
|
+
|
|
122
|
+
Refs are frozen data. Helpers such as `table.column("Total")` and
|
|
123
|
+
`rows.column("Total")` are non-enumerable, so JSON descriptions stay data-first.
|
|
124
|
+
|
|
125
|
+
## Formulas
|
|
126
|
+
|
|
127
|
+
`@bilig/workbook` creates formula expressions. `@bilig/formula` parses and
|
|
128
|
+
normalizes formula text. `@bilig/core` or an app runtime calculates it.
|
|
129
|
+
|
|
130
|
+
Formula helpers keep formula text and workbook dependencies separate. A planned
|
|
131
|
+
formula write includes both the formula string and the refs used to build it.
|
|
132
|
+
For custom formula text, use `formula.raw(source, { inputs })`. For spreadsheet
|
|
133
|
+
string literals, use `formula.text(value)`. Bare strings are not formula
|
|
134
|
+
operands because agents should not guess whether a string is code, a label, a
|
|
135
|
+
named range, or user text.
|
|
136
|
+
|
|
137
|
+
## Runtime Adapter
|
|
138
|
+
|
|
139
|
+
`@bilig/workbook` does not execute plans. A runtime owns that:
|
|
320
140
|
|
|
321
141
|
```ts
|
|
322
|
-
const
|
|
142
|
+
const adapter = {
|
|
323
143
|
apply(plan) {
|
|
324
|
-
|
|
144
|
+
const ops = materializeForThisRuntime(plan);
|
|
145
|
+
return {
|
|
146
|
+
status: "applied",
|
|
147
|
+
previewOps: ops,
|
|
148
|
+
appliedOps: ops,
|
|
149
|
+
proof: { source: "runtime", opCount: ops.length },
|
|
150
|
+
undo: { id: "undo-1" },
|
|
151
|
+
};
|
|
325
152
|
},
|
|
326
|
-
read(targets) {
|
|
327
|
-
return
|
|
153
|
+
read(targets, plan) {
|
|
154
|
+
return targets.map((target) => ({ target, value: 12 }));
|
|
328
155
|
},
|
|
329
|
-
|
|
156
|
+
verifyChecks(checks, plan) {
|
|
157
|
+
return checks.map((entry) => ({ ...entry, status: "passed" }));
|
|
158
|
+
},
|
|
159
|
+
};
|
|
330
160
|
```
|
|
331
161
|
|
|
332
|
-
`
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
`
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
162
|
+
`runWorkbookPlan` refuses to call `apply` if static plan verification fails.
|
|
163
|
+
If an adapter returns both `previewOps` and `appliedOps`, the result reports
|
|
164
|
+
whether they matched. If the adapter returns neither, the run records an
|
|
165
|
+
unverified apply fact. Use `runWorkbookPlan(plan, adapter, { requireApplyProof:
|
|
166
|
+
true })` when an agent must fail closed instead of accepting an unproved apply.
|
|
167
|
+
Readback checks attach proof to passed checks, such as
|
|
168
|
+
`{ source: "readback", value: 12 }` or
|
|
169
|
+
`{ source: "readback", formula: "(Table[Quantity])*(Table[Rate])" }`.
|
|
170
|
+
Generic check verifiers may only change `status` or add JSON-safe `proof`; they
|
|
171
|
+
cannot rewrite the check contract.
|
|
172
|
+
|
|
173
|
+
The result is deliberately plain:
|
|
174
|
+
|
|
175
|
+
```ts
|
|
176
|
+
type WorkbookRunResult =
|
|
177
|
+
| {
|
|
178
|
+
status: "done";
|
|
179
|
+
apply?: WorkbookRunApplySummary;
|
|
180
|
+
changed: WorkbookChangeSummary[];
|
|
181
|
+
checks: WorkbookCheckResult[];
|
|
182
|
+
undo?: WorkbookUndoRef;
|
|
183
|
+
unverified?: WorkbookRunUnverified[];
|
|
184
|
+
}
|
|
185
|
+
| {
|
|
186
|
+
status: "failed";
|
|
187
|
+
errors: WorkbookRunError[];
|
|
188
|
+
apply?: WorkbookRunApplySummary;
|
|
189
|
+
checks: WorkbookCheckResult[];
|
|
190
|
+
unverified?: WorkbookRunUnverified[];
|
|
191
|
+
};
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Low-Level Ops
|
|
195
|
+
|
|
196
|
+
Most models should use the small action API: `writeFormula`, `writeValue`,
|
|
197
|
+
`format`, `clear`, and checks. If a consumer needs the existing workbook
|
|
198
|
+
operation language directly, call `workbook.addOp(op, { target, message })`
|
|
199
|
+
inside an action.
|
|
200
|
+
|
|
201
|
+
The op is guarded with `isWorkbookOp`, cloned into `plan.ops`, and kept in the
|
|
202
|
+
command log. If a target is supplied and the op exposes a concrete range,
|
|
203
|
+
`verifyPlan` checks that the target and op agree.
|
|
204
|
+
|
|
205
|
+
## Example
|
|
206
|
+
|
|
207
|
+
See [examples/workbook-agent-model](../../examples/workbook-agent-model) for a
|
|
208
|
+
generic model that plans, verifies, describes, runs, and prints proof without
|
|
209
|
+
depending on a hardcoded business model.
|
package/dist/check.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface WorkbookCheckApi {
|
|
|
19
19
|
readonly custom: (options: WorkbookCustomCheckOptions) => WorkbookCheckResult;
|
|
20
20
|
}
|
|
21
21
|
export type WorkbookBuiltInCheckKind = 'exists' | 'noFormulaErrors' | 'valueEquals' | 'formulaEquals';
|
|
22
|
-
export declare const builtInWorkbookCheckKinds: readonly ("
|
|
22
|
+
export declare const builtInWorkbookCheckKinds: readonly ("exists" | "noFormulaErrors" | "valueEquals" | "formulaEquals")[];
|
|
23
23
|
export declare function isBuiltInWorkbookCheckKind(value: unknown): value is WorkbookBuiltInCheckKind;
|
|
24
24
|
export declare function createWorkbookCheckResult(kind: string, target: WorkbookRef, message: string): WorkbookCheckResult;
|
|
25
25
|
export declare function createWorkbookCustomCheck(options: WorkbookCustomCheckOptions): WorkbookCheckResult;
|
package/dist/check.js
CHANGED
|
@@ -46,14 +46,22 @@ function uniqueRefs(refs) {
|
|
|
46
46
|
}
|
|
47
47
|
function createWorkbookCheck(options) {
|
|
48
48
|
const refs = uniqueRefs(options.refs);
|
|
49
|
-
|
|
49
|
+
const expectation = options.expectation === undefined
|
|
50
|
+
? undefined
|
|
51
|
+
: options.expectation.kind === 'formulaEquals'
|
|
52
|
+
? Object.freeze({
|
|
53
|
+
...options.expectation,
|
|
54
|
+
inputs: Object.freeze([...options.expectation.inputs]),
|
|
55
|
+
})
|
|
56
|
+
: Object.freeze({ ...options.expectation });
|
|
57
|
+
return Object.freeze({
|
|
50
58
|
status: 'planned',
|
|
51
59
|
kind: requiredText(options.kind, 'kind'),
|
|
52
60
|
...(options.target !== undefined ? { target: options.target } : {}),
|
|
53
|
-
...(refs !== undefined ? { refs } : {}),
|
|
61
|
+
...(refs !== undefined ? { refs: Object.freeze([...refs]) } : {}),
|
|
54
62
|
message: requiredText(options.message, 'message'),
|
|
55
|
-
...(
|
|
56
|
-
};
|
|
63
|
+
...(expectation !== undefined ? { expectation } : {}),
|
|
64
|
+
});
|
|
57
65
|
}
|
|
58
66
|
export function createWorkbookCustomCheck(options) {
|
|
59
67
|
const kind = requiredText(options.kind, 'kind');
|
package/dist/check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,iBAAiB,CAAA;AAEnE,OAAO,EAAE,OAAO,EAA+B,MAAM,cAAc,CAAA;AA4BnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC;IACrD,QAAQ;IACR,iBAAiB;IACjB,aAAa;IACb,eAAe;CAC8B,CAAC,CAAA;AAEhD,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAA;AAC9F,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,MAAmB,EAAE,OAAe;IAC1F,OAAO,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AACvD,CAAC;AAMD,SAAS,YAAY,CAAC,KAAa,EAAE,IAAY;IAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,kBAAkB,CAAC,CAAA;IAC3D,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAmB;IAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IAC1E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,MAAM,CAAC,GAAgB;IAC9B,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,EAAE,CAAA;AAChC,CAAC;AAED,SAAS,UAAU,CAAC,IAAwC;IAC1D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,MAAM,GAAkB,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAkC;IAC7D,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,OAAO;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"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"}
|
package/dist/describe.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { WorkbookRef, WorkbookRefKind, WorkbookRowOperator } from './find.j
|
|
|
3
3
|
import { type WorkbookActionInspection, type WorkbookActionMap, type WorkbookActionPlan, type WorkbookActionPlanResult, type WorkbookModel } from './model.js';
|
|
4
4
|
import type { WorkbookActionInput } from './input.js';
|
|
5
5
|
import type { WorkbookOp } from './ops.js';
|
|
6
|
-
import type { WorkbookCheckStatus, WorkbookRunErrorCode, WorkbookRunResult } from './result.js';
|
|
6
|
+
import type { WorkbookCheckStatus, WorkbookRunErrorCode, WorkbookRunResult, WorkbookRunUnverifiedKind } from './result.js';
|
|
7
7
|
export interface WorkbookModelDescription {
|
|
8
8
|
readonly name: string;
|
|
9
9
|
readonly description?: string;
|
|
@@ -117,15 +117,29 @@ export interface WorkbookUndoRefDescription {
|
|
|
117
117
|
readonly id: string;
|
|
118
118
|
readonly ops?: readonly WorkbookOp[];
|
|
119
119
|
}
|
|
120
|
+
export interface WorkbookRunApplySummaryDescription {
|
|
121
|
+
readonly matched: boolean | null;
|
|
122
|
+
readonly previewOps?: readonly WorkbookOp[];
|
|
123
|
+
readonly appliedOps?: readonly WorkbookOp[];
|
|
124
|
+
readonly proof?: WorkbookActionInput;
|
|
125
|
+
}
|
|
126
|
+
export interface WorkbookRunUnverifiedDescription {
|
|
127
|
+
readonly kind: WorkbookRunUnverifiedKind;
|
|
128
|
+
readonly message: string;
|
|
129
|
+
}
|
|
120
130
|
export type WorkbookRunResultDescription = {
|
|
121
131
|
readonly status: 'done';
|
|
132
|
+
readonly apply?: WorkbookRunApplySummaryDescription;
|
|
122
133
|
readonly changed: readonly WorkbookChangeSummaryDescription[];
|
|
123
134
|
readonly checks: readonly WorkbookCheckResultDescription[];
|
|
124
135
|
readonly undo?: WorkbookUndoRefDescription;
|
|
136
|
+
readonly unverified?: readonly WorkbookRunUnverifiedDescription[];
|
|
125
137
|
} | {
|
|
126
138
|
readonly status: 'failed';
|
|
127
139
|
readonly errors: readonly WorkbookRunErrorDescription[];
|
|
140
|
+
readonly apply?: WorkbookRunApplySummaryDescription;
|
|
128
141
|
readonly checks: readonly WorkbookCheckResultDescription[];
|
|
142
|
+
readonly unverified?: readonly WorkbookRunUnverifiedDescription[];
|
|
129
143
|
};
|
|
130
144
|
export interface WorkbookRunErrorDescription {
|
|
131
145
|
readonly code: WorkbookRunErrorCode;
|