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,176 @@
1
+ import { readChannelEvents as readEventsInternal, } from "../internal/store/events.js";
2
+ import { matchesInboxPolicy } from "../internal/store/inbox.js";
3
+ import { watchEvents } from "../internal/store/watch.js";
4
+ import { reduceWorkerRegistry } from "../internal/store/worker-state.js";
5
+ import { resolveChannelRef } from "./resolve.js";
6
+ export class WorkerInboxError extends Error {
7
+ code;
8
+ channel;
9
+ workerId;
10
+ constructor(code, channel, workerId, message) {
11
+ super(message ?? defaultMessage(code, channel, workerId));
12
+ this.name = "WorkerInboxError";
13
+ this.code = code;
14
+ this.channel = channel;
15
+ this.workerId = workerId;
16
+ }
17
+ }
18
+ function defaultMessage(code, channel, workerId) {
19
+ switch (code) {
20
+ case "WORKER_INBOX_WORKER_NOT_FOUND":
21
+ return `Worker '${workerId}' not found in channel '${channel}'`;
22
+ case "WORKER_INBOX_WORKER_TERMINAL":
23
+ return `Worker '${workerId}' in channel '${channel}' is terminal`;
24
+ }
25
+ }
26
+ function resolve(input) {
27
+ return resolveChannelRef({
28
+ channel: input.channel,
29
+ ...(input.scope !== undefined ? { scope: input.scope } : {}),
30
+ ...(input.projectKey !== undefined ? { projectKey: input.projectKey } : {}),
31
+ ...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
32
+ });
33
+ }
34
+ /**
35
+ * Read durable inbox messages for a specific worker.
36
+ *
37
+ * Reduces the worker registry from the channel event log, finds the worker,
38
+ * and filters `message` events through `matchesInboxPolicy()` using the
39
+ * worker's latest `inboxPolicy`. Core only reasons from the durable event
40
+ * log; it does not claim the OS process is live.
41
+ */
42
+ export async function readWorkerInbox(input) {
43
+ const ref = resolve(input);
44
+ const events = await readEventsInternal(input.channel, ref.project);
45
+ const registry = reduceWorkerRegistry(events, ref);
46
+ const worker = registry.workers.find((w) => w.workerId === input.workerId);
47
+ if (!worker) {
48
+ throw new WorkerInboxError("WORKER_INBOX_WORKER_NOT_FOUND", input.channel, input.workerId);
49
+ }
50
+ if (worker.terminal && !input.includeTerminal) {
51
+ throw new WorkerInboxError("WORKER_INBOX_WORKER_TERMINAL", input.channel, input.workerId);
52
+ }
53
+ if (input.limit !== undefined &&
54
+ (!Number.isInteger(input.limit) || input.limit < 0)) {
55
+ throw new Error("readWorkerInbox: limit must be a non-negative integer");
56
+ }
57
+ if (input.limit === 0)
58
+ return [];
59
+ const afterSeq = input.afterSeq ?? 0;
60
+ const out = [];
61
+ for (const ev of events) {
62
+ if (ev.seq <= afterSeq)
63
+ continue;
64
+ if (!matchesInboxPolicy(ev, input.workerId, worker.inboxPolicy))
65
+ continue;
66
+ out.push({
67
+ workerId: input.workerId,
68
+ event: ev,
69
+ seq: ev.seq,
70
+ cursor: ev.seq,
71
+ });
72
+ if (input.limit !== undefined && out.length >= input.limit)
73
+ break;
74
+ }
75
+ return out;
76
+ }
77
+ /**
78
+ * Watch future inbox messages for a specific worker.
79
+ *
80
+ * Performs upfront worker validation and captures the current `lastSeq`,
81
+ * then returns a generator that yields future inbox-matching messages
82
+ * through the channel watch primitives. The generator ends when a terminal
83
+ * event for the watched worker arrives; it does not cross a terminal event
84
+ * into a later respawn with the same id.
85
+ *
86
+ * Eager validation means errors surface from the outer call, and the
87
+ * watch's `sinceSeq` snapshot is taken before the caller can append more
88
+ * events.
89
+ */
90
+ export async function watchWorkerInbox(input) {
91
+ const ref = resolve(input);
92
+ const events = await readEventsInternal(input.channel, ref.project);
93
+ const registry = reduceWorkerRegistry(events, ref);
94
+ const worker = registry.workers.find((w) => w.workerId === input.workerId);
95
+ if (!worker) {
96
+ throw new WorkerInboxError("WORKER_INBOX_WORKER_NOT_FOUND", input.channel, input.workerId);
97
+ }
98
+ if (worker.terminal) {
99
+ throw new WorkerInboxError("WORKER_INBOX_WORKER_TERMINAL", input.channel, input.workerId);
100
+ }
101
+ const policy = worker.inboxPolicy;
102
+ const lastSeq = events.length > 0 ? events[events.length - 1].seq : 0;
103
+ const generationFloorSeq = findGenerationFloorSeq(events, input.workerId);
104
+ const watchOpts = { project: ref.project };
105
+ if (input.signal !== undefined)
106
+ watchOpts.signal = input.signal;
107
+ if (input.fromStart) {
108
+ watchOpts.sinceSeq = generationFloorSeq;
109
+ }
110
+ else if (input.sinceSeq !== undefined) {
111
+ watchOpts.sinceSeq = Math.max(input.sinceSeq, generationFloorSeq);
112
+ }
113
+ else {
114
+ watchOpts.sinceSeq = lastSeq;
115
+ }
116
+ return inboxWatchGenerator(input.channel, input.workerId, policy, watchOpts);
117
+ }
118
+ async function* inboxWatchGenerator(channel, workerId, policy, watchOpts) {
119
+ for await (const ev of watchEvents(channel, { includeNonMeaningful: true, includeProgress: false }, watchOpts)) {
120
+ if (isTerminalForWorker(ev, workerId))
121
+ return;
122
+ if (matchesInboxPolicy(ev, workerId, policy)) {
123
+ yield {
124
+ workerId,
125
+ event: ev,
126
+ seq: ev.seq,
127
+ cursor: ev.seq,
128
+ };
129
+ }
130
+ }
131
+ }
132
+ function isTerminalForWorker(ev, workerId) {
133
+ if (ev.kind === "killed") {
134
+ return resolveWorkerId(ev) === workerId;
135
+ }
136
+ if (ev.kind === "done") {
137
+ if (ev.synthesized !== true)
138
+ return false;
139
+ return resolveWorkerId(ev) === workerId;
140
+ }
141
+ if (ev.kind === "error") {
142
+ const synthesized = ev.synthesized === true;
143
+ const fromSupervisor = ev.by.startsWith("supervisor:");
144
+ if (!synthesized && !fromSupervisor)
145
+ return false;
146
+ return resolveWorkerId(ev) === workerId;
147
+ }
148
+ return false;
149
+ }
150
+ function findGenerationFloorSeq(events, workerId) {
151
+ let lastTerminalSeq = 0;
152
+ let generationFloorSeq = 0;
153
+ for (const ev of events) {
154
+ if (isTerminalForWorker(ev, workerId)) {
155
+ lastTerminalSeq = ev.seq;
156
+ continue;
157
+ }
158
+ if (isSpawnedForWorker(ev, workerId)) {
159
+ generationFloorSeq = lastTerminalSeq;
160
+ }
161
+ }
162
+ return generationFloorSeq;
163
+ }
164
+ function isSpawnedForWorker(ev, workerId) {
165
+ return ev.kind === "spawned" && ev.as === workerId;
166
+ }
167
+ function resolveWorkerId(ev) {
168
+ const explicit = ev.worker ?? ev.as;
169
+ if (explicit)
170
+ return explicit;
171
+ return stripSupervisor(ev.by);
172
+ }
173
+ function stripSupervisor(by) {
174
+ return by.startsWith("supervisor:") ? by.slice("supervisor:".length) : by;
175
+ }
176
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../src/channel/api/inbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type ChannelEvent, type InterruptReason } from "../internal/store/events.js";
2
+ import type { WorkerRuntime } from "./runtime.js";
3
+ import type { ChannelAddressOptions, MutationCommonOptions } from "./types.js";
4
+ export interface InterruptWorkerInput extends ChannelAddressOptions, MutationCommonOptions {
5
+ workerId: string;
6
+ message?: string;
7
+ reason?: InterruptReason;
8
+ }
9
+ export type InterruptDelivery = "interrupted-current-turn" | "no-active-turn" | "worker-terminal" | "worker-unknown";
10
+ export interface InterruptWorkerResult {
11
+ /** Last durable event appended (`interrupted` if attempted, else `interrupt_requested`). */
12
+ event: ChannelEvent;
13
+ interrupted: boolean;
14
+ delivery: InterruptDelivery;
15
+ }
16
+ /**
17
+ * Durable-event-only interrupt. Appends an `interrupt_requested` event
18
+ * recording intent. Does not touch any worker runtime.
19
+ */
20
+ export declare function requestInterrupt(input: InterruptWorkerInput): Promise<ChannelEvent>;
21
+ /**
22
+ * Orchestration interrupt. Appends `interrupt_requested`, asks the
23
+ * injected runtime to interrupt the worker, then appends `interrupted`
24
+ * with the runtime-reported `method` / `outcome`. Core never imports CLI
25
+ * provider adapters — the runtime is injected.
26
+ *
27
+ * Skips the runtime call (and the `interrupted` event) when the worker
28
+ * is unknown or terminal in the durable registry.
29
+ */
30
+ export declare function interruptWorker(input: InterruptWorkerInput, runtime: WorkerRuntime): Promise<InterruptWorkerResult>;
31
+ //# sourceMappingURL=interrupt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interrupt.d.ts","sourceRoot":"","sources":["../../../src/channel/api/interrupt.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAyB,aAAa,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,oBACf,SAAQ,qBAAqB,EAC3B,qBAAqB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,MAAM,iBAAiB,GACzB,0BAA0B,GAC1B,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,CAAC;AAErB,MAAM,WAAW,qBAAqB;IACpC,4FAA4F;IAC5F,KAAK,EAAE,YAAY,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAsBvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,qBAAqB,CAAC,CAiFhC"}
@@ -0,0 +1,102 @@
1
+ import { appendEvent, readChannelEvents, } from "../internal/store/events.js";
2
+ import { reduceWorkerRegistry } from "../internal/store/worker-state.js";
3
+ import { resolveChannelRef } from "./resolve.js";
4
+ /**
5
+ * Durable-event-only interrupt. Appends an `interrupt_requested` event
6
+ * recording intent. Does not touch any worker runtime.
7
+ */
8
+ export async function requestInterrupt(input) {
9
+ const ref = resolveChannelRef({
10
+ channel: input.channel,
11
+ ...(input.scope !== undefined ? { scope: input.scope } : {}),
12
+ ...(input.projectKey !== undefined
13
+ ? { projectKey: input.projectKey }
14
+ : {}),
15
+ ...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
16
+ });
17
+ return appendEvent(input.channel, {
18
+ kind: "interrupt_requested",
19
+ by: input.by,
20
+ worker: input.workerId,
21
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
22
+ ...(input.message !== undefined ? { message: input.message } : {}),
23
+ ...(input.origin !== undefined ? { origin: input.origin } : {}),
24
+ ...(input.meta !== undefined ? { meta: input.meta } : {}),
25
+ }, ref.project);
26
+ }
27
+ /**
28
+ * Orchestration interrupt. Appends `interrupt_requested`, asks the
29
+ * injected runtime to interrupt the worker, then appends `interrupted`
30
+ * with the runtime-reported `method` / `outcome`. Core never imports CLI
31
+ * provider adapters — the runtime is injected.
32
+ *
33
+ * Skips the runtime call (and the `interrupted` event) when the worker
34
+ * is unknown or terminal in the durable registry.
35
+ */
36
+ export async function interruptWorker(input, runtime) {
37
+ const ref = resolveChannelRef({
38
+ channel: input.channel,
39
+ ...(input.scope !== undefined ? { scope: input.scope } : {}),
40
+ ...(input.projectKey !== undefined
41
+ ? { projectKey: input.projectKey }
42
+ : {}),
43
+ ...(input.cwd !== undefined ? { cwd: input.cwd } : {}),
44
+ });
45
+ const events = await readChannelEvents(input.channel, ref.project);
46
+ const registry = reduceWorkerRegistry(events);
47
+ const worker = registry.workers.find((w) => w.workerId === input.workerId);
48
+ const turnId = worker?.activeTurnId;
49
+ const requestEvent = await appendEvent(input.channel, {
50
+ kind: "interrupt_requested",
51
+ by: input.by,
52
+ worker: input.workerId,
53
+ ...(turnId !== undefined ? { turnId } : {}),
54
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
55
+ ...(input.message !== undefined ? { message: input.message } : {}),
56
+ ...(input.origin !== undefined ? { origin: input.origin } : {}),
57
+ ...(input.meta !== undefined ? { meta: input.meta } : {}),
58
+ }, ref.project);
59
+ if (!worker) {
60
+ return {
61
+ event: requestEvent,
62
+ interrupted: false,
63
+ delivery: "worker-unknown",
64
+ };
65
+ }
66
+ if (worker.terminal) {
67
+ return {
68
+ event: requestEvent,
69
+ interrupted: false,
70
+ delivery: "worker-terminal",
71
+ };
72
+ }
73
+ const result = runtime.interrupt
74
+ ? await runtime.interrupt({
75
+ workerId: input.workerId,
76
+ ...(turnId !== undefined ? { turnId } : {}),
77
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
78
+ ...(input.message !== undefined ? { message: input.message } : {}),
79
+ })
80
+ : { method: "none", outcome: "unsupported" };
81
+ const interruptedEvent = await appendEvent(input.channel, {
82
+ kind: "interrupted",
83
+ by: input.by,
84
+ worker: input.workerId,
85
+ method: result.method,
86
+ outcome: result.outcome,
87
+ ...(turnId !== undefined ? { turnId } : {}),
88
+ ...(input.reason !== undefined ? { reason: input.reason } : {}),
89
+ ...(result.message !== undefined ? { message: result.message } : {}),
90
+ ...(input.origin !== undefined ? { origin: input.origin } : {}),
91
+ ...(input.meta !== undefined ? { meta: input.meta } : {}),
92
+ }, ref.project);
93
+ const delivery = worker.activity === "mid-turn"
94
+ ? "interrupted-current-turn"
95
+ : "no-active-turn";
96
+ return {
97
+ event: interruptedEvent,
98
+ interrupted: result.outcome === "interrupted",
99
+ delivery,
100
+ };
101
+ }
102
+ //# sourceMappingURL=interrupt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interrupt.js","sourceRoot":"","sources":["../../../src/channel/api/interrupt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type ThreadChannelEvent } from "../internal/store/events.js";
2
+ import type { PostThreadOptions, RenameThreadOptions } from "./types.js";
3
+ /**
4
+ * Append a structured thread event. Throws when the channel is not of
5
+ * `forum` type, when `action` is invalid, or when a non-`opened` event
6
+ * is missing a thread key.
7
+ */
8
+ export declare function postThread(opts: PostThreadOptions): Promise<ThreadChannelEvent>;
9
+ /**
10
+ * Rename a thread. Records a `kind:"thread", action:"rename"` event so
11
+ * subsequent reducers can flatten alias chains.
12
+ */
13
+ export declare function renameThread(opts: RenameThreadOptions): Promise<ThreadChannelEvent>;
14
+ //# sourceMappingURL=post-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-thread.d.ts","sourceRoot":"","sources":["../../../src/channel/api/post-thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AAOrC,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAYzE;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,kBAAkB,CAAC,CAuC7B;AAWD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAyD7B"}
@@ -0,0 +1,106 @@
1
+ import { appendEvent, } from "../internal/store/events.js";
2
+ import { normalizeThreadKey } from "../internal/store/schema.js";
3
+ import { buildThreadAliasResolver, } from "../internal/store/thread-state.js";
4
+ import { readForumChannelEvents } from "./assert.js";
5
+ import { resolveChannelRef } from "./resolve.js";
6
+ const VALID_ACTIONS = new Set([
7
+ "opened",
8
+ "comment",
9
+ "status",
10
+ "labels",
11
+ "assignees",
12
+ "summary",
13
+ "processed",
14
+ ]);
15
+ /**
16
+ * Append a structured thread event. Throws when the channel is not of
17
+ * `forum` type, when `action` is invalid, or when a non-`opened` event
18
+ * is missing a thread key.
19
+ */
20
+ export async function postThread(opts) {
21
+ const ref = resolveChannelRef({
22
+ channel: opts.channel,
23
+ ...(opts.scope !== undefined ? { scope: opts.scope } : {}),
24
+ ...(opts.projectKey !== undefined ? { projectKey: opts.projectKey } : {}),
25
+ ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
26
+ });
27
+ if (!VALID_ACTIONS.has(opts.action)) {
28
+ throw new Error(`Invalid thread action '${opts.action}'. Must be one of: ${[...VALID_ACTIONS].join(", ")}`);
29
+ }
30
+ await readForumChannelEvents(opts.channel, ref.project, "post");
31
+ const thread = resolveThreadKey(opts.action, opts.thread);
32
+ const event = await appendEvent(opts.channel, {
33
+ kind: "thread",
34
+ by: opts.by,
35
+ action: opts.action,
36
+ thread,
37
+ ...(opts.title !== undefined ? { title: opts.title } : {}),
38
+ ...(opts.text !== undefined ? { text: opts.text } : {}),
39
+ ...(opts.description !== undefined
40
+ ? { description: opts.description }
41
+ : {}),
42
+ ...(opts.status !== undefined ? { status: opts.status } : {}),
43
+ ...(opts.labels !== undefined ? { labels: opts.labels } : {}),
44
+ ...(opts.assignees !== undefined ? { assignees: opts.assignees } : {}),
45
+ ...(opts.summary !== undefined ? { summary: opts.summary } : {}),
46
+ ...(opts.context !== undefined && opts.context.length > 0
47
+ ? { context: opts.context }
48
+ : {}),
49
+ ...(opts.origin !== undefined ? { origin: opts.origin } : {}),
50
+ ...(opts.meta !== undefined ? { meta: opts.meta } : {}),
51
+ }, ref.project);
52
+ return event;
53
+ }
54
+ function resolveThreadKey(action, value) {
55
+ if (value)
56
+ return normalizeThreadKey(value);
57
+ if (action === "opened")
58
+ return `thread-${Date.now().toString(36)}`;
59
+ throw new Error("--thread is required unless action is 'opened'");
60
+ }
61
+ /**
62
+ * Rename a thread. Records a `kind:"thread", action:"rename"` event so
63
+ * subsequent reducers can flatten alias chains.
64
+ */
65
+ export async function renameThread(opts) {
66
+ const ref = resolveChannelRef({
67
+ channel: opts.channel,
68
+ ...(opts.scope !== undefined ? { scope: opts.scope } : {}),
69
+ ...(opts.projectKey !== undefined ? { projectKey: opts.projectKey } : {}),
70
+ ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
71
+ });
72
+ const events = await readForumChannelEvents(opts.channel, ref.project, "thread rename");
73
+ const oldKey = normalizeThreadKey(opts.thread);
74
+ const newKey = normalizeThreadKey(opts.newThread);
75
+ if (oldKey === newKey) {
76
+ throw new Error("Old and new thread keys are identical");
77
+ }
78
+ // Reject renames that would silently merge two existing threads.
79
+ const resolver = buildThreadAliasResolver(events);
80
+ const oldCurrent = resolver.resolve(oldKey);
81
+ const currentTarget = resolver.resolve(newKey);
82
+ const knownKeys = new Set();
83
+ for (const ev of events) {
84
+ if (ev.kind === "thread" &&
85
+ typeof ev.thread === "string") {
86
+ knownKeys.add(resolver.resolve(ev.thread));
87
+ }
88
+ }
89
+ if (!knownKeys.has(oldCurrent)) {
90
+ throw new Error(`Thread '${oldKey}' not found in channel '${opts.channel}'.`);
91
+ }
92
+ if (knownKeys.has(currentTarget) && currentTarget !== oldCurrent) {
93
+ throw new Error(`Thread '${newKey}' already exists in channel '${opts.channel}'. Refusing to merge two timelines.`);
94
+ }
95
+ const event = await appendEvent(opts.channel, {
96
+ kind: "thread",
97
+ by: opts.by,
98
+ action: "rename",
99
+ thread: oldKey,
100
+ newThread: newKey,
101
+ ...(opts.origin !== undefined ? { origin: opts.origin } : {}),
102
+ ...(opts.meta !== undefined ? { meta: opts.meta } : {}),
103
+ }, ref.project);
104
+ return event;
105
+ }
106
+ //# sourceMappingURL=post-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-thread.js","sourceRoot":"","sources":["../../../src/channel/api/post-thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type ChannelEvent, type ContextChannelEvent, type ReadChannelEventsPagination, type ThreadChannelEvent } from "../internal/store/events.js";
2
+ import { type ThreadState } from "../internal/store/thread-state.js";
3
+ import type { ChannelMetadata } from "../internal/store/schema.js";
4
+ import type { ChannelAddressOptions } from "./types.js";
5
+ /**
6
+ * Cursor pagination options. Omitting all of them returns every event,
7
+ * preserving the read-all default for existing callers.
8
+ */
9
+ export interface ReadChannelEventsOptions extends ChannelAddressOptions, ReadChannelEventsPagination {
10
+ }
11
+ export declare function readChannelEvents(opts: ReadChannelEventsOptions): Promise<ChannelEvent[]>;
12
+ export declare function readChannelMetadata(opts: ChannelAddressOptions): Promise<ChannelMetadata>;
13
+ export declare function listForumThreads(opts: ChannelAddressOptions): Promise<ThreadState[]>;
14
+ export declare function showThread(opts: ChannelAddressOptions & {
15
+ thread: string;
16
+ }): Promise<(ThreadChannelEvent | ContextChannelEvent)[]>;
17
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/channel/api/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,wBACf,SAAQ,qBAAqB,EAC3B,2BAA2B;CAAG;AAElC,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAYzB;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAaxB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,qBAAqB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAAC,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAavD"}
@@ -0,0 +1,44 @@
1
+ import { readChannelEvents as readEventsInternal, } from "../internal/store/events.js";
2
+ import { reduceChannelMetadata } from "../internal/store/channel-metadata.js";
3
+ import { collectThreadTimeline, reduceThreads, } from "../internal/store/thread-state.js";
4
+ import { normalizeThreadKey } from "../internal/store/schema.js";
5
+ import { readForumChannelEvents } from "./assert.js";
6
+ import { resolveChannelRef } from "./resolve.js";
7
+ export async function readChannelEvents(opts) {
8
+ const ref = resolveChannelRef({
9
+ channel: opts.channel,
10
+ ...(opts.scope !== undefined ? { scope: opts.scope } : {}),
11
+ ...(opts.projectKey !== undefined ? { projectKey: opts.projectKey } : {}),
12
+ ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
13
+ });
14
+ return readEventsInternal(opts.channel, ref.project, {
15
+ ...(opts.afterSeq !== undefined ? { afterSeq: opts.afterSeq } : {}),
16
+ ...(opts.beforeSeq !== undefined ? { beforeSeq: opts.beforeSeq } : {}),
17
+ ...(opts.limit !== undefined ? { limit: opts.limit } : {}),
18
+ });
19
+ }
20
+ export async function readChannelMetadata(opts) {
21
+ const events = await readChannelEvents(opts);
22
+ return reduceChannelMetadata(events);
23
+ }
24
+ export async function listForumThreads(opts) {
25
+ const ref = resolveChannelRef({
26
+ channel: opts.channel,
27
+ ...(opts.scope !== undefined ? { scope: opts.scope } : {}),
28
+ ...(opts.projectKey !== undefined ? { projectKey: opts.projectKey } : {}),
29
+ ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
30
+ });
31
+ const events = await readForumChannelEvents(opts.channel, ref.project, "forum");
32
+ return reduceThreads(events);
33
+ }
34
+ export async function showThread(opts) {
35
+ const ref = resolveChannelRef({
36
+ channel: opts.channel,
37
+ ...(opts.scope !== undefined ? { scope: opts.scope } : {}),
38
+ ...(opts.projectKey !== undefined ? { projectKey: opts.projectKey } : {}),
39
+ ...(opts.cwd !== undefined ? { cwd: opts.cwd } : {}),
40
+ });
41
+ const events = await readForumChannelEvents(opts.channel, ref.project, "thread");
42
+ return collectThreadTimeline(events, normalizeThreadKey(opts.thread));
43
+ }
44
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/channel/api/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ChannelRef, ChannelScope } from "../internal/store/schema.js";
2
+ export interface ResolveChannelRefOptions {
3
+ channel: string;
4
+ scope?: ChannelScope;
5
+ /** Storage project bucket key. Wins when set. */
6
+ projectKey?: string;
7
+ /** cwd used to derive the project bucket when scope is "project". */
8
+ cwd?: string;
9
+ /**
10
+ * If true, do not require the channel to exist on disk. Used for the
11
+ * create path. Defaults to false (existence required).
12
+ */
13
+ forCreate?: boolean;
14
+ }
15
+ /**
16
+ * Resolve a `ChannelRef` honoring `--scope`, an explicit `projectKey`,
17
+ * or cwd-derived defaults. Mirrors the CLI's scope-resolution rules so
18
+ * downstream consumers behave the same way.
19
+ */
20
+ export declare function resolveChannelRef(opts: ResolveChannelRefOptions): ChannelRef;
21
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/channel/api/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACb,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,UAAU,CAoB5E"}
@@ -0,0 +1,28 @@
1
+ import { channelDir, resolveChannelProjectForCreate, resolveExistingChannelRef, } from "../internal/store/paths.js";
2
+ /**
3
+ * Resolve a `ChannelRef` honoring `--scope`, an explicit `projectKey`,
4
+ * or cwd-derived defaults. Mirrors the CLI's scope-resolution rules so
5
+ * downstream consumers behave the same way.
6
+ */
7
+ export function resolveChannelRef(opts) {
8
+ if (opts.projectKey) {
9
+ const project = opts.projectKey;
10
+ return {
11
+ name: opts.channel,
12
+ scope: opts.scope ?? "project",
13
+ project,
14
+ dir: channelDir(opts.channel, project),
15
+ };
16
+ }
17
+ if (opts.forCreate) {
18
+ return resolveChannelProjectForCreate(opts.channel, {
19
+ scope: opts.scope,
20
+ cwd: opts.cwd,
21
+ });
22
+ }
23
+ return resolveExistingChannelRef(opts.channel, {
24
+ scope: opts.scope,
25
+ cwd: opts.cwd,
26
+ });
27
+ }
28
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/channel/api/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AAoBpC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA8B;IAC9D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,OAAO;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;YAC9B,OAAO;YACP,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;SACvC,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,8BAA8B,CAAC,IAAI,CAAC,OAAO,EAAE;YAClD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;IACL,CAAC;IACD,OAAO,yBAAyB,CAAC,IAAI,CAAC,OAAO,EAAE;QAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;AACL,CAAC"}