@blxzer/cursor-trellis-core 0.5.0-beta.4 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/channel.d.ts +1 -0
- package/channel.js +1 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +27 -47
- package/task.d.ts +1 -0
- package/task.js +1 -0
- package/testing.d.ts +1 -0
- package/testing.js +1 -0
- package/dist/channel/api/assert.d.ts +0 -3
- package/dist/channel/api/assert.d.ts.map +0 -1
- package/dist/channel/api/assert.js +0 -11
- package/dist/channel/api/assert.js.map +0 -1
- package/dist/channel/api/context.d.ts +0 -21
- package/dist/channel/api/context.d.ts.map +0 -1
- package/dist/channel/api/context.js +0 -99
- package/dist/channel/api/context.js.map +0 -1
- package/dist/channel/api/create.d.ts +0 -9
- package/dist/channel/api/create.d.ts.map +0 -1
- package/dist/channel/api/create.js +0 -104
- package/dist/channel/api/create.js.map +0 -1
- package/dist/channel/api/inbox.d.ts +0 -51
- package/dist/channel/api/inbox.d.ts.map +0 -1
- package/dist/channel/api/inbox.js +0 -176
- package/dist/channel/api/inbox.js.map +0 -1
- package/dist/channel/api/interrupt.d.ts +0 -31
- package/dist/channel/api/interrupt.d.ts.map +0 -1
- package/dist/channel/api/interrupt.js +0 -102
- package/dist/channel/api/interrupt.js.map +0 -1
- package/dist/channel/api/post-thread.d.ts +0 -14
- package/dist/channel/api/post-thread.d.ts.map +0 -1
- package/dist/channel/api/post-thread.js +0 -109
- package/dist/channel/api/post-thread.js.map +0 -1
- package/dist/channel/api/read.d.ts +0 -17
- package/dist/channel/api/read.d.ts.map +0 -1
- package/dist/channel/api/read.js +0 -44
- package/dist/channel/api/read.js.map +0 -1
- package/dist/channel/api/resolve.d.ts +0 -21
- package/dist/channel/api/resolve.d.ts.map +0 -1
- package/dist/channel/api/resolve.js +0 -28
- package/dist/channel/api/resolve.js.map +0 -1
- package/dist/channel/api/runtime.d.ts +0 -70
- package/dist/channel/api/runtime.d.ts.map +0 -1
- package/dist/channel/api/runtime.js +0 -11
- package/dist/channel/api/runtime.js.map +0 -1
- package/dist/channel/api/send.d.ts +0 -4
- package/dist/channel/api/send.d.ts.map +0 -1
- package/dist/channel/api/send.js +0 -52
- package/dist/channel/api/send.js.map +0 -1
- package/dist/channel/api/spawn.d.ts +0 -13
- package/dist/channel/api/spawn.d.ts.map +0 -1
- package/dist/channel/api/spawn.js +0 -54
- package/dist/channel/api/spawn.js.map +0 -1
- package/dist/channel/api/title.d.ts +0 -5
- package/dist/channel/api/title.d.ts.map +0 -1
- package/dist/channel/api/title.js +0 -40
- package/dist/channel/api/title.js.map +0 -1
- package/dist/channel/api/types.d.ts +0 -65
- package/dist/channel/api/types.d.ts.map +0 -1
- package/dist/channel/api/types.js +0 -2
- package/dist/channel/api/types.js.map +0 -1
- package/dist/channel/api/watch-channels.d.ts +0 -40
- package/dist/channel/api/watch-channels.d.ts.map +0 -1
- package/dist/channel/api/watch-channels.js +0 -143
- package/dist/channel/api/watch-channels.js.map +0 -1
- package/dist/channel/api/watch.d.ts +0 -11
- package/dist/channel/api/watch.d.ts.map +0 -1
- package/dist/channel/api/watch.js +0 -17
- package/dist/channel/api/watch.js.map +0 -1
- package/dist/channel/api/workers.d.ts +0 -69
- package/dist/channel/api/workers.d.ts.map +0 -1
- package/dist/channel/api/workers.js +0 -145
- package/dist/channel/api/workers.js.map +0 -1
- package/dist/channel/index.d.ts +0 -38
- package/dist/channel/index.d.ts.map +0 -1
- package/dist/channel/index.js +0 -23
- package/dist/channel/index.js.map +0 -1
- package/dist/channel/internal/store/channel-metadata.d.ts +0 -23
- package/dist/channel/internal/store/channel-metadata.d.ts.map +0 -1
- package/dist/channel/internal/store/channel-metadata.js +0 -94
- package/dist/channel/internal/store/channel-metadata.js.map +0 -1
- package/dist/channel/internal/store/delivery.d.ts +0 -27
- package/dist/channel/internal/store/delivery.d.ts.map +0 -1
- package/dist/channel/internal/store/delivery.js +0 -37
- package/dist/channel/internal/store/delivery.js.map +0 -1
- package/dist/channel/internal/store/events.d.ts +0 -215
- package/dist/channel/internal/store/events.d.ts.map +0 -1
- package/dist/channel/internal/store/events.js +0 -206
- package/dist/channel/internal/store/events.js.map +0 -1
- package/dist/channel/internal/store/filter.d.ts +0 -21
- package/dist/channel/internal/store/filter.d.ts.map +0 -1
- package/dist/channel/internal/store/filter.js +0 -75
- package/dist/channel/internal/store/filter.js.map +0 -1
- package/dist/channel/internal/store/inbox.d.ts +0 -17
- package/dist/channel/internal/store/inbox.d.ts.map +0 -1
- package/dist/channel/internal/store/inbox.js +0 -30
- package/dist/channel/internal/store/inbox.js.map +0 -1
- package/dist/channel/internal/store/lock.d.ts +0 -17
- package/dist/channel/internal/store/lock.d.ts.map +0 -1
- package/dist/channel/internal/store/lock.js +0 -88
- package/dist/channel/internal/store/lock.js.map +0 -1
- package/dist/channel/internal/store/paths.d.ts +0 -43
- package/dist/channel/internal/store/paths.d.ts.map +0 -1
- package/dist/channel/internal/store/paths.js +0 -233
- package/dist/channel/internal/store/paths.js.map +0 -1
- package/dist/channel/internal/store/schema.d.ts +0 -77
- package/dist/channel/internal/store/schema.d.ts.map +0 -1
- package/dist/channel/internal/store/schema.js +0 -127
- package/dist/channel/internal/store/schema.js.map +0 -1
- package/dist/channel/internal/store/seq.d.ts +0 -12
- package/dist/channel/internal/store/seq.d.ts.map +0 -1
- package/dist/channel/internal/store/seq.js +0 -133
- package/dist/channel/internal/store/seq.js.map +0 -1
- package/dist/channel/internal/store/thread-state.d.ts +0 -37
- package/dist/channel/internal/store/thread-state.d.ts.map +0 -1
- package/dist/channel/internal/store/thread-state.js +0 -206
- package/dist/channel/internal/store/thread-state.js.map +0 -1
- package/dist/channel/internal/store/watch.d.ts +0 -10
- package/dist/channel/internal/store/watch.d.ts.map +0 -1
- package/dist/channel/internal/store/watch.js +0 -122
- package/dist/channel/internal/store/watch.js.map +0 -1
- package/dist/channel/internal/store/worker-state.d.ts +0 -56
- package/dist/channel/internal/store/worker-state.d.ts.map +0 -1
- package/dist/channel/internal/store/worker-state.js +0 -220
- package/dist/channel/internal/store/worker-state.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/task/adapter-middleware.d.ts +0 -118
- package/dist/task/adapter-middleware.d.ts.map +0 -1
- package/dist/task/adapter-middleware.js +0 -508
- package/dist/task/adapter-middleware.js.map +0 -1
- package/dist/task/contract-migrate.d.ts +0 -29
- package/dist/task/contract-migrate.d.ts.map +0 -1
- package/dist/task/contract-migrate.js +0 -207
- package/dist/task/contract-migrate.js.map +0 -1
- package/dist/task/full-quality.d.ts +0 -89
- package/dist/task/full-quality.d.ts.map +0 -1
- package/dist/task/full-quality.js +0 -379
- package/dist/task/full-quality.js.map +0 -1
- package/dist/task/index.d.ts +0 -31
- package/dist/task/index.d.ts.map +0 -1
- package/dist/task/index.js +0 -20
- package/dist/task/index.js.map +0 -1
- package/dist/task/kernel-cli.d.ts +0 -44
- package/dist/task/kernel-cli.d.ts.map +0 -1
- package/dist/task/kernel-cli.js +0 -287
- package/dist/task/kernel-cli.js.map +0 -1
- package/dist/task/kernel-contract.d.ts +0 -113
- package/dist/task/kernel-contract.d.ts.map +0 -1
- package/dist/task/kernel-contract.js +0 -332
- package/dist/task/kernel-contract.js.map +0 -1
- package/dist/task/kernel-store.d.ts +0 -99
- package/dist/task/kernel-store.d.ts.map +0 -1
- package/dist/task/kernel-store.js +0 -735
- package/dist/task/kernel-store.js.map +0 -1
- package/dist/task/kernel-surface.d.ts +0 -39
- package/dist/task/kernel-surface.d.ts.map +0 -1
- package/dist/task/kernel-surface.js +0 -73
- package/dist/task/kernel-surface.js.map +0 -1
- package/dist/task/lite-context-pack.d.ts +0 -71
- package/dist/task/lite-context-pack.d.ts.map +0 -1
- package/dist/task/lite-context-pack.js +0 -175
- package/dist/task/lite-context-pack.js.map +0 -1
- package/dist/task/ondemand-topology.d.ts +0 -108
- package/dist/task/ondemand-topology.d.ts.map +0 -1
- package/dist/task/ondemand-topology.js +0 -453
- package/dist/task/ondemand-topology.js.map +0 -1
- package/dist/task/p36-artifact-migrate.d.ts +0 -61
- package/dist/task/p36-artifact-migrate.d.ts.map +0 -1
- package/dist/task/p36-artifact-migrate.js +0 -336
- package/dist/task/p36-artifact-migrate.js.map +0 -1
- package/dist/task/p36-wave-c.d.ts +0 -39
- package/dist/task/p36-wave-c.d.ts.map +0 -1
- package/dist/task/p36-wave-c.js +0 -100
- package/dist/task/p36-wave-c.js.map +0 -1
- package/dist/task/paths.d.ts +0 -37
- package/dist/task/paths.d.ts.map +0 -1
- package/dist/task/paths.js +0 -49
- package/dist/task/paths.js.map +0 -1
- package/dist/task/phase.d.ts +0 -27
- package/dist/task/phase.d.ts.map +0 -1
- package/dist/task/phase.js +0 -24
- package/dist/task/phase.js.map +0 -1
- package/dist/task/records.d.ts +0 -48
- package/dist/task/records.d.ts.map +0 -1
- package/dist/task/records.js +0 -100
- package/dist/task/records.js.map +0 -1
- package/dist/task/schema.d.ts +0 -77
- package/dist/task/schema.d.ts.map +0 -1
- package/dist/task/schema.js +0 -220
- package/dist/task/schema.js.map +0 -1
- package/dist/testing/index.d.ts +0 -2
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -4
- package/dist/testing/index.js.map +0 -1
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import fsp from "node:fs/promises";
|
|
3
|
-
import { withLock } from "./lock.js";
|
|
4
|
-
import { channelDir, eventsPath, lockPath, seqSidecarPath, } from "./paths.js";
|
|
5
|
-
import { reconcileSeq, writeSidecar } from "./seq.js";
|
|
6
|
-
import { parseEventOrigin } from "./schema.js";
|
|
7
|
-
export const CHANNEL_EVENT_KINDS = new Set([
|
|
8
|
-
"create",
|
|
9
|
-
"join",
|
|
10
|
-
"leave",
|
|
11
|
-
"message",
|
|
12
|
-
"thread",
|
|
13
|
-
"context",
|
|
14
|
-
"channel",
|
|
15
|
-
"spawned",
|
|
16
|
-
"killed",
|
|
17
|
-
"respawned",
|
|
18
|
-
"progress",
|
|
19
|
-
"done",
|
|
20
|
-
"error",
|
|
21
|
-
"waiting",
|
|
22
|
-
"awake",
|
|
23
|
-
"undeliverable",
|
|
24
|
-
"interrupt_requested",
|
|
25
|
-
"turn_started",
|
|
26
|
-
"turn_finished",
|
|
27
|
-
"interrupted",
|
|
28
|
-
"supervisor_warning",
|
|
29
|
-
]);
|
|
30
|
-
export function parseChannelKind(v) {
|
|
31
|
-
if (v === undefined)
|
|
32
|
-
return undefined;
|
|
33
|
-
if (!CHANNEL_EVENT_KINDS.has(v)) {
|
|
34
|
-
throw new Error(`Invalid --kind '${v}'. Must be one of: ${[...CHANNEL_EVENT_KINDS].join(", ")}`);
|
|
35
|
-
}
|
|
36
|
-
return v;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Parse a CSV of event kinds into a typed list. Each member is validated
|
|
40
|
-
* through {@link parseChannelKind} so the single-value error message and
|
|
41
|
-
* whitelist remain the SOT. Returns `undefined` when input is undefined
|
|
42
|
-
* or contains no non-empty members.
|
|
43
|
-
*/
|
|
44
|
-
export function parseChannelKinds(v) {
|
|
45
|
-
if (v === undefined)
|
|
46
|
-
return undefined;
|
|
47
|
-
const parts = v
|
|
48
|
-
.split(",")
|
|
49
|
-
.map((s) => s.trim())
|
|
50
|
-
.filter((s) => s.length > 0);
|
|
51
|
-
if (parts.length === 0)
|
|
52
|
-
return undefined;
|
|
53
|
-
const out = [];
|
|
54
|
-
const seen = new Set();
|
|
55
|
-
for (const part of parts) {
|
|
56
|
-
const parsed = parseChannelKind(part);
|
|
57
|
-
if (parsed === undefined)
|
|
58
|
-
continue;
|
|
59
|
-
if (seen.has(parsed))
|
|
60
|
-
continue;
|
|
61
|
-
seen.add(parsed);
|
|
62
|
-
out.push(parsed);
|
|
63
|
-
}
|
|
64
|
-
return out;
|
|
65
|
-
}
|
|
66
|
-
export function isCreateEvent(ev) {
|
|
67
|
-
return ev.kind === "create";
|
|
68
|
-
}
|
|
69
|
-
export function isThreadEvent(ev) {
|
|
70
|
-
return ev.kind === "thread" && typeof ev.thread === "string";
|
|
71
|
-
}
|
|
72
|
-
export function isContextEvent(ev) {
|
|
73
|
-
return ev.kind === "context";
|
|
74
|
-
}
|
|
75
|
-
export function isChannelMetadataEvent(ev) {
|
|
76
|
-
return ev.kind === "channel";
|
|
77
|
-
}
|
|
78
|
-
export async function ensureChannelDir(name, project) {
|
|
79
|
-
const dir = channelDir(name, project);
|
|
80
|
-
await fsp.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
81
|
-
return dir;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Read the last committed seq for a channel. Uses the same reconcile
|
|
85
|
-
* path as `appendEvent` so callers that need a snapshot do not see a
|
|
86
|
-
* stale sidecar.
|
|
87
|
-
*/
|
|
88
|
-
export async function readLastSeq(name, project) {
|
|
89
|
-
const file = eventsPath(name, project);
|
|
90
|
-
if (!fs.existsSync(file))
|
|
91
|
-
return 0;
|
|
92
|
-
return reconcileSeq(file, seqSidecarPath(name, project));
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Append a channel event atomically under the channel lock.
|
|
96
|
-
*
|
|
97
|
-
* Internally reconciles the `.seq` sidecar with the JSONL tail to avoid
|
|
98
|
-
* the legacy full-scan path. Sidecar repair happens automatically on
|
|
99
|
-
* corruption, missing file, or sidecar drift in either direction.
|
|
100
|
-
*
|
|
101
|
-
* @internal Trellis CLI-internal write primitive — downstream consumers
|
|
102
|
-
* must go through the typed mutation APIs (`createChannel`,
|
|
103
|
-
* `sendMessage`, etc.).
|
|
104
|
-
*/
|
|
105
|
-
export async function appendEvent(name, partial, project) {
|
|
106
|
-
validateEventBase(partial);
|
|
107
|
-
await ensureChannelDir(name, project);
|
|
108
|
-
const jsonl = eventsPath(name, project);
|
|
109
|
-
const sidecar = seqSidecarPath(name, project);
|
|
110
|
-
return withLock(lockPath(name, project), async () => {
|
|
111
|
-
const existing = findIdempotentEvent(jsonl, partial);
|
|
112
|
-
if (existing !== undefined)
|
|
113
|
-
return existing;
|
|
114
|
-
const lastSeq = await reconcileSeq(jsonl, sidecar);
|
|
115
|
-
const event = {
|
|
116
|
-
...partial,
|
|
117
|
-
seq: lastSeq + 1,
|
|
118
|
-
ts: partial.ts ?? new Date().toISOString(),
|
|
119
|
-
};
|
|
120
|
-
await fsp.appendFile(jsonl, JSON.stringify(event) + "\n", "utf-8");
|
|
121
|
-
await writeSidecar(sidecar, event.seq);
|
|
122
|
-
return event;
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
function findIdempotentEvent(file, partial) {
|
|
126
|
-
const key = partial.idempotencyKey;
|
|
127
|
-
if (key === undefined)
|
|
128
|
-
return undefined;
|
|
129
|
-
for (const ev of readAllEvents(file)) {
|
|
130
|
-
if (ev.idempotencyKey !== key)
|
|
131
|
-
continue;
|
|
132
|
-
if (ev.kind !== partial.kind) {
|
|
133
|
-
throw new Error(`Idempotency key '${key}' was already used for ${ev.kind}; cannot reuse it for ${partial.kind}`);
|
|
134
|
-
}
|
|
135
|
-
return ev;
|
|
136
|
-
}
|
|
137
|
-
return undefined;
|
|
138
|
-
}
|
|
139
|
-
function validateEventBase(partial) {
|
|
140
|
-
const key = partial.idempotencyKey;
|
|
141
|
-
if (key?.trim().length === 0) {
|
|
142
|
-
throw new Error("idempotencyKey must be a non-empty string");
|
|
143
|
-
}
|
|
144
|
-
const origin = partial.origin;
|
|
145
|
-
if (origin !== undefined) {
|
|
146
|
-
parseEventOrigin(typeof origin === "string" ? origin : String(origin));
|
|
147
|
-
}
|
|
148
|
-
const meta = partial.meta;
|
|
149
|
-
if (meta !== undefined &&
|
|
150
|
-
(meta === null || typeof meta !== "object" || Array.isArray(meta))) {
|
|
151
|
-
throw new Error("meta must be a plain JSON object");
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/** Default page size applied when a cursor is present but `limit` is not. */
|
|
155
|
-
export const DEFAULT_CURSOR_PAGE_SIZE = 200;
|
|
156
|
-
function readAllEvents(file) {
|
|
157
|
-
if (!fs.existsSync(file))
|
|
158
|
-
return [];
|
|
159
|
-
const text = fs.readFileSync(file, "utf-8");
|
|
160
|
-
const events = [];
|
|
161
|
-
for (const line of text.split("\n")) {
|
|
162
|
-
if (!line.trim())
|
|
163
|
-
continue;
|
|
164
|
-
try {
|
|
165
|
-
events.push(JSON.parse(line));
|
|
166
|
-
}
|
|
167
|
-
catch {
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return events;
|
|
172
|
-
}
|
|
173
|
-
export async function readChannelEvents(name, project, pagination) {
|
|
174
|
-
const file = eventsPath(name, project);
|
|
175
|
-
const all = readAllEvents(file);
|
|
176
|
-
if (!pagination ||
|
|
177
|
-
(pagination.afterSeq === undefined &&
|
|
178
|
-
pagination.beforeSeq === undefined &&
|
|
179
|
-
pagination.limit === undefined)) {
|
|
180
|
-
return all;
|
|
181
|
-
}
|
|
182
|
-
const { afterSeq, beforeSeq, limit } = pagination;
|
|
183
|
-
if (afterSeq !== undefined && beforeSeq !== undefined) {
|
|
184
|
-
throw new Error("readChannelEvents: pass only one of afterSeq / beforeSeq");
|
|
185
|
-
}
|
|
186
|
-
if (limit !== undefined && (!Number.isInteger(limit) || limit < 0)) {
|
|
187
|
-
throw new Error("readChannelEvents: limit must be a non-negative integer");
|
|
188
|
-
}
|
|
189
|
-
// Events are appended in monotonic seq order; keep that as the contract.
|
|
190
|
-
if (afterSeq !== undefined) {
|
|
191
|
-
const page = all.filter((ev) => ev.seq > afterSeq);
|
|
192
|
-
const cap = limit ?? DEFAULT_CURSOR_PAGE_SIZE;
|
|
193
|
-
return page.slice(0, cap);
|
|
194
|
-
}
|
|
195
|
-
if (beforeSeq !== undefined) {
|
|
196
|
-
const page = all.filter((ev) => ev.seq < beforeSeq);
|
|
197
|
-
const cap = limit ?? DEFAULT_CURSOR_PAGE_SIZE;
|
|
198
|
-
// Newest page first internally; return ascending for stable consumers.
|
|
199
|
-
return page.slice(Math.max(0, page.length - cap));
|
|
200
|
-
}
|
|
201
|
-
// limit only: latest N events in ascending seq order.
|
|
202
|
-
return limit !== undefined
|
|
203
|
-
? all.slice(Math.max(0, all.length - limit))
|
|
204
|
-
: all;
|
|
205
|
-
}
|
|
206
|
-
//# sourceMappingURL=events.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type ChannelEvent, type ChannelEventKind } from "./events.js";
|
|
2
|
-
import type { ThreadAction } from "./schema.js";
|
|
3
|
-
export declare const MEANINGFUL_EVENT_KINDS: ReadonlySet<ChannelEventKind>;
|
|
4
|
-
export interface ChannelEventFilter {
|
|
5
|
-
from?: string[];
|
|
6
|
-
/**
|
|
7
|
-
* Restrict to one kind (legacy single value) or any of a list (OR
|
|
8
|
-
* semantics). An explicit kind constraint bypasses the default
|
|
9
|
-
* meaningful-kinds filter so non-meaningful kinds can still match
|
|
10
|
-
* when requested directly (e.g. `supervisor_warning`).
|
|
11
|
-
*/
|
|
12
|
-
kind?: ChannelEventKind | readonly ChannelEventKind[];
|
|
13
|
-
to?: string;
|
|
14
|
-
self?: string;
|
|
15
|
-
includeProgress?: boolean;
|
|
16
|
-
includeNonMeaningful?: boolean;
|
|
17
|
-
thread?: string;
|
|
18
|
-
action?: ThreadAction;
|
|
19
|
-
}
|
|
20
|
-
export declare function matchesEventFilter(ev: ChannelEvent, filter: ChannelEventFilter): boolean;
|
|
21
|
-
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../src/channel/internal/store/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,gBAAgB,CAazC,CAAC;AAEzB,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,gBAAgB,GAAG,SAAS,gBAAgB,EAAE,CAAC;IACtD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAaD,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,YAAY,EAChB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAgDT"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { isThreadEvent, } from "./events.js";
|
|
2
|
-
export const MEANINGFUL_EVENT_KINDS = new Set([
|
|
3
|
-
"create",
|
|
4
|
-
"join",
|
|
5
|
-
"leave",
|
|
6
|
-
"message",
|
|
7
|
-
"thread",
|
|
8
|
-
"context",
|
|
9
|
-
"channel",
|
|
10
|
-
"spawned",
|
|
11
|
-
"killed",
|
|
12
|
-
"respawned",
|
|
13
|
-
"done",
|
|
14
|
-
"error",
|
|
15
|
-
]);
|
|
16
|
-
function matchesKind(evKind, filterKind) {
|
|
17
|
-
if (filterKind === undefined)
|
|
18
|
-
return true;
|
|
19
|
-
if (typeof filterKind === "string")
|
|
20
|
-
return evKind === filterKind;
|
|
21
|
-
// Empty array = no kind constraint (treat as if filter.kind was undefined).
|
|
22
|
-
if (filterKind.length === 0)
|
|
23
|
-
return true;
|
|
24
|
-
return filterKind.includes(evKind);
|
|
25
|
-
}
|
|
26
|
-
export function matchesEventFilter(ev, filter) {
|
|
27
|
-
if (filter.self && ev.by === filter.self)
|
|
28
|
-
return false;
|
|
29
|
-
// An explicit kind filter is itself the caller's "I know what I want"
|
|
30
|
-
// signal — bypass the default meaningful-kinds gate so non-meaningful
|
|
31
|
-
// kinds like `supervisor_warning` remain matchable when requested.
|
|
32
|
-
const hasExplicitKind = filter.kind !== undefined &&
|
|
33
|
-
(typeof filter.kind === "string" || filter.kind.length > 0);
|
|
34
|
-
if (!filter.includeNonMeaningful &&
|
|
35
|
-
!hasExplicitKind &&
|
|
36
|
-
!MEANINGFUL_EVENT_KINDS.has(ev.kind)) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
if (!filter.includeProgress && ev.kind === "progress")
|
|
40
|
-
return false;
|
|
41
|
-
if (!matchesKind(ev.kind, filter.kind))
|
|
42
|
-
return false;
|
|
43
|
-
if (filter.thread !== undefined) {
|
|
44
|
-
if (!isThreadEvent(ev))
|
|
45
|
-
return false;
|
|
46
|
-
if (ev.thread !== filter.thread)
|
|
47
|
-
return false;
|
|
48
|
-
}
|
|
49
|
-
if (filter.action !== undefined) {
|
|
50
|
-
if (!isThreadEvent(ev))
|
|
51
|
-
return false;
|
|
52
|
-
if (ev.action !== filter.action)
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
if (filter.from && filter.from.length > 0) {
|
|
56
|
-
if (!filter.from.includes(ev.by))
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
if (filter.to) {
|
|
60
|
-
const evTo = ev.to;
|
|
61
|
-
if (filter.to === "exclusive") {
|
|
62
|
-
if (!evTo)
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
if (!evTo)
|
|
67
|
-
return true;
|
|
68
|
-
if (Array.isArray(evTo))
|
|
69
|
-
return evTo.includes(filter.to);
|
|
70
|
-
return evTo === filter.to;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
//# sourceMappingURL=filter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { ChannelEvent, MessageChannelEvent } from "./events.js";
|
|
2
|
-
import type { InboxPolicy } from "./schema.js";
|
|
3
|
-
/** Default inbox policy applied to workers / spawned events without one. */
|
|
4
|
-
export declare const DEFAULT_INBOX_POLICY: InboxPolicy;
|
|
5
|
-
/**
|
|
6
|
-
* Decide whether a channel `message` event should be delivered to a
|
|
7
|
-
* worker's inbox under the given policy. Single source of truth shared
|
|
8
|
-
* by the worker registry reducer, the delivery helper, and the CLI
|
|
9
|
-
* supervisor inbox watcher.
|
|
10
|
-
*
|
|
11
|
-
* - `explicitOnly`: deliver only when `to` targets the worker.
|
|
12
|
-
* - `broadcastAndExplicit`: also deliver broadcast messages (no `to`).
|
|
13
|
-
*
|
|
14
|
-
* A worker never consumes its own message events.
|
|
15
|
-
*/
|
|
16
|
-
export declare function matchesInboxPolicy(ev: ChannelEvent, workerId: string, policy: InboxPolicy): ev is MessageChannelEvent;
|
|
17
|
-
//# sourceMappingURL=inbox.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../../../src/channel/internal/store/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,EAAE,WAA4B,CAAC;AAOhE;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,EAAE,IAAI,mBAAmB,CAO3B"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/** Default inbox policy applied to workers / spawned events without one. */
|
|
2
|
-
export const DEFAULT_INBOX_POLICY = "explicitOnly";
|
|
3
|
-
function toList(to) {
|
|
4
|
-
if (to === undefined)
|
|
5
|
-
return [];
|
|
6
|
-
return Array.isArray(to) ? to : [to];
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Decide whether a channel `message` event should be delivered to a
|
|
10
|
-
* worker's inbox under the given policy. Single source of truth shared
|
|
11
|
-
* by the worker registry reducer, the delivery helper, and the CLI
|
|
12
|
-
* supervisor inbox watcher.
|
|
13
|
-
*
|
|
14
|
-
* - `explicitOnly`: deliver only when `to` targets the worker.
|
|
15
|
-
* - `broadcastAndExplicit`: also deliver broadcast messages (no `to`).
|
|
16
|
-
*
|
|
17
|
-
* A worker never consumes its own message events.
|
|
18
|
-
*/
|
|
19
|
-
export function matchesInboxPolicy(ev, workerId, policy) {
|
|
20
|
-
if (ev.kind !== "message")
|
|
21
|
-
return false;
|
|
22
|
-
if (ev.by === workerId)
|
|
23
|
-
return false;
|
|
24
|
-
const targets = toList(ev.to);
|
|
25
|
-
if (targets.length > 0)
|
|
26
|
-
return targets.includes(workerId);
|
|
27
|
-
// Broadcast (no `to`).
|
|
28
|
-
return policy === "broadcastAndExplicit";
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=inbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/inbox.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAgB,cAAc,CAAC;AAEhE,SAAS,MAAM,CAAC,EAAiC;IAC/C,IAAI,EAAE,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAgB,EAChB,QAAgB,EAChB,MAAmB;IAEnB,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1D,uBAAuB;IACvB,OAAO,MAAM,KAAK,sBAAsB,CAAC;AAC3C,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File-based advisory lock primitive.
|
|
3
|
-
*
|
|
4
|
-
* Uses `open(path, "wx")` (O_EXCL) for atomic creation across processes.
|
|
5
|
-
* Each lockfile stores the holder's pid for forensic + stale-lock
|
|
6
|
-
* recovery. If a lock file exists but the owning pid is no longer alive,
|
|
7
|
-
* the next `acquireLock` will steal it.
|
|
8
|
-
*/
|
|
9
|
-
interface AcquireOptions {
|
|
10
|
-
retryIntervalMs?: number;
|
|
11
|
-
maxWaitMs?: number;
|
|
12
|
-
}
|
|
13
|
-
export declare function acquireLock(lockFile: string, opts?: AcquireOptions): Promise<void>;
|
|
14
|
-
export declare function releaseLock(lockFile: string): void;
|
|
15
|
-
export declare function withLock<T>(lockFile: string, fn: () => Promise<T> | T, opts?: AcquireOptions): Promise<T>;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../../src/channel/internal/store/lock.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,UAAU,cAAc;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CASlD;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EACxB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File-based advisory lock primitive.
|
|
3
|
-
*
|
|
4
|
-
* Uses `open(path, "wx")` (O_EXCL) for atomic creation across processes.
|
|
5
|
-
* Each lockfile stores the holder's pid for forensic + stale-lock
|
|
6
|
-
* recovery. If a lock file exists but the owning pid is no longer alive,
|
|
7
|
-
* the next `acquireLock` will steal it.
|
|
8
|
-
*/
|
|
9
|
-
import fs from "node:fs";
|
|
10
|
-
import path from "node:path";
|
|
11
|
-
const DEFAULT_RETRY_INTERVAL_MS = 25;
|
|
12
|
-
const DEFAULT_MAX_WAIT_MS = 5000;
|
|
13
|
-
export async function acquireLock(lockFile, opts = {}) {
|
|
14
|
-
const interval = opts.retryIntervalMs ?? DEFAULT_RETRY_INTERVAL_MS;
|
|
15
|
-
const deadline = Date.now() + (opts.maxWaitMs ?? DEFAULT_MAX_WAIT_MS);
|
|
16
|
-
fs.mkdirSync(path.dirname(lockFile), { recursive: true });
|
|
17
|
-
while (true) {
|
|
18
|
-
try {
|
|
19
|
-
const fd = fs.openSync(lockFile, "wx");
|
|
20
|
-
fs.writeSync(fd, String(process.pid));
|
|
21
|
-
fs.closeSync(fd);
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
if (err.code !== "EEXIST")
|
|
26
|
-
throw err;
|
|
27
|
-
}
|
|
28
|
-
if (await checkAndStealStale(lockFile))
|
|
29
|
-
continue;
|
|
30
|
-
if (Date.now() >= deadline) {
|
|
31
|
-
throw new Error(`Failed to acquire lock ${lockFile} within ${opts.maxWaitMs ?? DEFAULT_MAX_WAIT_MS}ms`);
|
|
32
|
-
}
|
|
33
|
-
await sleep(interval);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
export function releaseLock(lockFile) {
|
|
37
|
-
try {
|
|
38
|
-
const content = fs.readFileSync(lockFile, "utf-8").trim();
|
|
39
|
-
if (content === String(process.pid)) {
|
|
40
|
-
fs.unlinkSync(lockFile);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// already gone
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
export async function withLock(lockFile, fn, opts) {
|
|
48
|
-
await acquireLock(lockFile, opts);
|
|
49
|
-
try {
|
|
50
|
-
return await fn();
|
|
51
|
-
}
|
|
52
|
-
finally {
|
|
53
|
-
releaseLock(lockFile);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
async function checkAndStealStale(lockFile) {
|
|
57
|
-
let holderPid = 0;
|
|
58
|
-
try {
|
|
59
|
-
holderPid = Number(fs.readFileSync(lockFile, "utf-8").trim());
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
return false;
|
|
63
|
-
}
|
|
64
|
-
if (!holderPid || !pidAlive(holderPid)) {
|
|
65
|
-
try {
|
|
66
|
-
fs.unlinkSync(lockFile);
|
|
67
|
-
process.stderr.write(`[channel lock] stale lock from dead pid ${holderPid} stolen at ${lockFile}\n`);
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
function pidAlive(pid) {
|
|
77
|
-
try {
|
|
78
|
-
process.kill(pid, 0);
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
function sleep(ms) {
|
|
86
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=lock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../../src/channel/internal/store/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { type ChannelRef, type ChannelScope } from "./schema.js";
|
|
2
|
-
/** Top-level Trellis channels directory. */
|
|
3
|
-
export declare function channelRoot(): string;
|
|
4
|
-
/**
|
|
5
|
-
* Derive a per-project bucket name from an absolute cwd, mirroring
|
|
6
|
-
* Claude Code's `~/.claude/projects/<sanitized-cwd>/` convention.
|
|
7
|
-
*/
|
|
8
|
-
export declare function projectKey(cwd: string): string;
|
|
9
|
-
/**
|
|
10
|
-
* Project key for the current CLI invocation. Reads
|
|
11
|
-
* `TRELLIS_CHANNEL_PROJECT` env first, then falls back to deriving from
|
|
12
|
-
* `process.cwd()`.
|
|
13
|
-
*/
|
|
14
|
-
export declare function currentProjectKey(): string;
|
|
15
|
-
export declare function projectDir(project?: string): string;
|
|
16
|
-
export declare function channelDir(name: string, project?: string): string;
|
|
17
|
-
export declare function eventsPath(name: string, project?: string): string;
|
|
18
|
-
export declare function seqSidecarPath(name: string, project?: string): string;
|
|
19
|
-
export declare function lockPath(name: string, project?: string): string;
|
|
20
|
-
export declare function workerFile(name: string, worker: string, suffix: string, project?: string): string;
|
|
21
|
-
export declare function workerLockPath(name: string, worker: string, project?: string): string;
|
|
22
|
-
/**
|
|
23
|
-
* One-shot migration: move legacy flat channels at `<root>/<name>/` into
|
|
24
|
-
* a `_legacy/` bucket so the new project-scoped layout can use the top
|
|
25
|
-
* level. Idempotent.
|
|
26
|
-
*/
|
|
27
|
-
export declare function migrateLegacyChannels(): void;
|
|
28
|
-
export declare function ensureBucketMarker(project: string): void;
|
|
29
|
-
export declare function listProjects(): string[];
|
|
30
|
-
/**
|
|
31
|
-
* List channel names inside a project bucket — subdirectories that
|
|
32
|
-
* contain an `events.jsonl` file. Used by the cross-channel watcher for
|
|
33
|
-
* dynamic channel discovery.
|
|
34
|
-
*/
|
|
35
|
-
export declare function listChannelNamesInProject(project: string): string[];
|
|
36
|
-
export interface ResolveChannelOptions {
|
|
37
|
-
scope?: ChannelScope;
|
|
38
|
-
cwd?: string;
|
|
39
|
-
}
|
|
40
|
-
export declare function resolveChannelProjectForCreate(name: string, opts?: ResolveChannelOptions): ChannelRef;
|
|
41
|
-
export declare function resolveExistingChannelRef(name: string, opts?: ResolveChannelOptions): ChannelRef;
|
|
42
|
-
export declare function selectExistingChannelProject(name: string): string;
|
|
43
|
-
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../../src/channel/internal/store/paths.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,4CAA4C;AAC5C,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,wBAAgB,UAAU,CAAC,OAAO,GAAE,MAA4B,GAAG,MAAM,CAExE;AAID,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAA4B,GACpC,MAAM,CAER;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAA4B,GACpC,MAAM,CAER;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAA4B,GACpC,MAAM,CAER;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAA4B,GACpC,MAAM,CAER;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAA4B,GACpC,MAAM,CAER;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAA4B,GACpC,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CA2C5C;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAOxD;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAqBvC;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBnE;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,qBAA0B,GAC/B,UAAU,CAcZ;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,qBAA0B,GAC/B,UAAU,CAsEZ;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE"}
|