@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
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { fnvStart, foldId } from './ids.js';
|
|
2
|
+
import { seenFrom, seenIds } from './seen.js';
|
|
3
|
+
import { assertWindow, openWindow, windowEntries, windowFrom, windowSize } from './window.js';
|
|
4
|
+
import { nextDue } from './reducer.js';
|
|
5
|
+
/** An empty, owned scope at version zero. */
|
|
6
|
+
export function initialState(scope, _policy) {
|
|
7
|
+
return {
|
|
8
|
+
scope, version: 0, cursors: {}, ...seenFrom([], [], []), open: openWindow(scope),
|
|
9
|
+
batch: null, outbox: { decisions: [], deadLetters: [] }, recent: [], dueAt: null,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
/** Builds owned state from a snapshot. Copies every array it will mutate and never mutates `record`. O(W + S + outbox). */
|
|
13
|
+
export function fromRecord(record, policy) {
|
|
14
|
+
const held = record.batch;
|
|
15
|
+
const state = {
|
|
16
|
+
scope: record.scope, version: record.version, cursors: record.cursors,
|
|
17
|
+
...seenFrom(record.seen, record.buffer.entries, held?.window.events ?? []),
|
|
18
|
+
open: windowFrom(record.scope, record.buffer),
|
|
19
|
+
batch: held ? { window: held.window, phase: held.phase, hash: heldHash(record.scope, held.window.events) } : null,
|
|
20
|
+
outbox: { decisions: [...record.outbox.decisions], deadLetters: [...record.outbox.deadLetters] },
|
|
21
|
+
recent: record.recent, dueAt: null,
|
|
22
|
+
};
|
|
23
|
+
state.dueAt = nextDue(policy, state);
|
|
24
|
+
return state;
|
|
25
|
+
}
|
|
26
|
+
function heldHash(scope, events) {
|
|
27
|
+
const hash = fnvStart(scope);
|
|
28
|
+
for (const entry of events)
|
|
29
|
+
foldId(hash, entry.id);
|
|
30
|
+
return hash;
|
|
31
|
+
}
|
|
32
|
+
/** The state as a fresh `ScopeRecord`, deep-equal to the copying reducer's. Shares immutable parts. O(W + S + outbox). */
|
|
33
|
+
export function toRecord(state) {
|
|
34
|
+
const open = state.open;
|
|
35
|
+
const buffer = { entries: windowEntries(open), dropped: open.dropped, gap: open.gap, forcedAt: open.forcedAt };
|
|
36
|
+
if (open.endedAt !== null)
|
|
37
|
+
buffer.endedAt = open.endedAt;
|
|
38
|
+
return {
|
|
39
|
+
version: state.version, scope: state.scope, cursors: state.cursors, seen: seenIds(state.seen), buffer,
|
|
40
|
+
batch: state.batch ? { window: state.batch.window, phase: state.batch.phase } : null,
|
|
41
|
+
outbox: { decisions: [...state.outbox.decisions], deadLetters: [...state.outbox.deadLetters] },
|
|
42
|
+
recent: state.recent, dueAt: state.dueAt,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** True when the scope holds nothing: an empty window, no batch, empty lanes and `dueAt === null`. Such a scope may be evicted from the cache. */
|
|
46
|
+
export function quiescent(state) {
|
|
47
|
+
return windowSize(state.open) === 0 && state.batch === null && state.outbox.decisions.length === 0
|
|
48
|
+
&& state.outbox.deadLetters.length === 0 && state.dueAt === null;
|
|
49
|
+
}
|
|
50
|
+
/** Checks the state's invariants after an apply, in tests and debug builds. Throws, naming the broken invariant. */
|
|
51
|
+
export function assertInvariants(state, policy) {
|
|
52
|
+
const ring = state.seen;
|
|
53
|
+
if (ring.size > Math.max(0, policy.seenCount) || ring.ids.length !== ring.capacity || ring.head < 0
|
|
54
|
+
|| (ring.capacity > 0 && ring.head >= ring.capacity) || ring.size < 0 || ring.size > ring.capacity) {
|
|
55
|
+
throw new Error('I2: seen ring');
|
|
56
|
+
}
|
|
57
|
+
const expected = new Map();
|
|
58
|
+
for (const id of seenIds(ring))
|
|
59
|
+
expected.set(id, (expected.get(id) ?? 0) + 1);
|
|
60
|
+
const windows = new Set();
|
|
61
|
+
for (const entries of [windowEntries(state.open), state.batch?.window.events ?? []]) {
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
if (windows.has(entry.id))
|
|
64
|
+
throw new Error('I1: duplicate window id');
|
|
65
|
+
windows.add(entry.id);
|
|
66
|
+
expected.set(entry.id, (expected.get(entry.id) ?? 0) + 1);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (expected.size !== state.known.size)
|
|
70
|
+
throw new Error('I1: known ids');
|
|
71
|
+
for (const [id, count] of expected)
|
|
72
|
+
if (state.known.get(id) !== count)
|
|
73
|
+
throw new Error('I1: known count');
|
|
74
|
+
assertWindow(state.scope, state.open);
|
|
75
|
+
if (state.batch?.hash) {
|
|
76
|
+
const hash = heldHash(state.scope, state.batch.window.events);
|
|
77
|
+
if (hash.hi !== state.batch.hash.hi || hash.lo !== state.batch.hash.lo)
|
|
78
|
+
throw new Error('I5: held hash');
|
|
79
|
+
}
|
|
80
|
+
if (state.open.endedAt !== null && windowSize(state.open) === 0)
|
|
81
|
+
throw new Error('I3: endedAt on an empty window');
|
|
82
|
+
if (!Object.is(state.dueAt, nextDue(policy, state)))
|
|
83
|
+
throw new Error('I6: dueAt');
|
|
84
|
+
for (const lane of [state.outbox.decisions, state.outbox.deadLetters]) {
|
|
85
|
+
for (let i = 1; i < lane.length; i += 1)
|
|
86
|
+
if (lane[i]?.phase.phase === 'inFlight')
|
|
87
|
+
throw new Error('outbox: more than one in flight in a lane');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EndInput, EventsInput, FlushInput, Input, JudgeDeferredInput, ReleasedInput, ScopeRecord, StepConfig, Stepped, TraceEffect } from './types.js';
|
|
2
|
+
export type { StepConfig } from './types.js';
|
|
3
|
+
export { deadline, isAct } from './window.js';
|
|
4
|
+
export { offeredRoutes, validate } from './reducer.js';
|
|
5
|
+
export { windowId } from './ids.js';
|
|
6
|
+
/**
|
|
7
|
+
* The pure reducer for tests, evals and replays: `fromRecord`, then `apply`, then `toRecord`.
|
|
8
|
+
* Never mutates `record`. O(W + S) per call, so a runtime that owns its state calls `apply`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function step(config: StepConfig, record: ScopeRecord, input: EventsInput | FlushInput | EndInput | ReleasedInput | JudgeDeferredInput, now: number): Stepped<TraceEffect>;
|
|
11
|
+
export declare function step(config: StepConfig, record: ScopeRecord, input: Input, now: number): Stepped;
|
|
12
|
+
/** The empty snapshot at version zero. */
|
|
13
|
+
export declare function initialRecord(scope: string): ScopeRecord;
|
|
14
|
+
//# sourceMappingURL=step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/core/step.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI7J,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC;;;GAGG;AACH,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAClL,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;AAQlG,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAGxD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { fromRecord, toRecord } from './state.js';
|
|
2
|
+
import { apply, newOutput } from './reducer.js';
|
|
3
|
+
export { deadline, isAct } from './window.js';
|
|
4
|
+
export { offeredRoutes, validate } from './reducer.js';
|
|
5
|
+
export { windowId } from './ids.js';
|
|
6
|
+
export function step(config, record, input, now) {
|
|
7
|
+
const state = fromRecord(record, config.policy);
|
|
8
|
+
const out = newOutput();
|
|
9
|
+
apply({ policy: config.policy, decisions: config.decisions ?? 'lane', deadLetters: config.deadLetters ?? 'lane', traces: true }, state, { input, now }, out);
|
|
10
|
+
return { record: toRecord(state), effects: out.effects };
|
|
11
|
+
}
|
|
12
|
+
/** The empty snapshot at version zero. */
|
|
13
|
+
export function initialRecord(scope) {
|
|
14
|
+
return { version: 0, scope, cursors: {}, seen: [], buffer: { entries: [], dropped: 0, gap: false, forcedAt: null },
|
|
15
|
+
batch: null, outbox: { decisions: [], deadLetters: [] }, recent: [], dueAt: null };
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step.js","sourceRoot":"","sources":["../../src/core/step.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAQpC,MAAM,UAAU,IAAI,CAAC,MAAkB,EAAE,MAAmB,EAAE,KAAY,EAAE,GAAW;IACrF,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7J,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AAC3D,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;QAChH,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type Judgment, type Route } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The act-threshold rule. `act` is p(interrupt) + p(ask) from the judgment's own probabilities,
|
|
4
|
+
* with missing entries counted as 0. Only finite probabilities in [0, 1] count, as `validate`
|
|
5
|
+
* reads them. Returns the route to stage instead of the judge's, with `act`, or null when the
|
|
6
|
+
* judge's route stands. A judgment with no usable probability is never changed.
|
|
7
|
+
* At or above the threshold, choose the offered interrupt or ask with the higher probability;
|
|
8
|
+
* ties go to ask. If neither is offered, the judge's route stands. Below the threshold, replace
|
|
9
|
+
* an acting route with the highest-probability offered non-acting route; ties prefer skip,
|
|
10
|
+
* note, queue, then wait. Otherwise the judge's route stands.
|
|
11
|
+
*/
|
|
12
|
+
export declare function thresholdRoute(judgment: Judgment, offered: readonly Route[], actThreshold: number): {
|
|
13
|
+
route: Route;
|
|
14
|
+
act: number;
|
|
15
|
+
} | null;
|
|
16
|
+
/** Replay duration and the maximum acceptable act rate. */
|
|
17
|
+
export interface SuggestThresholdOptions {
|
|
18
|
+
/** How long the replay that recorded the judgments covered. */
|
|
19
|
+
durationMs: number;
|
|
20
|
+
maxActsPerHour: number;
|
|
21
|
+
}
|
|
22
|
+
/** The observed act count and hourly rate at one candidate threshold. */
|
|
23
|
+
export interface ThresholdCandidate {
|
|
24
|
+
threshold: number;
|
|
25
|
+
acts: number;
|
|
26
|
+
actsPerHour: number;
|
|
27
|
+
}
|
|
28
|
+
/** Candidate rates and the smallest threshold that meets the budget. */
|
|
29
|
+
export interface ThresholdSuggestion {
|
|
30
|
+
/** The smallest threshold whose act rate fits the budget, or null when none does. */
|
|
31
|
+
threshold: number | null;
|
|
32
|
+
candidates: ThresholdCandidate[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Picks an `actThreshold` offline from the judgments a replay recorded, with no extra judge calls.
|
|
36
|
+
* The candidates are every `act` above 0 that the judgments reach, capped at 1, plus 1. A judgment
|
|
37
|
+
* with no usable probability acts at every threshold when its own route is interrupt or ask.
|
|
38
|
+
*/
|
|
39
|
+
export declare function suggestThreshold(judgments: readonly Pick<Judgment, 'route' | 'probabilities'>[], options: SuggestThresholdOptions): ThresholdSuggestion;
|
|
40
|
+
//# sourceMappingURL=threshold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold.d.ts","sourceRoot":"","sources":["../../src/core/threshold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/D;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAcxI;AAED,2DAA2D;AAC3D,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yEAAyE;AACzE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wEAAwE;AACxE,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,uBAAuB,GAAG,mBAAmB,CAoBvJ"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { ROUTES } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The act-threshold rule. `act` is p(interrupt) + p(ask) from the judgment's own probabilities,
|
|
4
|
+
* with missing entries counted as 0. Only finite probabilities in [0, 1] count, as `validate`
|
|
5
|
+
* reads them. Returns the route to stage instead of the judge's, with `act`, or null when the
|
|
6
|
+
* judge's route stands. A judgment with no usable probability is never changed.
|
|
7
|
+
* At or above the threshold, choose the offered interrupt or ask with the higher probability;
|
|
8
|
+
* ties go to ask. If neither is offered, the judge's route stands. Below the threshold, replace
|
|
9
|
+
* an acting route with the highest-probability offered non-acting route; ties prefer skip,
|
|
10
|
+
* note, queue, then wait. Otherwise the judge's route stands.
|
|
11
|
+
*/
|
|
12
|
+
export function thresholdRoute(judgment, offered, actThreshold) {
|
|
13
|
+
const act = actProbability(judgment);
|
|
14
|
+
if (act === null)
|
|
15
|
+
return null;
|
|
16
|
+
const choices = act >= actThreshold ? ['ask', 'interrupt'] : acting(judgment.route) ? ['skip', 'note', 'queue', 'wait'] : [];
|
|
17
|
+
let route;
|
|
18
|
+
let best = -1;
|
|
19
|
+
for (const choice of choices) {
|
|
20
|
+
const p = probability(judgment.probabilities?.[choice]) ?? 0;
|
|
21
|
+
if (offered.includes(choice) && p > best) {
|
|
22
|
+
route = choice;
|
|
23
|
+
best = p;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return route === undefined || route === judgment.route ? null : { route, act };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Picks an `actThreshold` offline from the judgments a replay recorded, with no extra judge calls.
|
|
30
|
+
* The candidates are every `act` above 0 that the judgments reach, capped at 1, plus 1. A judgment
|
|
31
|
+
* with no usable probability acts at every threshold when its own route is interrupt or ask.
|
|
32
|
+
*/
|
|
33
|
+
export function suggestThreshold(judgments, options) {
|
|
34
|
+
const { durationMs, maxActsPerHour } = options;
|
|
35
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0)
|
|
36
|
+
throw new RangeError(`attend: suggestThreshold needs a positive durationMs, got ${durationMs}`);
|
|
37
|
+
if (!Number.isFinite(maxActsPerHour) || maxActsPerHour < 0)
|
|
38
|
+
throw new RangeError(`attend: suggestThreshold needs a maxActsPerHour of 0 or more, got ${maxActsPerHour}`);
|
|
39
|
+
const acts = [];
|
|
40
|
+
let fixed = 0;
|
|
41
|
+
for (const judgment of judgments) {
|
|
42
|
+
const act = actProbability(judgment);
|
|
43
|
+
if (act === null)
|
|
44
|
+
fixed += Number(acting(judgment.route));
|
|
45
|
+
else if (act > 0)
|
|
46
|
+
acts.push(act);
|
|
47
|
+
}
|
|
48
|
+
acts.sort((a, b) => a - b);
|
|
49
|
+
const thresholds = [...new Set([...acts.map((act) => Math.min(act, 1)), 1])];
|
|
50
|
+
let below = 0;
|
|
51
|
+
const candidates = thresholds.map((threshold) => {
|
|
52
|
+
while (below < acts.length && (acts[below] ?? 0) < threshold)
|
|
53
|
+
below += 1;
|
|
54
|
+
const count = fixed + acts.length - below;
|
|
55
|
+
return { threshold, acts: count, actsPerHour: (count * 3_600_000) / durationMs };
|
|
56
|
+
});
|
|
57
|
+
return { threshold: candidates.find((candidate) => candidate.actsPerHour <= maxActsPerHour)?.threshold ?? null, candidates };
|
|
58
|
+
}
|
|
59
|
+
function probability(value) {
|
|
60
|
+
return value !== undefined && Number.isFinite(value) && value >= 0 && value <= 1 ? value : undefined;
|
|
61
|
+
}
|
|
62
|
+
function acting(route) {
|
|
63
|
+
return route === 'interrupt' || route === 'ask';
|
|
64
|
+
}
|
|
65
|
+
function actProbability(judgment) {
|
|
66
|
+
const { probabilities } = judgment;
|
|
67
|
+
if (probabilities === undefined || !ROUTES.some((route) => probability(probabilities[route]) !== undefined))
|
|
68
|
+
return null;
|
|
69
|
+
// Decimal sums such as 0.7 + 0.1 must meet an exact 0.8 threshold.
|
|
70
|
+
return Math.round(((probability(probabilities.interrupt) ?? 0) + (probability(probabilities.ask) ?? 0)) * 1e12) / 1e12;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=threshold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold.js","sourceRoot":"","sources":["../../src/core/threshold.ts"],"names":[],"mappings":"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"}
|