@acquiredintelligence/attend 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +580 -2
- package/dist/attend.d.ts +30 -0
- package/dist/attend.d.ts.map +1 -0
- package/dist/attend.js +428 -0
- package/dist/attend.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/ids.d.ts +12 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +97 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/reducer.d.ts +26 -0
- package/dist/core/reducer.d.ts.map +1 -0
- package/dist/core/reducer.js +437 -0
- package/dist/core/reducer.js.map +1 -0
- package/dist/core/seen.d.ts +22 -0
- package/dist/core/seen.d.ts.map +1 -0
- package/dist/core/seen.js +61 -0
- package/dist/core/seen.js.map +1 -0
- package/dist/core/state.d.ts +12 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +90 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/step.d.ts +14 -0
- package/dist/core/step.d.ts.map +1 -0
- package/dist/core/step.js +17 -0
- package/dist/core/step.js.map +1 -0
- package/dist/core/threshold.d.ts +40 -0
- package/dist/core/threshold.d.ts.map +1 -0
- package/dist/core/threshold.js +72 -0
- package/dist/core/threshold.js.map +1 -0
- package/dist/core/types.d.ts +704 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +24 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/window.d.ts +38 -0
- package/dist/core/window.d.ts.map +1 -0
- package/dist/core/window.js +322 -0
- package/dist/core/window.js.map +1 -0
- package/dist/decisions.d.ts +53 -0
- package/dist/decisions.d.ts.map +1 -0
- package/dist/decisions.js +115 -0
- package/dist/decisions.js.map +1 -0
- package/dist/errors.d.ts +36 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +53 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/adapter.d.ts +21 -0
- package/dist/internal/adapter.d.ts.map +1 -0
- package/dist/internal/adapter.js +62 -0
- package/dist/internal/adapter.js.map +1 -0
- package/dist/internal/assert.d.ts +5 -0
- package/dist/internal/assert.d.ts.map +1 -0
- package/dist/internal/assert.js +14 -0
- package/dist/internal/assert.js.map +1 -0
- package/dist/internal/clock.d.ts +8 -0
- package/dist/internal/clock.d.ts.map +1 -0
- package/dist/internal/clock.js +38 -0
- package/dist/internal/clock.js.map +1 -0
- package/dist/internal/http.d.ts +42 -0
- package/dist/internal/http.d.ts.map +1 -0
- package/dist/internal/http.js +122 -0
- package/dist/internal/http.js.map +1 -0
- package/dist/internal/images.d.ts +18 -0
- package/dist/internal/images.d.ts.map +1 -0
- package/dist/internal/images.js +75 -0
- package/dist/internal/images.js.map +1 -0
- package/dist/internal/json.d.ts +3 -0
- package/dist/internal/json.d.ts.map +1 -0
- package/dist/internal/json.js +5 -0
- package/dist/internal/json.js.map +1 -0
- package/dist/internal/prompt.d.ts +31 -0
- package/dist/internal/prompt.d.ts.map +1 -0
- package/dist/internal/prompt.js +149 -0
- package/dist/internal/prompt.js.map +1 -0
- package/dist/internal/shared.d.ts +12 -0
- package/dist/internal/shared.d.ts.map +1 -0
- package/dist/internal/shared.js +134 -0
- package/dist/internal/shared.js.map +1 -0
- package/dist/jev.d.ts +74 -0
- package/dist/jev.d.ts.map +1 -0
- package/dist/jev.js +156 -0
- package/dist/jev.js.map +1 -0
- package/dist/llm.d.ts +164 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +79 -0
- package/dist/llm.js.map +1 -0
- package/dist/mcp.d.ts +130 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +550 -0
- package/dist/mcp.js.map +1 -0
- package/dist/memory.d.ts +10 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +50 -0
- package/dist/memory.js.map +1 -0
- package/dist/postgres.d.ts +25 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +56 -0
- package/dist/postgres.js.map +1 -0
- package/dist/redis.d.ts +20 -0
- package/dist/redis.d.ts.map +1 -0
- package/dist/redis.js +83 -0
- package/dist/redis.js.map +1 -0
- package/dist/server/compat.d.ts +13 -0
- package/dist/server/compat.d.ts.map +1 -0
- package/dist/server/compat.js +5 -0
- package/dist/server/compat.js.map +1 -0
- package/dist/server/cursor.d.ts +15 -0
- package/dist/server/cursor.d.ts.map +1 -0
- package/dist/server/cursor.js +50 -0
- package/dist/server/cursor.js.map +1 -0
- package/dist/server/events.d.ts +42 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +189 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/fanout.d.ts +28 -0
- package/dist/server/fanout.d.ts.map +1 -0
- package/dist/server/fanout.js +184 -0
- package/dist/server/fanout.js.map +1 -0
- package/dist/server/guard.d.ts +19 -0
- package/dist/server/guard.d.ts.map +1 -0
- package/dist/server/guard.js +27 -0
- package/dist/server/guard.js.map +1 -0
- package/dist/server/http.d.ts +4 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +323 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/ingest.d.ts +4 -0
- package/dist/server/ingest.d.ts.map +1 -0
- package/dist/server/ingest.js +400 -0
- package/dist/server/ingest.js.map +1 -0
- package/dist/server/install.d.ts +5 -0
- package/dist/server/install.d.ts.map +1 -0
- package/dist/server/install.js +91 -0
- package/dist/server/install.js.map +1 -0
- package/dist/server/poll.d.ts +4 -0
- package/dist/server/poll.d.ts.map +1 -0
- package/dist/server/poll.js +45 -0
- package/dist/server/poll.js.map +1 -0
- package/dist/server/serve.d.ts +19 -0
- package/dist/server/serve.d.ts.map +1 -0
- package/dist/server/serve.js +238 -0
- package/dist/server/serve.js.map +1 -0
- package/dist/server/sessions.d.ts +14 -0
- package/dist/server/sessions.d.ts.map +1 -0
- package/dist/server/sessions.js +54 -0
- package/dist/server/sessions.js.map +1 -0
- package/dist/server/stream.d.ts +11 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +216 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server/tools.d.ts +22 -0
- package/dist/server/tools.d.ts.map +1 -0
- package/dist/server/tools.js +55 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server/types.d.ts +351 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +5 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +10 -0
- package/dist/server.js.map +1 -0
- package/dist/shell/budget.d.ts +4 -0
- package/dist/shell/budget.d.ts.map +1 -0
- package/dist/shell/budget.js +5 -0
- package/dist/shell/budget.js.map +1 -0
- package/dist/shell/copy.d.ts +17 -0
- package/dist/shell/copy.d.ts.map +1 -0
- package/dist/shell/copy.js +67 -0
- package/dist/shell/copy.js.map +1 -0
- package/dist/shell/decisions.d.ts +6 -0
- package/dist/shell/decisions.d.ts.map +1 -0
- package/dist/shell/decisions.js +42 -0
- package/dist/shell/decisions.js.map +1 -0
- package/dist/shell/read.d.ts +7 -0
- package/dist/shell/read.d.ts.map +1 -0
- package/dist/shell/read.js +21 -0
- package/dist/shell/read.js.map +1 -0
- package/dist/shell/scheduler.d.ts +4 -0
- package/dist/shell/scheduler.d.ts.map +1 -0
- package/dist/shell/scheduler.js +90 -0
- package/dist/shell/scheduler.js.map +1 -0
- package/dist/shell/scope.d.ts +27 -0
- package/dist/shell/scope.d.ts.map +1 -0
- package/dist/shell/scope.js +343 -0
- package/dist/shell/scope.js.map +1 -0
- package/dist/shell/types.d.ts +156 -0
- package/dist/shell/types.d.ts.map +1 -0
- package/dist/shell/types.js +2 -0
- package/dist/shell/types.js.map +1 -0
- package/dist/sqlite.d.ts +14 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/sqlite.js +39 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/step.d.ts +18 -0
- package/dist/step.d.ts.map +1 -0
- package/dist/step.js +14 -0
- package/dist/step.js.map +1 -0
- package/dist/store/memory.d.ts +12 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +264 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/postgres.d.ts +24 -0
- package/dist/store/postgres.d.ts.map +1 -0
- package/dist/store/postgres.js +364 -0
- package/dist/store/postgres.js.map +1 -0
- package/dist/store/redis.d.ts +12 -0
- package/dist/store/redis.d.ts.map +1 -0
- package/dist/store/redis.js +540 -0
- package/dist/store/redis.js.map +1 -0
- package/dist/store/sqlite-worker.d.ts +91 -0
- package/dist/store/sqlite-worker.d.ts.map +1 -0
- package/dist/store/sqlite-worker.js +322 -0
- package/dist/store/sqlite-worker.js.map +1 -0
- package/dist/store/sqlite.d.ts +34 -0
- package/dist/store/sqlite.d.ts.map +1 -0
- package/dist/store/sqlite.js +238 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/types.d.ts +137 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +13 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +542 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/wire.d.ts +16 -0
- package/dist/testing/wire.d.ts.map +1 -0
- package/dist/testing/wire.js +304 -0
- package/dist/testing/wire.js.map +1 -0
- package/dist/testing.d.ts +113 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +655 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +130 -4
- package/skills/attend/SKILL.md +231 -0
- package/skills/attend/references/judges.md +283 -0
- package/skills/attend/references/kinds.md +62 -0
- package/skills/attend/references/mcp.md +132 -0
- package/skills/attend/references/sinks.md +73 -0
- package/skills/attend/references/stores.md +90 -0
- package/skills/attend/references/testing.md +120 -0
package/dist/attend.js
ADDED
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import { ConflictError, isPermanent } from './errors.js';
|
|
2
|
+
import { sleep, systemClock } from './internal/clock.js';
|
|
3
|
+
import { arrayLength, assertNever, messageOf } from './internal/shared.js';
|
|
4
|
+
import { DEFAULT_POLICY, KINDS, ROUTES } from './types.js';
|
|
5
|
+
import { createScopes } from './shell/scope.js';
|
|
6
|
+
import { createScheduler } from './shell/scheduler.js';
|
|
7
|
+
import { copyDecision, copyEventSized, copyLetter, copyWindowSliced } from './shell/copy.js';
|
|
8
|
+
import { windowBytesFor } from './shell/budget.js';
|
|
9
|
+
import { readRecord } from './shell/read.js';
|
|
10
|
+
import { readDecisions } from './shell/decisions.js';
|
|
11
|
+
import { thresholdRoute } from './core/threshold.js';
|
|
12
|
+
/** Errors raised by intake and effect handlers. */
|
|
13
|
+
export { BackpressureError, ConflictError, OutboxFullError, PermanentError } from './errors.js';
|
|
14
|
+
/** Creates a scope-owning shell over a log and snapshot store. */
|
|
15
|
+
export function createAttend(config) {
|
|
16
|
+
return createAttendInternal(config);
|
|
17
|
+
}
|
|
18
|
+
/** Internal snapshot kill switch for recovery and differential verification. */
|
|
19
|
+
export function createAttendInternal(config, snapshot = 'ratio') {
|
|
20
|
+
const share = config.windowShare ?? 0.5;
|
|
21
|
+
if (!Number.isFinite(share) || share <= 0 || share > 1)
|
|
22
|
+
throw new RangeError('attend: windowShare must be in (0, 1]');
|
|
23
|
+
if (config.actThreshold !== undefined && (!Number.isFinite(config.actThreshold) || config.actThreshold <= 0 || config.actThreshold > 1)) {
|
|
24
|
+
throw new RangeError('attend: actThreshold must be in (0, 1]');
|
|
25
|
+
}
|
|
26
|
+
if (config.judgeConcurrency !== undefined && (!Number.isInteger(config.judgeConcurrency) || config.judgeConcurrency <= 0)) {
|
|
27
|
+
throw new RangeError('attend: judgeConcurrency must be a positive integer');
|
|
28
|
+
}
|
|
29
|
+
const policy = { ...DEFAULT_POLICY, ...config.settle };
|
|
30
|
+
if (config.judge.budget) {
|
|
31
|
+
const bytes = windowBytesFor(config.judge.budget, share);
|
|
32
|
+
if (!Number.isFinite(bytes) || bytes <= 0)
|
|
33
|
+
throw new RangeError('attend: judge window budget must be positive and finite');
|
|
34
|
+
if (config.settle?.maxWindowBytes === undefined)
|
|
35
|
+
policy.maxWindowBytes = bytes;
|
|
36
|
+
}
|
|
37
|
+
const clock = config.clock ?? systemClock();
|
|
38
|
+
const modes = { decisions: config.sink === 'log' ? 'log' : 'lane', deadLetters: config.deadLetter === 'log' ? 'log' : 'lane' };
|
|
39
|
+
const sources = new Set();
|
|
40
|
+
const attached = new Set();
|
|
41
|
+
const sizedEvents = new WeakMap();
|
|
42
|
+
const calls = new Map();
|
|
43
|
+
const releases = new Set();
|
|
44
|
+
let running = null;
|
|
45
|
+
let judges = 0;
|
|
46
|
+
const scheduler = createScheduler({ clock, onDue(scope) {
|
|
47
|
+
const due = scopes.due(scope);
|
|
48
|
+
if (due === null)
|
|
49
|
+
return;
|
|
50
|
+
if (due > clock.now())
|
|
51
|
+
scheduler.arm(scope, due);
|
|
52
|
+
else
|
|
53
|
+
tick(scope);
|
|
54
|
+
} });
|
|
55
|
+
const scopes = createScopes({ store: config.store, clock, config: { policy, ...modes, traces: config.observe !== undefined },
|
|
56
|
+
admission: config.admission, idleMs: config.cache?.idleMs ?? 300000, snapshot, scheduler,
|
|
57
|
+
eventBytes: (event) => sizedEvents.get(event), running: () => running !== null, execute, observe });
|
|
58
|
+
const submit = scopes.submit;
|
|
59
|
+
function observe(trace) {
|
|
60
|
+
try {
|
|
61
|
+
config.observe?.(trace.kind === 'deadLettered' || trace.kind === 'dropped' ? structuredClone(trace) : trace);
|
|
62
|
+
}
|
|
63
|
+
catch { }
|
|
64
|
+
}
|
|
65
|
+
function classify(events) {
|
|
66
|
+
if (!Array.isArray(events))
|
|
67
|
+
throw new TypeError('attend: events must be an array');
|
|
68
|
+
const length = arrayLength(events.length);
|
|
69
|
+
const classified = new Array(length);
|
|
70
|
+
for (let i = 0; i < length; i += 1) {
|
|
71
|
+
const { event, bytes } = copyEventSized(events[i]);
|
|
72
|
+
const kind = config.kind(event);
|
|
73
|
+
if (!KINDS.includes(kind))
|
|
74
|
+
throw new TypeError('attend: invalid event kind');
|
|
75
|
+
const entry = { ...event, kind };
|
|
76
|
+
sizedEvents.set(entry, bytes);
|
|
77
|
+
classified[i] = entry;
|
|
78
|
+
}
|
|
79
|
+
return classified;
|
|
80
|
+
}
|
|
81
|
+
function tick(scope) {
|
|
82
|
+
void background(scope, 'tick', () => submit(scope, { kind: 'tick' }));
|
|
83
|
+
}
|
|
84
|
+
function background(scope, input, work) {
|
|
85
|
+
return work().catch((error) => {
|
|
86
|
+
if (!(error instanceof ConflictError))
|
|
87
|
+
observe({ kind: 'failed', scope, input, message: messageOf(error) });
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function call(scope, result, leaseUntil, work, release) {
|
|
91
|
+
if (!running) {
|
|
92
|
+
const released = background(scope, release.kind, () => submit(scope, release)).finally(() => releases.delete(released));
|
|
93
|
+
releases.add(released);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const done = background(scope, result, work).finally(() => calls.delete(done));
|
|
97
|
+
calls.set(done, leaseUntil);
|
|
98
|
+
}
|
|
99
|
+
function settledOrExpired(done, leaseUntil) {
|
|
100
|
+
if (leaseUntil <= clock.now())
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
return new Promise((resolve) => {
|
|
103
|
+
const cancel = clock.at(leaseUntil, resolve);
|
|
104
|
+
void done.then(() => {
|
|
105
|
+
cancel();
|
|
106
|
+
resolve();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function execute(scope, effect) {
|
|
111
|
+
switch (effect.kind) {
|
|
112
|
+
case 'trace':
|
|
113
|
+
observe(effect.trace);
|
|
114
|
+
return;
|
|
115
|
+
case 'judge':
|
|
116
|
+
if (running && judges >= (config.judgeConcurrency ?? Infinity)) {
|
|
117
|
+
void background(scope, 'judgeDeferred', () => submit(scope, { kind: 'judgeDeferred', batchId: effect.batchId, attempt: effect.attempt, until: clock.now() + 100 }));
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
call(scope, 'judged', effect.leaseUntil, () => runJudge(scope, effect), { kind: 'judgeReleased', batchId: effect.batchId, attempt: effect.attempt });
|
|
121
|
+
return;
|
|
122
|
+
case 'deliver':
|
|
123
|
+
call(scope, 'delivered', effect.delivery.phase.leaseUntil, () => runDeliver(scope, effect), {
|
|
124
|
+
kind: 'deliveryReleased',
|
|
125
|
+
deliveryId: effect.delivery.item.id,
|
|
126
|
+
attempt: effect.delivery.phase.attempt,
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
default:
|
|
130
|
+
return assertNever(effect);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function runJudge(scope, effect) {
|
|
134
|
+
judges += 1;
|
|
135
|
+
const controller = new AbortController();
|
|
136
|
+
const cancel = clock.at(clock.now() + policy.judgeTimeoutMs, () => controller.abort(new Error('attend: judge timed out')));
|
|
137
|
+
const { batchId, attempt } = effect;
|
|
138
|
+
let result;
|
|
139
|
+
try {
|
|
140
|
+
const live = config.context ? await config.context(scope, controller.signal) : {};
|
|
141
|
+
const window = copyWindowSliced(effect.window);
|
|
142
|
+
const input = {
|
|
143
|
+
scope,
|
|
144
|
+
window: window instanceof Promise ? await window : window,
|
|
145
|
+
routes: effect.offered.map((route) => {
|
|
146
|
+
const criterion = config.criteria?.[route];
|
|
147
|
+
return criterion === undefined ? { route } : { route, criterion };
|
|
148
|
+
}),
|
|
149
|
+
predicates: Object.entries({ ...config.predicates, ...live.predicates }).map(([name, question]) => ({ name, question })),
|
|
150
|
+
facts: live.facts ?? {},
|
|
151
|
+
recent: structuredClone(effect.recent),
|
|
152
|
+
now: clock.now(),
|
|
153
|
+
};
|
|
154
|
+
if (config.guidance !== undefined)
|
|
155
|
+
input.guidance = config.guidance;
|
|
156
|
+
const images = config.capture ? await capture(config.capture, scope, batchId, controller.signal) : [];
|
|
157
|
+
if (images.length > 0)
|
|
158
|
+
input.images = images;
|
|
159
|
+
const judgment = await config.judge(input, controller.signal);
|
|
160
|
+
if (isJudgment(judgment)) {
|
|
161
|
+
const threshold = config.actThreshold === undefined ? null : thresholdRoute(judgment, effect.offered, config.actThreshold);
|
|
162
|
+
if (threshold)
|
|
163
|
+
observe({ kind: 'routeThresholded', scope, batchId, from: judgment.route, to: threshold.route, act: threshold.act });
|
|
164
|
+
result = { kind: 'judged', batchId, attempt, judgment: structuredClone(threshold ? { ...judgment, route: threshold.route } : judgment) };
|
|
165
|
+
}
|
|
166
|
+
else
|
|
167
|
+
result = { kind: 'judgeFailed', batchId, attempt, message: 'malformed judgment', permanent: false };
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
result = { kind: 'judgeFailed', batchId, attempt, message: messageOf(error), permanent: isPermanent(error) };
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
cancel();
|
|
174
|
+
}
|
|
175
|
+
judges -= 1;
|
|
176
|
+
await submit(scope, result);
|
|
177
|
+
}
|
|
178
|
+
async function capture(fn, scope, batchId, judgeSignal) {
|
|
179
|
+
const controller = new AbortController();
|
|
180
|
+
const onJudgeAbort = () => controller.abort(judgeSignal.reason);
|
|
181
|
+
judgeSignal.addEventListener('abort', onJudgeAbort, { once: true });
|
|
182
|
+
const cancel = clock.at(clock.now() + (config.captureTimeoutMs ?? 500), () => controller.abort(new Error('attend: capture timed out')));
|
|
183
|
+
const timedOut = new Promise((_, reject) => controller.signal.addEventListener('abort', () => reject(controller.signal.reason), { once: true }));
|
|
184
|
+
try {
|
|
185
|
+
const result = await Promise.race([fn(scope, controller.signal), timedOut]);
|
|
186
|
+
return result === null ? [] : Array.isArray(result) ? result : [result];
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
observe({ kind: 'captureFailed', scope, batchId, message: messageOf(error) });
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
cancel();
|
|
194
|
+
judgeSignal.removeEventListener('abort', onJudgeAbort);
|
|
195
|
+
timedOut.catch(() => undefined);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async function runDeliver(scope, effect) {
|
|
199
|
+
const { item, phase } = effect.delivery;
|
|
200
|
+
const controller = new AbortController();
|
|
201
|
+
const cancel = clock.at(phase.leaseUntil, () => controller.abort(new Error('attend: delivery timed out')));
|
|
202
|
+
let result;
|
|
203
|
+
try {
|
|
204
|
+
if (item.kind === 'decision' && config.sink !== 'log') {
|
|
205
|
+
const decision = copyDecision(item.decision);
|
|
206
|
+
await config.sink.deliver(decision instanceof Promise ? await decision : decision, controller.signal);
|
|
207
|
+
}
|
|
208
|
+
else if (item.kind === 'deadLetter' && config.deadLetter !== 'log') {
|
|
209
|
+
const letter = copyLetter(item.letter);
|
|
210
|
+
await config.deadLetter(letter instanceof Promise ? await letter : letter, controller.signal);
|
|
211
|
+
}
|
|
212
|
+
result = { kind: 'delivered', deliveryId: item.id, attempt: phase.attempt };
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
result = { kind: 'deliveryFailed', deliveryId: item.id, attempt: phase.attempt, message: messageOf(error), permanent: isPermanent(error) };
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
cancel();
|
|
219
|
+
}
|
|
220
|
+
await submit(scope, result);
|
|
221
|
+
}
|
|
222
|
+
async function sweep(now, limit, warm) {
|
|
223
|
+
try {
|
|
224
|
+
let after;
|
|
225
|
+
while (running) {
|
|
226
|
+
const page = await config.store.due(now, limit, after);
|
|
227
|
+
for (const key of page) {
|
|
228
|
+
if (!running)
|
|
229
|
+
break;
|
|
230
|
+
const due = await scopes.touch(key.scope);
|
|
231
|
+
if (!warm || (due !== null && due <= clock.now()))
|
|
232
|
+
tick(key.scope);
|
|
233
|
+
}
|
|
234
|
+
if (page.length < limit || page.length === 0)
|
|
235
|
+
break;
|
|
236
|
+
after = page.at(-1);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
observe({ kind: 'failed', scope: '*', input: 'tick', message: messageOf(error) });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return {
|
|
244
|
+
push(scope, events) {
|
|
245
|
+
try {
|
|
246
|
+
return submit(scope, { kind: 'events', events: classify(events) }, true);
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return Promise.reject(error);
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
flush: (scope) => submit(scope, { kind: 'flush' }, true),
|
|
253
|
+
end: (scope) => submit(scope, { kind: 'end' }, true),
|
|
254
|
+
inspect: (scope) => readRecord(config.store, scope, modes),
|
|
255
|
+
decisions: (filter, options) => readDecisions(config.store.log, clock, filter, options),
|
|
256
|
+
async attach(scope, source, options) {
|
|
257
|
+
const slot = `${scope}\n${source.key}`;
|
|
258
|
+
if (attached.has(slot))
|
|
259
|
+
throw new Error(`attend: source "${source.key}" is already attached to scope "${scope}"`);
|
|
260
|
+
attached.add(slot);
|
|
261
|
+
const controller = new AbortController();
|
|
262
|
+
const abort = () => controller.abort();
|
|
263
|
+
options?.signal?.addEventListener('abort', abort, { once: true });
|
|
264
|
+
if (options?.signal?.aborted)
|
|
265
|
+
abort();
|
|
266
|
+
sources.add(controller);
|
|
267
|
+
let failures = 0;
|
|
268
|
+
try {
|
|
269
|
+
while (!controller.signal.aborted) {
|
|
270
|
+
const subscription = new AbortController();
|
|
271
|
+
const signal = AbortSignal.any([controller.signal, subscription.signal]);
|
|
272
|
+
let pending;
|
|
273
|
+
const write = async (batch) => {
|
|
274
|
+
try {
|
|
275
|
+
signal.throwIfAborted();
|
|
276
|
+
await submit(scope, { kind: 'events', ...batch, source: source.key, events: classify(batch.events) }, true, signal, (error) => subscription.abort(error));
|
|
277
|
+
if (!signal.aborted)
|
|
278
|
+
failures = 0;
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
subscription.abort(error);
|
|
282
|
+
throw error;
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
const emit = (batch) => {
|
|
286
|
+
pending = write(batch);
|
|
287
|
+
pending.catch(() => undefined);
|
|
288
|
+
return pending;
|
|
289
|
+
};
|
|
290
|
+
try {
|
|
291
|
+
const cursor = (await readRecord(config.store, scope, modes))?.cursors[source.key] ?? null;
|
|
292
|
+
controller.signal.throwIfAborted();
|
|
293
|
+
await source.subscribe(cursor, emit, signal);
|
|
294
|
+
await pending;
|
|
295
|
+
signal.throwIfAborted();
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
if (controller.signal.aborted)
|
|
300
|
+
return;
|
|
301
|
+
const failure = subscription.signal.aborted ? subscription.signal.reason : error;
|
|
302
|
+
subscription.abort(failure);
|
|
303
|
+
if (isPermanent(failure))
|
|
304
|
+
throw failure;
|
|
305
|
+
failures += 1;
|
|
306
|
+
const delay = policy.retryBackoffMs[Math.min(failures, policy.retryBackoffMs.length) - 1] ?? policy.deliveryTimeoutMs;
|
|
307
|
+
observe({ kind: 'retrying', scope, stage: 'source', id: source.key, attempt: failures, at: clock.now() + delay, message: messageOf(failure) });
|
|
308
|
+
await sleep(clock, delay, controller.signal);
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
subscription.abort();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
attached.delete(slot);
|
|
317
|
+
sources.delete(controller);
|
|
318
|
+
options?.signal?.removeEventListener('abort', abort);
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
async run({ signal, sweepMs = 1000, sweepLimit = 100 }) {
|
|
322
|
+
if (running)
|
|
323
|
+
throw new Error('attend: already running');
|
|
324
|
+
running = { signal };
|
|
325
|
+
const onAbort = () => { running = null; scheduler.stop(); for (const source of sources)
|
|
326
|
+
source.abort(); };
|
|
327
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
328
|
+
try {
|
|
329
|
+
if (signal.aborted)
|
|
330
|
+
return;
|
|
331
|
+
scopes.armAll();
|
|
332
|
+
await sweep(Number.MAX_SAFE_INTEGER, sweepLimit, true);
|
|
333
|
+
while (!signal.aborted) {
|
|
334
|
+
await sweep(clock.now(), sweepLimit, false);
|
|
335
|
+
scopes.evict();
|
|
336
|
+
await sleep(clock, sweepMs, signal);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
finally {
|
|
340
|
+
onAbort();
|
|
341
|
+
signal.removeEventListener('abort', onAbort);
|
|
342
|
+
const writes = scopes.pending();
|
|
343
|
+
await Promise.all([...calls].map(([done, leaseUntil]) => settledOrExpired(done, leaseUntil)));
|
|
344
|
+
await writes;
|
|
345
|
+
while (releases.size > 0)
|
|
346
|
+
await Promise.all(releases);
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
function isJudgment(value) {
|
|
352
|
+
if (typeof value !== 'object' || value === null || !('route' in value))
|
|
353
|
+
return false;
|
|
354
|
+
if (!ROUTES.some((route) => route === value.route))
|
|
355
|
+
return false;
|
|
356
|
+
const probabilities = 'probabilities' in value ? value.probabilities : undefined;
|
|
357
|
+
const predicates = 'predicates' in value ? value.predicates : undefined;
|
|
358
|
+
const optionalObject = (v) => v === undefined || (typeof v === 'object' && v !== null);
|
|
359
|
+
return optionalObject(probabilities) && optionalObject(predicates);
|
|
360
|
+
}
|
|
361
|
+
/** A sink with a required handler for each delivered route. */
|
|
362
|
+
export function routes(handlers) {
|
|
363
|
+
return {
|
|
364
|
+
async deliver(decision, signal) {
|
|
365
|
+
switch (decision.route) {
|
|
366
|
+
case 'interrupt':
|
|
367
|
+
return handlers.interrupt({ ...decision, route: 'interrupt' }, signal);
|
|
368
|
+
case 'queue':
|
|
369
|
+
return handlers.queue({ ...decision, route: 'queue' }, signal);
|
|
370
|
+
case 'note':
|
|
371
|
+
return handlers.note({ ...decision, route: 'note' }, signal);
|
|
372
|
+
case 'ask':
|
|
373
|
+
return handlers.ask({ ...decision, route: 'ask' }, signal);
|
|
374
|
+
default:
|
|
375
|
+
return assertNever(decision.route);
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
const ROUTE_HINT = {
|
|
381
|
+
interrupt: 'Attend to this now, even mid-task.',
|
|
382
|
+
queue: 'Take this up when the current step is done.',
|
|
383
|
+
note: 'Background only. No reply is needed.',
|
|
384
|
+
ask: 'The user was offered a way to call you in. Stay quiet unless they do.',
|
|
385
|
+
};
|
|
386
|
+
/** The text an agent hears: the window's event lines oldest first, what was left out, and one line on the route. */
|
|
387
|
+
export function defaultNotice(decision, options) {
|
|
388
|
+
const max = options?.maxLines ?? 20;
|
|
389
|
+
const lines = decision.window.events.filter((e) => e.kind !== 'context').map((e) => e.text ?? `${e.name} ${JSON.stringify(e.data)}`);
|
|
390
|
+
const shown = lines.slice(-max);
|
|
391
|
+
const out = [];
|
|
392
|
+
if (lines.length > shown.length)
|
|
393
|
+
out.push(`(${lines.length - shown.length} older events not shown)`);
|
|
394
|
+
if (decision.window.gap)
|
|
395
|
+
out.push('Some events before these were lost.');
|
|
396
|
+
out.push(...shown);
|
|
397
|
+
if (decision.window.dropped > 0)
|
|
398
|
+
out.push(`(${decision.window.dropped} background events dropped from this window)`);
|
|
399
|
+
out.push(ROUTE_HINT[decision.route]);
|
|
400
|
+
return out.join('\n');
|
|
401
|
+
}
|
|
402
|
+
/** A resumable source over an event log, with optional polling and blocking waits. */
|
|
403
|
+
export function logSource(log, scope, options) {
|
|
404
|
+
const limit = options?.limit ?? 100;
|
|
405
|
+
const blockMs = options?.blockMs ?? 1000;
|
|
406
|
+
const pollMs = options?.pollMs ?? 250;
|
|
407
|
+
const clock = options?.clock ?? systemClock();
|
|
408
|
+
return {
|
|
409
|
+
key: `log:${scope}`,
|
|
410
|
+
async subscribe(cursor, emit, signal) {
|
|
411
|
+
let after = cursor;
|
|
412
|
+
while (!signal.aborted) {
|
|
413
|
+
const entries = await log.read(scope, after, { limit, blockMs });
|
|
414
|
+
if (signal.aborted)
|
|
415
|
+
return;
|
|
416
|
+
const last = entries[entries.length - 1];
|
|
417
|
+
if (last) {
|
|
418
|
+
await emit({ events: entries.map((e) => e.event), cursor: last.position });
|
|
419
|
+
after = last.position;
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
await sleep(clock, pollMs, signal);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
//# sourceMappingURL=attend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attend.js","sourceRoot":"","sources":["../src/attend.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FnvState } from './types.js';
|
|
2
|
+
/** FNV-1a 64 over `len:part` for the scope and each id, as 16 hex characters. */
|
|
3
|
+
export declare function windowId(scope: string, ids: readonly string[]): string;
|
|
4
|
+
/** A fresh FNV-1a 64 state with `len:scope` already folded. */
|
|
5
|
+
export declare function fnvStart(scope: string): FnvState;
|
|
6
|
+
/** Folds `len:id` (UTF-8 byte length, a colon, the UTF-8 bytes) into `state` in place. */
|
|
7
|
+
export declare function foldId(state: FnvState, id: string): void;
|
|
8
|
+
/** The two unsigned limbs as 16 lowercase hex characters. */
|
|
9
|
+
export declare function fnvHex(state: FnvState): string;
|
|
10
|
+
/** UTF-8 byte length, replacing lone surrogates with U+FFFD as TextEncoder does. */
|
|
11
|
+
export declare function utf8Length(text: string): number;
|
|
12
|
+
//# sourceMappingURL=ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/core/ids.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAItE;AAED,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAIhD;AAED,0FAA0F;AAC1F,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAsDxD;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAE9C;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY/C"}
|
package/dist/core/ids.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** FNV-1a 64 over `len:part` for the scope and each id, as 16 hex characters. */
|
|
2
|
+
export function windowId(scope, ids) {
|
|
3
|
+
const state = fnvStart(scope);
|
|
4
|
+
for (const id of ids)
|
|
5
|
+
foldId(state, id);
|
|
6
|
+
return fnvHex(state);
|
|
7
|
+
}
|
|
8
|
+
/** A fresh FNV-1a 64 state with `len:scope` already folded. */
|
|
9
|
+
export function fnvStart(scope) {
|
|
10
|
+
const state = { hi: 0xcbf29ce4, lo: 0x84222325 };
|
|
11
|
+
foldId(state, scope);
|
|
12
|
+
return state;
|
|
13
|
+
}
|
|
14
|
+
/** Folds `len:id` (UTF-8 byte length, a colon, the UTF-8 bytes) into `state` in place. */
|
|
15
|
+
export function foldId(state, id) {
|
|
16
|
+
let hi = state.hi;
|
|
17
|
+
let lo = state.lo;
|
|
18
|
+
let length = utf8Length(id);
|
|
19
|
+
let divisor = 1;
|
|
20
|
+
while (divisor * 10 <= length)
|
|
21
|
+
divisor *= 10;
|
|
22
|
+
while (divisor >= 1) {
|
|
23
|
+
const digit = Math.floor(length / divisor);
|
|
24
|
+
lo = (lo ^ (48 + digit)) >>> 0;
|
|
25
|
+
const product = lo * 0x1b3;
|
|
26
|
+
hi = (hi * 0x1b3 + Math.floor(product / 0x100000000) + ((lo << 8) >>> 0)) >>> 0;
|
|
27
|
+
lo = product >>> 0;
|
|
28
|
+
length -= digit * divisor;
|
|
29
|
+
divisor /= 10;
|
|
30
|
+
}
|
|
31
|
+
lo = (lo ^ 0x3a) >>> 0;
|
|
32
|
+
const product = lo * 0x1b3;
|
|
33
|
+
hi = (hi * 0x1b3 + Math.floor(product / 0x100000000) + ((lo << 8) >>> 0)) >>> 0;
|
|
34
|
+
lo = product >>> 0;
|
|
35
|
+
for (let i = 0; i < id.length; i += 1) {
|
|
36
|
+
let code = id.charCodeAt(i);
|
|
37
|
+
let packed = code;
|
|
38
|
+
let count = 1;
|
|
39
|
+
if (code >= 0x80) {
|
|
40
|
+
if (code >= 0xd800 && code <= 0xdfff) {
|
|
41
|
+
const next = id.charCodeAt(i + 1);
|
|
42
|
+
if (code <= 0xdbff && next >= 0xdc00 && next <= 0xdfff) {
|
|
43
|
+
code = 0x10000 + ((code - 0xd800) << 10) + next - 0xdc00;
|
|
44
|
+
i += 1;
|
|
45
|
+
}
|
|
46
|
+
else
|
|
47
|
+
code = 0xfffd;
|
|
48
|
+
}
|
|
49
|
+
if (code < 0x800) {
|
|
50
|
+
packed = (0xc0 | (code >>> 6)) | ((0x80 | (code & 0x3f)) << 8);
|
|
51
|
+
count = 2;
|
|
52
|
+
}
|
|
53
|
+
else if (code < 0x10000) {
|
|
54
|
+
packed = (0xe0 | (code >>> 12)) | ((0x80 | ((code >>> 6) & 0x3f)) << 8) | ((0x80 | (code & 0x3f)) << 16);
|
|
55
|
+
count = 3;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
packed = (0xf0 | (code >>> 18)) | ((0x80 | ((code >>> 12) & 0x3f)) << 8)
|
|
59
|
+
| ((0x80 | ((code >>> 6) & 0x3f)) << 16) | ((0x80 | (code & 0x3f)) << 24);
|
|
60
|
+
count = 4;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
do {
|
|
64
|
+
lo = (lo ^ (packed & 0xff)) >>> 0;
|
|
65
|
+
const product = lo * 0x1b3;
|
|
66
|
+
hi = (hi * 0x1b3 + Math.floor(product / 0x100000000) + ((lo << 8) >>> 0)) >>> 0;
|
|
67
|
+
lo = product >>> 0;
|
|
68
|
+
packed >>>= 8;
|
|
69
|
+
count -= 1;
|
|
70
|
+
} while (count > 0);
|
|
71
|
+
}
|
|
72
|
+
state.hi = hi;
|
|
73
|
+
state.lo = lo;
|
|
74
|
+
}
|
|
75
|
+
/** The two unsigned limbs as 16 lowercase hex characters. */
|
|
76
|
+
export function fnvHex(state) {
|
|
77
|
+
return state.hi.toString(16).padStart(8, '0') + state.lo.toString(16).padStart(8, '0');
|
|
78
|
+
}
|
|
79
|
+
/** UTF-8 byte length, replacing lone surrogates with U+FFFD as TextEncoder does. */
|
|
80
|
+
export function utf8Length(text) {
|
|
81
|
+
let length = 0;
|
|
82
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
83
|
+
const code = text.charCodeAt(i);
|
|
84
|
+
if (code < 0x80)
|
|
85
|
+
length += 1;
|
|
86
|
+
else if (code < 0x800)
|
|
87
|
+
length += 2;
|
|
88
|
+
else if (code >= 0xd800 && code <= 0xdbff && text.charCodeAt(i + 1) >= 0xdc00 && text.charCodeAt(i + 1) <= 0xdfff) {
|
|
89
|
+
length += 4;
|
|
90
|
+
i += 1;
|
|
91
|
+
}
|
|
92
|
+
else
|
|
93
|
+
length += 3;
|
|
94
|
+
}
|
|
95
|
+
return length;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=ids.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/core/ids.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ApplyConfig, ApplyOutput, Decision, Judgment, LoggedInput, Route, ScopeState, SettlePolicy } from './types.js';
|
|
2
|
+
/** Bumped whenever a release changes a transition. Stored with every snapshot. */
|
|
3
|
+
export declare const REDUCER_VERSION = 1;
|
|
4
|
+
/** An empty output. One output may collect several inputs: `apply` only ever sets `changed`. */
|
|
5
|
+
export declare function newOutput(): ApplyOutput;
|
|
6
|
+
/**
|
|
7
|
+
* Applies one logged input to `state` in place: today's transitions, plus `end`, `judgeDeferred`
|
|
8
|
+
* and the `size` trigger. Deterministic in (state, logged, config). Pushes effects and decision
|
|
9
|
+
* rows onto `out`, and sets `out.changed` if anything changed. Never reads a clock and never calls
|
|
10
|
+
* app code. `events`, `flush`, `end` and the releases still yield traces only.
|
|
11
|
+
*/
|
|
12
|
+
export declare function apply(config: ApplyConfig, state: ScopeState, logged: LoggedInput, out: ApplyOutput): void;
|
|
13
|
+
/** The instant the state next wants a tick: the batch's time, the open window's deadline unless judging, and each lane head's time. */
|
|
14
|
+
export declare function nextDue(policy: SettlePolicy, state: ScopeState): number | null;
|
|
15
|
+
/** Every route, with `wait` only when it is offered. */
|
|
16
|
+
export declare function offeredRoutes(offerWait: boolean): Route[];
|
|
17
|
+
/**
|
|
18
|
+
* Validate the judge's answer at the boundary. The route must be offered, or the answer is
|
|
19
|
+
* null. Probabilities outside [0, 1] or for routes not offered count as 0 and the vector is
|
|
20
|
+
* renormalised; when it sums to 0 the chosen route gets 1. Predicates and a confidence outside
|
|
21
|
+
* [0, 1] are dropped.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validate(judgment: Judgment, offered: Route[]): (Pick<Decision, 'probabilities' | 'predicates' | 'confidence'> & {
|
|
24
|
+
route: Route;
|
|
25
|
+
}) | null;
|
|
26
|
+
//# sourceMappingURL=reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/core/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAAE,WAAW,EAA0B,QAAQ,EACT,QAAQ,EAAE,WAAW,EAAc,KAAK,EAAE,UAAU,EACrG,YAAY,EACb,MAAM,YAAY,CAAC;AAMpB,kFAAkF;AAClF,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,gGAAgG;AAChG,wBAAgB,SAAS,IAAI,WAAW,CAEvC;AAYD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CA2EzG;AAyCD,uIAAuI;AACvI,wBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAgB9E;AAsED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,KAAK,EAAE,CAEzD;AA6CD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC,GAAG;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,GAAG,IAAI,CAkBxJ"}
|