trellis-hgl-core 0.6.0-beta.18
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 +235 -0
- package/dist/channel/api/assert.d.ts +3 -0
- package/dist/channel/api/assert.d.ts.map +1 -0
- package/dist/channel/api/assert.js +11 -0
- package/dist/channel/api/assert.js.map +1 -0
- package/dist/channel/api/context.d.ts +21 -0
- package/dist/channel/api/context.d.ts.map +1 -0
- package/dist/channel/api/context.js +99 -0
- package/dist/channel/api/context.js.map +1 -0
- package/dist/channel/api/create.d.ts +9 -0
- package/dist/channel/api/create.d.ts.map +1 -0
- package/dist/channel/api/create.js +104 -0
- package/dist/channel/api/create.js.map +1 -0
- package/dist/channel/api/inbox.d.ts +51 -0
- package/dist/channel/api/inbox.d.ts.map +1 -0
- package/dist/channel/api/inbox.js +176 -0
- package/dist/channel/api/inbox.js.map +1 -0
- package/dist/channel/api/interrupt.d.ts +31 -0
- package/dist/channel/api/interrupt.d.ts.map +1 -0
- package/dist/channel/api/interrupt.js +102 -0
- package/dist/channel/api/interrupt.js.map +1 -0
- package/dist/channel/api/post-thread.d.ts +14 -0
- package/dist/channel/api/post-thread.d.ts.map +1 -0
- package/dist/channel/api/post-thread.js +106 -0
- package/dist/channel/api/post-thread.js.map +1 -0
- package/dist/channel/api/read.d.ts +17 -0
- package/dist/channel/api/read.d.ts.map +1 -0
- package/dist/channel/api/read.js +44 -0
- package/dist/channel/api/read.js.map +1 -0
- package/dist/channel/api/resolve.d.ts +21 -0
- package/dist/channel/api/resolve.d.ts.map +1 -0
- package/dist/channel/api/resolve.js +28 -0
- package/dist/channel/api/resolve.js.map +1 -0
- package/dist/channel/api/runtime.d.ts +70 -0
- package/dist/channel/api/runtime.d.ts.map +1 -0
- package/dist/channel/api/runtime.js +11 -0
- package/dist/channel/api/runtime.js.map +1 -0
- package/dist/channel/api/send.d.ts +4 -0
- package/dist/channel/api/send.d.ts.map +1 -0
- package/dist/channel/api/send.js +44 -0
- package/dist/channel/api/send.js.map +1 -0
- package/dist/channel/api/spawn.d.ts +13 -0
- package/dist/channel/api/spawn.d.ts.map +1 -0
- package/dist/channel/api/spawn.js +54 -0
- package/dist/channel/api/spawn.js.map +1 -0
- package/dist/channel/api/title.d.ts +5 -0
- package/dist/channel/api/title.d.ts.map +1 -0
- package/dist/channel/api/title.js +40 -0
- package/dist/channel/api/title.js.map +1 -0
- package/dist/channel/api/types.d.ts +64 -0
- package/dist/channel/api/types.d.ts.map +1 -0
- package/dist/channel/api/types.js +2 -0
- package/dist/channel/api/types.js.map +1 -0
- package/dist/channel/api/watch-channels.d.ts +40 -0
- package/dist/channel/api/watch-channels.d.ts.map +1 -0
- package/dist/channel/api/watch-channels.js +143 -0
- package/dist/channel/api/watch-channels.js.map +1 -0
- package/dist/channel/api/watch.d.ts +11 -0
- package/dist/channel/api/watch.d.ts.map +1 -0
- package/dist/channel/api/watch.js +17 -0
- package/dist/channel/api/watch.js.map +1 -0
- package/dist/channel/api/workers.d.ts +69 -0
- package/dist/channel/api/workers.d.ts.map +1 -0
- package/dist/channel/api/workers.js +145 -0
- package/dist/channel/api/workers.js.map +1 -0
- package/dist/channel/index.d.ts +38 -0
- package/dist/channel/index.d.ts.map +1 -0
- package/dist/channel/index.js +23 -0
- package/dist/channel/index.js.map +1 -0
- package/dist/channel/internal/store/channel-metadata.d.ts +23 -0
- package/dist/channel/internal/store/channel-metadata.d.ts.map +1 -0
- package/dist/channel/internal/store/channel-metadata.js +94 -0
- package/dist/channel/internal/store/channel-metadata.js.map +1 -0
- package/dist/channel/internal/store/delivery.d.ts +27 -0
- package/dist/channel/internal/store/delivery.d.ts.map +1 -0
- package/dist/channel/internal/store/delivery.js +37 -0
- package/dist/channel/internal/store/delivery.js.map +1 -0
- package/dist/channel/internal/store/events.d.ts +203 -0
- package/dist/channel/internal/store/events.d.ts.map +1 -0
- package/dist/channel/internal/store/events.js +185 -0
- package/dist/channel/internal/store/events.js.map +1 -0
- package/dist/channel/internal/store/filter.d.ts +22 -0
- package/dist/channel/internal/store/filter.d.ts.map +1 -0
- package/dist/channel/internal/store/filter.js +78 -0
- package/dist/channel/internal/store/filter.js.map +1 -0
- package/dist/channel/internal/store/inbox.d.ts +17 -0
- package/dist/channel/internal/store/inbox.d.ts.map +1 -0
- package/dist/channel/internal/store/inbox.js +30 -0
- package/dist/channel/internal/store/inbox.js.map +1 -0
- package/dist/channel/internal/store/lock.d.ts +17 -0
- package/dist/channel/internal/store/lock.d.ts.map +1 -0
- package/dist/channel/internal/store/lock.js +88 -0
- package/dist/channel/internal/store/lock.js.map +1 -0
- package/dist/channel/internal/store/paths.d.ts +43 -0
- package/dist/channel/internal/store/paths.d.ts.map +1 -0
- package/dist/channel/internal/store/paths.js +233 -0
- package/dist/channel/internal/store/paths.js.map +1 -0
- package/dist/channel/internal/store/schema.d.ts +77 -0
- package/dist/channel/internal/store/schema.d.ts.map +1 -0
- package/dist/channel/internal/store/schema.js +127 -0
- package/dist/channel/internal/store/schema.js.map +1 -0
- package/dist/channel/internal/store/seq.d.ts +12 -0
- package/dist/channel/internal/store/seq.d.ts.map +1 -0
- package/dist/channel/internal/store/seq.js +133 -0
- package/dist/channel/internal/store/seq.js.map +1 -0
- package/dist/channel/internal/store/thread-state.d.ts +37 -0
- package/dist/channel/internal/store/thread-state.d.ts.map +1 -0
- package/dist/channel/internal/store/thread-state.js +206 -0
- package/dist/channel/internal/store/thread-state.js.map +1 -0
- package/dist/channel/internal/store/watch.d.ts +10 -0
- package/dist/channel/internal/store/watch.d.ts.map +1 -0
- package/dist/channel/internal/store/watch.js +122 -0
- package/dist/channel/internal/store/watch.js.map +1 -0
- package/dist/channel/internal/store/worker-state.d.ts +49 -0
- package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
- package/dist/channel/internal/store/worker-state.js +207 -0
- package/dist/channel/internal/store/worker-state.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mem/adapters/claude.d.ts +22 -0
- package/dist/mem/adapters/claude.d.ts.map +1 -0
- package/dist/mem/adapters/claude.js +252 -0
- package/dist/mem/adapters/claude.js.map +1 -0
- package/dist/mem/adapters/codex.d.ts +35 -0
- package/dist/mem/adapters/codex.d.ts.map +1 -0
- package/dist/mem/adapters/codex.js +222 -0
- package/dist/mem/adapters/codex.js.map +1 -0
- package/dist/mem/adapters/opencode.d.ts +19 -0
- package/dist/mem/adapters/opencode.d.ts.map +1 -0
- package/dist/mem/adapters/opencode.js +25 -0
- package/dist/mem/adapters/opencode.js.map +1 -0
- package/dist/mem/context.d.ts +23 -0
- package/dist/mem/context.d.ts.map +1 -0
- package/dist/mem/context.js +118 -0
- package/dist/mem/context.js.map +1 -0
- package/dist/mem/dialogue.d.ts +17 -0
- package/dist/mem/dialogue.d.ts.map +1 -0
- package/dist/mem/dialogue.js +51 -0
- package/dist/mem/dialogue.js.map +1 -0
- package/dist/mem/filter.d.ts +31 -0
- package/dist/mem/filter.d.ts.map +1 -0
- package/dist/mem/filter.js +70 -0
- package/dist/mem/filter.js.map +1 -0
- package/dist/mem/index.d.ts +18 -0
- package/dist/mem/index.d.ts.map +1 -0
- package/dist/mem/index.js +17 -0
- package/dist/mem/index.js.map +1 -0
- package/dist/mem/internal/jsonl.d.ts +35 -0
- package/dist/mem/internal/jsonl.d.ts.map +1 -0
- package/dist/mem/internal/jsonl.js +125 -0
- package/dist/mem/internal/jsonl.js.map +1 -0
- package/dist/mem/internal/paths.d.ts +18 -0
- package/dist/mem/internal/paths.d.ts.map +1 -0
- package/dist/mem/internal/paths.js +51 -0
- package/dist/mem/internal/paths.js.map +1 -0
- package/dist/mem/phase.d.ts +45 -0
- package/dist/mem/phase.d.ts.map +1 -0
- package/dist/mem/phase.js +220 -0
- package/dist/mem/phase.js.map +1 -0
- package/dist/mem/projects.d.ts +13 -0
- package/dist/mem/projects.d.ts.map +1 -0
- package/dist/mem/projects.js +37 -0
- package/dist/mem/projects.js.map +1 -0
- package/dist/mem/search.d.ts +32 -0
- package/dist/mem/search.d.ts.map +1 -0
- package/dist/mem/search.js +125 -0
- package/dist/mem/search.js.map +1 -0
- package/dist/mem/sessions.d.ts +37 -0
- package/dist/mem/sessions.d.ts.map +1 -0
- package/dist/mem/sessions.js +270 -0
- package/dist/mem/sessions.js.map +1 -0
- package/dist/mem/types.d.ts +176 -0
- package/dist/mem/types.d.ts.map +1 -0
- package/dist/mem/types.js +10 -0
- package/dist/mem/types.js.map +1 -0
- package/dist/task/index.d.ts +9 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/index.js +9 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/paths.d.ts +37 -0
- package/dist/task/paths.d.ts.map +1 -0
- package/dist/task/paths.js +49 -0
- package/dist/task/paths.js.map +1 -0
- package/dist/task/phase.d.ts +27 -0
- package/dist/task/phase.d.ts.map +1 -0
- package/dist/task/phase.js +24 -0
- package/dist/task/phase.js.map +1 -0
- package/dist/task/records.d.ts +39 -0
- package/dist/task/records.d.ts.map +1 -0
- package/dist/task/records.js +89 -0
- package/dist/task/records.js.map +1 -0
- package/dist/task/schema.d.ts +77 -0
- package/dist/task/schema.d.ts.map +1 -0
- package/dist/task/schema.js +220 -0
- package/dist/task/schema.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +4 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { type ChannelEvent } from "../internal/store/events.js";
|
|
2
|
+
import type { ChannelScope } from "../internal/store/schema.js";
|
|
3
|
+
import { type WorkerState } from "../internal/store/worker-state.js";
|
|
4
|
+
export interface ListWorkersInput {
|
|
5
|
+
channel: string;
|
|
6
|
+
scope?: ChannelScope;
|
|
7
|
+
projectKey?: string;
|
|
8
|
+
cwd?: string;
|
|
9
|
+
/** Include `done` / `error` / `killed` / `crashed` workers. Default false. */
|
|
10
|
+
includeTerminal?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Project the durable worker registry for a channel. SOT for CLI list /
|
|
14
|
+
* status, daemon runtime cards, and tests — do not reparse event logs
|
|
15
|
+
* independently.
|
|
16
|
+
*/
|
|
17
|
+
export declare function listWorkers(input: ListWorkersInput): Promise<WorkerState[]>;
|
|
18
|
+
export interface WatchWorkersInput extends ListWorkersInput {
|
|
19
|
+
sinceSeq?: number;
|
|
20
|
+
signal?: AbortSignal;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Watch the durable worker registry. Yields a fresh registry snapshot
|
|
24
|
+
* whenever a worker-relevant event lands. The first yield is the current
|
|
25
|
+
* snapshot.
|
|
26
|
+
*/
|
|
27
|
+
export declare function watchWorkers(input: WatchWorkersInput): AsyncGenerator<WorkerState[], void, unknown>;
|
|
28
|
+
export interface WorkerRuntimeObservation {
|
|
29
|
+
workerId: string;
|
|
30
|
+
/** Supervisor pid from `<worker>.pid`. */
|
|
31
|
+
pid?: number;
|
|
32
|
+
/** Worker child pid from `<worker>.worker-pid`. */
|
|
33
|
+
workerPid?: number;
|
|
34
|
+
supervisorAlive?: boolean;
|
|
35
|
+
workerAlive?: boolean;
|
|
36
|
+
observedAt: string;
|
|
37
|
+
source: "local-pid-files";
|
|
38
|
+
}
|
|
39
|
+
export interface ProbeWorkerRuntimeInput {
|
|
40
|
+
channel: string;
|
|
41
|
+
scope?: ChannelScope;
|
|
42
|
+
projectKey?: string;
|
|
43
|
+
cwd?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Host-local runtime observation. Reads `<worker>.pid` /
|
|
47
|
+
* `<worker>.worker-pid` files and checks OS liveness. This is NOT
|
|
48
|
+
* durable channel truth — `reduceWorkerRegistry` must never read pid
|
|
49
|
+
* files. Only valid on the machine that owns the supervisor files.
|
|
50
|
+
*/
|
|
51
|
+
export declare function probeWorkerRuntime(input: ProbeWorkerRuntimeInput): Promise<WorkerRuntimeObservation[]>;
|
|
52
|
+
export interface ReconcileWorkerLivenessInput extends ProbeWorkerRuntimeInput {
|
|
53
|
+
now?: () => Date;
|
|
54
|
+
/** Append the proposed terminal events. Default false (no durable writes). */
|
|
55
|
+
appendTerminalEvents?: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface ReconcileWorkerLivenessResult {
|
|
58
|
+
observations: WorkerRuntimeObservation[];
|
|
59
|
+
proposedEvents: ChannelEvent[];
|
|
60
|
+
appended: ChannelEvent[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reconcile durable worker state against host-local pid files. Reports
|
|
64
|
+
* observations and the durable events it would propose. Only writes when
|
|
65
|
+
* `appendTerminalEvents` is true — the default performs no durable
|
|
66
|
+
* writes. Valid only on the machine that owns the supervisor files.
|
|
67
|
+
*/
|
|
68
|
+
export declare function reconcileWorkerLiveness(input: ReconcileWorkerLivenessInput): Promise<ReconcileWorkerLivenessResult>;
|
|
69
|
+
//# sourceMappingURL=workers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../../src/channel/api/workers.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,mCAAmC,CAAC;AAG3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAkBD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,WAAW,EAAE,CAAC,CAOxB;AAED,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAuB,YAAY,CACjC,KAAK,EAAE,iBAAiB,GACvB,cAAc,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CA6B9C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAoBD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,wBAAwB,EAAE,CAAC,CA2BrC;AAED,MAAM,WAAW,4BAA6B,SAAQ,uBAAuB;IAC3E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,8EAA8E;IAC9E,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,YAAY,EAAE,wBAAwB,EAAE,CAAC;IACzC,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,6BAA6B,CAAC,CA4CxC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { appendEvent, readChannelEvents, } from "../internal/store/events.js";
|
|
3
|
+
import { workerFile } from "../internal/store/paths.js";
|
|
4
|
+
import { watchEvents } from "../internal/store/watch.js";
|
|
5
|
+
import { reduceWorkerRegistry, } from "../internal/store/worker-state.js";
|
|
6
|
+
import { resolveChannelRef } from "./resolve.js";
|
|
7
|
+
function resolve(input) {
|
|
8
|
+
return resolveChannelRef({
|
|
9
|
+
channel: input.channel,
|
|
10
|
+
...(input.scope !== undefined ? { scope: input.scope } : {}),
|
|
11
|
+
...(input.projectKey !== undefined
|
|
12
|
+
? { projectKey: input.projectKey }
|
|
13
|
+
: {}),
|
|
14
|
+
...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Project the durable worker registry for a channel. SOT for CLI list /
|
|
19
|
+
* status, daemon runtime cards, and tests — do not reparse event logs
|
|
20
|
+
* independently.
|
|
21
|
+
*/
|
|
22
|
+
export async function listWorkers(input) {
|
|
23
|
+
const ref = resolve(input);
|
|
24
|
+
const events = await readChannelEvents(input.channel, ref.project);
|
|
25
|
+
const registry = reduceWorkerRegistry(events, ref);
|
|
26
|
+
return input.includeTerminal
|
|
27
|
+
? registry.workers
|
|
28
|
+
: registry.workers.filter((w) => !w.terminal);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Watch the durable worker registry. Yields a fresh registry snapshot
|
|
32
|
+
* whenever a worker-relevant event lands. The first yield is the current
|
|
33
|
+
* snapshot.
|
|
34
|
+
*/
|
|
35
|
+
export async function* watchWorkers(input) {
|
|
36
|
+
const ref = resolve(input);
|
|
37
|
+
const events = await readChannelEvents(input.channel, ref.project);
|
|
38
|
+
const snapshot = () => {
|
|
39
|
+
const registry = reduceWorkerRegistry(events, ref);
|
|
40
|
+
return input.includeTerminal
|
|
41
|
+
? registry.workers
|
|
42
|
+
: registry.workers.filter((w) => !w.terminal);
|
|
43
|
+
};
|
|
44
|
+
yield snapshot();
|
|
45
|
+
const lastSeq = events.length > 0 ? events[events.length - 1].seq : 0;
|
|
46
|
+
const watchOpts = { project: ref.project, sinceSeq: input.sinceSeq ?? lastSeq };
|
|
47
|
+
if (input.signal)
|
|
48
|
+
watchOpts.signal = input.signal;
|
|
49
|
+
for await (const ev of watchEvents(input.channel, { includeNonMeaningful: true, includeProgress: false }, watchOpts)) {
|
|
50
|
+
events.push(ev);
|
|
51
|
+
yield snapshot();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function pidAlive(pid) {
|
|
55
|
+
try {
|
|
56
|
+
process.kill(pid, 0);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function readPidFile(path) {
|
|
64
|
+
try {
|
|
65
|
+
const n = Number(fs.readFileSync(path, "utf-8").trim());
|
|
66
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Host-local runtime observation. Reads `<worker>.pid` /
|
|
74
|
+
* `<worker>.worker-pid` files and checks OS liveness. This is NOT
|
|
75
|
+
* durable channel truth — `reduceWorkerRegistry` must never read pid
|
|
76
|
+
* files. Only valid on the machine that owns the supervisor files.
|
|
77
|
+
*/
|
|
78
|
+
export async function probeWorkerRuntime(input) {
|
|
79
|
+
const ref = resolve(input);
|
|
80
|
+
const events = await readChannelEvents(input.channel, ref.project);
|
|
81
|
+
const registry = reduceWorkerRegistry(events, ref);
|
|
82
|
+
const observedAt = new Date().toISOString();
|
|
83
|
+
return registry.workers.map((w) => {
|
|
84
|
+
const pid = readPidFile(workerFile(input.channel, w.workerId, "pid", ref.project));
|
|
85
|
+
const workerPid = readPidFile(workerFile(input.channel, w.workerId, "worker-pid", ref.project));
|
|
86
|
+
const obs = {
|
|
87
|
+
workerId: w.workerId,
|
|
88
|
+
observedAt,
|
|
89
|
+
source: "local-pid-files",
|
|
90
|
+
};
|
|
91
|
+
if (pid !== undefined) {
|
|
92
|
+
obs.pid = pid;
|
|
93
|
+
obs.supervisorAlive = pidAlive(pid);
|
|
94
|
+
}
|
|
95
|
+
if (workerPid !== undefined) {
|
|
96
|
+
obs.workerPid = workerPid;
|
|
97
|
+
obs.workerAlive = pidAlive(workerPid);
|
|
98
|
+
}
|
|
99
|
+
return obs;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Reconcile durable worker state against host-local pid files. Reports
|
|
104
|
+
* observations and the durable events it would propose. Only writes when
|
|
105
|
+
* `appendTerminalEvents` is true — the default performs no durable
|
|
106
|
+
* writes. Valid only on the machine that owns the supervisor files.
|
|
107
|
+
*/
|
|
108
|
+
export async function reconcileWorkerLiveness(input) {
|
|
109
|
+
const ref = resolve(input);
|
|
110
|
+
const events = await readChannelEvents(input.channel, ref.project);
|
|
111
|
+
const registry = reduceWorkerRegistry(events, ref);
|
|
112
|
+
const observations = await probeWorkerRuntime(input);
|
|
113
|
+
const obsById = new Map(observations.map((o) => [o.workerId, o]));
|
|
114
|
+
const now = (input.now ?? (() => new Date()))();
|
|
115
|
+
const proposedEvents = [];
|
|
116
|
+
for (const w of registry.workers) {
|
|
117
|
+
if (w.terminal)
|
|
118
|
+
continue;
|
|
119
|
+
const obs = obsById.get(w.workerId);
|
|
120
|
+
// A non-terminal worker whose supervisor pid is gone is a crash that
|
|
121
|
+
// never wrote a terminal event.
|
|
122
|
+
if (obs?.supervisorAlive === false) {
|
|
123
|
+
proposedEvents.push({
|
|
124
|
+
seq: 0,
|
|
125
|
+
ts: now.toISOString(),
|
|
126
|
+
kind: "error",
|
|
127
|
+
by: `supervisor:${w.workerId}`,
|
|
128
|
+
worker: w.workerId,
|
|
129
|
+
message: "supervisor process not alive (reconciled)",
|
|
130
|
+
synthesized: true,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const appended = [];
|
|
135
|
+
if (input.appendTerminalEvents) {
|
|
136
|
+
for (const ev of proposedEvents) {
|
|
137
|
+
const { seq: _seq, ts: _ts, ...partial } = ev;
|
|
138
|
+
void _seq;
|
|
139
|
+
void _ts;
|
|
140
|
+
appended.push(await appendEvent(input.channel, partial, ref.project));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { observations, proposedEvents, appended };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=workers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workers.js","sourceRoot":"","sources":["../../../src/channel/api/workers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type { ChannelScope, ChannelType, ChannelRef, ChannelMetadata, ContextEntry, FileContextEntry, RawContextEntry, ContextTarget, ContextMutationAction, EventOrigin, ThreadAction, InboxPolicy, } from "./internal/store/schema.js";
|
|
2
|
+
export { GLOBAL_PROJECT_KEY, CHANNEL_TYPES, THREAD_ACTIONS, EVENT_ORIGINS, INBOX_POLICIES, parseChannelScope, parseChannelType, parseThreadAction, parseEventOrigin, parseInboxPolicy, normalizeThreadKey, buildContextEntries, contextEntryKey, asContextEntries, asStringArray, } from "./internal/store/schema.js";
|
|
3
|
+
export type { ChannelEvent, ChannelEventKind, CreateChannelEvent, MessageChannelEvent, ThreadChannelEvent, ContextChannelEvent, ChannelMetadataEvent, SpawnedChannelEvent, KilledChannelEvent, DoneChannelEvent, ErrorChannelEvent, ProgressChannelEvent, UndeliverableChannelEvent, InterruptRequestedChannelEvent, TurnStartedChannelEvent, TurnFinishedChannelEvent, InterruptedChannelEvent, SupervisorWarningChannelEvent, SupervisorWarningReason, InterruptReason, InterruptMethod, InterruptOutcome, UndeliverableReason, ReadChannelEventsPagination, } from "./internal/store/events.js";
|
|
4
|
+
export { CHANNEL_EVENT_KINDS, DEFAULT_CURSOR_PAGE_SIZE, parseChannelKind, parseChannelKinds, isCreateEvent, isThreadEvent, isContextEvent, isChannelMetadataEvent, } from "./internal/store/events.js";
|
|
5
|
+
export type { WorkerState, WorkerLifecycle, WorkerActivity, WorkerRegistry, } from "./internal/store/worker-state.js";
|
|
6
|
+
export { reduceWorkerRegistry, isTerminalLifecycle, } from "./internal/store/worker-state.js";
|
|
7
|
+
export { DEFAULT_INBOX_POLICY, matchesInboxPolicy, } from "./internal/store/inbox.js";
|
|
8
|
+
export type { DeliveryMode, UndeliverableTarget, } from "./internal/store/delivery.js";
|
|
9
|
+
export { DELIVERY_MODES, parseDeliveryMode, classifyDelivery, } from "./internal/store/delivery.js";
|
|
10
|
+
export type { ChannelEventFilter } from "./internal/store/filter.js";
|
|
11
|
+
export type { WatchFilter } from "./internal/store/watch.js";
|
|
12
|
+
export { MEANINGFUL_EVENT_KINDS, matchesEventFilter, } from "./internal/store/filter.js";
|
|
13
|
+
export { reduceChannelMetadata, } from "./internal/store/channel-metadata.js";
|
|
14
|
+
export type { ThreadState, ThreadAliasResolver, } from "./internal/store/thread-state.js";
|
|
15
|
+
export { reduceThreads, buildThreadAliasResolver, collectThreadTimeline, } from "./internal/store/thread-state.js";
|
|
16
|
+
export { createChannel, } from "./api/create.js";
|
|
17
|
+
export { sendMessage, } from "./api/send.js";
|
|
18
|
+
export { readWorkerInbox, watchWorkerInbox, WorkerInboxError, } from "./api/inbox.js";
|
|
19
|
+
export type { ReadWorkerInboxInput, WatchWorkerInboxInput, WorkerInboxMessage, WorkerInboxErrorCode, } from "./api/inbox.js";
|
|
20
|
+
export { postThread, renameThread, } from "./api/post-thread.js";
|
|
21
|
+
export { addChannelContext, deleteChannelContext, listChannelContext, addThreadContext, deleteThreadContext, listThreadContext, } from "./api/context.js";
|
|
22
|
+
export { setChannelTitle, clearChannelTitle, } from "./api/title.js";
|
|
23
|
+
export { readChannelEvents, readChannelMetadata, listForumThreads, showThread, } from "./api/read.js";
|
|
24
|
+
export type { ReadChannelEventsOptions } from "./api/read.js";
|
|
25
|
+
export { watchChannelEvents, } from "./api/watch.js";
|
|
26
|
+
export type { WatchChannelOptions } from "./api/watch.js";
|
|
27
|
+
export { watchChannels, channelCursorKey, } from "./api/watch-channels.js";
|
|
28
|
+
export type { WatchChannelsInput, CrossChannelEvent, ChannelCursor, ChannelCursorKey, } from "./api/watch-channels.js";
|
|
29
|
+
export { listWorkers, watchWorkers, probeWorkerRuntime, reconcileWorkerLiveness, } from "./api/workers.js";
|
|
30
|
+
export type { ListWorkersInput, WatchWorkersInput, WorkerRuntimeObservation, ProbeWorkerRuntimeInput, ReconcileWorkerLivenessInput, ReconcileWorkerLivenessResult, } from "./api/workers.js";
|
|
31
|
+
export { spawnWorker } from "./api/spawn.js";
|
|
32
|
+
export { requestInterrupt, interruptWorker, } from "./api/interrupt.js";
|
|
33
|
+
export type { InterruptWorkerInput, InterruptWorkerResult, InterruptDelivery, } from "./api/interrupt.js";
|
|
34
|
+
export type { WorkerStartInput, WorkerRuntimeHandle, WorkerInterruptInput, WorkerInterruptResult, WorkerStopInput, WorkerStopResult, WorkerRuntime, SpawnWorkerInput, } from "./api/runtime.js";
|
|
35
|
+
export { resolveChannelRef } from "./api/resolve.js";
|
|
36
|
+
export type { ResolveChannelRefOptions } from "./api/resolve.js";
|
|
37
|
+
export type { ChannelAddressOptions, MutationCommonOptions, CreateChannelOptions, SendMessageOptions, PostThreadOptions, ContextMutationOptions, ThreadContextMutationOptions, RenameThreadOptions, SetChannelTitleOptions, ClearChannelTitleOptions, } from "./api/types.js";
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/channel/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Public channel API surface.
|
|
2
|
+
export { GLOBAL_PROJECT_KEY, CHANNEL_TYPES, THREAD_ACTIONS, EVENT_ORIGINS, INBOX_POLICIES, parseChannelScope, parseChannelType, parseThreadAction, parseEventOrigin, parseInboxPolicy, normalizeThreadKey, buildContextEntries, contextEntryKey, asContextEntries, asStringArray, } from "./internal/store/schema.js";
|
|
3
|
+
export { CHANNEL_EVENT_KINDS, DEFAULT_CURSOR_PAGE_SIZE, parseChannelKind, parseChannelKinds, isCreateEvent, isThreadEvent, isContextEvent, isChannelMetadataEvent, } from "./internal/store/events.js";
|
|
4
|
+
export { reduceWorkerRegistry, isTerminalLifecycle, } from "./internal/store/worker-state.js";
|
|
5
|
+
export { DEFAULT_INBOX_POLICY, matchesInboxPolicy, } from "./internal/store/inbox.js";
|
|
6
|
+
export { DELIVERY_MODES, parseDeliveryMode, classifyDelivery, } from "./internal/store/delivery.js";
|
|
7
|
+
export { MEANINGFUL_EVENT_KINDS, matchesEventFilter, } from "./internal/store/filter.js";
|
|
8
|
+
export { reduceChannelMetadata, } from "./internal/store/channel-metadata.js";
|
|
9
|
+
export { reduceThreads, buildThreadAliasResolver, collectThreadTimeline, } from "./internal/store/thread-state.js";
|
|
10
|
+
export { createChannel, } from "./api/create.js";
|
|
11
|
+
export { sendMessage, } from "./api/send.js";
|
|
12
|
+
export { readWorkerInbox, watchWorkerInbox, WorkerInboxError, } from "./api/inbox.js";
|
|
13
|
+
export { postThread, renameThread, } from "./api/post-thread.js";
|
|
14
|
+
export { addChannelContext, deleteChannelContext, listChannelContext, addThreadContext, deleteThreadContext, listThreadContext, } from "./api/context.js";
|
|
15
|
+
export { setChannelTitle, clearChannelTitle, } from "./api/title.js";
|
|
16
|
+
export { readChannelEvents, readChannelMetadata, listForumThreads, showThread, } from "./api/read.js";
|
|
17
|
+
export { watchChannelEvents, } from "./api/watch.js";
|
|
18
|
+
export { watchChannels, channelCursorKey, } from "./api/watch-channels.js";
|
|
19
|
+
export { listWorkers, watchWorkers, probeWorkerRuntime, reconcileWorkerLiveness, } from "./api/workers.js";
|
|
20
|
+
export { spawnWorker } from "./api/spawn.js";
|
|
21
|
+
export { requestInterrupt, interruptWorker, } from "./api/interrupt.js";
|
|
22
|
+
export { resolveChannelRef } from "./api/resolve.js";
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/channel/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAiB9B,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,4BAA4B,CAAC;AA6BpC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AASpC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,qBAAqB,GACtB,MAAM,sCAAsC,CAAC;AAO9C,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,GACZ,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EACL,UAAU,EACV,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,GACX,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAU1B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAkB5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ChannelEvent } from "./events.js";
|
|
2
|
+
import { type ChannelMetadata } from "./schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Single source of truth for projecting a channel's metadata from its
|
|
5
|
+
* event stream.
|
|
6
|
+
*
|
|
7
|
+
* Covers:
|
|
8
|
+
* - create event metadata (type, description, labels, context)
|
|
9
|
+
* - legacy `linkedContext` field on create / thread events
|
|
10
|
+
* - legacy `type:"thread"` / `type:"threads"` are NOT normalized to
|
|
11
|
+
* `forum`; they project to `chat` so thread APIs reject them
|
|
12
|
+
* - `kind:"context", target:"channel"` add/delete projection
|
|
13
|
+
* - `kind:"channel", action:"title"` set/clear projection
|
|
14
|
+
*/
|
|
15
|
+
export declare function reduceChannelMetadata(events: ChannelEvent[]): ChannelMetadata;
|
|
16
|
+
/**
|
|
17
|
+
* Legacy compatibility: project a single create event into channel
|
|
18
|
+
* metadata. New callers should use {@link reduceChannelMetadata} over
|
|
19
|
+
* the full event stream so context add/delete, title set/clear, and
|
|
20
|
+
* legacy `linkedContext` projection are honored.
|
|
21
|
+
*/
|
|
22
|
+
export declare function metadataFromCreateEvent(create: ChannelEvent | undefined): ChannelMetadata;
|
|
23
|
+
//# sourceMappingURL=channel-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-metadata.d.ts","sourceRoot":"","sources":["../../../../src/channel/internal/store/channel-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EAAE,GACrB,eAAe,CA2DjB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,GAAG,SAAS,GAC/B,eAAe,CAGjB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { isChannelMetadataEvent, isContextEvent, isCreateEvent, } from "./events.js";
|
|
2
|
+
import { asContextEntries, asStringArray, contextEntryKey, } from "./schema.js";
|
|
3
|
+
/**
|
|
4
|
+
* Single source of truth for projecting a channel's metadata from its
|
|
5
|
+
* event stream.
|
|
6
|
+
*
|
|
7
|
+
* Covers:
|
|
8
|
+
* - create event metadata (type, description, labels, context)
|
|
9
|
+
* - legacy `linkedContext` field on create / thread events
|
|
10
|
+
* - legacy `type:"thread"` / `type:"threads"` are NOT normalized to
|
|
11
|
+
* `forum`; they project to `chat` so thread APIs reject them
|
|
12
|
+
* - `kind:"context", target:"channel"` add/delete projection
|
|
13
|
+
* - `kind:"channel", action:"title"` set/clear projection
|
|
14
|
+
*/
|
|
15
|
+
export function reduceChannelMetadata(events) {
|
|
16
|
+
let type = "chat";
|
|
17
|
+
let description;
|
|
18
|
+
let labels;
|
|
19
|
+
let title;
|
|
20
|
+
const contextMap = new Map();
|
|
21
|
+
const addEntries = (entries) => {
|
|
22
|
+
if (!entries)
|
|
23
|
+
return;
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
contextMap.set(contextEntryKey(entry), entry);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const deleteEntries = (entries) => {
|
|
29
|
+
if (!entries)
|
|
30
|
+
return;
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
contextMap.delete(contextEntryKey(entry));
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
for (const ev of events) {
|
|
36
|
+
if (isCreateEvent(ev)) {
|
|
37
|
+
type = normalizeChannelType(ev.type);
|
|
38
|
+
if (typeof ev.description === "string")
|
|
39
|
+
description = ev.description;
|
|
40
|
+
labels = asStringArray(ev.labels) ?? labels;
|
|
41
|
+
// Initial context comes from `context` (new) or legacy
|
|
42
|
+
// `linkedContext`. New entries replace any prior state because a
|
|
43
|
+
// `create` event is always seq 1.
|
|
44
|
+
const initial = asContextEntries(ev.context) ?? asContextEntries(ev.linkedContext);
|
|
45
|
+
contextMap.clear();
|
|
46
|
+
addEntries(initial);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (isContextEvent(ev) && ev.target === "channel") {
|
|
50
|
+
const entries = asContextEntries(ev.context);
|
|
51
|
+
if (ev.action === "add")
|
|
52
|
+
addEntries(entries);
|
|
53
|
+
else if (ev.action === "delete")
|
|
54
|
+
deleteEntries(entries);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (isChannelMetadataEvent(ev) && ev.action === "title") {
|
|
58
|
+
const next = ev.title;
|
|
59
|
+
if (typeof next === "string" && next.length > 0)
|
|
60
|
+
title = next;
|
|
61
|
+
else if (next === null || next === "")
|
|
62
|
+
title = undefined;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const context = contextMap.size > 0 ? [...contextMap.values()] : undefined;
|
|
67
|
+
return {
|
|
68
|
+
type,
|
|
69
|
+
...(title !== undefined ? { title } : {}),
|
|
70
|
+
...(description !== undefined ? { description } : {}),
|
|
71
|
+
...(context !== undefined ? { context } : {}),
|
|
72
|
+
...(labels !== undefined ? { labels } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Legacy compatibility: project a single create event into channel
|
|
77
|
+
* metadata. New callers should use {@link reduceChannelMetadata} over
|
|
78
|
+
* the full event stream so context add/delete, title set/clear, and
|
|
79
|
+
* legacy `linkedContext` projection are honored.
|
|
80
|
+
*/
|
|
81
|
+
export function metadataFromCreateEvent(create) {
|
|
82
|
+
if (!create || !isCreateEvent(create))
|
|
83
|
+
return { type: "chat" };
|
|
84
|
+
return reduceChannelMetadata([create]);
|
|
85
|
+
}
|
|
86
|
+
function normalizeChannelType(value) {
|
|
87
|
+
if (value === "forum")
|
|
88
|
+
return "forum";
|
|
89
|
+
// Legacy `"thread"` / `"threads"` values are intentionally not
|
|
90
|
+
// upgraded to `forum`; they fall through to `chat` so forum/thread
|
|
91
|
+
// APIs reject pre-rename channels.
|
|
92
|
+
return "chat";
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=channel-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-metadata.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/channel-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { UndeliverableReason } from "./events.js";
|
|
2
|
+
import type { WorkerRegistry } from "./worker-state.js";
|
|
3
|
+
/**
|
|
4
|
+
* Delivery validation mode for targeted `sendMessage`.
|
|
5
|
+
*
|
|
6
|
+
* - `appendOnly`: current behavior — append the message, never signal.
|
|
7
|
+
* Preserves pre-spawn backlog delivery.
|
|
8
|
+
* - `requireKnownWorker`: signal `undeliverable` for targets that have
|
|
9
|
+
* never existed in the durable worker registry.
|
|
10
|
+
* - `requireRunningWorker`: signal `undeliverable` for targets that are
|
|
11
|
+
* unknown or terminal in the durable worker registry.
|
|
12
|
+
*/
|
|
13
|
+
export type DeliveryMode = "appendOnly" | "requireKnownWorker" | "requireRunningWorker";
|
|
14
|
+
export declare const DELIVERY_MODES: ReadonlySet<DeliveryMode>;
|
|
15
|
+
export declare function parseDeliveryMode(v: string | undefined): DeliveryMode | undefined;
|
|
16
|
+
export interface UndeliverableTarget {
|
|
17
|
+
targetWorker: string;
|
|
18
|
+
reason: UndeliverableReason;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Classify which targeted workers a message cannot reach under the given
|
|
22
|
+
* delivery mode. Pure — decides only from the durable worker registry,
|
|
23
|
+
* never from OS liveness. `appendOnly` always returns an empty list.
|
|
24
|
+
* Broadcast messages (no targets) never produce undeliverable signals.
|
|
25
|
+
*/
|
|
26
|
+
export declare function classifyDelivery(registry: WorkerRegistry, targets: string[], mode: DeliveryMode): UndeliverableTarget[];
|
|
27
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../../src/channel/internal/store/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,YAAY,CAInD,CAAC;AAEH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,MAAM,GAAG,SAAS,GACpB,YAAY,GAAG,SAAS,CAQ1B;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,YAAY,GACjB,mBAAmB,EAAE,CAevB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const DELIVERY_MODES = new Set([
|
|
2
|
+
"appendOnly",
|
|
3
|
+
"requireKnownWorker",
|
|
4
|
+
"requireRunningWorker",
|
|
5
|
+
]);
|
|
6
|
+
export function parseDeliveryMode(v) {
|
|
7
|
+
if (v === undefined)
|
|
8
|
+
return undefined;
|
|
9
|
+
if (!DELIVERY_MODES.has(v)) {
|
|
10
|
+
throw new Error(`Invalid delivery mode '${v}'. Must be one of: ${[...DELIVERY_MODES].join(", ")}`);
|
|
11
|
+
}
|
|
12
|
+
return v;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Classify which targeted workers a message cannot reach under the given
|
|
16
|
+
* delivery mode. Pure — decides only from the durable worker registry,
|
|
17
|
+
* never from OS liveness. `appendOnly` always returns an empty list.
|
|
18
|
+
* Broadcast messages (no targets) never produce undeliverable signals.
|
|
19
|
+
*/
|
|
20
|
+
export function classifyDelivery(registry, targets, mode) {
|
|
21
|
+
if (mode === "appendOnly" || targets.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const byId = new Map(registry.workers.map((w) => [w.workerId, w]));
|
|
24
|
+
const failed = [];
|
|
25
|
+
for (const target of targets) {
|
|
26
|
+
const worker = byId.get(target);
|
|
27
|
+
if (!worker) {
|
|
28
|
+
failed.push({ targetWorker: target, reason: "worker-unknown" });
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (mode === "requireRunningWorker" && worker.terminal) {
|
|
32
|
+
failed.push({ targetWorker: target, reason: "worker-terminal" });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return failed;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/delivery.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,cAAc,GAA8B,IAAI,GAAG,CAAC;IAC/D,YAAY;IACZ,oBAAoB;IACpB,sBAAsB;CACvB,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAC/B,CAAqB;IAErB,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAiB,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,0BAA0B,CAAC,sBAAsB,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IACD,OAAO,CAAiB,CAAC;AAC3B,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAwB,EACxB,OAAiB,EACjB,IAAkB;IAElB,IAAI,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAChE,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,sBAAsB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|