@backlogmd/serve 0.2.2 → 0.4.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/app/dist/index.html +40 -20
- package/dist/assignmentQueue.d.ts +22 -0
- package/dist/assignmentQueue.d.ts.map +1 -0
- package/dist/assignmentQueue.js +27 -0
- package/dist/assignmentQueue.js.map +1 -0
- package/dist/chatAgent.d.ts +2 -0
- package/dist/chatAgent.d.ts.map +1 -0
- package/dist/chatAgent.js +89 -0
- package/dist/chatAgent.js.map +1 -0
- package/dist/cli.d.ts +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -11
- package/dist/cli.js.map +1 -1
- package/dist/context.d.ts +45 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/html.d.ts +2 -2
- package/dist/html.d.ts.map +1 -1
- package/dist/html.js +20 -5
- package/dist/html.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/errorOutput.d.ts +7 -0
- package/dist/lib/errorOutput.d.ts.map +1 -0
- package/dist/lib/errorOutput.js +23 -0
- package/dist/lib/errorOutput.js.map +1 -0
- package/dist/lib/validStatuses.d.ts +2 -0
- package/dist/lib/validStatuses.d.ts.map +1 -0
- package/dist/lib/validStatuses.js +7 -0
- package/dist/lib/validStatuses.js.map +1 -0
- package/dist/routes.d.ts +4 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +36 -0
- package/dist/routes.js.map +1 -0
- package/dist/server.d.ts +11 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +123 -156
- package/dist/server.js.map +1 -1
- package/dist/shared/os.d.ts +2 -0
- package/dist/shared/os.d.ts.map +1 -0
- package/dist/shared/os.js +23 -0
- package/dist/shared/os.js.map +1 -0
- package/dist/useCases/deleteItem.d.ts +14 -0
- package/dist/useCases/deleteItem.d.ts.map +1 -0
- package/dist/useCases/deleteItem.js +27 -0
- package/dist/useCases/deleteItem.js.map +1 -0
- package/dist/useCases/deleteTask.d.ts +14 -0
- package/dist/useCases/deleteTask.d.ts.map +1 -0
- package/dist/useCases/deleteTask.js +28 -0
- package/dist/useCases/deleteTask.js.map +1 -0
- package/dist/useCases/getBacklog.d.ts +4 -0
- package/dist/useCases/getBacklog.d.ts.map +1 -0
- package/dist/useCases/getBacklog.js +19 -0
- package/dist/useCases/getBacklog.js.map +1 -0
- package/dist/useCases/getEvents.d.ts +4 -0
- package/dist/useCases/getEvents.d.ts.map +1 -0
- package/dist/useCases/getEvents.js +17 -0
- package/dist/useCases/getEvents.js.map +1 -0
- package/dist/useCases/getIndexPage.d.ts +4 -0
- package/dist/useCases/getIndexPage.d.ts.map +1 -0
- package/dist/useCases/getIndexPage.js +20 -0
- package/dist/useCases/getIndexPage.js.map +1 -0
- package/dist/useCases/getItemContent.d.ts +14 -0
- package/dist/useCases/getItemContent.d.ts.map +1 -0
- package/dist/useCases/getItemContent.js +26 -0
- package/dist/useCases/getItemContent.js.map +1 -0
- package/dist/useCases/getTaskContent.d.ts +13 -0
- package/dist/useCases/getTaskContent.d.ts.map +1 -0
- package/dist/useCases/getTaskContent.js +28 -0
- package/dist/useCases/getTaskContent.js.map +1 -0
- package/dist/useCases/getWork.d.ts +10 -0
- package/dist/useCases/getWork.d.ts.map +1 -0
- package/dist/useCases/getWork.js +6 -0
- package/dist/useCases/getWork.js.map +1 -0
- package/dist/useCases/getWorkerAssignments.d.ts +17 -0
- package/dist/useCases/getWorkerAssignments.d.ts.map +1 -0
- package/dist/useCases/getWorkerAssignments.js +92 -0
- package/dist/useCases/getWorkerAssignments.js.map +1 -0
- package/dist/useCases/getWorkers.d.ts +4 -0
- package/dist/useCases/getWorkers.d.ts.map +1 -0
- package/dist/useCases/getWorkers.js +5 -0
- package/dist/useCases/getWorkers.js.map +1 -0
- package/dist/useCases/patchTaskStatus.d.ts +14 -0
- package/dist/useCases/patchTaskStatus.d.ts.map +1 -0
- package/dist/useCases/patchTaskStatus.js +34 -0
- package/dist/useCases/patchTaskStatus.js.map +1 -0
- package/dist/useCases/postAssignWork.d.ts +11 -0
- package/dist/useCases/postAssignWork.d.ts.map +1 -0
- package/dist/useCases/postAssignWork.js +48 -0
- package/dist/useCases/postAssignWork.js.map +1 -0
- package/dist/useCases/postChat.d.ts +13 -0
- package/dist/useCases/postChat.d.ts.map +1 -0
- package/dist/useCases/postChat.js +44 -0
- package/dist/useCases/postChat.js.map +1 -0
- package/dist/useCases/postWorkerReport.d.ts +6 -0
- package/dist/useCases/postWorkerReport.d.ts.map +1 -0
- package/dist/useCases/postWorkerReport.js +71 -0
- package/dist/useCases/postWorkerReport.js.map +1 -0
- package/dist/useCases/putItemContent.d.ts +18 -0
- package/dist/useCases/putItemContent.d.ts.map +1 -0
- package/dist/useCases/putItemContent.js +30 -0
- package/dist/useCases/putItemContent.js.map +1 -0
- package/dist/useCases/putTaskContent.d.ts +17 -0
- package/dist/useCases/putTaskContent.d.ts.map +1 -0
- package/dist/useCases/putTaskContent.js +31 -0
- package/dist/useCases/putTaskContent.js.map +1 -0
- package/dist/watcher.d.ts +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +1 -1
- package/dist/watcher.js.map +1 -1
- package/dist/workerRegistry.d.ts +35 -0
- package/dist/workerRegistry.d.ts.map +1 -0
- package/dist/workerRegistry.js +53 -0
- package/dist/workerRegistry.js.map +1 -0
- package/package.json +31 -13
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory queue of work assignments for workers.
|
|
3
|
+
* POST /api/workers/assign enqueues; GET /api/workers/assignments returns the list for a worker.
|
|
4
|
+
*/
|
|
5
|
+
export interface AssignmentMessage {
|
|
6
|
+
workerId: string;
|
|
7
|
+
taskId?: string;
|
|
8
|
+
itemId?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class AssignmentQueue {
|
|
11
|
+
private queue;
|
|
12
|
+
enqueue(msg: AssignmentMessage): void;
|
|
13
|
+
/**
|
|
14
|
+
* Remove and return the first assignment for the given worker, or null.
|
|
15
|
+
*/
|
|
16
|
+
dequeueForWorker(workerId: string): AssignmentMessage | null;
|
|
17
|
+
/**
|
|
18
|
+
* Return all assignments for the given worker without removing them.
|
|
19
|
+
*/
|
|
20
|
+
listForWorker(workerId: string): AssignmentMessage[];
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=assignmentQueue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assignmentQueue.d.ts","sourceRoot":"","sources":["../src/assignmentQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA2B;IAExC,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI;IAIrC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAO5D;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE;CAGrD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory queue of work assignments for workers.
|
|
3
|
+
* POST /api/workers/assign enqueues; GET /api/workers/assignments returns the list for a worker.
|
|
4
|
+
*/
|
|
5
|
+
export class AssignmentQueue {
|
|
6
|
+
queue = [];
|
|
7
|
+
enqueue(msg) {
|
|
8
|
+
this.queue.push(msg);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Remove and return the first assignment for the given worker, or null.
|
|
12
|
+
*/
|
|
13
|
+
dequeueForWorker(workerId) {
|
|
14
|
+
const idx = this.queue.findIndex((m) => m.workerId === workerId);
|
|
15
|
+
if (idx === -1)
|
|
16
|
+
return null;
|
|
17
|
+
const [msg] = this.queue.splice(idx, 1);
|
|
18
|
+
return msg;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Return all assignments for the given worker without removing them.
|
|
22
|
+
*/
|
|
23
|
+
listForWorker(workerId) {
|
|
24
|
+
return this.queue.filter((m) => m.workerId === workerId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=assignmentQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assignmentQueue.js","sourceRoot":"","sources":["../src/assignmentQueue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,OAAO,eAAe;IAClB,KAAK,GAAwB,EAAE,CAAC;IAExC,OAAO,CAAC,GAAsB;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAgB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACjE,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatAgent.d.ts","sourceRoot":"","sources":["../src/chatAgent.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// import { buildBacklogOutput } from "@backlogmd/parser";
|
|
2
|
+
// //import { createChatAgent } from "@backlogmd/autopilot";
|
|
3
|
+
// import { BacklogCore } from "@backlogmd/core";
|
|
4
|
+
// import { DynamicTool } from "@langchain/core/tools";
|
|
5
|
+
// import { ChatOpenAI } from "@langchain/openai";
|
|
6
|
+
// import type { AgentExecutor } from "@langchain/classic/agents";
|
|
7
|
+
// import type { WorkerState } from "./workerRegistry.js";
|
|
8
|
+
export {};
|
|
9
|
+
// export interface CreateChatAgentForServerOptions {
|
|
10
|
+
// onBacklogChange?: () => void;
|
|
11
|
+
// /** Workers that have reported to the server (in-memory list). Used for list_workers tool. */
|
|
12
|
+
// getWorkerStates?: () => WorkerState[];
|
|
13
|
+
// }
|
|
14
|
+
// export async function createChatAgentForServer(
|
|
15
|
+
// backlogDir: string,
|
|
16
|
+
// options: CreateChatAgentForServerOptions = {},
|
|
17
|
+
// ): Promise<AgentExecutor | null> {
|
|
18
|
+
// const { onBacklogChange, getWorkerStates } = options;
|
|
19
|
+
// if (!process.env.OPENAI_API_KEY) {
|
|
20
|
+
// return null;
|
|
21
|
+
// }
|
|
22
|
+
// const getBacklog = new DynamicTool({
|
|
23
|
+
// name: "get_backlog",
|
|
24
|
+
// description:
|
|
25
|
+
// "Get the current backlog (work items and tasks). Use this to answer questions about what is on the backlog.",
|
|
26
|
+
// func: async () => {
|
|
27
|
+
// const output = buildBacklogOutput(backlogDir);
|
|
28
|
+
// return JSON.stringify(
|
|
29
|
+
// {
|
|
30
|
+
// entries: output.entries?.length ?? 0,
|
|
31
|
+
// items: output.items?.length ?? 0,
|
|
32
|
+
// tasks: output.tasks?.length ?? 0,
|
|
33
|
+
// validationErrors: output.validation?.errors?.length ?? 0,
|
|
34
|
+
// summary: output.entries?.slice(0, 20) ?? [],
|
|
35
|
+
// },
|
|
36
|
+
// null,
|
|
37
|
+
// 2,
|
|
38
|
+
// );
|
|
39
|
+
// },
|
|
40
|
+
// });
|
|
41
|
+
// const tools: InstanceType<typeof DynamicTool>[] = [getBacklog];
|
|
42
|
+
// if (getWorkerStates) {
|
|
43
|
+
// tools.push(
|
|
44
|
+
// new DynamicTool({
|
|
45
|
+
// name: "list_workers",
|
|
46
|
+
// description:
|
|
47
|
+
// "List workers that have reported to the server (name, role, status). Call this when the user asks for help, who is available, or what workers exist.",
|
|
48
|
+
// func: async () => {
|
|
49
|
+
// const workers = getWorkerStates();
|
|
50
|
+
// if (workers.length === 0) {
|
|
51
|
+
// return "No workers have reported yet. Workers register when they run with --server-url pointing to this server.";
|
|
52
|
+
// }
|
|
53
|
+
// return workers
|
|
54
|
+
// .map(
|
|
55
|
+
// (w) => `${w.name} (${w.role}): ${w.status}${w.taskTitle ? ` — ${w.taskTitle}` : ""}`,
|
|
56
|
+
// )
|
|
57
|
+
// .join("\n");
|
|
58
|
+
// },
|
|
59
|
+
// }),
|
|
60
|
+
// );
|
|
61
|
+
// }
|
|
62
|
+
// let core: Awaited<ReturnType<typeof BacklogCore.load>> | null = null;
|
|
63
|
+
// try {
|
|
64
|
+
// core = await BacklogCore.load({ rootDir: backlogDir });
|
|
65
|
+
// } catch (err) {
|
|
66
|
+
// console.warn(
|
|
67
|
+
// "[backlogmd-serve] Could not load core:",
|
|
68
|
+
// (err as Error).message,
|
|
69
|
+
// "- chat will have no backlog mutation tools.",
|
|
70
|
+
// );
|
|
71
|
+
// }
|
|
72
|
+
// try {
|
|
73
|
+
// const executor = await createChatAgent({
|
|
74
|
+
// llm: new ChatOpenAI({ temperature: 0 }),
|
|
75
|
+
// core: core ?? undefined,
|
|
76
|
+
// tools,
|
|
77
|
+
// onBacklogChange,
|
|
78
|
+
// });
|
|
79
|
+
// console.log("[backlogmd-serve] Chat agent ready.");
|
|
80
|
+
// return executor;
|
|
81
|
+
// } catch (err) {
|
|
82
|
+
// console.error(
|
|
83
|
+
// "[backlogmd-serve] Failed to create chat agent:",
|
|
84
|
+
// (err as Error).message,
|
|
85
|
+
// );
|
|
86
|
+
// return null;
|
|
87
|
+
// }
|
|
88
|
+
//}
|
|
89
|
+
//# sourceMappingURL=chatAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatAgent.js","sourceRoot":"","sources":["../src/chatAgent.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,4DAA4D;AAC5D,iDAAiD;AACjD,uDAAuD;AACvD,kDAAkD;AAClD,kEAAkE;AAClE,0DAA0D;;AAE1D,qDAAqD;AACrD,kCAAkC;AAClC,kGAAkG;AAClG,2CAA2C;AAC3C,IAAI;AAEJ,kDAAkD;AAClD,wBAAwB;AACxB,mDAAmD;AACnD,qCAAqC;AACrC,0DAA0D;AAC1D,uCAAuC;AACvC,mBAAmB;AACnB,MAAM;AAEN,yCAAyC;AACzC,2BAA2B;AAC3B,mBAAmB;AACnB,sHAAsH;AACtH,0BAA0B;AAC1B,uDAAuD;AACvD,+BAA+B;AAC/B,YAAY;AACZ,kDAAkD;AAClD,8CAA8C;AAC9C,8CAA8C;AAC9C,sEAAsE;AACtE,yDAAyD;AACzD,aAAa;AACb,gBAAgB;AAChB,aAAa;AACb,WAAW;AACX,SAAS;AACT,QAAQ;AAER,oEAAoE;AAEpE,2BAA2B;AAC3B,kBAAkB;AAClB,0BAA0B;AAC1B,gCAAgC;AAChC,uBAAuB;AACvB,mKAAmK;AACnK,8BAA8B;AAC9B,+CAA+C;AAC/C,wCAAwC;AACxC,gIAAgI;AAChI,cAAc;AACd,2BAA2B;AAC3B,oBAAoB;AACpB,sGAAsG;AACtG,gBAAgB;AAChB,2BAA2B;AAC3B,aAAa;AACb,YAAY;AACZ,SAAS;AACT,MAAM;AAEN,0EAA0E;AAC1E,UAAU;AACV,8DAA8D;AAC9D,oBAAoB;AACpB,oBAAoB;AACpB,kDAAkD;AAClD,gCAAgC;AAChC,uDAAuD;AACvD,SAAS;AACT,MAAM;AAEN,QAAQ;AACR,6CAA6C;AAC7C,+CAA+C;AAC/C,+BAA+B;AAC/B,aAAa;AACb,uBAAuB;AACvB,QAAQ;AACR,wDAAwD;AACxD,qBAAqB;AACrB,kBAAkB;AAClB,mBAAmB;AACnB,wDAAwD;AACxD,8BAA8B;AAC9B,OAAO;AACP,iBAAiB;AACjB,IAAI;AACJ,GAAG"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import "dotenv/config";
|
|
2
3
|
export interface CliArgs {
|
|
3
|
-
|
|
4
|
+
/** Project root directory (must contain .backlogmd/) */
|
|
5
|
+
rootDir: string;
|
|
4
6
|
port: number;
|
|
5
7
|
host: string;
|
|
6
8
|
help: boolean;
|
|
7
9
|
}
|
|
8
10
|
export declare function parseArgs(argv: string[]): CliArgs;
|
|
9
|
-
export declare function run(argv: string[]): number
|
|
11
|
+
export declare function run(argv: string[]): Promise<number>;
|
|
10
12
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AAWvB,MAAM,WAAW,OAAO;IACpB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;CACjB;AAUD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CA0CjD;AA4BD,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDzD"}
|
package/dist/cli.js
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
2
|
+
import "dotenv/config";
|
|
3
|
+
import path from "path";
|
|
3
4
|
import fs from "node:fs";
|
|
5
|
+
import { fileURLToPath } from "url";
|
|
6
|
+
import { Backlogmd } from "@backlogmd/core";
|
|
4
7
|
import { startServer } from "./index.js";
|
|
8
|
+
import { resolveBacklogRoot } from "./shared/os.js";
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const isMain = process.argv[1] && path.resolve(process.argv[1]) === __filename;
|
|
5
11
|
const USAGE = `Usage: backlogmd-serve [options]
|
|
6
12
|
|
|
7
13
|
Options:
|
|
8
|
-
--dir <path>
|
|
14
|
+
--dir <path> Project root: must contain .backlogmd/ (with work/ inside) or a work/ directory (default: current directory)
|
|
9
15
|
--port <port> Port to listen on (default: 3030)
|
|
10
16
|
--host <host> Host to bind to (default: localhost)
|
|
11
17
|
--help Show this help message`;
|
|
12
18
|
export function parseArgs(argv) {
|
|
13
19
|
const args = {
|
|
14
|
-
|
|
20
|
+
rootDir: process.cwd(),
|
|
15
21
|
port: 3030,
|
|
16
22
|
host: "localhost",
|
|
17
23
|
help: false,
|
|
@@ -22,7 +28,7 @@ export function parseArgs(argv) {
|
|
|
22
28
|
if (i + 1 >= argv.length) {
|
|
23
29
|
throw new Error("--dir requires a path argument");
|
|
24
30
|
}
|
|
25
|
-
args.
|
|
31
|
+
args.rootDir = path.resolve(argv[++i]);
|
|
26
32
|
break;
|
|
27
33
|
case "--port":
|
|
28
34
|
if (i + 1 >= argv.length) {
|
|
@@ -50,7 +56,31 @@ export function parseArgs(argv) {
|
|
|
50
56
|
}
|
|
51
57
|
return args;
|
|
52
58
|
}
|
|
53
|
-
|
|
59
|
+
// const STAFF_ROLE = { id: "executor", name: "Executor" } as const;
|
|
60
|
+
// function startAgentsInProcess(
|
|
61
|
+
// backlogRoot: string,
|
|
62
|
+
// host: string,
|
|
63
|
+
// port: number,
|
|
64
|
+
// ctx: AppContext,
|
|
65
|
+
// ): void {
|
|
66
|
+
// const url = `http://${host}:${port}`;
|
|
67
|
+
// void runWorkerLoop({
|
|
68
|
+
// backlogDir: backlogRoot,
|
|
69
|
+
// serverUrl: url,
|
|
70
|
+
// name: "Planner",
|
|
71
|
+
// role: PLANNER_ROLE,
|
|
72
|
+
// getWorkTrigger: ctx.getWorkTrigger,
|
|
73
|
+
// });
|
|
74
|
+
// void runWorkerLoop({
|
|
75
|
+
// backlogDir: backlogRoot,
|
|
76
|
+
// serverUrl: url,
|
|
77
|
+
// name: "Staff",
|
|
78
|
+
// role: STAFF_ROLE,
|
|
79
|
+
// getWorkTrigger: ctx.getWorkTrigger,
|
|
80
|
+
// });
|
|
81
|
+
// console.error("[serve] Started 2 agents in-process (event-driven, no poll loop)");
|
|
82
|
+
// }
|
|
83
|
+
export async function run(argv) {
|
|
54
84
|
let args;
|
|
55
85
|
try {
|
|
56
86
|
args = parseArgs(argv);
|
|
@@ -64,14 +94,24 @@ export function run(argv) {
|
|
|
64
94
|
console.log(USAGE);
|
|
65
95
|
return 0;
|
|
66
96
|
}
|
|
67
|
-
if (!fs.existsSync(args.
|
|
68
|
-
console.error(`Error:
|
|
97
|
+
if (!fs.existsSync(args.rootDir)) {
|
|
98
|
+
console.error(`Error: project root not found: ${args.rootDir}`);
|
|
99
|
+
return 1;
|
|
100
|
+
}
|
|
101
|
+
const backlogRoot = resolveBacklogRoot(args.rootDir);
|
|
102
|
+
let backlogmd;
|
|
103
|
+
try {
|
|
104
|
+
backlogmd = await Backlogmd.load({ rootDir: backlogRoot });
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
console.error("Failed to load backlog:", err.message);
|
|
69
108
|
return 1;
|
|
70
109
|
}
|
|
71
110
|
const server = startServer({
|
|
72
|
-
dir:
|
|
111
|
+
dir: backlogRoot,
|
|
73
112
|
port: args.port,
|
|
74
113
|
host: args.host,
|
|
114
|
+
backlogmd,
|
|
75
115
|
});
|
|
76
116
|
const url = `http://${args.host}:${args.port}`;
|
|
77
117
|
console.error(`BacklogMD board running at ${url}`);
|
|
@@ -85,8 +125,10 @@ export function run(argv) {
|
|
|
85
125
|
process.on("SIGTERM", handleShutdown);
|
|
86
126
|
return 0;
|
|
87
127
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
128
|
+
if (isMain) {
|
|
129
|
+
run(process.argv.slice(2)).then((exitCode) => {
|
|
130
|
+
if (exitCode !== 0)
|
|
131
|
+
process.exit(exitCode);
|
|
132
|
+
});
|
|
91
133
|
}
|
|
92
134
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ServerResponse } from "node:http";
|
|
2
|
+
import type { Backlogmd } from "@backlogmd/core";
|
|
3
|
+
export type { WorkerReportBody, WorkerState } from "./workerRegistry.js";
|
|
4
|
+
import type { WorkerReportBody, WorkerState } from "./workerRegistry.js";
|
|
5
|
+
import type { AssignmentMessage } from "./assignmentQueue.js";
|
|
6
|
+
export type ChatAgent = {
|
|
7
|
+
invoke: (args: {
|
|
8
|
+
input: string;
|
|
9
|
+
}) => Promise<{
|
|
10
|
+
output: unknown;
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
export interface AppContext {
|
|
14
|
+
backlogDir: string;
|
|
15
|
+
/** Single source of truth for backlog state; all reads/writes go through this. */
|
|
16
|
+
backlogmd: Backlogmd;
|
|
17
|
+
/** Returns a chat agent instance, or null if unavailable (e.g. no API key). */
|
|
18
|
+
getChatAgent: () => Promise<ChatAgent | null>;
|
|
19
|
+
notifyClients: () => void;
|
|
20
|
+
/** Broadcast a worker update to all SSE clients. */
|
|
21
|
+
broadcastWorkerUpdate: (payload: WorkerReportBody) => void;
|
|
22
|
+
/** Broadcast status (e.g. worker count) to all SSE clients. */
|
|
23
|
+
broadcastStatus: () => void;
|
|
24
|
+
/** Update worker state and return current state (for report endpoint). */
|
|
25
|
+
reportWorker: (body: WorkerReportBody) => WorkerState;
|
|
26
|
+
/** Get current state of all known workers. */
|
|
27
|
+
getWorkerStates: () => WorkerState[];
|
|
28
|
+
/** Enqueue an assignment for a worker to consume via poll. */
|
|
29
|
+
enqueueAssignment: (msg: AssignmentMessage) => void;
|
|
30
|
+
/** Dequeue and return the next assignment (available work) for this worker, or null. */
|
|
31
|
+
dequeueAssignment: (workerId: string) => AssignmentMessage | null;
|
|
32
|
+
/** List all assignments for this worker without removing them. */
|
|
33
|
+
listAssignments: (workerId: string) => AssignmentMessage[];
|
|
34
|
+
addEventClient: (res: ServerResponse) => void;
|
|
35
|
+
removeEventClient: (res: ServerResponse) => void;
|
|
36
|
+
/** Claim an item (e.g. when in-progress but item has no tasks to set). Cleared when worker reports idle. */
|
|
37
|
+
setClaimedItem: (workerKey: string, itemId: string | null) => void;
|
|
38
|
+
/** Whether this item is currently claimed by any worker (exclude from assignments). */
|
|
39
|
+
isItemClaimed: (itemId: string) => boolean;
|
|
40
|
+
/** Returns a promise that resolves when work may be available (assign or backlog change). In-process workers wait on this instead of polling. */
|
|
41
|
+
getWorkTrigger: () => Promise<void>;
|
|
42
|
+
/** Signal in-process workers to check for work. Called after assign and on backlog change. */
|
|
43
|
+
triggerWorkAvailable: () => void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG;IAAE,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAE9F,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,SAAS,EAAE,SAAS,CAAC;IACrB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,oDAAoD;IACpD,qBAAqB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3D,+DAA+D;IAC/D,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,0EAA0E;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,WAAW,CAAC;IACtD,8CAA8C;IAC9C,eAAe,EAAE,MAAM,WAAW,EAAE,CAAC;IACrC,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACpD,wFAAwF;IACxF,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAC;IAClE,kEAAkE;IAClE,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,iBAAiB,EAAE,CAAC;IAC3D,cAAc,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IAC9C,iBAAiB,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,4GAA4G;IAC5G,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnE,uFAAuF;IACvF,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,iJAAiJ;IACjJ,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,8FAA8F;IAC9F,oBAAoB,EAAE,MAAM,IAAI,CAAC;CACpC"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":""}
|
package/dist/html.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare function renderHtml(
|
|
1
|
+
import type { BacklogStateDto } from "@backlogmd/types";
|
|
2
|
+
export declare function renderHtml(doc: BacklogStateDto): string;
|
|
3
3
|
//# sourceMappingURL=html.d.ts.map
|
package/dist/html.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAsBxD,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAKvD"}
|
package/dist/html.js
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
import path from "
|
|
3
|
-
import { fileURLToPath } from "
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
4
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
5
|
const templatePath = path.resolve(__dirname, "..", "app", "dist", "index.html");
|
|
6
|
-
const template = fs.readFileSync(templatePath, "utf-8");
|
|
7
6
|
const PLACEHOLDER = "<!--__BACKLOG_DATA__-->";
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
/** In development, read template on each request so app rebuilds (e.g. vite --watch) are picked up without restarting the server. */
|
|
8
|
+
function getTemplate() {
|
|
9
|
+
if (process.env.NODE_ENV === "development" && fs.existsSync(templatePath)) {
|
|
10
|
+
return fs.readFileSync(templatePath, "utf-8");
|
|
11
|
+
}
|
|
12
|
+
return cachedTemplate;
|
|
13
|
+
}
|
|
14
|
+
let cachedTemplate;
|
|
15
|
+
try {
|
|
16
|
+
cachedTemplate = fs.readFileSync(templatePath, "utf-8");
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
cachedTemplate = "";
|
|
20
|
+
}
|
|
21
|
+
export function renderHtml(doc) {
|
|
22
|
+
const template = getTemplate();
|
|
23
|
+
const chatEnabled = Boolean(process.env.OPENAI_API_KEY?.trim());
|
|
24
|
+
const script = `<script>window.__BACKLOG__=${JSON.stringify(doc)};window.__CHAT_ENABLED__=${JSON.stringify(chatEnabled)}</script>`;
|
|
10
25
|
return template.replace(PLACEHOLDER, script);
|
|
11
26
|
}
|
|
12
27
|
//# sourceMappingURL=html.js.map
|
package/dist/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAEhF,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,qIAAqI;AACrI,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1E,OAAO,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,IAAI,cAAsB,CAAC;AAC3B,IAAI,CAAC;IACH,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC;AAAC,MAAM,CAAC;IACP,cAAc,GAAG,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAoB;IAC7C,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,8BAA8B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC;IACnI,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,13 @@ export interface ServerOptions {
|
|
|
4
4
|
dir?: string;
|
|
5
5
|
port?: number;
|
|
6
6
|
host?: string;
|
|
7
|
+
/** Backlogmd instance (source of truth). Must be loaded before startServer. */
|
|
8
|
+
backlogmd: import("@backlogmd/core").Backlogmd;
|
|
9
|
+
/** Called when the server is listening; receives ctx (e.g. to start in-process workers with getWorkTrigger). */
|
|
10
|
+
onListening?: (ctx: import("./context.js").AppContext) => void;
|
|
7
11
|
}
|
|
8
12
|
export interface ServerHandle {
|
|
9
13
|
close: () => void;
|
|
10
14
|
}
|
|
11
|
-
export declare function startServer(options
|
|
15
|
+
export declare function startServer(options: ServerOptions): ServerHandle;
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,aAAa;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,SAAS,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC;IAC/C,gHAAgH;IAChH,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,cAAc,EAAE,UAAU,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,YAAY;IACzB,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA2BhE"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
import path from "
|
|
1
|
+
import path from "path";
|
|
2
2
|
import { watchBacklogDir } from "./watcher.js";
|
|
3
3
|
import { createServer } from "./server.js";
|
|
4
4
|
export { createServer } from "./server.js";
|
|
5
|
-
export function startServer(options
|
|
5
|
+
export function startServer(options) {
|
|
6
6
|
const cwd = process.cwd();
|
|
7
7
|
const dir = path.resolve(options.dir || path.join(cwd, ".backlogmd"));
|
|
8
8
|
const port = options.port || 3000;
|
|
9
|
-
const
|
|
10
|
-
const {
|
|
9
|
+
const { backlogmd } = options;
|
|
10
|
+
const { notifyClients, close: closeServer, triggerWorkAvailable, } = createServer(port, dir, {
|
|
11
|
+
backlogmd,
|
|
12
|
+
onListening: options.onListening,
|
|
13
|
+
});
|
|
11
14
|
const watcher = watchBacklogDir(dir, () => {
|
|
12
|
-
|
|
15
|
+
void backlogmd.reconcile().then(() => {
|
|
16
|
+
notifyClients();
|
|
17
|
+
triggerWorkAvailable();
|
|
18
|
+
});
|
|
13
19
|
});
|
|
14
20
|
const close = () => {
|
|
15
21
|
watcher.close();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,MAAM,UAAU,WAAW,CAAC,OAAsB;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAClC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,EACF,aAAa,EACb,KAAK,EAAE,WAAW,EAClB,oBAAoB,GACvB,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;QACxB,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,WAAW;KACnC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE;QACtC,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,aAAa,EAAE,CAAC;YAChB,oBAAoB,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,GAAG,EAAE;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BacklogStateDto } from "@backlogmd/types";
|
|
2
|
+
/**
|
|
3
|
+
* Build a minimal BacklogStateDto with a single error entry.
|
|
4
|
+
* Used as a fallback when the parser fails catastrophically.
|
|
5
|
+
*/
|
|
6
|
+
export declare function errorBacklogStateDto(backlogDir: string, err: Error): BacklogStateDto;
|
|
7
|
+
//# sourceMappingURL=errorOutput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorOutput.d.ts","sourceRoot":"","sources":["../../src/lib/errorOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,eAAe,CAiBpF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a minimal BacklogStateDto with a single error entry.
|
|
3
|
+
* Used as a fallback when the parser fails catastrophically.
|
|
4
|
+
*/
|
|
5
|
+
export function errorBacklogStateDto(backlogDir, err) {
|
|
6
|
+
return {
|
|
7
|
+
protocol: "backlogmd/v2",
|
|
8
|
+
generatedAt: new Date().toISOString(),
|
|
9
|
+
rootDir: backlogDir,
|
|
10
|
+
validation: {
|
|
11
|
+
errors: [
|
|
12
|
+
{
|
|
13
|
+
code: "FATAL_PARSE_ERROR",
|
|
14
|
+
message: `Failed to read backlog: ${err.message}`,
|
|
15
|
+
source: "",
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
warnings: [],
|
|
19
|
+
},
|
|
20
|
+
work: [],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errorOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorOutput.js","sourceRoot":"","sources":["../../src/lib/errorOutput.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,GAAU;IACjE,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE;YACV,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,mBAAmB;oBACzB,OAAO,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE;oBACjD,MAAM,EAAE,EAAE;iBACX;aACF;YACD,QAAQ,EAAE,EAAE;SACb;QACD,IAAI,EAAE,EAAE;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validStatuses.d.ts","sourceRoot":"","sources":["../../src/lib/validStatuses.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,EAAE,GAAG,CAAC,MAAM,CAKrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validStatuses.js","sourceRoot":"","sources":["../../src/lib/validStatuses.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAgB,IAAI,GAAG,CAAC;IACjD,MAAM;IACN,OAAO;IACP,aAAa;IACb,MAAM;CACP,CAAC,CAAC"}
|
package/dist/routes.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAiBjE,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,UAAU,GAAG,IAAI,CAiE1E"}
|
package/dist/routes.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getIndexPage } from "./useCases/getIndexPage.js";
|
|
2
|
+
import { getBacklog } from "./useCases/getBacklog.js";
|
|
3
|
+
import { patchTaskStatus } from "./useCases/patchTaskStatus.js";
|
|
4
|
+
import { getTaskContent } from "./useCases/getTaskContent.js";
|
|
5
|
+
import { putTaskContent } from "./useCases/putTaskContent.js";
|
|
6
|
+
import { deleteTask } from "./useCases/deleteTask.js";
|
|
7
|
+
import { deleteItem } from "./useCases/deleteItem.js";
|
|
8
|
+
import { getItemContent } from "./useCases/getItemContent.js";
|
|
9
|
+
import { putItemContent } from "./useCases/putItemContent.js";
|
|
10
|
+
import { postChat } from "./useCases/postChat.js";
|
|
11
|
+
import { getEvents } from "./useCases/getEvents.js";
|
|
12
|
+
import { postWorkerReport } from "./useCases/postWorkerReport.js";
|
|
13
|
+
import { getWorkers } from "./useCases/getWorkers.js";
|
|
14
|
+
import { postAssignWork } from "./useCases/postAssignWork.js";
|
|
15
|
+
import { getWorkerAssignments } from "./useCases/getWorkerAssignments.js";
|
|
16
|
+
export function registerRoutes(app, ctx) {
|
|
17
|
+
app.get("/", (req, reply) => getIndexPage(ctx, req, reply));
|
|
18
|
+
app.get("/index.html", (req, reply) => getIndexPage(ctx, req, reply));
|
|
19
|
+
app.get("/api/backlog", (req, reply) => getBacklog(ctx, req, reply));
|
|
20
|
+
app.get("/api/backlog.json", (req, reply) => getBacklog(ctx, req, reply));
|
|
21
|
+
app.patch("/api/tasks/:taskId", (req, reply) => patchTaskStatus(ctx, req, reply));
|
|
22
|
+
app.get("/api/tasks/:taskId/content", (req, reply) => getTaskContent(ctx, req, reply));
|
|
23
|
+
app.put("/api/tasks/:taskId/content", (req, reply) => putTaskContent(ctx, req, reply));
|
|
24
|
+
app.delete("/api/tasks/:taskId", (req, reply) => deleteTask(ctx, req, reply));
|
|
25
|
+
app.get("/api/items/:encodedSlug/content", (req, reply) => getItemContent(ctx, req, reply));
|
|
26
|
+
app.put("/api/items/:encodedSlug/content", (req, reply) => putItemContent(ctx, req, reply));
|
|
27
|
+
app.delete("/api/items/:encodedSlug", (req, reply) => deleteItem(ctx, req, reply));
|
|
28
|
+
app.post("/api/chat", (req, reply) => postChat(ctx, req, reply));
|
|
29
|
+
app.get("/events", (req, reply) => getEvents(ctx, req, reply));
|
|
30
|
+
app.get("/api/workers", (req, reply) => getWorkers(ctx, req, reply));
|
|
31
|
+
app.post("/api/workers/report", (req, reply) => postWorkerReport(ctx, req, reply));
|
|
32
|
+
app.post("/api/workers/assign", (req, reply) => postAssignWork(ctx, req, reply));
|
|
33
|
+
app.get("/api/work", (req, reply) => getWorkerAssignments(ctx, req, reply));
|
|
34
|
+
app.get("/api/workers/assignments", (req, reply) => getWorkerAssignments(ctx, req, reply));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../src/routes.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Server } from "http";
|
|
2
|
+
import type { AppContext } from "./context.js";
|
|
2
3
|
export interface ServerResult {
|
|
3
4
|
server: Server;
|
|
4
5
|
notifyClients: () => void;
|
|
5
6
|
close: () => void;
|
|
7
|
+
/** Signal in-process workers to check for work (e.g. for watcher). */
|
|
8
|
+
triggerWorkAvailable: () => void;
|
|
6
9
|
}
|
|
7
|
-
export
|
|
10
|
+
export interface CreateServerOptions {
|
|
11
|
+
/** Backlogmd instance (source of truth); must be loaded before calling createServer. */
|
|
12
|
+
backlogmd: import("@backlogmd/core").Backlogmd;
|
|
13
|
+
/** Called when the server is listening; receives ctx so workers can register for work triggers. */
|
|
14
|
+
onListening?: (ctx: AppContext) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare function createServer(port: number, backlogDir: string, options: CreateServerOptions): ServerResult;
|
|
8
17
|
//# sourceMappingURL=server.d.ts.map
|