@mindfoldhq/trellis 0.6.0-beta.11 → 0.6.0-beta.12
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/dist/commands/channel/create.d.ts +5 -0
- package/dist/commands/channel/create.d.ts.map +1 -1
- package/dist/commands/channel/create.js +19 -15
- package/dist/commands/channel/create.js.map +1 -1
- package/dist/commands/channel/index.d.ts.map +1 -1
- package/dist/commands/channel/index.js +90 -9
- package/dist/commands/channel/index.js.map +1 -1
- package/dist/commands/channel/kill.d.ts +1 -0
- package/dist/commands/channel/kill.d.ts.map +1 -1
- package/dist/commands/channel/kill.js +16 -13
- package/dist/commands/channel/kill.js.map +1 -1
- package/dist/commands/channel/list.d.ts +1 -0
- package/dist/commands/channel/list.d.ts.map +1 -1
- package/dist/commands/channel/list.js +18 -6
- package/dist/commands/channel/list.js.map +1 -1
- package/dist/commands/channel/messages.d.ts +3 -0
- package/dist/commands/channel/messages.d.ts.map +1 -1
- package/dist/commands/channel/messages.js +88 -58
- package/dist/commands/channel/messages.js.map +1 -1
- package/dist/commands/channel/rm.d.ts +2 -0
- package/dist/commands/channel/rm.d.ts.map +1 -1
- package/dist/commands/channel/rm.js +15 -5
- package/dist/commands/channel/rm.js.map +1 -1
- package/dist/commands/channel/run.js +1 -1
- package/dist/commands/channel/run.js.map +1 -1
- package/dist/commands/channel/send.d.ts +2 -0
- package/dist/commands/channel/send.d.ts.map +1 -1
- package/dist/commands/channel/send.js +9 -10
- package/dist/commands/channel/send.js.map +1 -1
- package/dist/commands/channel/spawn.d.ts +1 -0
- package/dist/commands/channel/spawn.d.ts.map +1 -1
- package/dist/commands/channel/spawn.js +14 -11
- package/dist/commands/channel/spawn.js.map +1 -1
- package/dist/commands/channel/store/events.d.ts +61 -6
- package/dist/commands/channel/store/events.d.ts.map +1 -1
- package/dist/commands/channel/store/events.js +53 -9
- package/dist/commands/channel/store/events.js.map +1 -1
- package/dist/commands/channel/store/filter.d.ts +33 -0
- package/dist/commands/channel/store/filter.d.ts.map +1 -0
- package/dist/commands/channel/store/filter.js +63 -0
- package/dist/commands/channel/store/filter.js.map +1 -0
- package/dist/commands/channel/store/paths.d.ts +7 -0
- package/dist/commands/channel/store/paths.d.ts.map +1 -1
- package/dist/commands/channel/store/paths.js +76 -17
- package/dist/commands/channel/store/paths.js.map +1 -1
- package/dist/commands/channel/store/schema.d.ts +36 -0
- package/dist/commands/channel/store/schema.d.ts.map +1 -0
- package/dist/commands/channel/store/schema.js +91 -0
- package/dist/commands/channel/store/schema.js.map +1 -0
- package/dist/commands/channel/store/thread-state.d.ts +19 -0
- package/dist/commands/channel/store/thread-state.d.ts.map +1 -0
- package/dist/commands/channel/store/thread-state.js +81 -0
- package/dist/commands/channel/store/thread-state.js.map +1 -0
- package/dist/commands/channel/store/watch.d.ts +4 -21
- package/dist/commands/channel/store/watch.d.ts.map +1 -1
- package/dist/commands/channel/store/watch.js +8 -54
- package/dist/commands/channel/store/watch.js.map +1 -1
- package/dist/commands/channel/supervisor.d.ts +1 -1
- package/dist/commands/channel/supervisor.d.ts.map +1 -1
- package/dist/commands/channel/supervisor.js +11 -10
- package/dist/commands/channel/supervisor.js.map +1 -1
- package/dist/commands/channel/threads.d.ts +28 -0
- package/dist/commands/channel/threads.d.ts.map +1 -0
- package/dist/commands/channel/threads.js +96 -0
- package/dist/commands/channel/threads.js.map +1 -0
- package/dist/commands/channel/wait.d.ts +3 -0
- package/dist/commands/channel/wait.d.ts.map +1 -1
- package/dist/commands/channel/wait.js +9 -8
- package/dist/commands/channel/wait.js.map +1 -1
- package/dist/migrations/manifests/0.6.0-beta.12.json +9 -0
- package/dist/templates/markdown/spec/guides/code-reuse-thinking-guide.md.txt +128 -9
- package/dist/templates/markdown/spec/guides/cross-layer-thinking-guide.md.txt +62 -0
- package/dist/templates/markdown/spec/guides/index.md.txt +18 -0
- package/package.json +1 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
export const GLOBAL_PROJECT_KEY = "_global";
|
|
3
|
+
export const CHANNEL_TYPES = new Set([
|
|
4
|
+
"chat",
|
|
5
|
+
"thread",
|
|
6
|
+
]);
|
|
7
|
+
export const THREAD_ACTIONS = new Set([
|
|
8
|
+
"opened",
|
|
9
|
+
"comment",
|
|
10
|
+
"status",
|
|
11
|
+
"labels",
|
|
12
|
+
"assignees",
|
|
13
|
+
"summary",
|
|
14
|
+
"processed",
|
|
15
|
+
]);
|
|
16
|
+
export function parseChannelScope(v) {
|
|
17
|
+
if (v === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (v !== "project" && v !== "global") {
|
|
20
|
+
throw new Error("Invalid --scope. Must be one of: project, global");
|
|
21
|
+
}
|
|
22
|
+
return v;
|
|
23
|
+
}
|
|
24
|
+
export function parseChannelType(v) {
|
|
25
|
+
if (v === undefined)
|
|
26
|
+
return "chat";
|
|
27
|
+
if (!CHANNEL_TYPES.has(v)) {
|
|
28
|
+
throw new Error("Invalid --type. Must be one of: chat, thread");
|
|
29
|
+
}
|
|
30
|
+
return v;
|
|
31
|
+
}
|
|
32
|
+
export function parseThreadAction(v) {
|
|
33
|
+
if (!THREAD_ACTIONS.has(v)) {
|
|
34
|
+
throw new Error(`Invalid thread action '${v}'. Must be one of: ${[...THREAD_ACTIONS].join(", ")}`);
|
|
35
|
+
}
|
|
36
|
+
return v;
|
|
37
|
+
}
|
|
38
|
+
export function normalizeThreadKey(v) {
|
|
39
|
+
const trimmed = v.trim();
|
|
40
|
+
if (!trimmed)
|
|
41
|
+
throw new Error("Thread key must not be empty");
|
|
42
|
+
if (!/^[A-Za-z0-9._-]+$/.test(trimmed)) {
|
|
43
|
+
throw new Error("Thread key may only contain letters, numbers, '.', '_' and '-'");
|
|
44
|
+
}
|
|
45
|
+
return trimmed;
|
|
46
|
+
}
|
|
47
|
+
export function parseLinkedContext(files, raw) {
|
|
48
|
+
const entries = [];
|
|
49
|
+
for (const file of files ?? []) {
|
|
50
|
+
const value = file.trim();
|
|
51
|
+
if (!path.isAbsolute(value)) {
|
|
52
|
+
throw new Error(`--linked-context-file must be absolute: ${file}`);
|
|
53
|
+
}
|
|
54
|
+
entries.push({ type: "file", path: value });
|
|
55
|
+
}
|
|
56
|
+
for (const text of raw ?? []) {
|
|
57
|
+
if (!text.trim()) {
|
|
58
|
+
throw new Error("--linked-context-raw must not be empty");
|
|
59
|
+
}
|
|
60
|
+
entries.push({ type: "raw", text });
|
|
61
|
+
}
|
|
62
|
+
return entries.length > 0 ? entries : undefined;
|
|
63
|
+
}
|
|
64
|
+
export function parseCsv(value) {
|
|
65
|
+
const out = value
|
|
66
|
+
?.split(",")
|
|
67
|
+
.map((s) => s.trim())
|
|
68
|
+
.filter(Boolean);
|
|
69
|
+
return out && out.length > 0 ? out : undefined;
|
|
70
|
+
}
|
|
71
|
+
export function asStringArray(value) {
|
|
72
|
+
if (!Array.isArray(value))
|
|
73
|
+
return undefined;
|
|
74
|
+
return value.filter((item) => typeof item === "string");
|
|
75
|
+
}
|
|
76
|
+
export function asLinkedContextEntries(value) {
|
|
77
|
+
if (!Array.isArray(value))
|
|
78
|
+
return undefined;
|
|
79
|
+
const entries = value.filter((entry) => {
|
|
80
|
+
if (!entry || typeof entry !== "object")
|
|
81
|
+
return false;
|
|
82
|
+
const candidate = entry;
|
|
83
|
+
if (candidate.type === "file")
|
|
84
|
+
return typeof candidate.path === "string";
|
|
85
|
+
if (candidate.type === "raw")
|
|
86
|
+
return typeof candidate.text === "string";
|
|
87
|
+
return false;
|
|
88
|
+
});
|
|
89
|
+
return entries.length > 0 ? entries : undefined;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ChannelEvent } from "./events.js";
|
|
2
|
+
import { type LinkedContextEntry } from "./schema.js";
|
|
3
|
+
export interface ThreadState {
|
|
4
|
+
thread: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
status: string;
|
|
7
|
+
labels: string[];
|
|
8
|
+
assignees: string[];
|
|
9
|
+
description?: string;
|
|
10
|
+
linkedContext?: LinkedContextEntry[];
|
|
11
|
+
summary?: string;
|
|
12
|
+
openedAt?: string;
|
|
13
|
+
updatedAt?: string;
|
|
14
|
+
lastSeq: number;
|
|
15
|
+
comments: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function reduceThreads(events: ChannelEvent[]): ThreadState[];
|
|
18
|
+
export declare function formatThreadBoard(states: ThreadState[]): string[];
|
|
19
|
+
//# sourceMappingURL=thread-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-state.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/thread-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,aAAa,CAAC;AACrB,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CA4BnE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAcjE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { isThreadEvent, } from "./events.js";
|
|
2
|
+
import { asLinkedContextEntries, asStringArray, } from "./schema.js";
|
|
3
|
+
export function reduceThreads(events) {
|
|
4
|
+
const states = new Map();
|
|
5
|
+
for (const ev of events) {
|
|
6
|
+
if (!isThreadEvent(ev))
|
|
7
|
+
continue;
|
|
8
|
+
const key = ev.thread;
|
|
9
|
+
const current = states.get(key) ??
|
|
10
|
+
{
|
|
11
|
+
thread: key,
|
|
12
|
+
status: "open",
|
|
13
|
+
labels: [],
|
|
14
|
+
assignees: [],
|
|
15
|
+
lastSeq: ev.seq,
|
|
16
|
+
comments: 0,
|
|
17
|
+
};
|
|
18
|
+
if (typeof ev.ts === "string")
|
|
19
|
+
current.updatedAt = ev.ts;
|
|
20
|
+
if (!current.openedAt && typeof ev.ts === "string") {
|
|
21
|
+
current.openedAt = ev.ts;
|
|
22
|
+
}
|
|
23
|
+
current.lastSeq = ev.seq;
|
|
24
|
+
applyThreadAction(current, ev);
|
|
25
|
+
states.set(key, current);
|
|
26
|
+
}
|
|
27
|
+
return [...states.values()].sort((a, b) => (b.updatedAt ?? "").localeCompare(a.updatedAt ?? ""));
|
|
28
|
+
}
|
|
29
|
+
export function formatThreadBoard(states) {
|
|
30
|
+
if (states.length === 0)
|
|
31
|
+
return ["(no threads)"];
|
|
32
|
+
return [
|
|
33
|
+
"THREAD STATUS TITLE",
|
|
34
|
+
...states.map((state) => {
|
|
35
|
+
const labels = state.labels.length > 0 ? ` labels=${state.labels.join(",")}` : "";
|
|
36
|
+
const assignees = state.assignees.length > 0
|
|
37
|
+
? ` assignees=${state.assignees.join(",")}`
|
|
38
|
+
: "";
|
|
39
|
+
return `${state.thread} [${state.status}] ${state.title ?? ""}${labels}${assignees}`;
|
|
40
|
+
}),
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
function applyThreadAction(current, ev) {
|
|
44
|
+
switch (ev.action) {
|
|
45
|
+
case "opened":
|
|
46
|
+
current.status = typeof ev.status === "string" ? ev.status : "open";
|
|
47
|
+
if (typeof ev.title === "string")
|
|
48
|
+
current.title = ev.title;
|
|
49
|
+
if (typeof ev.description === "string") {
|
|
50
|
+
current.description = ev.description;
|
|
51
|
+
}
|
|
52
|
+
current.linkedContext =
|
|
53
|
+
asLinkedContextEntries(ev.linkedContext) ?? current.linkedContext;
|
|
54
|
+
current.labels = asStringArray(ev.labels) ?? current.labels;
|
|
55
|
+
current.assignees = asStringArray(ev.assignees) ?? current.assignees;
|
|
56
|
+
return;
|
|
57
|
+
case "comment":
|
|
58
|
+
current.comments += 1;
|
|
59
|
+
return;
|
|
60
|
+
case "status":
|
|
61
|
+
if (typeof ev.status === "string")
|
|
62
|
+
current.status = ev.status;
|
|
63
|
+
return;
|
|
64
|
+
case "labels":
|
|
65
|
+
current.labels = asStringArray(ev.labels) ?? current.labels;
|
|
66
|
+
return;
|
|
67
|
+
case "assignees":
|
|
68
|
+
current.assignees = asStringArray(ev.assignees) ?? current.assignees;
|
|
69
|
+
return;
|
|
70
|
+
case "summary":
|
|
71
|
+
if (typeof ev.summary === "string")
|
|
72
|
+
current.summary = ev.summary;
|
|
73
|
+
return;
|
|
74
|
+
case "processed":
|
|
75
|
+
current.status = typeof ev.status === "string" ? ev.status : "processed";
|
|
76
|
+
return;
|
|
77
|
+
default:
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=thread-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-state.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/thread-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,6 @@
|
|
|
1
|
-
import type { ChannelEvent
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
from?: string[];
|
|
5
|
-
/** Only events with this kind wake us. */
|
|
6
|
-
kind?: ChannelEventKind;
|
|
7
|
-
/** Only events with this tag wake us (most useful with kind=say). */
|
|
8
|
-
tag?: string;
|
|
9
|
-
/**
|
|
10
|
-
* `to` filter:
|
|
11
|
-
* - "any" — events with no `to` (broadcast) OR explicitly to us; default
|
|
12
|
-
* - "<agent>" — explicitly targeted at <agent>; broadcasts also pass
|
|
13
|
-
* - "exclusive" — only events explicitly targeted (no broadcasts)
|
|
14
|
-
*/
|
|
15
|
-
to?: string;
|
|
16
|
-
/** The agent name watching; used to filter out events the agent itself produced. */
|
|
17
|
-
self?: string;
|
|
18
|
-
/** Include progress events too (defaults to false). */
|
|
19
|
-
includeProgress?: boolean;
|
|
20
|
-
}
|
|
21
|
-
export declare function matchesFilter(ev: ChannelEvent, filter: WatchFilter): boolean;
|
|
1
|
+
import type { ChannelEvent } from "./events.js";
|
|
2
|
+
import { type ChannelEventFilter } from "./filter.js";
|
|
3
|
+
export type WatchFilter = ChannelEventFilter;
|
|
22
4
|
/**
|
|
23
5
|
* Watch the channel events.jsonl for events matching the filter.
|
|
24
6
|
*
|
|
@@ -32,5 +14,6 @@ export declare function watchEvents(channelName: string, filter: WatchFilter, op
|
|
|
32
14
|
signal?: AbortSignal;
|
|
33
15
|
fromStart?: boolean;
|
|
34
16
|
sinceSeq?: number;
|
|
17
|
+
project?: string;
|
|
35
18
|
}): AsyncGenerator<ChannelEvent, void, unknown>;
|
|
36
19
|
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/watch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../../src/commands/channel/store/watch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAsB,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAqD7C;;;;;;;;GAQG;AACH,wBAAuB,WAAW,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE;IACJ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAyE7C"}
|
|
@@ -1,54 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import { eventsPath, channelDir } from "./paths.js";
|
|
3
|
-
|
|
4
|
-
* meaningful kinds — these wake a wait() call.
|
|
5
|
-
* progress / waiting / awake are status pings and never wake.
|
|
6
|
-
*/
|
|
7
|
-
const MEANINGFUL_KINDS = new Set([
|
|
8
|
-
"create",
|
|
9
|
-
"join",
|
|
10
|
-
"leave",
|
|
11
|
-
"message",
|
|
12
|
-
"spawned",
|
|
13
|
-
"killed",
|
|
14
|
-
"respawned",
|
|
15
|
-
"done",
|
|
16
|
-
"error",
|
|
17
|
-
]);
|
|
18
|
-
export function matchesFilter(ev, filter) {
|
|
19
|
-
// Don't wake on our own events (avoid self-loop)
|
|
20
|
-
if (filter.self && ev.by === filter.self)
|
|
21
|
-
return false;
|
|
22
|
-
if (!filter.includeProgress && !MEANINGFUL_KINDS.has(ev.kind))
|
|
23
|
-
return false;
|
|
24
|
-
if (filter.kind && ev.kind !== filter.kind)
|
|
25
|
-
return false;
|
|
26
|
-
if (filter.from && filter.from.length > 0) {
|
|
27
|
-
if (!filter.from.includes(ev.by))
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
if (filter.tag !== undefined && ev.tag !== filter.tag) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
// `to` routing: events with `to` set are targeted; broadcasts (no `to`)
|
|
34
|
-
// generally pass through.
|
|
35
|
-
if (filter.to) {
|
|
36
|
-
const evTo = ev.to;
|
|
37
|
-
if (filter.to === "exclusive") {
|
|
38
|
-
if (!evTo)
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
if (!evTo)
|
|
43
|
-
return true; // broadcast — pass
|
|
44
|
-
if (Array.isArray(evTo)) {
|
|
45
|
-
return evTo.includes(filter.to);
|
|
46
|
-
}
|
|
47
|
-
return evTo === filter.to;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
3
|
+
import { matchesEventFilter } from "./filter.js";
|
|
52
4
|
async function readNewEvents(filePath, state) {
|
|
53
5
|
if (!fs.existsSync(filePath)) {
|
|
54
6
|
// File was deleted (e.g. `--force` recreate) — reset offset so when
|
|
@@ -104,10 +56,12 @@ async function readNewEvents(filePath, state) {
|
|
|
104
56
|
* fs.watch is lossy (Windows, NFS, etc.).
|
|
105
57
|
*/
|
|
106
58
|
export async function* watchEvents(channelName, filter, opts = {}) {
|
|
107
|
-
const file = eventsPath(channelName);
|
|
59
|
+
const file = eventsPath(channelName, opts.project);
|
|
108
60
|
// Ensure channel dir exists so fs.watch on its parent works
|
|
109
|
-
if (!fs.existsSync(channelDir(channelName))) {
|
|
110
|
-
await fs.promises.mkdir(channelDir(channelName), {
|
|
61
|
+
if (!fs.existsSync(channelDir(channelName, opts.project))) {
|
|
62
|
+
await fs.promises.mkdir(channelDir(channelName, opts.project), {
|
|
63
|
+
recursive: true,
|
|
64
|
+
});
|
|
111
65
|
}
|
|
112
66
|
// Three modes:
|
|
113
67
|
// default (from-now): start at EOF. Used by `wait` so a previous
|
|
@@ -140,7 +94,7 @@ export async function* watchEvents(channelName, filter, opts = {}) {
|
|
|
140
94
|
};
|
|
141
95
|
let watcher = null;
|
|
142
96
|
try {
|
|
143
|
-
watcher = fs.watch(channelDir(channelName), () => wake());
|
|
97
|
+
watcher = fs.watch(channelDir(channelName, opts.project), () => wake());
|
|
144
98
|
}
|
|
145
99
|
catch {
|
|
146
100
|
// ignore — fall back to polling
|
|
@@ -157,7 +111,7 @@ export async function* watchEvents(channelName, filter, opts = {}) {
|
|
|
157
111
|
for (const ev of fresh) {
|
|
158
112
|
if (sinceSeq !== undefined && ev.seq <= sinceSeq)
|
|
159
113
|
continue;
|
|
160
|
-
if (
|
|
114
|
+
if (matchesEventFilter(ev, filter))
|
|
161
115
|
yield ev;
|
|
162
116
|
if (opts.signal?.aborted)
|
|
163
117
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../../src/commands/channel/store/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,5 +43,5 @@ export interface SupervisorConfig {
|
|
|
43
43
|
* Entry point invoked by `trellis channel __supervisor <channel> <worker> <config>`.
|
|
44
44
|
*/
|
|
45
45
|
export declare function runSupervisor(channelName: string, workerName: string, configPath: string): Promise<void>;
|
|
46
|
-
export declare function writeSupervisorConfig(channelName: string, workerName: string, config: SupervisorConfig): string;
|
|
46
|
+
export declare function writeSupervisorConfig(channelName: string, workerName: string, config: SupervisorConfig, project?: string): string;
|
|
47
47
|
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAOhE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ;;;8CAG0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;yCAEqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAOhE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ;;;8CAG0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;yCAEqC;IACrC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAyQf;AA+BD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAKR"}
|
|
@@ -27,7 +27,8 @@ const SHUTDOWN_GRACE_MS = 3000;
|
|
|
27
27
|
export async function runSupervisor(channelName, workerName, configPath) {
|
|
28
28
|
const config = readConfig(configPath);
|
|
29
29
|
// Self-pid file lets `trellis channel kill` find us.
|
|
30
|
-
|
|
30
|
+
const project = process.env.TRELLIS_CHANNEL_PROJECT;
|
|
31
|
+
fs.writeFileSync(workerFile(channelName, workerName, "pid", project), String(process.pid));
|
|
31
32
|
// ── adapter selection ──
|
|
32
33
|
const adapter = getAdapter(config.provider);
|
|
33
34
|
const adapterCtx = adapter.createCtx();
|
|
@@ -45,7 +46,7 @@ export async function runSupervisor(channelName, workerName, configPath) {
|
|
|
45
46
|
TRELLIS_CHANNEL: channelName,
|
|
46
47
|
TRELLIS_CHANNEL_AS: workerName,
|
|
47
48
|
};
|
|
48
|
-
const logPath = workerFile(channelName, workerName, "log");
|
|
49
|
+
const logPath = workerFile(channelName, workerName, "log", project);
|
|
49
50
|
const log = fs.createWriteStream(logPath);
|
|
50
51
|
log.write(`[supervisor] starting ${adapter.provider} ${args.join(" ")}\n`);
|
|
51
52
|
const child = spawn(adapter.provider, args, {
|
|
@@ -106,7 +107,7 @@ export async function runSupervisor(channelName, workerName, configPath) {
|
|
|
106
107
|
by: `supervisor:${workerName}`,
|
|
107
108
|
message: `worker spawn failed: ${err.message}`,
|
|
108
109
|
provider: config.provider,
|
|
109
|
-
});
|
|
110
|
+
}, project);
|
|
110
111
|
}
|
|
111
112
|
catch {
|
|
112
113
|
// ignore — we're exiting anyway
|
|
@@ -132,7 +133,7 @@ export async function runSupervisor(channelName, workerName, configPath) {
|
|
|
132
133
|
by: `supervisor:${workerName}`,
|
|
133
134
|
message: `worker process error: ${err.message}`,
|
|
134
135
|
provider: config.provider,
|
|
135
|
-
});
|
|
136
|
+
}, project);
|
|
136
137
|
}
|
|
137
138
|
catch {
|
|
138
139
|
// ignore
|
|
@@ -175,7 +176,7 @@ export async function runSupervisor(channelName, workerName, configPath) {
|
|
|
175
176
|
await shutdown.awaitFinalize();
|
|
176
177
|
return;
|
|
177
178
|
}
|
|
178
|
-
fs.writeFileSync(workerFile(channelName, workerName, "worker-pid"), String(child.pid));
|
|
179
|
+
fs.writeFileSync(workerFile(channelName, workerName, "worker-pid", project), String(child.pid));
|
|
179
180
|
await appendEvent(channelName, {
|
|
180
181
|
kind: "spawned",
|
|
181
182
|
by: config.spawnedBy ?? "main",
|
|
@@ -189,7 +190,7 @@ export async function runSupervisor(channelName, workerName, configPath) {
|
|
|
189
190
|
...(config.contextManifests && config.contextManifests.length > 0
|
|
190
191
|
? { manifests: config.contextManifests }
|
|
191
192
|
: {}),
|
|
192
|
-
});
|
|
193
|
+
}, project);
|
|
193
194
|
// ── 1. stdout reader ──
|
|
194
195
|
startStdoutPump({
|
|
195
196
|
channelName,
|
|
@@ -242,7 +243,7 @@ export async function runSupervisor(channelName, workerName, configPath) {
|
|
|
242
243
|
message: `handshake failed: ${msg}`,
|
|
243
244
|
provider: config.provider,
|
|
244
245
|
detail: { source: "handshake" },
|
|
245
|
-
});
|
|
246
|
+
}, project);
|
|
246
247
|
}
|
|
247
248
|
catch {
|
|
248
249
|
// ignore
|
|
@@ -262,7 +263,7 @@ async function cleanup(channelName, workerName) {
|
|
|
262
263
|
// killing the channel) doesn't replay messages.
|
|
263
264
|
for (const suffix of ["pid", "worker-pid", "config", "spawnlock"]) {
|
|
264
265
|
try {
|
|
265
|
-
fs.unlinkSync(workerFile(channelName, workerName, suffix));
|
|
266
|
+
fs.unlinkSync(workerFile(channelName, workerName, suffix, process.env.TRELLIS_CHANNEL_PROJECT));
|
|
266
267
|
}
|
|
267
268
|
catch {
|
|
268
269
|
// already gone
|
|
@@ -273,8 +274,8 @@ function readConfig(p) {
|
|
|
273
274
|
return JSON.parse(fs.readFileSync(p, "utf-8"));
|
|
274
275
|
}
|
|
275
276
|
// Helper to write a fresh config file before forking the supervisor.
|
|
276
|
-
export function writeSupervisorConfig(channelName, workerName, config) {
|
|
277
|
-
const p = workerFile(channelName, workerName, "config");
|
|
277
|
+
export function writeSupervisorConfig(channelName, workerName, config, project) {
|
|
278
|
+
const p = workerFile(channelName, workerName, "config", project);
|
|
278
279
|
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
279
280
|
fs.writeFileSync(p, JSON.stringify(config, null, 2), "utf-8");
|
|
280
281
|
return p;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/commands/channel/supervisor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAA4B,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,UAAU,EAAiB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgCzD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,UAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAEtC,qDAAqD;IACrD,EAAE,CAAC,aAAa,CACd,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/commands/channel/supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface ThreadPostOptions {
|
|
2
|
+
as: string;
|
|
3
|
+
action: string;
|
|
4
|
+
thread?: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
text?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
status?: string;
|
|
9
|
+
labels?: string;
|
|
10
|
+
assignees?: string;
|
|
11
|
+
summary?: string;
|
|
12
|
+
scope?: string;
|
|
13
|
+
linkedContextFile?: string[];
|
|
14
|
+
linkedContextRaw?: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ThreadsOptions {
|
|
17
|
+
scope?: string;
|
|
18
|
+
status?: string;
|
|
19
|
+
raw?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface ThreadShowOptions {
|
|
22
|
+
scope?: string;
|
|
23
|
+
raw?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function channelThreadPost(channelName: string, opts: ThreadPostOptions): Promise<void>;
|
|
26
|
+
export declare function channelThreadsList(channelName: string, opts: ThreadsOptions): Promise<void>;
|
|
27
|
+
export declare function channelThreadShow(channelName: string, threadKey: string, opts: ThreadShowOptions): Promise<void>;
|
|
28
|
+
//# sourceMappingURL=threads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/commands/channel/threads.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAuCf;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { appendEvent, isThreadEvent, readChannelEvents, readChannelMetadata, } from "./store/events.js";
|
|
2
|
+
import { resolveExistingChannelRef } from "./store/paths.js";
|
|
3
|
+
import { normalizeThreadKey, parseCsv, parseChannelScope, parseLinkedContext, parseThreadAction, } from "./store/schema.js";
|
|
4
|
+
import { formatThreadBoard, reduceThreads } from "./store/thread-state.js";
|
|
5
|
+
export async function channelThreadPost(channelName, opts) {
|
|
6
|
+
const ref = resolveExistingChannelRef(channelName, {
|
|
7
|
+
scope: parseChannelScope(opts.scope),
|
|
8
|
+
});
|
|
9
|
+
const metadata = await readChannelMetadata(channelName, ref.project);
|
|
10
|
+
if (metadata.type !== "thread") {
|
|
11
|
+
throw new Error(`Channel '${channelName}' is type '${metadata.type}'. 'post' requires a thread channel.`);
|
|
12
|
+
}
|
|
13
|
+
const action = parseThreadAction(opts.action);
|
|
14
|
+
const thread = resolveThreadKey(action, opts.thread);
|
|
15
|
+
const linkedContext = parseLinkedContext(opts.linkedContextFile, opts.linkedContextRaw);
|
|
16
|
+
const labels = parseCsv(opts.labels);
|
|
17
|
+
const assignees = parseCsv(opts.assignees);
|
|
18
|
+
const event = await appendEvent(channelName, {
|
|
19
|
+
kind: "thread",
|
|
20
|
+
by: opts.as,
|
|
21
|
+
action,
|
|
22
|
+
thread,
|
|
23
|
+
...(opts.title ? { title: opts.title } : {}),
|
|
24
|
+
...(opts.text ? { text: opts.text } : {}),
|
|
25
|
+
...(opts.description ? { description: opts.description } : {}),
|
|
26
|
+
...(opts.status ? { status: opts.status } : {}),
|
|
27
|
+
...(labels ? { labels } : {}),
|
|
28
|
+
...(assignees ? { assignees } : {}),
|
|
29
|
+
...(opts.summary ? { summary: opts.summary } : {}),
|
|
30
|
+
...(linkedContext ? { linkedContext } : {}),
|
|
31
|
+
}, ref.project);
|
|
32
|
+
console.log(JSON.stringify(event));
|
|
33
|
+
}
|
|
34
|
+
export async function channelThreadsList(channelName, opts) {
|
|
35
|
+
const ref = resolveExistingChannelRef(channelName, {
|
|
36
|
+
scope: parseChannelScope(opts.scope),
|
|
37
|
+
});
|
|
38
|
+
const metadata = await readChannelMetadata(channelName, ref.project);
|
|
39
|
+
if (metadata.type !== "thread") {
|
|
40
|
+
throw new Error(`Channel '${channelName}' is type '${metadata.type}'. 'threads' requires a thread channel.`);
|
|
41
|
+
}
|
|
42
|
+
const states = reduceThreads(await readChannelEvents(channelName, ref.project)).filter((state) => (opts.status ? state.status === opts.status : true));
|
|
43
|
+
if (opts.raw) {
|
|
44
|
+
for (const state of states)
|
|
45
|
+
console.log(JSON.stringify(state));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
for (const line of formatThreadBoard(states))
|
|
49
|
+
console.log(line);
|
|
50
|
+
}
|
|
51
|
+
export async function channelThreadShow(channelName, threadKey, opts) {
|
|
52
|
+
const ref = resolveExistingChannelRef(channelName, {
|
|
53
|
+
scope: parseChannelScope(opts.scope),
|
|
54
|
+
});
|
|
55
|
+
const metadata = await readChannelMetadata(channelName, ref.project);
|
|
56
|
+
if (metadata.type !== "thread") {
|
|
57
|
+
throw new Error(`Channel '${channelName}' is type '${metadata.type}'. 'thread' requires a thread channel.`);
|
|
58
|
+
}
|
|
59
|
+
const thread = normalizeThreadKey(threadKey);
|
|
60
|
+
const events = (await readChannelEvents(channelName, ref.project)).filter((ev) => isThreadEvent(ev) && ev.thread === thread);
|
|
61
|
+
if (opts.raw) {
|
|
62
|
+
for (const ev of events)
|
|
63
|
+
console.log(JSON.stringify(ev));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (events.length === 0) {
|
|
67
|
+
throw new Error(`Thread '${thread}' not found in channel '${channelName}'`);
|
|
68
|
+
}
|
|
69
|
+
const state = reduceThreads(events)[0];
|
|
70
|
+
console.log(`${state.thread} [${state.status}] ${state.title ?? ""}`.trimEnd());
|
|
71
|
+
if (state.description)
|
|
72
|
+
console.log(`description: ${state.description}`);
|
|
73
|
+
if (state.labels.length > 0)
|
|
74
|
+
console.log(`labels: ${state.labels.join(",")}`);
|
|
75
|
+
if (state.assignees.length > 0) {
|
|
76
|
+
console.log(`assignees: ${state.assignees.join(",")}`);
|
|
77
|
+
}
|
|
78
|
+
if (state.summary)
|
|
79
|
+
console.log(`summary: ${state.summary}`);
|
|
80
|
+
for (const ev of events)
|
|
81
|
+
printThreadEvent(ev);
|
|
82
|
+
}
|
|
83
|
+
function resolveThreadKey(action, value) {
|
|
84
|
+
if (value)
|
|
85
|
+
return normalizeThreadKey(value);
|
|
86
|
+
if (action === "opened")
|
|
87
|
+
return `thread-${Date.now().toString(36)}`;
|
|
88
|
+
throw new Error("--thread is required unless action is 'opened'");
|
|
89
|
+
}
|
|
90
|
+
function printThreadEvent(ev) {
|
|
91
|
+
const ts = ev.ts.slice(0, 19).replace("T", " ");
|
|
92
|
+
const action = ev.action ?? "?";
|
|
93
|
+
const text = ev.text ? ` ${ev.text}` : "";
|
|
94
|
+
console.log(` ${ts} ${action} by=${ev.by}${text}`);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=threads.js.map
|