@cavelang/scenario 0.29.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/Authors.md +5 -0
- package/License.md +6 -0
- package/README.md +146 -0
- package/dist/src/bind.d.ts +6 -0
- package/dist/src/bind.d.ts.map +1 -0
- package/dist/src/bind.js +347 -0
- package/dist/src/bind.js.map +1 -0
- package/dist/src/error.d.ts +7 -0
- package/dist/src/error.d.ts.map +1 -0
- package/dist/src/error.js +11 -0
- package/dist/src/error.js.map +1 -0
- package/dist/src/exact.d.ts +13 -0
- package/dist/src/exact.d.ts.map +1 -0
- package/dist/src/exact.js +65 -0
- package/dist/src/exact.js.map +1 -0
- package/dist/src/explain.d.ts +5 -0
- package/dist/src/explain.d.ts.map +1 -0
- package/dist/src/explain.js +59 -0
- package/dist/src/explain.js.map +1 -0
- package/dist/src/index.d.ts +7 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/model.d.ts +141 -0
- package/dist/src/model.d.ts.map +1 -0
- package/dist/src/model.js +2 -0
- package/dist/src/model.js.map +1 -0
- package/dist/src/record.d.ts +100 -0
- package/dist/src/record.d.ts.map +1 -0
- package/dist/src/record.js +189 -0
- package/dist/src/record.js.map +1 -0
- package/package.json +61 -0
- package/src/bind.ts +401 -0
- package/src/error.ts +22 -0
- package/src/exact.ts +93 -0
- package/src/explain.ts +68 -0
- package/src/index.ts +7 -0
- package/src/model.ts +120 -0
- package/src/record.ts +299 -0
package/Authors.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Authors
|
|
2
|
+
|
|
3
|
+
By adding their name to this file, all listed authors confirm they have copyright over their contributions to this project and are waiving these rights, placing their work in the public domain in accordance with the CC0 1.0 Universal Public Domain Dedication.
|
|
4
|
+
|
|
5
|
+
- Mirek Rusin (Switzerland)
|
package/License.md
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
|
|
2
|
+
|
|
3
|
+
To the extent possible under law, the authors listed in [Authors.md](./Authors.md) have waived all copyright and related or neighboring rights to this software and associated documentation files (the "Software").
|
|
4
|
+
|
|
5
|
+
For more information, please see:
|
|
6
|
+
https://creativecommons.org/publicdomain/zero/1.0/
|
package/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# `@cavelang/scenario`
|
|
2
|
+
|
|
3
|
+
Typed, replayable inputs for decision evaluators and formal solver models.
|
|
4
|
+
The package binds ordinary CAVE-Q patterns against an explicit transaction-
|
|
5
|
+
and valid-time snapshot, then overlays hypothetical CAVE claims inside a
|
|
6
|
+
rolled-back savepoint. The returned record is plain immutable data; no
|
|
7
|
+
database transaction remains open while an evaluator or Wasm solver runs.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { bind, explanationContext, Model } from '@cavelang/scenario'
|
|
11
|
+
|
|
12
|
+
const definition: Model.Definition = {
|
|
13
|
+
id: 'architecture-choice',
|
|
14
|
+
modelDigest: `sha256:${'0'.repeat(64)}`, // use the real model digest
|
|
15
|
+
snapshot: {
|
|
16
|
+
aliases: 'exact',
|
|
17
|
+
resolution: 'winner',
|
|
18
|
+
minimumConfidence: 0.5
|
|
19
|
+
},
|
|
20
|
+
overlay: 'system HAS team-size: 12 people',
|
|
21
|
+
bindings: [{
|
|
22
|
+
id: 'team-size',
|
|
23
|
+
query: 'system HAS team-size: ?n',
|
|
24
|
+
select: 'n',
|
|
25
|
+
expected: { kind: 'integer', unit: 'people' },
|
|
26
|
+
cardinality: 'one',
|
|
27
|
+
scenarioOverride: true,
|
|
28
|
+
policies: {
|
|
29
|
+
missing: 'reject',
|
|
30
|
+
contested: 'reject',
|
|
31
|
+
retracted: 'exclude',
|
|
32
|
+
unresolved: 'reject'
|
|
33
|
+
}
|
|
34
|
+
}]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const inputs = bind(store, definition)
|
|
38
|
+
// inputs.values['team-size'] is exact integer 12; the store still says 8.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Contracts
|
|
42
|
+
|
|
43
|
+
- `asOf`, `at`, alias handling, resolution, and minimum confidence are frozen
|
|
44
|
+
into every input record. Omitting `asOf` records the exact current head.
|
|
45
|
+
- Cardinality and missing/contested/retracted/unresolved behavior are explicit.
|
|
46
|
+
`many` additionally requires `all`, `min`, `max`, or `sum`; there is no
|
|
47
|
+
implicit first-row policy.
|
|
48
|
+
- Authored decimals and multiplier spellings become exact rationals without a
|
|
49
|
+
JavaScript `number` round trip. Unit changes require a declared exact
|
|
50
|
+
conversion. Approximation, uncertainty, sigma level, and confidence remain
|
|
51
|
+
separate fields and never become solver weights automatically.
|
|
52
|
+
- Durable evidence uses exact CAVE row IDs. Rolled-back assumptions use stable
|
|
53
|
+
`scenario:<scenario-id>:<overlay-digest>#<claim>` IDs, so replay identity
|
|
54
|
+
does not depend on transient SQLite row IDs.
|
|
55
|
+
- Overlay patterns are currently non-transitive and match hypothetical claims
|
|
56
|
+
by their authored entity names. This prevents current alias state from
|
|
57
|
+
leaking into a historical snapshot; transitive overlay composition waits on
|
|
58
|
+
the shared snapshot-query primitives tracked in the backlog.
|
|
59
|
+
|
|
60
|
+
Use `run(store, definition, evaluate)` when convenient. It calls `bind`
|
|
61
|
+
synchronously and invokes `evaluate` only after the overlay and verb registry
|
|
62
|
+
have been restored, including when the evaluator later times out or crashes.
|
|
63
|
+
|
|
64
|
+
For solver runs, `explanationContext(definition, inputs)` converts the frozen
|
|
65
|
+
record into `@cavelang/solver` explanation metadata. It retains every binding's
|
|
66
|
+
query, typed and authored value, exact belief/scenario evidence IDs, snapshot
|
|
67
|
+
policy, input-record digest, and overlay digest. Passing that context to
|
|
68
|
+
`Solve.runWithExplanation` also rejects replay against a different canonical
|
|
69
|
+
model digest.
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
const inputs = bind(store, definition)
|
|
73
|
+
const report = await Solve.runWithExplanation(
|
|
74
|
+
adapter,
|
|
75
|
+
model,
|
|
76
|
+
{ unsatCore: true },
|
|
77
|
+
explanationContext(definition, inputs)
|
|
78
|
+
)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Explicit result governance
|
|
82
|
+
|
|
83
|
+
Evaluation remains ephemeral. The `Record` API is the only transition from a
|
|
84
|
+
plain solver report or ordinary evaluator output into durable CAVE history:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
import { Record } from '@cavelang/scenario'
|
|
88
|
+
|
|
89
|
+
Record.result(store, {
|
|
90
|
+
schema: Record.resultSchema,
|
|
91
|
+
id: 'architecture-2026-07-15',
|
|
92
|
+
report
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
An ordinary deterministic evaluator uses the same frozen input record and a
|
|
97
|
+
separately versioned result—no solver is required:
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
const evaluation = await run(store, definition, inputs => ({
|
|
101
|
+
schema: Record.evaluationSchema,
|
|
102
|
+
id: 'architecture-evaluation',
|
|
103
|
+
inputs,
|
|
104
|
+
evaluator: { name: 'architecture-threshold', version: '1.0.0' },
|
|
105
|
+
output: { architecture: 'monolith' }
|
|
106
|
+
} satisfies Record.Evaluation))
|
|
107
|
+
|
|
108
|
+
Record.result(store, evaluation)
|
|
109
|
+
Record.recommendation(store, {
|
|
110
|
+
schema: Record.recommendationSchema,
|
|
111
|
+
id: 'architecture-recommendation',
|
|
112
|
+
resultId: evaluation.id,
|
|
113
|
+
value: evaluation.output
|
|
114
|
+
})
|
|
115
|
+
Record.decision(store, {
|
|
116
|
+
schema: Record.decisionSchema,
|
|
117
|
+
id: 'architecture-decision',
|
|
118
|
+
resultId: evaluation.id,
|
|
119
|
+
recommendationId: 'architecture-recommendation',
|
|
120
|
+
selected: evaluation.output,
|
|
121
|
+
decidedBy: 'human/mirek'
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`cave.scenario/evaluation@1` records the exact `inputs` (snapshot, overlay,
|
|
126
|
+
evidence, and digest), evaluator name/version, and JSON output. The evaluator
|
|
127
|
+
runs only after rollback; recording, recommendation, and human decision remain
|
|
128
|
+
three explicit operations. The package test suite exercises this complete
|
|
129
|
+
non-solver architecture-choice workflow.
|
|
130
|
+
|
|
131
|
+
Each stable ID owns one append-only artifact series. Re-recording identical
|
|
132
|
+
content returns `existing`; reusing the ID for different content throws
|
|
133
|
+
`RecordConflictError`. The write is one atomic claim, with canonical JSON
|
|
134
|
+
encoded as a code value so export, backup, and sync preserve the complete
|
|
135
|
+
model digest, backend/version, snapshot, inputs, evidence, limits, and outcome.
|
|
136
|
+
|
|
137
|
+
`Record.recommendation`, `Record.decision`, `Record.action`, and
|
|
138
|
+
`Record.externalEffect` use different versioned schemas and entity namespaces.
|
|
139
|
+
Each checks its predecessor before appending. These latter two are audit
|
|
140
|
+
records only: they never invoke `@cavelang/act` or a hook. Governed action
|
|
141
|
+
execution remains the sole authority for an external effect.
|
|
142
|
+
|
|
143
|
+
`Record.replay` reads an immutable solver report without solving again and returns
|
|
144
|
+
explicit incompatibility reasons for a different model digest, backend, or
|
|
145
|
+
solver version. External evaluations retain their exact evaluator identity and
|
|
146
|
+
input digest through `Record.read`; they are never mistaken for solver replay.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Store } from '@cavelang/store';
|
|
2
|
+
import { type Definition, type InputRecord } from './model.ts';
|
|
3
|
+
export declare const bind: (store: Store, definition: Definition) => InputRecord;
|
|
4
|
+
/** Materializes and rolls back inputs before `evaluate` is invoked. */
|
|
5
|
+
export declare const run: <Result>(store: Store, definition: Definition, evaluate: (inputs: InputRecord) => Result | Promise<Result>) => Promise<Result>;
|
|
6
|
+
//# sourceMappingURL=bind.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../src/bind.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAG5C,OAAO,EAKL,KAAK,UAAU,EAGf,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAA;AAoUnB,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,YAAY,UAAU,KAAG,WAiD3D,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,GAAG,GAAU,MAAM,EAC9B,OAAO,KAAK,EACZ,YAAY,UAAU,EACtB,UAAU,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAC1D,OAAO,CAAC,MAAM,CAAsC,CAAA"}
|
package/dist/src/bind.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import * as Canonical from '@cavelang/canonical';
|
|
3
|
+
import { Uuidv7 } from '@cavelang/core';
|
|
4
|
+
import { Pattern, query } from '@cavelang/query';
|
|
5
|
+
import { Exact } from '@cavelang/solver';
|
|
6
|
+
import { ScenarioInputError } from "./error.js";
|
|
7
|
+
import * as Numeric from "./exact.js";
|
|
8
|
+
import { schema } from "./model.js";
|
|
9
|
+
const compareText = (left, right) => left < right ? -1 : left > right ? 1 : 0;
|
|
10
|
+
const stableStringify = (value) => {
|
|
11
|
+
if (value === null || typeof value !== 'object')
|
|
12
|
+
return JSON.stringify(value);
|
|
13
|
+
if (Array.isArray(value))
|
|
14
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
15
|
+
const record = value;
|
|
16
|
+
return `{${Object.keys(record).sort().map(key => `${JSON.stringify(key)}:${stableStringify(record[key])}`).join(',')}}`;
|
|
17
|
+
};
|
|
18
|
+
const sha256 = (text) => `sha256:${createHash('sha256').update(text).digest('hex')}`;
|
|
19
|
+
const identifierPattern = /^[A-Za-z0-9][A-Za-z0-9._/-]*$/;
|
|
20
|
+
const invalid = (message, bindingId) => {
|
|
21
|
+
throw new ScenarioInputError('invalid-definition', message, bindingId);
|
|
22
|
+
};
|
|
23
|
+
const validateBinding = (binding) => {
|
|
24
|
+
if (!identifierPattern.test(binding.id))
|
|
25
|
+
invalid('identifier must use letters, numbers, dot, underscore, slash, or dash', binding.id);
|
|
26
|
+
if (binding.expected.kind !== 'boolean' && binding.select === undefined) {
|
|
27
|
+
invalid('select is required for non-Boolean inputs', binding.id);
|
|
28
|
+
}
|
|
29
|
+
if (binding.cardinality === 'one' && binding.policies.missing !== 'reject') {
|
|
30
|
+
invalid('cardinality one requires missing: reject', binding.id);
|
|
31
|
+
}
|
|
32
|
+
if (binding.cardinality === 'optional' && binding.policies.missing === 'empty') {
|
|
33
|
+
invalid('cardinality optional supports missing: reject or omit', binding.id);
|
|
34
|
+
}
|
|
35
|
+
if (binding.cardinality === 'many' && binding.policies.missing === 'omit') {
|
|
36
|
+
invalid('cardinality many supports missing: reject or empty', binding.id);
|
|
37
|
+
}
|
|
38
|
+
if (binding.cardinality === 'many' && binding.reduce !== 'all' &&
|
|
39
|
+
binding.expected.kind !== 'number' && binding.expected.kind !== 'integer') {
|
|
40
|
+
invalid(`reduction ${binding.reduce} requires a numeric input`, binding.id);
|
|
41
|
+
}
|
|
42
|
+
if (binding.expected.kind === 'enum') {
|
|
43
|
+
if (binding.expected.values.length === 0 || new Set(binding.expected.values).size !== binding.expected.values.length) {
|
|
44
|
+
invalid('enum values must be non-empty and unique', binding.id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (binding.expected.kind === 'number' || binding.expected.kind === 'integer') {
|
|
48
|
+
for (const conversion of binding.expected.conversions ?? []) {
|
|
49
|
+
if (conversion.from === conversion.to)
|
|
50
|
+
invalid('unit conversion must change the unit', binding.id);
|
|
51
|
+
if (Exact.compare(conversion.factor, '0') <= 0)
|
|
52
|
+
invalid('unit conversion factor must be positive', binding.id);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const pattern = (() => {
|
|
56
|
+
try {
|
|
57
|
+
return Pattern.parse(binding.query);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return invalid(`invalid CAVE-Q pattern: ${error instanceof Error ? error.message : String(error)}`, binding.id);
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
if (pattern.verb.kind === 'verb' && pattern.verb.transitive) {
|
|
64
|
+
invalid('transitive bindings are deferred until snapshot-aware shared query primitives are available', binding.id);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const validateDefinition = (definition) => {
|
|
68
|
+
if (!identifierPattern.test(definition.id))
|
|
69
|
+
invalid('scenario identifier must use letters, numbers, dot, underscore, slash, or dash');
|
|
70
|
+
if (!/^sha256:[0-9a-f]{64}$/.test(definition.modelDigest))
|
|
71
|
+
invalid('modelDigest must be a lowercase SHA-256 digest');
|
|
72
|
+
if (!Number.isFinite(definition.snapshot.minimumConfidence) ||
|
|
73
|
+
definition.snapshot.minimumConfidence < 0 || definition.snapshot.minimumConfidence > 1) {
|
|
74
|
+
invalid('minimumConfidence must be between 0 and 1');
|
|
75
|
+
}
|
|
76
|
+
const ids = new Set();
|
|
77
|
+
for (const binding of definition.bindings) {
|
|
78
|
+
if (ids.has(binding.id))
|
|
79
|
+
invalid(`duplicate binding identifier ${JSON.stringify(binding.id)}`);
|
|
80
|
+
ids.add(binding.id);
|
|
81
|
+
validateBinding(binding);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const boundaryUpper = (text) => {
|
|
85
|
+
const start = Date.parse(text.includes('T') ? text : `${text}T00:00:00Z`);
|
|
86
|
+
if (Number.isNaN(start))
|
|
87
|
+
throw new ScenarioInputError('invalid-definition', `cannot parse as-of boundary ${JSON.stringify(text)}`);
|
|
88
|
+
return Uuidv7.at(start + (text.includes('T') ? 1_000 : 86_400_000), 0, new Uint8Array(8));
|
|
89
|
+
};
|
|
90
|
+
const transactionTime = (store, asOf) => {
|
|
91
|
+
if (asOf === undefined) {
|
|
92
|
+
return store.db.prepare('SELECT MAX(tx) AS tx FROM cave_claim').get().tx;
|
|
93
|
+
}
|
|
94
|
+
const id = asOf.toLowerCase();
|
|
95
|
+
return Uuidv7.is(id) ?
|
|
96
|
+
store.db.prepare('SELECT MAX(tx) AS tx FROM cave_claim WHERE tx <= ?').get(id).tx :
|
|
97
|
+
store.db.prepare('SELECT MAX(tx) AS tx FROM cave_claim WHERE tx < ?').get(boundaryUpper(asOf)).tx;
|
|
98
|
+
};
|
|
99
|
+
const queryOptions = (snapshot, resolve) => ({
|
|
100
|
+
...(snapshot.asOf === undefined ? {} : { asOf: snapshot.asOf }),
|
|
101
|
+
...(snapshot.at === undefined ? {} : { at: snapshot.at }),
|
|
102
|
+
aliases: snapshot.aliases === 'closure',
|
|
103
|
+
resolve,
|
|
104
|
+
support: true
|
|
105
|
+
});
|
|
106
|
+
/** Explicit confidence filter opts CAVE-Q into returning current `@ 0%` rows. */
|
|
107
|
+
const includingRetractions = (input) => `${input}\nWHERE conf >= 0`;
|
|
108
|
+
const supportIds = (match) => match.row === undefined ? (match.rows ?? []).map(row => row.id) : [match.row.id];
|
|
109
|
+
const rawBaseCandidates = (store, binding, snapshot) => {
|
|
110
|
+
const pattern = includingRetractions(binding.query);
|
|
111
|
+
const unresolved = query(store, pattern, queryOptions(snapshot, false));
|
|
112
|
+
const winners = query(store, pattern, queryOptions(snapshot, true));
|
|
113
|
+
const winnerIds = new Set(winners.flatMap(supportIds));
|
|
114
|
+
const selected = snapshot.resolution === 'winner' ? winners : unresolved;
|
|
115
|
+
return selected.map(match => {
|
|
116
|
+
const ids = supportIds(match);
|
|
117
|
+
return {
|
|
118
|
+
match,
|
|
119
|
+
origin: 'belief',
|
|
120
|
+
contested: snapshot.resolution === 'coexisting' && ids.some(id => !winnerIds.has(id)),
|
|
121
|
+
retracted: match.row?.conf === 0,
|
|
122
|
+
unresolved: ids.length === 0
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
const overlayResult = (store, definition, canonical, stableIds) => {
|
|
127
|
+
if (canonical.claims.length === 0)
|
|
128
|
+
return {};
|
|
129
|
+
const rolledBack = Symbol('cave-scenario-overlay');
|
|
130
|
+
try {
|
|
131
|
+
return store.transaction(() => {
|
|
132
|
+
const inserted = store.insertResult(canonical, {
|
|
133
|
+
source: `scenario/${definition.id}`,
|
|
134
|
+
lifecycle: true
|
|
135
|
+
});
|
|
136
|
+
const stableByRow = new Map(inserted.ids.map((id, index) => [id, stableIds[index]]));
|
|
137
|
+
const result = {};
|
|
138
|
+
for (const binding of definition.bindings) {
|
|
139
|
+
// Overlay claims are matched as authored. Base aliases and historical
|
|
140
|
+
// rows cannot make a hypothetical claim appear under a different name.
|
|
141
|
+
const matches = query(store, includingRetractions(binding.query), {
|
|
142
|
+
...(definition.snapshot.at === undefined ? {} : { at: definition.snapshot.at }),
|
|
143
|
+
all: true,
|
|
144
|
+
aliases: false,
|
|
145
|
+
support: true
|
|
146
|
+
}).filter(match => match.row !== undefined && stableByRow.has(match.row.id));
|
|
147
|
+
result[binding.id] = matches.map(match => ({
|
|
148
|
+
match,
|
|
149
|
+
origin: 'scenario',
|
|
150
|
+
contested: false,
|
|
151
|
+
retracted: match.row?.conf === 0,
|
|
152
|
+
unresolved: false,
|
|
153
|
+
scenarioClaimId: stableByRow.get(match.row.id)
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
throw Object.assign(new Error('scenario overlay materialized'), { [rolledBack]: result });
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
if (error instanceof Error && rolledBack in error)
|
|
161
|
+
return error[rolledBack];
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const selectedText = (candidate, binding) => {
|
|
166
|
+
if (binding.select !== undefined)
|
|
167
|
+
return candidate.match.bindings[binding.select];
|
|
168
|
+
if (binding.expected.kind === 'boolean')
|
|
169
|
+
return undefined;
|
|
170
|
+
return candidate.match.at?.text ?? candidate.match.row?.value_text ?? undefined;
|
|
171
|
+
};
|
|
172
|
+
const plain = (text) => text.length >= 2 && ((text.startsWith('"') && text.endsWith('"')) || (text.startsWith('`') && text.endsWith('`'))) ?
|
|
173
|
+
text.slice(1, -1) : text;
|
|
174
|
+
const uncertainty = (candidate, expected, bindingId) => {
|
|
175
|
+
const row = candidate.match.row;
|
|
176
|
+
if (row?.delta_text === null || row?.delta_text === undefined)
|
|
177
|
+
return undefined;
|
|
178
|
+
const parsed = Numeric.convert(Numeric.parse(row.delta_text, bindingId), expected.unit, expected.conversions, bindingId);
|
|
179
|
+
return {
|
|
180
|
+
authored: row.delta_text,
|
|
181
|
+
exact: parsed.exact,
|
|
182
|
+
...(parsed.unit === undefined ? {} : { unit: parsed.unit }),
|
|
183
|
+
sigmaLevel: row.sigma_level ?? 2
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
const valueOf = (candidate, binding) => {
|
|
187
|
+
const expected = binding.expected;
|
|
188
|
+
const text = selectedText(candidate, binding);
|
|
189
|
+
switch (expected.kind) {
|
|
190
|
+
case 'boolean': {
|
|
191
|
+
if (binding.select === undefined)
|
|
192
|
+
return { kind: 'boolean', value: true };
|
|
193
|
+
if (text === undefined)
|
|
194
|
+
throw new ScenarioInputError('invalid-value', `query did not bind ?${binding.select}`, binding.id);
|
|
195
|
+
const value = plain(text);
|
|
196
|
+
const yes = expected.trueValue ?? 'true';
|
|
197
|
+
const no = expected.falseValue ?? 'false';
|
|
198
|
+
if (value !== yes && value !== no) {
|
|
199
|
+
throw new ScenarioInputError('invalid-value', `expected ${JSON.stringify(yes)} or ${JSON.stringify(no)}, received ${JSON.stringify(value)}`, binding.id);
|
|
200
|
+
}
|
|
201
|
+
return { kind: 'boolean', value: value === yes };
|
|
202
|
+
}
|
|
203
|
+
case 'enum': {
|
|
204
|
+
if (text === undefined)
|
|
205
|
+
throw new ScenarioInputError('invalid-value', `query did not bind ?${binding.select}`, binding.id);
|
|
206
|
+
const value = plain(text);
|
|
207
|
+
if (!expected.values.includes(value)) {
|
|
208
|
+
throw new ScenarioInputError('invalid-value', `value ${JSON.stringify(value)} is outside [${expected.values.join(', ')}]`, binding.id);
|
|
209
|
+
}
|
|
210
|
+
return { kind: 'enum', value };
|
|
211
|
+
}
|
|
212
|
+
case 'text':
|
|
213
|
+
if (text === undefined)
|
|
214
|
+
throw new ScenarioInputError('invalid-value', `query did not bind ?${binding.select}`, binding.id);
|
|
215
|
+
return { kind: 'text', value: plain(text) };
|
|
216
|
+
case 'integer':
|
|
217
|
+
case 'number': {
|
|
218
|
+
const authored = candidate.match.at?.text ?? candidate.match.row?.value_text ?? text;
|
|
219
|
+
if (authored === undefined)
|
|
220
|
+
throw new ScenarioInputError('invalid-value', 'matched row has no numeric value', binding.id);
|
|
221
|
+
const parsed = Numeric.convert(Numeric.parse(authored, binding.id), expected.unit, expected.conversions, binding.id);
|
|
222
|
+
const uncertainty_ = uncertainty(candidate, expected, binding.id);
|
|
223
|
+
const common = {
|
|
224
|
+
...(parsed.unit === undefined ? {} : { unit: parsed.unit }),
|
|
225
|
+
authored,
|
|
226
|
+
approximate: parsed.approximate,
|
|
227
|
+
...(uncertainty_ === undefined ? {} : { uncertainty: uncertainty_ })
|
|
228
|
+
};
|
|
229
|
+
if (expected.kind === 'integer') {
|
|
230
|
+
if (parsed.exact.denominator !== '1') {
|
|
231
|
+
throw new ScenarioInputError('invalid-value', `expected an integer, received ${JSON.stringify(authored)}`, binding.id);
|
|
232
|
+
}
|
|
233
|
+
return { kind: 'integer', value: parsed.exact.numerator, ...common };
|
|
234
|
+
}
|
|
235
|
+
return { kind: 'number', value: parsed.exact, ...common };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
const evidenceOf = (candidate) => candidate.origin === 'scenario' ?
|
|
240
|
+
[{ origin: 'scenario', claimIds: [candidate.scenarioClaimId] }] :
|
|
241
|
+
[{ origin: 'belief', rowIds: supportIds(candidate.match) }];
|
|
242
|
+
const publicCandidate = (candidate, binding) => ({
|
|
243
|
+
value: valueOf(candidate, binding),
|
|
244
|
+
confidence: candidate.match.row?.conf ?? 1,
|
|
245
|
+
evidence: evidenceOf(candidate)
|
|
246
|
+
});
|
|
247
|
+
const evidenceKey = (candidate) => candidate.origin === 'scenario' ?
|
|
248
|
+
`scenario:${candidate.scenarioClaimId}` : `belief:${supportIds(candidate.match).join(',')}`;
|
|
249
|
+
const reduce = (values, binding) => {
|
|
250
|
+
if (binding.cardinality !== 'many' || binding.reduce === 'all')
|
|
251
|
+
return values;
|
|
252
|
+
const numeric = values;
|
|
253
|
+
if (binding.reduce === 'sum') {
|
|
254
|
+
const exact = numeric.reduce((total, value) => Numeric.add(total, value.kind === 'integer' ? { numerator: value.value, denominator: '1' } : value.value), { numerator: '0', denominator: '1' });
|
|
255
|
+
const unit = numeric[0]?.unit;
|
|
256
|
+
const approximate = numeric.some(value => value.approximate);
|
|
257
|
+
return binding.expected.kind === 'integer' ?
|
|
258
|
+
{ kind: 'integer', value: exact.numerator, ...(unit === undefined ? {} : { unit }), approximate } :
|
|
259
|
+
{ kind: 'number', value: exact, ...(unit === undefined ? {} : { unit }), approximate };
|
|
260
|
+
}
|
|
261
|
+
let selected = numeric[0];
|
|
262
|
+
for (const value of numeric.slice(1)) {
|
|
263
|
+
const left = selected.kind === 'integer' ? { numerator: selected.value, denominator: '1' } : selected.value;
|
|
264
|
+
const right = value.kind === 'integer' ? { numerator: value.value, denominator: '1' } : value.value;
|
|
265
|
+
const comparison = Numeric.compare(right, left);
|
|
266
|
+
if ((binding.reduce === 'min' && comparison < 0) || (binding.reduce === 'max' && comparison > 0))
|
|
267
|
+
selected = value;
|
|
268
|
+
}
|
|
269
|
+
return selected;
|
|
270
|
+
};
|
|
271
|
+
const bindOne = (binding, base, overlay, minimumConfidence) => {
|
|
272
|
+
const eligible = (values) => values
|
|
273
|
+
.filter(candidate => candidate.retracted && binding.policies.retracted === 'reject' ||
|
|
274
|
+
candidate.match.row === undefined || candidate.match.row.conf >= minimumConfidence)
|
|
275
|
+
.filter(candidate => binding.policies.retracted !== 'exclude' || !candidate.retracted);
|
|
276
|
+
const baseEligible = eligible(base);
|
|
277
|
+
const overlayEligible = eligible(overlay);
|
|
278
|
+
const selected = (binding.scenarioOverride && overlayEligible.length > 0 ? overlayEligible : [...baseEligible, ...overlayEligible])
|
|
279
|
+
.sort((left, right) => compareText(evidenceKey(left), evidenceKey(right)));
|
|
280
|
+
const rejected = selected.find(candidate => candidate.retracted && binding.policies.retracted === 'reject');
|
|
281
|
+
if (rejected !== undefined)
|
|
282
|
+
throw new ScenarioInputError('retracted-input', 'matched a retracted belief', binding.id);
|
|
283
|
+
if (binding.policies.contested === 'reject' && selected.some(candidate => candidate.contested)) {
|
|
284
|
+
throw new ScenarioInputError('contested-input', 'matched coexisting beliefs that do not win resolution', binding.id);
|
|
285
|
+
}
|
|
286
|
+
if (binding.policies.unresolved === 'reject' && selected.some(candidate => candidate.unresolved)) {
|
|
287
|
+
throw new ScenarioInputError('unresolved-input', 'query result has no supporting claim row', binding.id);
|
|
288
|
+
}
|
|
289
|
+
const countOk = binding.cardinality === 'many' || selected.length <= 1;
|
|
290
|
+
if (!countOk)
|
|
291
|
+
throw new ScenarioInputError('ambiguous-input', `expected ${binding.cardinality}, matched ${selected.length} values`, binding.id);
|
|
292
|
+
if (selected.length === 0 && binding.policies.missing === 'reject') {
|
|
293
|
+
throw new ScenarioInputError('missing-input', 'query matched no eligible value', binding.id);
|
|
294
|
+
}
|
|
295
|
+
const candidates = selected.map(candidate => publicCandidate(candidate, binding));
|
|
296
|
+
if (selected.length === 0 && binding.policies.missing === 'omit')
|
|
297
|
+
return { id: binding.id, candidates };
|
|
298
|
+
if (selected.length === 0)
|
|
299
|
+
return { id: binding.id, candidates, value: [] };
|
|
300
|
+
const values = candidates.map(candidate => candidate.value);
|
|
301
|
+
if (binding.cardinality === 'many')
|
|
302
|
+
return { id: binding.id, candidates, value: reduce(values, binding) };
|
|
303
|
+
return { id: binding.id, candidates, ...(values[0] === undefined ? {} : { value: values[0] }) };
|
|
304
|
+
};
|
|
305
|
+
export const bind = (store, definition) => {
|
|
306
|
+
validateDefinition(definition);
|
|
307
|
+
const frozenTx = transactionTime(store, definition.snapshot.asOf);
|
|
308
|
+
const effectiveSnapshot = definition.snapshot.asOf === undefined && frozenTx !== null ?
|
|
309
|
+
{ ...definition.snapshot, asOf: frozenTx } : definition.snapshot;
|
|
310
|
+
const registry = effectiveSnapshot.asOf === undefined ? store.registry() : store.registryAsOf(effectiveSnapshot.asOf);
|
|
311
|
+
const canonical = Canonical.canonicalizeText(definition.overlay ?? '', registry);
|
|
312
|
+
if (canonical.problems.length > 0) {
|
|
313
|
+
const details = canonical.problems.map(problem => `line ${problem.line}: ${problem.message}`).join('; ');
|
|
314
|
+
throw new ScenarioInputError('invalid-overlay', `overlay has ${canonical.problems.length} problem(s): ${details}`);
|
|
315
|
+
}
|
|
316
|
+
const overlayText = Canonical.emit(canonical);
|
|
317
|
+
const overlayDigest = sha256(overlayText);
|
|
318
|
+
const claimIds = canonical.claims.map((_, index) => `scenario:${definition.id}:${overlayDigest.slice(7)}#${index + 1}`);
|
|
319
|
+
const base = Object.fromEntries(definition.bindings.map(binding => [
|
|
320
|
+
binding.id,
|
|
321
|
+
rawBaseCandidates(store, binding, effectiveSnapshot)
|
|
322
|
+
]));
|
|
323
|
+
const overlay = overlayResult(store, { ...definition, snapshot: effectiveSnapshot }, canonical, claimIds);
|
|
324
|
+
const bindings = definition.bindings.map(binding => bindOne(binding, base[binding.id] ?? [], overlay[binding.id] ?? [], definition.snapshot.minimumConfidence));
|
|
325
|
+
const values = {};
|
|
326
|
+
for (const binding of bindings)
|
|
327
|
+
if (binding.value !== undefined)
|
|
328
|
+
values[binding.id] = binding.value;
|
|
329
|
+
const supportingRowIds = [...new Set(bindings.flatMap(binding => binding.candidates.flatMap(candidate => candidate.evidence.flatMap(evidence => evidence.origin === 'belief' ? evidence.rowIds : []))))].sort(compareText);
|
|
330
|
+
const scenarioClaimIds = [...new Set(bindings.flatMap(binding => binding.candidates.flatMap(candidate => candidate.evidence.flatMap(evidence => evidence.origin === 'scenario' ? evidence.claimIds : []))))].sort(compareText);
|
|
331
|
+
const withoutDigest = {
|
|
332
|
+
schema,
|
|
333
|
+
scenarioId: definition.id,
|
|
334
|
+
modelDigest: definition.modelDigest,
|
|
335
|
+
snapshot: { ...definition.snapshot, transactionTime: frozenTx },
|
|
336
|
+
overlay: { digest: overlayDigest, source: `scenario/${definition.id}`, claimIds },
|
|
337
|
+
values,
|
|
338
|
+
bindings,
|
|
339
|
+
supportingRowIds,
|
|
340
|
+
scenarioClaimIds
|
|
341
|
+
};
|
|
342
|
+
const digest = sha256(stableStringify(withoutDigest));
|
|
343
|
+
return { ...withoutDigest, digest };
|
|
344
|
+
};
|
|
345
|
+
/** Materializes and rolls back inputs before `evaluate` is invoked. */
|
|
346
|
+
export const run = async (store, definition, evaluate) => evaluate(bind(store, definition));
|
|
347
|
+
//# sourceMappingURL=bind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bind.js","sourceRoot":"","sources":["../../src/bind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type Code = 'invalid-definition' | 'invalid-overlay' | 'missing-input' | 'ambiguous-input' | 'contested-input' | 'retracted-input' | 'unresolved-input' | 'invalid-value' | 'incompatible-unit';
|
|
2
|
+
export declare class ScenarioInputError extends Error {
|
|
3
|
+
readonly code: Code;
|
|
4
|
+
readonly bindingId?: string;
|
|
5
|
+
constructor(code: Code, message: string, bindingId?: string);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/error.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GACZ,oBAAoB,GACpB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,eAAe,GACf,mBAAmB,CAAA;AAEvB,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;gBAEf,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAM5D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class ScenarioInputError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
bindingId;
|
|
4
|
+
constructor(code, message, bindingId) {
|
|
5
|
+
super(bindingId === undefined ? message : `scenario input ${JSON.stringify(bindingId)}: ${message}`);
|
|
6
|
+
this.name = 'ScenarioInputError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.bindingId = bindingId;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/error.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,CAAM;IACV,SAAS,CAAS;IAE3B,YAAY,IAAU,EAAE,OAAe,EAAE,SAAkB;QACzD,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC,CAAA;QACpG,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Conversion, ExactNumber } from './model.ts';
|
|
2
|
+
type Parsed = {
|
|
3
|
+
readonly exact: ExactNumber;
|
|
4
|
+
readonly unit?: string;
|
|
5
|
+
readonly approximate: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare const add: (left: ExactNumber, right: ExactNumber) => ExactNumber;
|
|
8
|
+
export declare const compare: (left: ExactNumber, right: ExactNumber) => number;
|
|
9
|
+
/** Parses CAVE's exact scalar spelling without passing the digits through `number`. */
|
|
10
|
+
export declare const parse: (authored: string, bindingId: string) => Parsed;
|
|
11
|
+
export declare const convert: (parsed: Parsed, expectedUnit: string | undefined, conversions: readonly Conversion[] | undefined, bindingId: string) => Parsed;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=exact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exact.d.ts","sourceRoot":"","sources":["../../src/exact.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAYzD,KAAK,MAAM,GAAG;IACZ,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B,CAAA;AAmBD,eAAO,MAAM,GAAG,GAAI,MAAM,WAAW,EAAE,OAAO,WAAW,KAAG,WAIzD,CAAA;AAEH,eAAO,MAAM,OAAO,GAAI,MAAM,WAAW,EAAE,OAAO,WAAW,KAAG,MAEmD,CAAA;AAInH,uFAAuF;AACvF,eAAO,MAAM,KAAK,GAAI,UAAU,MAAM,EAAE,WAAW,MAAM,KAAG,MAsB3D,CAAA;AAED,eAAO,MAAM,OAAO,GAClB,QAAQ,MAAM,EACd,cAAc,MAAM,GAAG,SAAS,EAChC,aAAa,SAAS,UAAU,EAAE,GAAG,SAAS,EAC9C,WAAW,MAAM,KAChB,MAcF,CAAA"}
|