@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
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAkB,MAAM,MAAM,CAAC;AAGnD,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAKjE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,SAAS,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC;IAC/C,mGAAmG;IACnG,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,IAAI,CAAC;CACzC;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,YAAY,CAyJd"}
|
package/dist/server.js
CHANGED
|
@@ -1,181 +1,148 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"block",
|
|
8
|
-
"in-progress",
|
|
9
|
-
"done",
|
|
10
|
-
]);
|
|
11
|
-
/**
|
|
12
|
-
* Build an empty BacklogOutput with a single error entry.
|
|
13
|
-
* Used as a fallback when the parser fails catastrophically.
|
|
14
|
-
*/
|
|
15
|
-
function errorOutput(backlogDir, err) {
|
|
16
|
-
return {
|
|
17
|
-
protocol: "backlogmd/v2",
|
|
18
|
-
generatedAt: new Date().toISOString(),
|
|
19
|
-
rootDir: backlogDir,
|
|
20
|
-
entries: [],
|
|
21
|
-
items: [],
|
|
22
|
-
tasks: [],
|
|
23
|
-
validation: {
|
|
24
|
-
errors: [
|
|
25
|
-
{
|
|
26
|
-
code: "FATAL_PARSE_ERROR",
|
|
27
|
-
message: `Failed to read backlog: ${err.message}`,
|
|
28
|
-
source: "",
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
warnings: [],
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Read the full request body as a string.
|
|
37
|
-
*/
|
|
38
|
-
function readBody(req) {
|
|
39
|
-
return new Promise((resolve, reject) => {
|
|
40
|
-
let body = "";
|
|
41
|
-
req.on("data", (chunk) => {
|
|
42
|
-
body += chunk.toString();
|
|
43
|
-
});
|
|
44
|
-
req.on("end", () => resolve(body));
|
|
45
|
-
req.on("error", reject);
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
export function createServer(port, backlogDir) {
|
|
1
|
+
import Fastify from "fastify";
|
|
2
|
+
import { WorkerRegistry } from "./workerRegistry.js";
|
|
3
|
+
import { AssignmentQueue } from "./assignmentQueue.js";
|
|
4
|
+
import { registerRoutes } from "./routes.js";
|
|
5
|
+
export function createServer(port, backlogDir, options) {
|
|
6
|
+
const { backlogmd, onListening } = options;
|
|
49
7
|
const clients = new Set();
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
let output;
|
|
54
|
-
try {
|
|
55
|
-
output = buildBacklogOutput(backlogDir);
|
|
56
|
-
}
|
|
57
|
-
catch (err) {
|
|
58
|
-
console.error("[backlogmd-serve] Parse error:", err.message);
|
|
59
|
-
output = errorOutput(backlogDir, err);
|
|
60
|
-
}
|
|
61
|
-
if (output.validation.errors.length > 0) {
|
|
62
|
-
for (const e of output.validation.errors) {
|
|
63
|
-
console.error(`[backlogmd-serve] ${e.code}: ${e.message}${e.source ? ` (${e.source})` : ""}`);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
const html = renderHtml(output);
|
|
67
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
68
|
-
res.end(html);
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (url.pathname === "/api/backlog" || url.pathname === "/api/backlog.json") {
|
|
72
|
-
let output;
|
|
8
|
+
const broadcastWorkerUpdate = (payload) => {
|
|
9
|
+
const message = `data: ${JSON.stringify({ type: "worker", payload })}\n\n`;
|
|
10
|
+
for (const client of clients) {
|
|
73
11
|
try {
|
|
74
|
-
|
|
12
|
+
client.write(message);
|
|
75
13
|
}
|
|
76
|
-
catch
|
|
77
|
-
|
|
78
|
-
output = errorOutput(backlogDir, err);
|
|
79
|
-
}
|
|
80
|
-
if (output.validation.errors.length > 0) {
|
|
81
|
-
for (const e of output.validation.errors) {
|
|
82
|
-
console.error(`[backlogmd-serve] ${e.code}: ${e.message}${e.source ? ` (${e.source})` : ""}`);
|
|
83
|
-
}
|
|
14
|
+
catch {
|
|
15
|
+
// Client may have closed
|
|
84
16
|
}
|
|
85
|
-
res.writeHead(200, { "Content-Type": "application/json" });
|
|
86
|
-
res.end(JSON.stringify(output));
|
|
87
|
-
return;
|
|
88
17
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
res.end(JSON.stringify({ error: "Missing task source" }));
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
let body;
|
|
18
|
+
};
|
|
19
|
+
const workerRegistry = new WorkerRegistry(broadcastWorkerUpdate);
|
|
20
|
+
const broadcastStatus = () => {
|
|
21
|
+
const count = workerRegistry.getAll().length;
|
|
22
|
+
const message = `data: ${JSON.stringify({ type: "status", workers: count })}\n\n`;
|
|
23
|
+
for (const client of clients) {
|
|
99
24
|
try {
|
|
100
|
-
|
|
25
|
+
client.write(message);
|
|
101
26
|
}
|
|
102
27
|
catch {
|
|
103
|
-
|
|
104
|
-
res.end(JSON.stringify({ error: "Failed to read request body" }));
|
|
105
|
-
return;
|
|
28
|
+
// Client may have closed
|
|
106
29
|
}
|
|
107
|
-
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
// let chatAgentPromise: Promise<Awaited<ReturnType<typeof createChatAgentForServer>>> | null = null;
|
|
33
|
+
// const getChatAgent = (): Promise<Awaited<ReturnType<typeof createChatAgentForServer>>> => {
|
|
34
|
+
// if (!chatAgentPromise) {
|
|
35
|
+
// chatAgentPromise = createChatAgentForServer(backlogDir, {
|
|
36
|
+
// onBacklogChange: () => notifyClients(),
|
|
37
|
+
// getWorkerStates: () => workerRegistry.getAll(),
|
|
38
|
+
// });
|
|
39
|
+
// }
|
|
40
|
+
// return chatAgentPromise;
|
|
41
|
+
// };
|
|
42
|
+
// if (process.env.OPENAI_API_KEY) {
|
|
43
|
+
// void getChatAgent();
|
|
44
|
+
// }
|
|
45
|
+
const notifyClients = () => {
|
|
46
|
+
const message = "data: reload\n\n";
|
|
47
|
+
for (const client of clients) {
|
|
108
48
|
try {
|
|
109
|
-
|
|
49
|
+
client.write(message);
|
|
110
50
|
}
|
|
111
51
|
catch {
|
|
112
|
-
|
|
113
|
-
res.end(JSON.stringify({ error: "Invalid JSON" }));
|
|
114
|
-
return;
|
|
52
|
+
// Client may have closed
|
|
115
53
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if (
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
res.end(JSON.stringify({ error: message }));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const reportWorker = (body) => workerRegistry.report(body);
|
|
57
|
+
const getWorkerStates = () => workerRegistry.getAll();
|
|
58
|
+
const assignmentQueue = new AssignmentQueue();
|
|
59
|
+
const enqueueAssignment = (msg) => assignmentQueue.enqueue(msg);
|
|
60
|
+
const dequeueAssignment = (workerId) => assignmentQueue.dequeueForWorker(workerId);
|
|
61
|
+
const listAssignments = (workerId) => assignmentQueue.listForWorker(workerId);
|
|
62
|
+
const CLAIM_STALE_MS = 5 * 60 * 1000; // 5 minutes
|
|
63
|
+
const claimedByWorker = new Map();
|
|
64
|
+
const setClaimedItem = (workerKey, itemId) => {
|
|
65
|
+
if (itemId)
|
|
66
|
+
claimedByWorker.set(workerKey, { itemId, since: Date.now() });
|
|
67
|
+
else
|
|
68
|
+
claimedByWorker.delete(workerKey);
|
|
69
|
+
};
|
|
70
|
+
const isItemClaimed = (itemId) => {
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
for (const entry of claimedByWorker.values()) {
|
|
73
|
+
if (entry.itemId === itemId) {
|
|
74
|
+
if (now - entry.since > CLAIM_STALE_MS) {
|
|
75
|
+
const toDelete = [...claimedByWorker.entries()]
|
|
76
|
+
.filter(([, v]) => v.itemId === itemId)
|
|
77
|
+
.map(([k]) => k);
|
|
78
|
+
for (const k of toDelete)
|
|
79
|
+
claimedByWorker.delete(k);
|
|
80
|
+
return false;
|
|
144
81
|
}
|
|
82
|
+
return true;
|
|
145
83
|
}
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (url.pathname === "/events") {
|
|
149
|
-
res.writeHead(200, {
|
|
150
|
-
"Content-Type": "text/event-stream",
|
|
151
|
-
"Cache-Control": "no-cache",
|
|
152
|
-
Connection: "keep-alive",
|
|
153
|
-
});
|
|
154
|
-
res.write("\n");
|
|
155
|
-
clients.add(res);
|
|
156
|
-
req.on("close", () => {
|
|
157
|
-
clients.delete(res);
|
|
158
|
-
});
|
|
159
|
-
return;
|
|
160
84
|
}
|
|
161
|
-
|
|
162
|
-
res.end("Not Found");
|
|
85
|
+
return false;
|
|
163
86
|
};
|
|
164
|
-
const
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
87
|
+
const workTriggerResolvers = [];
|
|
88
|
+
const getWorkTrigger = () => new Promise((resolve) => {
|
|
89
|
+
workTriggerResolvers.push(resolve);
|
|
90
|
+
});
|
|
91
|
+
const triggerWorkAvailable = () => {
|
|
92
|
+
for (const r of workTriggerResolvers)
|
|
93
|
+
r();
|
|
94
|
+
workTriggerResolvers.length = 0;
|
|
95
|
+
};
|
|
96
|
+
const ctx = {
|
|
97
|
+
backlogDir,
|
|
98
|
+
backlogmd,
|
|
99
|
+
getChatAgent: () => Promise.resolve(null),
|
|
100
|
+
notifyClients,
|
|
101
|
+
broadcastWorkerUpdate,
|
|
102
|
+
broadcastStatus,
|
|
103
|
+
reportWorker,
|
|
104
|
+
getWorkerStates,
|
|
105
|
+
enqueueAssignment,
|
|
106
|
+
dequeueAssignment,
|
|
107
|
+
listAssignments,
|
|
108
|
+
addEventClient: (res) => clients.add(res),
|
|
109
|
+
removeEventClient: (res) => clients.delete(res),
|
|
110
|
+
setClaimedItem,
|
|
111
|
+
isItemClaimed,
|
|
112
|
+
getWorkTrigger,
|
|
113
|
+
triggerWorkAvailable,
|
|
170
114
|
};
|
|
115
|
+
const fastify = Fastify({ logger: false });
|
|
116
|
+
registerRoutes(fastify, ctx);
|
|
117
|
+
fastify.setNotFoundHandler((_request, reply) => {
|
|
118
|
+
reply.code(404).type("text/plain").send("Not Found");
|
|
119
|
+
});
|
|
171
120
|
const close = () => {
|
|
172
121
|
for (const client of clients) {
|
|
173
|
-
|
|
122
|
+
try {
|
|
123
|
+
client.end();
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// ignore
|
|
127
|
+
}
|
|
174
128
|
}
|
|
175
129
|
clients.clear();
|
|
176
|
-
|
|
130
|
+
void fastify.close();
|
|
131
|
+
};
|
|
132
|
+
fastify.listen({ port, host: "localhost" }, (err) => {
|
|
133
|
+
if (err) {
|
|
134
|
+
fastify.log.error(err);
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
onListening?.(ctx);
|
|
138
|
+
triggerWorkAvailable();
|
|
139
|
+
setTimeout(() => triggerWorkAvailable(), 1500);
|
|
140
|
+
});
|
|
141
|
+
return {
|
|
142
|
+
server: fastify.server,
|
|
143
|
+
notifyClients,
|
|
144
|
+
close,
|
|
145
|
+
triggerWorkAvailable,
|
|
177
146
|
};
|
|
178
|
-
server.listen(port);
|
|
179
|
-
return { server, notifyClients, close };
|
|
180
147
|
}
|
|
181
148
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os.d.ts","sourceRoot":"","sources":["../../src/shared/os.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc1D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
// Resolve backlog root: directory that contains work/
|
|
4
|
+
// Prefer .backlogmd (project/.backlogmd/work/); fallback to project root (project/work/)
|
|
5
|
+
// If neither exists, create .backlogmd/work/ and use it
|
|
6
|
+
export function resolveBacklogRoot(rootDir) {
|
|
7
|
+
const dotBacklogmd = path.join(rootDir, ".backlogmd");
|
|
8
|
+
const workAtRoot = path.join(rootDir, "work");
|
|
9
|
+
let backlogRoot;
|
|
10
|
+
if (fs.existsSync(dotBacklogmd)) {
|
|
11
|
+
backlogRoot = dotBacklogmd;
|
|
12
|
+
}
|
|
13
|
+
else if (fs.existsSync(workAtRoot)) {
|
|
14
|
+
backlogRoot = rootDir;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
fs.mkdirSync(path.join(dotBacklogmd, "work"), { recursive: true });
|
|
18
|
+
backlogRoot = dotBacklogmd;
|
|
19
|
+
console.error(`Created ${path.join(rootDir, ".backlogmd", "work")} (empty backlog).`);
|
|
20
|
+
}
|
|
21
|
+
return backlogRoot;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=os.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"os.js","sourceRoot":"","sources":["../../src/shared/os.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,sDAAsD;AACtD,yFAAyF;AACzF,wDAAwD;AACxD,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,IAAI,WAAmB,CAAC;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,WAAW,GAAG,YAAY,CAAC;IAC7B,CAAC;SAAM,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,WAAW,GAAG,OAAO,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,WAAW,GAAG,YAAY,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
import type { AppContext } from "../context.js";
|
|
3
|
+
interface Params {
|
|
4
|
+
encodedSlug?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* DELETE /api/items/:encodedSlug
|
|
8
|
+
* Removes the work item directory (work/<slug>/ including index.md and all task files).
|
|
9
|
+
*/
|
|
10
|
+
export declare function deleteItem(ctx: AppContext, request: FastifyRequest<{
|
|
11
|
+
Params: Params;
|
|
12
|
+
}>, reply: FastifyReply): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=deleteItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteItem.d.ts","sourceRoot":"","sources":["../../src/useCases/deleteItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,UAAU,MAAM;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3C,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAqBf"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DELETE /api/items/:encodedSlug
|
|
3
|
+
* Removes the work item directory (work/<slug>/ including index.md and all task files).
|
|
4
|
+
*/
|
|
5
|
+
export async function deleteItem(ctx, request, reply) {
|
|
6
|
+
const slug = request.params.encodedSlug ? decodeURIComponent(request.params.encodedSlug) : "";
|
|
7
|
+
if (!slug) {
|
|
8
|
+
await reply.code(400).type("application/json").send({ error: "Missing item slug" });
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
await ctx.backlogmd.removeItem(slug);
|
|
13
|
+
ctx.notifyClients();
|
|
14
|
+
await reply.code(200).type("application/json").send({ ok: true });
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const message = err.message;
|
|
18
|
+
if (message.includes("not found")) {
|
|
19
|
+
await reply.code(404).type("application/json").send({ error: message });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error("[backlogmd-serve] deleteItem error:", message);
|
|
23
|
+
await reply.code(500).type("application/json").send({ error: message });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=deleteItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteItem.js","sourceRoot":"","sources":["../../src/useCases/deleteItem.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,OAA2C,EAC3C,KAAmB;IAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9F,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
import type { AppContext } from "../context.js";
|
|
3
|
+
interface Params {
|
|
4
|
+
taskId?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* DELETE /api/tasks/:taskId
|
|
8
|
+
* Removes the task file (and its feedback file if present) from the backlog.
|
|
9
|
+
*/
|
|
10
|
+
export declare function deleteTask(ctx: AppContext, request: FastifyRequest<{
|
|
11
|
+
Params: Params;
|
|
12
|
+
}>, reply: FastifyReply): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=deleteTask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteTask.d.ts","sourceRoot":"","sources":["../../src/useCases/deleteTask.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,UAAU,MAAM;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3C,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DELETE /api/tasks/:taskId
|
|
3
|
+
* Removes the task file (and its feedback file if present) from the backlog.
|
|
4
|
+
*/
|
|
5
|
+
export async function deleteTask(ctx, request, reply) {
|
|
6
|
+
const raw = request.params.taskId ?? "";
|
|
7
|
+
const taskId = raw ? decodeURIComponent(raw) : "";
|
|
8
|
+
if (!taskId) {
|
|
9
|
+
await reply.code(400).type("application/json").send({ error: "Missing task id" });
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
await ctx.backlogmd.removeTask(taskId);
|
|
14
|
+
ctx.notifyClients();
|
|
15
|
+
await reply.code(200).type("application/json").send({ ok: true });
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
const message = err.message;
|
|
19
|
+
if (message.includes("not found")) {
|
|
20
|
+
await reply.code(404).type("application/json").send({ error: message });
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.error("[backlogmd-serve] deleteTask error:", message);
|
|
24
|
+
await reply.code(500).type("application/json").send({ error: message });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=deleteTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteTask.js","sourceRoot":"","sources":["../../src/useCases/deleteTask.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,OAA2C,EAC3C,KAAmB;IAEnB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,aAAa,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBacklog.d.ts","sourceRoot":"","sources":["../../src/useCases/getBacklog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { errorBacklogStateDto } from "../lib/errorOutput.js";
|
|
2
|
+
export async function getBacklog(ctx, _request, reply) {
|
|
3
|
+
let doc;
|
|
4
|
+
try {
|
|
5
|
+
ctx.backlogmd.refresh();
|
|
6
|
+
doc = ctx.backlogmd.getDocument();
|
|
7
|
+
}
|
|
8
|
+
catch (err) {
|
|
9
|
+
console.error("[backlogmd-serve] Parse error:", err.message);
|
|
10
|
+
doc = errorBacklogStateDto(ctx.backlogDir, err);
|
|
11
|
+
}
|
|
12
|
+
if (doc.validation.errors.length > 0) {
|
|
13
|
+
for (const e of doc.validation.errors) {
|
|
14
|
+
console.error(`[backlogmd-serve] ${e.code}: ${e.message}${e.source ? ` (${e.source})` : ""}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
await reply.type("application/json").send(doc);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=getBacklog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getBacklog.js","sourceRoot":"","sources":["../../src/useCases/getBacklog.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,QAAwB,EACxB,KAAmB;IAEnB,IAAI,GAAoB,CAAC;IACzB,IAAI,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACxB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACxE,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAY,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CACX,qBAAqB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEvents.d.ts","sourceRoot":"","sources":["../../src/useCases/getEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export async function getEvents(ctx, _request, reply) {
|
|
2
|
+
const res = reply.raw;
|
|
3
|
+
res.writeHead(200, {
|
|
4
|
+
"Content-Type": "text/event-stream",
|
|
5
|
+
"Cache-Control": "no-cache",
|
|
6
|
+
Connection: "keep-alive",
|
|
7
|
+
});
|
|
8
|
+
res.write("\n");
|
|
9
|
+
ctx.addEventClient(res);
|
|
10
|
+
// Send initial status (e.g. worker count) on the same SSE stream
|
|
11
|
+
const status = { type: "status", workers: ctx.getWorkerStates().length };
|
|
12
|
+
res.write(`data: ${JSON.stringify(status)}\n\n`);
|
|
13
|
+
_request.raw.on("close", () => {
|
|
14
|
+
ctx.removeEventClient(res);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=getEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEvents.js","sourceRoot":"","sources":["../../src/useCases/getEvents.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAe,EACf,QAAwB,EACxB,KAAmB;IAEnB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;KACzB,CAAC,CAAC;IACF,GAAiD,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IACxB,iEAAiE;IACjE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC;IACjF,GAAiD,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/F,QAAQ,CAAC,GAAkE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAC5F,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
import type { AppContext } from "../context.js";
|
|
3
|
+
export declare function getIndexPage(ctx: AppContext, _request: FastifyRequest, reply: FastifyReply): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=getIndexPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getIndexPage.d.ts","sourceRoot":"","sources":["../../src/useCases/getIndexPage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,wBAAsB,YAAY,CAChC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { renderHtml } from "../html.js";
|
|
2
|
+
import { errorBacklogStateDto } from "../lib/errorOutput.js";
|
|
3
|
+
export async function getIndexPage(ctx, _request, reply) {
|
|
4
|
+
let doc;
|
|
5
|
+
try {
|
|
6
|
+
doc = ctx.backlogmd.getDocument();
|
|
7
|
+
}
|
|
8
|
+
catch (err) {
|
|
9
|
+
console.error("[backlogmd-serve] Parse error:", err.message);
|
|
10
|
+
doc = errorBacklogStateDto(ctx.backlogDir, err);
|
|
11
|
+
}
|
|
12
|
+
if (doc.validation.errors.length > 0) {
|
|
13
|
+
for (const e of doc.validation.errors) {
|
|
14
|
+
console.error(`[backlogmd-serve] ${e.code}: ${e.message}${e.source ? ` (${e.source})` : ""}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const html = renderHtml(doc);
|
|
18
|
+
await reply.type("text/html").send(html);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=getIndexPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getIndexPage.js","sourceRoot":"","sources":["../../src/useCases/getIndexPage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAe,EACf,QAAwB,EACxB,KAAmB;IAEnB,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QACxE,GAAG,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAY,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CACX,qBAAqB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
import type { AppContext } from "../context.js";
|
|
3
|
+
interface Params {
|
|
4
|
+
encodedSlug?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* GET /api/items/:encodedSlug/content
|
|
8
|
+
* Returns the plain-text body of the work item index (DESCRIPTION, CONTEXT, etc.).
|
|
9
|
+
*/
|
|
10
|
+
export declare function getItemContent(ctx: AppContext, request: FastifyRequest<{
|
|
11
|
+
Params: Params;
|
|
12
|
+
}>, reply: FastifyReply): Promise<void>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=getItemContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getItemContent.d.ts","sourceRoot":"","sources":["../../src/useCases/getItemContent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,UAAU,MAAM;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,cAAc,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3C,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|