@bilig/headless 0.9.0 → 0.9.2

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 CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  [![npm: @bilig/headless](https://img.shields.io/npm/v/@bilig/headless?label=%40bilig%2Fheadless)](https://www.npmjs.com/package/@bilig/headless)
4
4
  [![GitHub](https://img.shields.io/badge/GitHub-proompteng%2Fbilig-blue)](https://github.com/proompteng/bilig)
5
+ [![GitHub Repo stars](https://img.shields.io/github/stars/proompteng/bilig?style=social)](https://github.com/proompteng/bilig/stargazers)
5
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](../../LICENSE)
6
7
 
7
8
  `@bilig/headless` is the production-targeted WorkPaper workbook facade for
@@ -45,6 +46,14 @@ Supported scope:
45
46
  - The contract is the WorkPaper/headless API exported by this package.
46
47
  - Excel-file ingestion belongs to import/export pipelines before data reaches
47
48
  `WorkPaper`; this package executes the validated WorkPaper workbook model.
49
+ - XLSX cached-result parity investigations are covered by the repository
50
+ verifier, not by the published package surface. Use
51
+ `pnpm workpaper:xlsx-corpus:check -- <xlsx-file-or-directory>` for external
52
+ corpora, and `pnpm workpaper:xlsx-corpus:fixtures:check` for the checked-in
53
+ issue #8 reduction corpus. The verifier compares deterministic cached formula
54
+ results and skips volatile or environment-dependent formulas such as `NOW()`
55
+ and `CELL("filename")`; unsupported deterministic formulas remain visible as
56
+ mismatches instead of being silently accepted.
48
57
  - Custom function plugins and callback hooks are runtime registrations. Persist
49
58
  workbook data with the helpers below, then register custom behavior in
50
59
  application code before restore.
@@ -69,6 +78,8 @@ Repository:
69
78
  - npm: <https://www.npmjs.com/package/@bilig/headless>
70
79
  - runnable example:
71
80
  [`examples/headless-workpaper`](../../examples/headless-workpaper)
81
+ - public adoption kit:
82
+ [`docs/public-adoption-kit.md`](../../docs/public-adoption-kit.md)
72
83
 
73
84
  Inside this monorepo:
74
85
 
@@ -147,6 +158,10 @@ npm start
147
158
  Repository CI also runs the same example against packed local runtime packages
148
159
  through `pnpm workpaper:smoke:external`.
149
160
 
161
+ For a concise evaluator-facing summary with copy-paste npm commands, proof
162
+ links, shareable copy, and overclaim guardrails, use the root
163
+ [`Public Adoption Kit`](../../docs/public-adoption-kit.md).
164
+
150
165
  ## Core Concepts
151
166
 
152
167
  - `WorkPaper` is the top-level workbook object. Create it with
@@ -157,6 +172,11 @@ through `pnpm workpaper:smoke:external`.
157
172
  - A string beginning with `=` is a formula. Other strings are literal text.
158
173
  `null` clears a cell.
159
174
  - `getCellValue()` returns a computed `CellValue`.
175
+ - `getCellDisplayValue()` returns the formatted user-facing text for a cell,
176
+ including workbook error text such as `#VALUE!`.
177
+ - `getCellFormulaDiagnostics()` returns structured formula diagnostics for
178
+ supported error families, including financial cash-flow/date validation for
179
+ `XIRR()` and `XNPV()`.
160
180
  - `getCellFormula()` returns the formula text when the cell is a formula.
161
181
  - `getCellSerialized()` returns the persisted cell input shape.
162
182
  - Mutation methods return WorkPaper change arrays. Empty arrays are valid when
@@ -194,6 +214,27 @@ workbook.getSheetValues(sheet)
194
214
  workbook.getSheetSerialized(sheet)
195
215
  ```
196
216
 
217
+ Inspect a formula error:
218
+
219
+ ```ts
220
+ const value = workbook.getCellValue(at(7, 1))
221
+ const display = workbook.getCellDisplayValue(at(7, 1))
222
+ const diagnostics = workbook.getCellFormulaDiagnostics(at(7, 1))
223
+
224
+ console.log(value) // Raw CellValue protocol object
225
+ console.log(display) // "#VALUE!"
226
+ console.log(diagnostics[0]?.code) // e.g. "financial-unsupported-date-coercion"
227
+ ```
228
+
229
+ Finance date inputs:
230
+
231
+ `XIRR(values, dates, [guess])` and `XNPV(rate, values, dates)` accept numeric
232
+ Excel serial dates in `dates`. Text labels and text date strings are not
233
+ coerced in headless formulas; they evaluate to `#VALUE!`. Use
234
+ `getCellFormulaDiagnostics()` to distinguish invalid date ranges, mismatched
235
+ range dimensions, invalid cash-flow values, missing positive or negative cash
236
+ flows, invalid rates/guesses, and solver non-convergence.
237
+
197
238
  Batch related edits:
198
239
 
199
240
  ```ts
@@ -203,6 +244,39 @@ const changes = workbook.batch(() => {
203
244
  })
204
245
  ```
205
246
 
247
+ Create and read named expressions:
248
+
249
+ ```ts
250
+ import { WorkPaper, type WorkPaperCellAddress } from '@bilig/headless'
251
+
252
+ const workbook = WorkPaper.buildFromSheets({
253
+ Plan: [
254
+ ['Metric', 'Value'],
255
+ ['Base revenue', 100],
256
+ ['Target revenue', null],
257
+ ],
258
+ })
259
+
260
+ const sheet = workbook.getSheetId('Plan')
261
+ if (sheet === undefined) {
262
+ throw new Error('Plan sheet was not created')
263
+ }
264
+
265
+ const at = (row: number, col: number): WorkPaperCellAddress => ({
266
+ sheet,
267
+ row,
268
+ col,
269
+ })
270
+
271
+ workbook.addNamedExpression('GrowthRate', 0.15)
272
+ workbook.setCellContents(at(2, 1), '=B2*(1+GrowthRate)')
273
+
274
+ console.log(workbook.getNamedExpressionValue('GrowthRate')) // CellValue for 0.15
275
+ console.log(workbook.getNamedExpressionFormula('GrowthRate')) // undefined for a scalar name
276
+ console.log(workbook.getCellValue(at(2, 1))) // CellValue for 115
277
+ console.log(workbook.getNamedExpressionValue('MissingName')) // undefined
278
+ ```
279
+
206
280
  Move cells inside configured bounds:
207
281
 
208
282
  ```ts
@@ -236,6 +310,39 @@ const saved = serializeWorkPaperDocument(exportWorkPaperDocument(workbook, { inc
236
310
  const restored = createWorkPaperFromDocument(parseWorkPaperDocument(saved))
237
311
  ```
238
312
 
313
+ Validate a persisted document before restore:
314
+
315
+ ```ts
316
+ import {
317
+ WorkPaper,
318
+ createWorkPaperFromDocument,
319
+ exportWorkPaperDocument,
320
+ isPersistedWorkPaperDocument,
321
+ parseWorkPaperDocument,
322
+ serializeWorkPaperDocument,
323
+ } from '@bilig/headless'
324
+
325
+ const workbook = WorkPaper.buildFromSheets({
326
+ Sheet1: [[10, '=A1*2']],
327
+ })
328
+
329
+ const document = exportWorkPaperDocument(workbook, { includeConfig: true })
330
+ const serialized = serializeWorkPaperDocument(document)
331
+
332
+ const parsed = parseWorkPaperDocument(serialized)
333
+ if (!isPersistedWorkPaperDocument(parsed)) {
334
+ throw new Error('Persisted WorkPaper document failed validation')
335
+ }
336
+
337
+ const restored = createWorkPaperFromDocument(parsed)
338
+ ```
339
+
340
+ `parseWorkPaperDocument()` validates JSON and throws on invalid payloads.
341
+ `isPersistedWorkPaperDocument()` is useful when a service already has an
342
+ unknown parsed object. Custom function implementations, callback hooks, and
343
+ other process state are not persisted; register those in application code before
344
+ restoring the workbook.
345
+
239
346
  ## Persistence Contract
240
347
 
241
348
  `@bilig/headless` persists:
@@ -0,0 +1,18 @@
1
+ import { type CellValue } from '@bilig/protocol';
2
+ import type { WorkPaperCellAddress, WorkPaperCellRange, WorkPaperFormulaDiagnostic } from './work-paper-types.js';
3
+ interface WorkPaperFormulaDiagnosticHooks {
4
+ readonly getCellValue: (address: WorkPaperCellAddress) => CellValue;
5
+ readonly getCellValueFormat: (address: WorkPaperCellAddress) => string | undefined;
6
+ readonly getCellFormula: (address: WorkPaperCellAddress) => string | undefined;
7
+ readonly getRangeValues: (range: WorkPaperCellRange) => CellValue[][];
8
+ readonly getSheetId: (sheetName: string) => number | undefined;
9
+ readonly getSheetName: (sheetId: number) => string | undefined;
10
+ readonly simpleCellAddressToString: (address: WorkPaperCellAddress, options?: {
11
+ includeSheetName?: boolean;
12
+ }) => string;
13
+ readonly simpleCellRangeToString: (range: WorkPaperCellRange, options?: {
14
+ includeSheetName?: boolean;
15
+ }) => string;
16
+ }
17
+ export declare function collectWorkPaperFormulaDiagnostics(address: WorkPaperCellAddress, hooks: WorkPaperFormulaDiagnosticHooks): WorkPaperFormulaDiagnostic[];
18
+ export {};
@@ -0,0 +1,301 @@
1
+ import { ValueTag, formatCellDisplayValue, formatErrorCode } from '@bilig/protocol';
2
+ import { excelSerialToDateParts, parseCellAddress, parseFormula, parseRangeAddress } from '@bilig/formula';
3
+ function readFinanceFunctionName(callee) {
4
+ const normalized = callee.toUpperCase();
5
+ if (normalized === 'XIRR' || normalized === 'XNPV') {
6
+ return normalized;
7
+ }
8
+ return undefined;
9
+ }
10
+ function isFinanceCall(node) {
11
+ return node.kind === 'CallExpr' && readFinanceFunctionName(node.callee) !== undefined;
12
+ }
13
+ function buildDiagnostic(base, diagnostic) {
14
+ return {
15
+ severity: 'error',
16
+ address: base.address,
17
+ sheetName: base.sheetName,
18
+ a1: base.a1,
19
+ ...(base.formula !== undefined ? { formula: base.formula } : {}),
20
+ ...(base.functionName !== undefined ? { functionName: base.functionName } : {}),
21
+ ...(base.errorCode !== undefined ? { errorCode: base.errorCode } : {}),
22
+ ...(base.errorText !== undefined ? { errorText: base.errorText } : {}),
23
+ ...diagnostic,
24
+ };
25
+ }
26
+ function displayValue(value, format) {
27
+ const rendered = formatCellDisplayValue(value, format);
28
+ return rendered === '' ? '<blank>' : rendered;
29
+ }
30
+ function describeCellValue(value, format) {
31
+ switch (value.tag) {
32
+ case ValueTag.Empty:
33
+ return 'blank';
34
+ case ValueTag.Boolean:
35
+ return `boolean ${value.value ? 'TRUE' : 'FALSE'}`;
36
+ case ValueTag.String:
37
+ return `text "${value.value}"`;
38
+ case ValueTag.Error:
39
+ return `error ${formatErrorCode(value.code)}`;
40
+ case ValueTag.Number:
41
+ return `number ${displayValue(value, format)}`;
42
+ }
43
+ }
44
+ function resolveRangeNode(node, ownerSheetName, hooks) {
45
+ if (node.refKind !== 'cells') {
46
+ return undefined;
47
+ }
48
+ const parsed = parseRangeAddress(`${node.start}:${node.end}`, node.sheetName ?? ownerSheetName);
49
+ if (parsed.kind !== 'cells') {
50
+ return undefined;
51
+ }
52
+ const sheetName = parsed.sheetName ?? ownerSheetName;
53
+ const sheet = hooks.getSheetId(sheetName);
54
+ if (sheet === undefined) {
55
+ return undefined;
56
+ }
57
+ const range = {
58
+ start: { sheet, row: parsed.start.row, col: parsed.start.col },
59
+ end: { sheet, row: parsed.end.row, col: parsed.end.col },
60
+ };
61
+ const matrix = hooks.getRangeValues(range);
62
+ const values = [];
63
+ const addresses = [];
64
+ for (let rowOffset = 0; rowOffset < matrix.length; rowOffset += 1) {
65
+ const row = matrix[rowOffset] ?? [];
66
+ for (let colOffset = 0; colOffset < (row.length || range.end.col - range.start.col + 1); colOffset += 1) {
67
+ values.push(row[colOffset] ?? { tag: ValueTag.Empty });
68
+ addresses.push({ sheet, row: range.start.row + rowOffset, col: range.start.col + colOffset });
69
+ }
70
+ }
71
+ return {
72
+ rows: range.end.row - range.start.row + 1,
73
+ cols: range.end.col - range.start.col + 1,
74
+ values,
75
+ addresses,
76
+ reference: hooks.simpleCellRangeToString(range, { includeSheetName: true }),
77
+ };
78
+ }
79
+ function resolveCellNode(node, ownerSheetName, hooks) {
80
+ const parsed = parseCellAddress(node.ref, node.sheetName ?? ownerSheetName);
81
+ const sheetName = parsed.sheetName ?? ownerSheetName;
82
+ const sheet = hooks.getSheetId(sheetName);
83
+ if (sheet === undefined) {
84
+ return undefined;
85
+ }
86
+ const address = { sheet, row: parsed.row, col: parsed.col };
87
+ return {
88
+ rows: 1,
89
+ cols: 1,
90
+ values: [hooks.getCellValue(address)],
91
+ addresses: [address],
92
+ reference: hooks.simpleCellAddressToString(address, { includeSheetName: true }),
93
+ };
94
+ }
95
+ function resolveCellArgument(node, ownerSheetName, hooks) {
96
+ if (node?.kind === 'RangeRef') {
97
+ return resolveRangeNode(node, ownerSheetName, hooks);
98
+ }
99
+ if (node?.kind === 'CellRef') {
100
+ return resolveCellNode(node, ownerSheetName, hooks);
101
+ }
102
+ return undefined;
103
+ }
104
+ function resolveScalarNumber(node, ownerSheetName, hooks) {
105
+ if (node === undefined) {
106
+ return undefined;
107
+ }
108
+ if (node.kind === 'NumberLiteral') {
109
+ return Number.isFinite(node.value) ? node.value : undefined;
110
+ }
111
+ if (node.kind !== 'CellRef') {
112
+ return undefined;
113
+ }
114
+ const resolved = resolveCellNode(node, ownerSheetName, hooks);
115
+ const value = resolved?.values[0];
116
+ return value?.tag === ValueTag.Number && Number.isFinite(value.value) ? value.value : undefined;
117
+ }
118
+ function firstInvalidNumber(cells) {
119
+ for (let index = 0; index < cells.values.length; index += 1) {
120
+ const value = cells.values[index];
121
+ if (value.tag !== ValueTag.Number || !Number.isFinite(value.value)) {
122
+ return { value, address: cells.addresses[index] };
123
+ }
124
+ }
125
+ return undefined;
126
+ }
127
+ function firstInvalidDateSerial(cells) {
128
+ for (let index = 0; index < cells.values.length; index += 1) {
129
+ const value = cells.values[index];
130
+ if (value.tag !== ValueTag.Number) {
131
+ return { value, address: cells.addresses[index], unsupportedCoercion: value.tag === ValueTag.String };
132
+ }
133
+ if (!Number.isFinite(value.value) || excelSerialToDateParts(value.value) === undefined) {
134
+ return { value, address: cells.addresses[index], unsupportedCoercion: false };
135
+ }
136
+ }
137
+ return undefined;
138
+ }
139
+ function numericValues(cells) {
140
+ return cells.values.map((value) => (value.tag === ValueTag.Number ? value.value : Number.NaN));
141
+ }
142
+ function dateSerialValues(cells) {
143
+ return cells.values.map((value) => (value.tag === ValueTag.Number ? Math.trunc(value.value) : Number.NaN));
144
+ }
145
+ function diagnoseFinanceCall(call, base, ownerSheetName, hooks) {
146
+ const functionName = readFinanceFunctionName(call.callee);
147
+ if (functionName === undefined) {
148
+ return [
149
+ buildDiagnostic(base, {
150
+ code: 'formula-error',
151
+ message: `Formula evaluated to ${base.errorText ?? 'an error'}.`,
152
+ }),
153
+ ];
154
+ }
155
+ const valuesArg = functionName === 'XNPV' ? call.args[1] : call.args[0];
156
+ const datesArg = functionName === 'XNPV' ? call.args[2] : call.args[1];
157
+ const values = resolveCellArgument(valuesArg, ownerSheetName, hooks);
158
+ const dates = resolveCellArgument(datesArg, ownerSheetName, hooks);
159
+ const financeBase = { ...base, functionName };
160
+ if (!values || !dates) {
161
+ return [
162
+ buildDiagnostic(financeBase, {
163
+ code: 'financial-invalid-argument',
164
+ message: `${functionName} diagnostics require direct cell or cell-range cash-flow and date arguments.`,
165
+ }),
166
+ ];
167
+ }
168
+ if (values.rows !== dates.rows || values.cols !== dates.cols) {
169
+ return [
170
+ buildDiagnostic(financeBase, {
171
+ code: 'financial-mismatched-dimensions',
172
+ message: `${functionName} values range ${values.reference} is ${values.rows}x${values.cols}, but dates range ${dates.reference} is ${dates.rows}x${dates.cols}.`,
173
+ references: [values.reference, dates.reference],
174
+ }),
175
+ ];
176
+ }
177
+ const invalidCashFlow = firstInvalidNumber(values);
178
+ if (invalidCashFlow) {
179
+ const cell = hooks.simpleCellAddressToString(invalidCashFlow.address, { includeSheetName: true });
180
+ return [
181
+ buildDiagnostic(financeBase, {
182
+ code: 'financial-invalid-cash-flow',
183
+ message: `${functionName} cash-flow range ${values.reference} contains ${describeCellValue(invalidCashFlow.value, hooks.getCellValueFormat(invalidCashFlow.address))} at ${cell}; every cash-flow cell must be numeric.`,
184
+ references: [values.reference, cell],
185
+ }),
186
+ ];
187
+ }
188
+ const invalidDate = firstInvalidDateSerial(dates);
189
+ if (invalidDate) {
190
+ const cell = hooks.simpleCellAddressToString(invalidDate.address, { includeSheetName: true });
191
+ const code = invalidDate.unsupportedCoercion ? 'financial-unsupported-date-coercion' : 'financial-invalid-date-range';
192
+ const text = invalidDate.unsupportedCoercion
193
+ ? `${functionName} date range ${dates.reference} contains ${describeCellValue(invalidDate.value, hooks.getCellValueFormat(invalidDate.address))} at ${cell}. Use numeric Excel serial dates; text date coercion is not supported for headless ${functionName}.`
194
+ : `${functionName} date range ${dates.reference} contains ${describeCellValue(invalidDate.value, hooks.getCellValueFormat(invalidDate.address))} at ${cell}; dates must be valid numeric Excel serial dates.`;
195
+ return [
196
+ buildDiagnostic(financeBase, {
197
+ code,
198
+ message: text,
199
+ references: [dates.reference, cell],
200
+ }),
201
+ ];
202
+ }
203
+ const cashFlows = numericValues(values);
204
+ if (!cashFlows.some((value) => value > 0)) {
205
+ return [
206
+ buildDiagnostic(financeBase, {
207
+ code: 'financial-missing-positive-cash-flow',
208
+ message: `${functionName} cash-flow range ${values.reference} must contain at least one positive value.`,
209
+ references: [values.reference],
210
+ }),
211
+ ];
212
+ }
213
+ if (!cashFlows.some((value) => value < 0)) {
214
+ return [
215
+ buildDiagnostic(financeBase, {
216
+ code: 'financial-missing-negative-cash-flow',
217
+ message: `${functionName} cash-flow range ${values.reference} must contain at least one negative value.`,
218
+ references: [values.reference],
219
+ }),
220
+ ];
221
+ }
222
+ const dateSerials = dateSerialValues(dates);
223
+ const firstDate = dateSerials[0];
224
+ if (firstDate !== undefined && dateSerials.some((date) => date < firstDate)) {
225
+ return [
226
+ buildDiagnostic(financeBase, {
227
+ code: 'financial-invalid-date-range',
228
+ message: `${functionName} date range ${dates.reference} contains a date before the first date; XIRR/XNPV require later cash-flow dates to be on or after the first date.`,
229
+ references: [dates.reference],
230
+ }),
231
+ ];
232
+ }
233
+ if (functionName === 'XNPV') {
234
+ const rate = resolveScalarNumber(call.args[0], ownerSheetName, hooks);
235
+ if (rate === undefined || rate <= -0.999999999) {
236
+ return [
237
+ buildDiagnostic(financeBase, {
238
+ code: 'financial-invalid-rate',
239
+ message: 'XNPV discount rate must be a finite numeric value greater than -100%.',
240
+ }),
241
+ ];
242
+ }
243
+ }
244
+ if (functionName === 'XIRR' && call.args[2] !== undefined) {
245
+ const guess = resolveScalarNumber(call.args[2], ownerSheetName, hooks);
246
+ if (guess === undefined) {
247
+ return [
248
+ buildDiagnostic(financeBase, {
249
+ code: 'financial-invalid-rate',
250
+ message: 'XIRR optional guess must be a finite numeric value.',
251
+ }),
252
+ ];
253
+ }
254
+ }
255
+ return [
256
+ buildDiagnostic(financeBase, {
257
+ code: 'financial-nonconvergence',
258
+ message: `${functionName} inputs are structurally valid, but the solver did not find a valid rate for the supplied cash flows and dates.`,
259
+ references: [values.reference, dates.reference],
260
+ }),
261
+ ];
262
+ }
263
+ export function collectWorkPaperFormulaDiagnostics(address, hooks) {
264
+ const value = hooks.getCellValue(address);
265
+ const formula = hooks.getCellFormula(address);
266
+ if (value.tag !== ValueTag.Error || formula === undefined) {
267
+ return [];
268
+ }
269
+ const sheetName = hooks.getSheetName(address.sheet) ?? String(address.sheet);
270
+ const a1 = hooks.simpleCellAddressToString(address, { includeSheetName: false });
271
+ const base = {
272
+ address,
273
+ sheetName,
274
+ a1,
275
+ formula,
276
+ errorCode: value.code,
277
+ errorText: formatErrorCode(value.code),
278
+ };
279
+ let parsed;
280
+ try {
281
+ parsed = parseFormula(formula);
282
+ }
283
+ catch {
284
+ return [
285
+ buildDiagnostic(base, {
286
+ code: 'formula-error',
287
+ message: `Formula evaluated to ${formatErrorCode(value.code)}.`,
288
+ }),
289
+ ];
290
+ }
291
+ if (isFinanceCall(parsed)) {
292
+ return diagnoseFinanceCall(parsed, base, sheetName, hooks);
293
+ }
294
+ return [
295
+ buildDiagnostic(base, {
296
+ code: 'formula-error',
297
+ message: `Formula evaluated to ${formatErrorCode(value.code)}.`,
298
+ }),
299
+ ];
300
+ }
301
+ //# sourceMappingURL=work-paper-formula-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"work-paper-formula-diagnostics.js","sourceRoot":"","sources":["../src/work-paper-formula-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import type { SpreadsheetEngine } from '@bilig/core';
2
2
  import type { CellValue } from '@bilig/protocol';
3
3
  import type { WorkPaperEmitter } from './work-paper-emitter.js';
4
4
  import { type InternalFunctionBinding } from './work-paper-function-registry.js';
5
- import type { RawCellContent, SerializedWorkPaperNamedExpression, WorkPaperAddressMappingAdapter, WorkPaperArrayMappingAdapter, WorkPaperCellAddress, WorkPaperCellRange, WorkPaperColumnSearchAdapter, WorkPaperConfig, WorkPaperDateTime, WorkPaperDependencyGraphAdapter, WorkPaperEvaluatorAdapter, WorkPaperFunctionPluginDefinition, WorkPaperFunctionTranslationsPackage, WorkPaperGraphAdapter, WorkPaperLanguagePackage, WorkPaperLazilyTransformingAstServiceAdapter, WorkPaperLicenseKeyValidityState, WorkPaperRangeMappingAdapter, WorkPaperSheet, WorkPaperSheetMappingAdapter, WorkPaperEngineCounters, WorkPaperDetailedListener, WorkPaperEventName, WorkPaperInternals, WorkPaperListener } from './work-paper-types.js';
5
+ import type { RawCellContent, SerializedWorkPaperNamedExpression, WorkPaperAddressMappingAdapter, WorkPaperArrayMappingAdapter, WorkPaperCellAddress, WorkPaperCellRange, WorkPaperFormulaDiagnostic, WorkPaperColumnSearchAdapter, WorkPaperConfig, WorkPaperDateTime, WorkPaperDependencyGraphAdapter, WorkPaperEvaluatorAdapter, WorkPaperFunctionPluginDefinition, WorkPaperFunctionTranslationsPackage, WorkPaperGraphAdapter, WorkPaperLanguagePackage, WorkPaperLazilyTransformingAstServiceAdapter, WorkPaperLicenseKeyValidityState, WorkPaperRangeMappingAdapter, WorkPaperSheet, WorkPaperSheetMappingAdapter, WorkPaperEngineCounters, WorkPaperDetailedListener, WorkPaperEventName, WorkPaperInternals, WorkPaperListener } from './work-paper-types.js';
6
6
  import { WorkPaperCapabilitySurface } from './work-paper-capability-surface.js';
7
7
  export declare abstract class WorkPaperPublicSurface extends WorkPaperCapabilitySurface {
8
8
  static version: string;
@@ -62,6 +62,8 @@ export declare abstract class WorkPaperPublicSurface extends WorkPaperCapability
62
62
  resetPerformanceCounters(): void;
63
63
  normalizeFormula(formula: string): string;
64
64
  calculateFormula(formula: string, scope?: number): CellValue | CellValue[][];
65
+ getCellDisplayValue(address: WorkPaperCellAddress): string;
66
+ getCellFormulaDiagnostics(address: WorkPaperCellAddress): WorkPaperFormulaDiagnostic[];
65
67
  getNamedExpressionsFromFormula(formula: string): string[];
66
68
  validateFormula(formula: string): boolean;
67
69
  getRegisteredFunctionNames(languageCode?: string): string[];
@@ -1,6 +1,8 @@
1
+ import { formatCellDisplayValue } from '@bilig/protocol';
1
2
  import { checkWorkPaperLicenseKeyValidity, cloneConfig, DEFAULT_CONFIG } from './work-paper-config.js';
2
3
  import { numberToWorkPaperDate, numberToWorkPaperDateTime, numberToWorkPaperTime } from './work-paper-date-time.js';
3
4
  import { calculateWorkPaperFormula, getWorkPaperNamedExpressionsFromFormula, normalizeWorkPaperFormula, validateWorkPaperFormula, } from './work-paper-formula-analysis.js';
5
+ import { collectWorkPaperFormulaDiagnostics } from './work-paper-formula-diagnostics.js';
4
6
  import { getCapturedWorkPaperFunctionPlugin, getCapturedWorkPaperFunctionPlugins, listCapturedWorkPaperFunctionNames, } from './work-paper-function-registry.js';
5
7
  import { getRegisteredWorkPaperFunctionPluginById, getRegisteredWorkPaperFunctionPluginsById, readRegisteredWorkPaperLanguage, } from './work-paper-static-registry.js';
6
8
  import { DEFAULT_WORKPAPER_CONFIG, getAllWorkPaperStaticFunctionPlugins, getRegisteredWorkPaperStaticFunctionNames, getRegisteredWorkPaperStaticLanguageCodes, getWorkPaperStaticFunctionPlugin, getWorkPaperStaticLanguage, registerWorkPaperStaticFunction, registerWorkPaperStaticFunctionPlugin, registerWorkPaperStaticLanguage, unregisterAllWorkPaperStaticFunctions, unregisterWorkPaperStaticFunction, unregisterWorkPaperStaticFunctionPlugin, unregisterWorkPaperStaticLanguage, workPaperLanguages, WORKPAPER_BUILD_DATE, WORKPAPER_RELEASE_DATE, WORKPAPER_VERSION, } from './work-paper-static-api.js';
@@ -126,6 +128,21 @@ export class WorkPaperPublicSurface extends WorkPaperCapabilitySurface {
126
128
  messageOf: (error, fallback) => this.messageOf(error, fallback),
127
129
  });
128
130
  }
131
+ getCellDisplayValue(address) {
132
+ return formatCellDisplayValue(this.getCellValue(address), this.getCellValueFormat(address));
133
+ }
134
+ getCellFormulaDiagnostics(address) {
135
+ return collectWorkPaperFormulaDiagnostics(address, {
136
+ getCellValue: (target) => this.getCellValue(target),
137
+ getCellValueFormat: (target) => this.getCellValueFormat(target),
138
+ getCellFormula: (target) => this.getCellFormula(target),
139
+ getRangeValues: (range) => this.getRangeValues(range),
140
+ getSheetId: (sheetName) => this.sheetMapping.getSheetId(sheetName),
141
+ getSheetName: (sheetId) => this.sheetMapping.getSheetName(sheetId),
142
+ simpleCellAddressToString: (target, options) => this.simpleCellAddressToString(target, options),
143
+ simpleCellRangeToString: (range, options) => this.simpleCellRangeToString(range, options),
144
+ });
145
+ }
129
146
  getNamedExpressionsFromFormula(formula) {
130
147
  return getWorkPaperNamedExpressionsFromFormula(formula, { messageOf: (error, fallback) => this.messageOf(error, fallback) });
131
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"work-paper-public-surface.js","sourceRoot":"","sources":["../src/work-paper-public-surface.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"work-paper-public-surface.js","sourceRoot":"","sources":["../src/work-paper-public-surface.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CellValue, LiteralInput, RecalcMetrics } from '@bilig/protocol';
1
+ import type { CellValue, ErrorCode, LiteralInput, RecalcMetrics } from '@bilig/protocol';
2
2
  import type { EvaluationResult } from '@bilig/formula';
3
3
  import type { EngineCounters } from '@bilig/core';
4
4
  export type RawCellContent = LiteralInput | string;
@@ -202,6 +202,21 @@ export type WorkPaperDetailedListener<EventName extends WorkPaperEventName> = (p
202
202
  export type WorkPaperCellType = 'EMPTY' | 'VALUE' | 'FORMULA' | 'ARRAY';
203
203
  export type WorkPaperCellValueType = 'EMPTY' | 'NUMBER' | 'STRING' | 'BOOLEAN' | 'ERROR';
204
204
  export type WorkPaperCellValueDetailedType = WorkPaperCellValueType | 'DATE' | 'TIME' | 'DATETIME';
205
+ export type WorkPaperFormulaDiagnosticSeverity = 'error' | 'warning' | 'info';
206
+ export type WorkPaperFormulaDiagnosticCode = 'formula-error' | 'financial-invalid-argument' | 'financial-invalid-cash-flow' | 'financial-unsupported-date-coercion' | 'financial-invalid-date-range' | 'financial-mismatched-dimensions' | 'financial-missing-positive-cash-flow' | 'financial-missing-negative-cash-flow' | 'financial-invalid-rate' | 'financial-nonconvergence';
207
+ export interface WorkPaperFormulaDiagnostic {
208
+ severity: WorkPaperFormulaDiagnosticSeverity;
209
+ code: WorkPaperFormulaDiagnosticCode;
210
+ message: string;
211
+ address: WorkPaperCellAddress;
212
+ sheetName: string;
213
+ a1: string;
214
+ formula?: string;
215
+ functionName?: string;
216
+ errorCode?: ErrorCode;
217
+ errorText?: string;
218
+ references?: string[];
219
+ }
205
220
  export type WorkPaperDependencyRef = {
206
221
  kind: 'cell';
207
222
  address: WorkPaperCellAddress;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bilig/headless",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Headless spreadsheet engine and WorkPaper workbook facade for Node services, coding agents, and HyperFormula-style workflows.",
5
5
  "keywords": [
6
6
  "agent",
@@ -49,9 +49,9 @@
49
49
  "build": "rm -rf dist tsconfig.tsbuildinfo && tsc -p tsconfig.json"
50
50
  },
51
51
  "dependencies": {
52
- "@bilig/core": "0.9.0",
53
- "@bilig/formula": "0.9.0",
54
- "@bilig/protocol": "0.9.0"
52
+ "@bilig/core": "0.9.2",
53
+ "@bilig/formula": "0.9.2",
54
+ "@bilig/protocol": "0.9.2"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=24.0.0"