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.
Files changed (202) hide show
  1. package/LICENSE +235 -0
  2. package/dist/channel/api/assert.d.ts +3 -0
  3. package/dist/channel/api/assert.d.ts.map +1 -0
  4. package/dist/channel/api/assert.js +11 -0
  5. package/dist/channel/api/assert.js.map +1 -0
  6. package/dist/channel/api/context.d.ts +21 -0
  7. package/dist/channel/api/context.d.ts.map +1 -0
  8. package/dist/channel/api/context.js +99 -0
  9. package/dist/channel/api/context.js.map +1 -0
  10. package/dist/channel/api/create.d.ts +9 -0
  11. package/dist/channel/api/create.d.ts.map +1 -0
  12. package/dist/channel/api/create.js +104 -0
  13. package/dist/channel/api/create.js.map +1 -0
  14. package/dist/channel/api/inbox.d.ts +51 -0
  15. package/dist/channel/api/inbox.d.ts.map +1 -0
  16. package/dist/channel/api/inbox.js +176 -0
  17. package/dist/channel/api/inbox.js.map +1 -0
  18. package/dist/channel/api/interrupt.d.ts +31 -0
  19. package/dist/channel/api/interrupt.d.ts.map +1 -0
  20. package/dist/channel/api/interrupt.js +102 -0
  21. package/dist/channel/api/interrupt.js.map +1 -0
  22. package/dist/channel/api/post-thread.d.ts +14 -0
  23. package/dist/channel/api/post-thread.d.ts.map +1 -0
  24. package/dist/channel/api/post-thread.js +106 -0
  25. package/dist/channel/api/post-thread.js.map +1 -0
  26. package/dist/channel/api/read.d.ts +17 -0
  27. package/dist/channel/api/read.d.ts.map +1 -0
  28. package/dist/channel/api/read.js +44 -0
  29. package/dist/channel/api/read.js.map +1 -0
  30. package/dist/channel/api/resolve.d.ts +21 -0
  31. package/dist/channel/api/resolve.d.ts.map +1 -0
  32. package/dist/channel/api/resolve.js +28 -0
  33. package/dist/channel/api/resolve.js.map +1 -0
  34. package/dist/channel/api/runtime.d.ts +70 -0
  35. package/dist/channel/api/runtime.d.ts.map +1 -0
  36. package/dist/channel/api/runtime.js +11 -0
  37. package/dist/channel/api/runtime.js.map +1 -0
  38. package/dist/channel/api/send.d.ts +4 -0
  39. package/dist/channel/api/send.d.ts.map +1 -0
  40. package/dist/channel/api/send.js +44 -0
  41. package/dist/channel/api/send.js.map +1 -0
  42. package/dist/channel/api/spawn.d.ts +13 -0
  43. package/dist/channel/api/spawn.d.ts.map +1 -0
  44. package/dist/channel/api/spawn.js +54 -0
  45. package/dist/channel/api/spawn.js.map +1 -0
  46. package/dist/channel/api/title.d.ts +5 -0
  47. package/dist/channel/api/title.d.ts.map +1 -0
  48. package/dist/channel/api/title.js +40 -0
  49. package/dist/channel/api/title.js.map +1 -0
  50. package/dist/channel/api/types.d.ts +64 -0
  51. package/dist/channel/api/types.d.ts.map +1 -0
  52. package/dist/channel/api/types.js +2 -0
  53. package/dist/channel/api/types.js.map +1 -0
  54. package/dist/channel/api/watch-channels.d.ts +40 -0
  55. package/dist/channel/api/watch-channels.d.ts.map +1 -0
  56. package/dist/channel/api/watch-channels.js +143 -0
  57. package/dist/channel/api/watch-channels.js.map +1 -0
  58. package/dist/channel/api/watch.d.ts +11 -0
  59. package/dist/channel/api/watch.d.ts.map +1 -0
  60. package/dist/channel/api/watch.js +17 -0
  61. package/dist/channel/api/watch.js.map +1 -0
  62. package/dist/channel/api/workers.d.ts +69 -0
  63. package/dist/channel/api/workers.d.ts.map +1 -0
  64. package/dist/channel/api/workers.js +145 -0
  65. package/dist/channel/api/workers.js.map +1 -0
  66. package/dist/channel/index.d.ts +38 -0
  67. package/dist/channel/index.d.ts.map +1 -0
  68. package/dist/channel/index.js +23 -0
  69. package/dist/channel/index.js.map +1 -0
  70. package/dist/channel/internal/store/channel-metadata.d.ts +23 -0
  71. package/dist/channel/internal/store/channel-metadata.d.ts.map +1 -0
  72. package/dist/channel/internal/store/channel-metadata.js +94 -0
  73. package/dist/channel/internal/store/channel-metadata.js.map +1 -0
  74. package/dist/channel/internal/store/delivery.d.ts +27 -0
  75. package/dist/channel/internal/store/delivery.d.ts.map +1 -0
  76. package/dist/channel/internal/store/delivery.js +37 -0
  77. package/dist/channel/internal/store/delivery.js.map +1 -0
  78. package/dist/channel/internal/store/events.d.ts +203 -0
  79. package/dist/channel/internal/store/events.d.ts.map +1 -0
  80. package/dist/channel/internal/store/events.js +185 -0
  81. package/dist/channel/internal/store/events.js.map +1 -0
  82. package/dist/channel/internal/store/filter.d.ts +22 -0
  83. package/dist/channel/internal/store/filter.d.ts.map +1 -0
  84. package/dist/channel/internal/store/filter.js +78 -0
  85. package/dist/channel/internal/store/filter.js.map +1 -0
  86. package/dist/channel/internal/store/inbox.d.ts +17 -0
  87. package/dist/channel/internal/store/inbox.d.ts.map +1 -0
  88. package/dist/channel/internal/store/inbox.js +30 -0
  89. package/dist/channel/internal/store/inbox.js.map +1 -0
  90. package/dist/channel/internal/store/lock.d.ts +17 -0
  91. package/dist/channel/internal/store/lock.d.ts.map +1 -0
  92. package/dist/channel/internal/store/lock.js +88 -0
  93. package/dist/channel/internal/store/lock.js.map +1 -0
  94. package/dist/channel/internal/store/paths.d.ts +43 -0
  95. package/dist/channel/internal/store/paths.d.ts.map +1 -0
  96. package/dist/channel/internal/store/paths.js +233 -0
  97. package/dist/channel/internal/store/paths.js.map +1 -0
  98. package/dist/channel/internal/store/schema.d.ts +77 -0
  99. package/dist/channel/internal/store/schema.d.ts.map +1 -0
  100. package/dist/channel/internal/store/schema.js +127 -0
  101. package/dist/channel/internal/store/schema.js.map +1 -0
  102. package/dist/channel/internal/store/seq.d.ts +12 -0
  103. package/dist/channel/internal/store/seq.d.ts.map +1 -0
  104. package/dist/channel/internal/store/seq.js +133 -0
  105. package/dist/channel/internal/store/seq.js.map +1 -0
  106. package/dist/channel/internal/store/thread-state.d.ts +37 -0
  107. package/dist/channel/internal/store/thread-state.d.ts.map +1 -0
  108. package/dist/channel/internal/store/thread-state.js +206 -0
  109. package/dist/channel/internal/store/thread-state.js.map +1 -0
  110. package/dist/channel/internal/store/watch.d.ts +10 -0
  111. package/dist/channel/internal/store/watch.d.ts.map +1 -0
  112. package/dist/channel/internal/store/watch.js +122 -0
  113. package/dist/channel/internal/store/watch.js.map +1 -0
  114. package/dist/channel/internal/store/worker-state.d.ts +49 -0
  115. package/dist/channel/internal/store/worker-state.d.ts.map +1 -0
  116. package/dist/channel/internal/store/worker-state.js +207 -0
  117. package/dist/channel/internal/store/worker-state.js.map +1 -0
  118. package/dist/index.d.ts +3 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +7 -0
  121. package/dist/index.js.map +1 -0
  122. package/dist/mem/adapters/claude.d.ts +22 -0
  123. package/dist/mem/adapters/claude.d.ts.map +1 -0
  124. package/dist/mem/adapters/claude.js +252 -0
  125. package/dist/mem/adapters/claude.js.map +1 -0
  126. package/dist/mem/adapters/codex.d.ts +35 -0
  127. package/dist/mem/adapters/codex.d.ts.map +1 -0
  128. package/dist/mem/adapters/codex.js +222 -0
  129. package/dist/mem/adapters/codex.js.map +1 -0
  130. package/dist/mem/adapters/opencode.d.ts +19 -0
  131. package/dist/mem/adapters/opencode.d.ts.map +1 -0
  132. package/dist/mem/adapters/opencode.js +25 -0
  133. package/dist/mem/adapters/opencode.js.map +1 -0
  134. package/dist/mem/context.d.ts +23 -0
  135. package/dist/mem/context.d.ts.map +1 -0
  136. package/dist/mem/context.js +118 -0
  137. package/dist/mem/context.js.map +1 -0
  138. package/dist/mem/dialogue.d.ts +17 -0
  139. package/dist/mem/dialogue.d.ts.map +1 -0
  140. package/dist/mem/dialogue.js +51 -0
  141. package/dist/mem/dialogue.js.map +1 -0
  142. package/dist/mem/filter.d.ts +31 -0
  143. package/dist/mem/filter.d.ts.map +1 -0
  144. package/dist/mem/filter.js +70 -0
  145. package/dist/mem/filter.js.map +1 -0
  146. package/dist/mem/index.d.ts +18 -0
  147. package/dist/mem/index.d.ts.map +1 -0
  148. package/dist/mem/index.js +17 -0
  149. package/dist/mem/index.js.map +1 -0
  150. package/dist/mem/internal/jsonl.d.ts +35 -0
  151. package/dist/mem/internal/jsonl.d.ts.map +1 -0
  152. package/dist/mem/internal/jsonl.js +125 -0
  153. package/dist/mem/internal/jsonl.js.map +1 -0
  154. package/dist/mem/internal/paths.d.ts +18 -0
  155. package/dist/mem/internal/paths.d.ts.map +1 -0
  156. package/dist/mem/internal/paths.js +51 -0
  157. package/dist/mem/internal/paths.js.map +1 -0
  158. package/dist/mem/phase.d.ts +45 -0
  159. package/dist/mem/phase.d.ts.map +1 -0
  160. package/dist/mem/phase.js +220 -0
  161. package/dist/mem/phase.js.map +1 -0
  162. package/dist/mem/projects.d.ts +13 -0
  163. package/dist/mem/projects.d.ts.map +1 -0
  164. package/dist/mem/projects.js +37 -0
  165. package/dist/mem/projects.js.map +1 -0
  166. package/dist/mem/search.d.ts +32 -0
  167. package/dist/mem/search.d.ts.map +1 -0
  168. package/dist/mem/search.js +125 -0
  169. package/dist/mem/search.js.map +1 -0
  170. package/dist/mem/sessions.d.ts +37 -0
  171. package/dist/mem/sessions.d.ts.map +1 -0
  172. package/dist/mem/sessions.js +270 -0
  173. package/dist/mem/sessions.js.map +1 -0
  174. package/dist/mem/types.d.ts +176 -0
  175. package/dist/mem/types.d.ts.map +1 -0
  176. package/dist/mem/types.js +10 -0
  177. package/dist/mem/types.js.map +1 -0
  178. package/dist/task/index.d.ts +9 -0
  179. package/dist/task/index.d.ts.map +1 -0
  180. package/dist/task/index.js +9 -0
  181. package/dist/task/index.js.map +1 -0
  182. package/dist/task/paths.d.ts +37 -0
  183. package/dist/task/paths.d.ts.map +1 -0
  184. package/dist/task/paths.js +49 -0
  185. package/dist/task/paths.js.map +1 -0
  186. package/dist/task/phase.d.ts +27 -0
  187. package/dist/task/phase.d.ts.map +1 -0
  188. package/dist/task/phase.js +24 -0
  189. package/dist/task/phase.js.map +1 -0
  190. package/dist/task/records.d.ts +39 -0
  191. package/dist/task/records.d.ts.map +1 -0
  192. package/dist/task/records.js +89 -0
  193. package/dist/task/records.js.map +1 -0
  194. package/dist/task/schema.d.ts +77 -0
  195. package/dist/task/schema.d.ts.map +1 -0
  196. package/dist/task/schema.js +220 -0
  197. package/dist/task/schema.js.map +1 -0
  198. package/dist/testing/index.d.ts +2 -0
  199. package/dist/testing/index.d.ts.map +1 -0
  200. package/dist/testing/index.js +4 -0
  201. package/dist/testing/index.js.map +1 -0
  202. 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"}