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,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":"AAAA,OAAO,EACL,iBAAiB,IAAI,kBAAkB,GAKxC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EACL,qBAAqB,EACrB,aAAa,GAEd,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAWjD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAA8B;IAE9B,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;QACnD,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAA2B;IAE3B,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAA2B;IAE3B,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,IAAI,CAAC,OAAO,EACZ,GAAG,CAAC,OAAO,EACX,OAAO,CACR,CAAC;IACF,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAgD;IAEhD,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,IAAI,CAAC,OAAO,EACZ,GAAG,CAAC,OAAO,EACX,QAAQ,CACT,CAAC;IACF,OAAO,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -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"}
|