@nameczz/skill-sync 0.1.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.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/dist/src/autoSync.d.ts +36 -0
  4. package/dist/src/autoSync.js +235 -0
  5. package/dist/src/autoSync.js.map +1 -0
  6. package/dist/src/cli.d.ts +2 -0
  7. package/dist/src/cli.js +211 -0
  8. package/dist/src/cli.js.map +1 -0
  9. package/dist/src/codexArchive.d.ts +38 -0
  10. package/dist/src/codexArchive.js +340 -0
  11. package/dist/src/codexArchive.js.map +1 -0
  12. package/dist/src/config.d.ts +12 -0
  13. package/dist/src/config.js +78 -0
  14. package/dist/src/config.js.map +1 -0
  15. package/dist/src/copy.d.ts +1 -0
  16. package/dist/src/copy.js +42 -0
  17. package/dist/src/copy.js.map +1 -0
  18. package/dist/src/directoryPicker.d.ts +8 -0
  19. package/dist/src/directoryPicker.js +49 -0
  20. package/dist/src/directoryPicker.js.map +1 -0
  21. package/dist/src/format.d.ts +2 -0
  22. package/dist/src/format.js +27 -0
  23. package/dist/src/format.js.map +1 -0
  24. package/dist/src/frontmatter.d.ts +5 -0
  25. package/dist/src/frontmatter.js +36 -0
  26. package/dist/src/frontmatter.js.map +1 -0
  27. package/dist/src/git.d.ts +25 -0
  28. package/dist/src/git.js +227 -0
  29. package/dist/src/git.js.map +1 -0
  30. package/dist/src/hash.d.ts +1 -0
  31. package/dist/src/hash.js +34 -0
  32. package/dist/src/hash.js.map +1 -0
  33. package/dist/src/importSkill.d.ts +6 -0
  34. package/dist/src/importSkill.js +58 -0
  35. package/dist/src/importSkill.js.map +1 -0
  36. package/dist/src/init.d.ts +5 -0
  37. package/dist/src/init.js +13 -0
  38. package/dist/src/init.js.map +1 -0
  39. package/dist/src/installSkill.d.ts +6 -0
  40. package/dist/src/installSkill.js +62 -0
  41. package/dist/src/installSkill.js.map +1 -0
  42. package/dist/src/json.d.ts +2 -0
  43. package/dist/src/json.js +11 -0
  44. package/dist/src/json.js.map +1 -0
  45. package/dist/src/metadata.d.ts +11 -0
  46. package/dist/src/metadata.js +115 -0
  47. package/dist/src/metadata.js.map +1 -0
  48. package/dist/src/paths.d.ts +22 -0
  49. package/dist/src/paths.js +103 -0
  50. package/dist/src/paths.js.map +1 -0
  51. package/dist/src/removeLocalSkill.d.ts +5 -0
  52. package/dist/src/removeLocalSkill.js +79 -0
  53. package/dist/src/removeLocalSkill.js.map +1 -0
  54. package/dist/src/resolveConflict.d.ts +10 -0
  55. package/dist/src/resolveConflict.js +146 -0
  56. package/dist/src/resolveConflict.js.map +1 -0
  57. package/dist/src/scanner.d.ts +5 -0
  58. package/dist/src/scanner.js +57 -0
  59. package/dist/src/scanner.js.map +1 -0
  60. package/dist/src/server.d.ts +10 -0
  61. package/dist/src/server.js +494 -0
  62. package/dist/src/server.js.map +1 -0
  63. package/dist/src/sessionUsage.d.ts +14 -0
  64. package/dist/src/sessionUsage.js +180 -0
  65. package/dist/src/sessionUsage.js.map +1 -0
  66. package/dist/src/skillDependencies.d.ts +2 -0
  67. package/dist/src/skillDependencies.js +56 -0
  68. package/dist/src/skillDependencies.js.map +1 -0
  69. package/dist/src/skillMentions.d.ts +3 -0
  70. package/dist/src/skillMentions.js +111 -0
  71. package/dist/src/skillMentions.js.map +1 -0
  72. package/dist/src/status.d.ts +3 -0
  73. package/dist/src/status.js +134 -0
  74. package/dist/src/status.js.map +1 -0
  75. package/dist/src/stopSyncingSkill.d.ts +2 -0
  76. package/dist/src/stopSyncingSkill.js +31 -0
  77. package/dist/src/stopSyncingSkill.js.map +1 -0
  78. package/dist/src/sync.d.ts +48 -0
  79. package/dist/src/sync.js +741 -0
  80. package/dist/src/sync.js.map +1 -0
  81. package/dist/src/types.d.ts +84 -0
  82. package/dist/src/types.js +2 -0
  83. package/dist/src/types.js.map +1 -0
  84. package/dist/src/updateLocalSkill.d.ts +6 -0
  85. package/dist/src/updateLocalSkill.js +19 -0
  86. package/dist/src/updateLocalSkill.js.map +1 -0
  87. package/dist/src/usage.d.ts +6 -0
  88. package/dist/src/usage.js +84 -0
  89. package/dist/src/usage.js.map +1 -0
  90. package/dist/src/usageMonitor.d.ts +17 -0
  91. package/dist/src/usageMonitor.js +90 -0
  92. package/dist/src/usageMonitor.js.map +1 -0
  93. package/dist/web/assets/index-CPJdd8n0.js +59 -0
  94. package/dist/web/assets/index-T4bm09OX.css +2 -0
  95. package/dist/web/index.html +13 -0
  96. package/dist/web/style-options/common.css +515 -0
  97. package/dist/web/style-options/console.html +143 -0
  98. package/dist/web/style-options/desktop.html +144 -0
  99. package/dist/web/style-options/index.html +36 -0
  100. package/dist/web/style-options/workbench.html +112 -0
  101. package/package.json +84 -0
@@ -0,0 +1,494 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import fastify from "fastify";
6
+ import fastifyStatic from "@fastify/static";
7
+ import { tryLoadLocalConfig } from "./config.js";
8
+ import { initialize } from "./init.js";
9
+ import { buildStatusReport } from "./status.js";
10
+ import { selectDirectory } from "./directoryPicker.js";
11
+ import { gitBranchSyncStatus, gitStatus } from "./git.js";
12
+ import { importLocalSkill } from "./importSkill.js";
13
+ import { installRepoSkill } from "./installSkill.js";
14
+ import { listRepositoryConflicts, pullRepositoryChanges, resolveRepositoryConflicts, syncRepositoryChanges, syncSelectedSkills } from "./sync.js";
15
+ import { stopSyncingSkill } from "./stopSyncingSkill.js";
16
+ import { removeLocalSkill } from "./removeLocalSkill.js";
17
+ import { recordUsageEvent } from "./usage.js";
18
+ import { updateLocalSkill } from "./updateLocalSkill.js";
19
+ import { resolveConflict } from "./resolveConflict.js";
20
+ import { listCodexArchiveSessions, previewCodexArchiveSession, restoreCodexArchiveSession, unarchiveCodexArchiveSession, moveCodexArchiveSessionToTrash, validateCodexArchiveFileName } from "./codexArchive.js";
21
+ import { createAutoSyncController } from "./autoSync.js";
22
+ import { createUsageMonitor } from "./usageMonitor.js";
23
+ import { getDefaultAgentsSkillsDir, getDefaultCacheDir, getDefaultCodexSkillsDir, resolveSkillPath, repoSkillsDir, validateSkillId } from "./paths.js";
24
+ export async function startServer(options = {}) {
25
+ let config = await tryLoadLocalConfig();
26
+ const directoryPicker = options.directoryPicker ?? selectDirectory;
27
+ const app = fastify({ logger: false });
28
+ const autoSync = createAutoSyncController();
29
+ const usageMonitor = createUsageMonitor();
30
+ if (config) {
31
+ await autoSync.start(config);
32
+ await usageMonitor.start(config);
33
+ }
34
+ app.setErrorHandler((error, _request, reply) => {
35
+ const normalized = normalizeError(error);
36
+ reply.code(normalized.statusCode).send({
37
+ error: normalized.message
38
+ });
39
+ });
40
+ app.get("/api/health", async () => ({ ok: true }));
41
+ app.get("/archive", async (_request, reply) => {
42
+ reply.redirect("/codex-archive", 302);
43
+ });
44
+ app.get("/api/status", async () => {
45
+ if (!config) {
46
+ return {
47
+ configured: false,
48
+ defaults: {
49
+ syncRepo: "",
50
+ codexSkillsDir: getDefaultCodexSkillsDir(),
51
+ agentsSkillsDir: getDefaultAgentsSkillsDir(),
52
+ cacheDir: getDefaultCacheDir()
53
+ }
54
+ };
55
+ }
56
+ await usageMonitor.scanNow();
57
+ const report = await buildStatusReport(config);
58
+ return {
59
+ configured: true,
60
+ config,
61
+ gitStatus: await gitStatus(config.syncRepo),
62
+ gitBranchStatus: await gitBranchSyncStatus(config.syncRepo),
63
+ report,
64
+ autoSync: autoSync.getStatus(),
65
+ usageMonitor: usageMonitor.getStatus()
66
+ };
67
+ });
68
+ app.post("/api/init", async (request, reply) => {
69
+ const syncRepo = optionalPath(request.body?.syncRepo);
70
+ if (!syncRepo) {
71
+ reply.code(400);
72
+ return { error: "Choose a sync repository before initializing." };
73
+ }
74
+ const result = await initialize({
75
+ syncRepo,
76
+ codexSkillsDir: optionalPath(request.body?.codexSkillsDir),
77
+ agentsSkillsDir: optionalPath(request.body?.agentsSkillsDir),
78
+ cacheDir: optionalPath(request.body?.cacheDir)
79
+ });
80
+ config = result.config;
81
+ await autoSync.start(config);
82
+ await usageMonitor.start(config);
83
+ return {
84
+ configured: true,
85
+ gitInitialized: result.gitInitialized,
86
+ config: result.config,
87
+ autoSync: autoSync.getStatus(),
88
+ usageMonitor: usageMonitor.getStatus()
89
+ };
90
+ });
91
+ app.put("/api/config", async (request) => {
92
+ const loaded = requireConfig(config);
93
+ const result = await initialize({
94
+ syncRepo: optionalPath(request.body?.syncRepo) ?? loaded.syncRepo,
95
+ codexSkillsDir: optionalPath(request.body?.codexSkillsDir) ?? loaded.codexSkillsDir,
96
+ agentsSkillsDir: optionalPath(request.body?.agentsSkillsDir) ?? loaded.agentsSkillsDir,
97
+ cacheDir: optionalPath(request.body?.cacheDir) ?? loaded.cacheDir,
98
+ force: true
99
+ });
100
+ config = result.config;
101
+ await autoSync.start(config);
102
+ await usageMonitor.start(config);
103
+ return {
104
+ configured: true,
105
+ gitInitialized: result.gitInitialized,
106
+ config: result.config,
107
+ gitStatus: await gitStatus(result.config.syncRepo),
108
+ gitBranchStatus: await gitBranchSyncStatus(result.config.syncRepo),
109
+ report: await buildStatusReport(result.config),
110
+ autoSync: autoSync.getStatus(),
111
+ usageMonitor: usageMonitor.getStatus()
112
+ };
113
+ });
114
+ app.post("/api/select-directory", async (request) => {
115
+ return directoryPicker(optionalTitle(request.body?.title));
116
+ });
117
+ app.post("/api/import", async (request, reply) => {
118
+ const loaded = requireConfig(config);
119
+ const skillId = requireSkillId(request.body);
120
+ const source = optionalLocalSource(request.body.source);
121
+ const record = await importLocalSkill(loaded, skillId, { force: request.body.force, source });
122
+ const result = await syncSelectedSkills(loaded, [{ skillId, source }]);
123
+ reply.code(201);
124
+ return { record, result };
125
+ });
126
+ app.post("/api/install", async (request) => {
127
+ const loaded = requireConfig(config);
128
+ const skillId = requireSkillId(request.body);
129
+ const source = optionalLocalSource(request.body.source);
130
+ const { record, dependencyInstall } = await installRepoSkill(loaded, skillId, { force: request.body.force, source });
131
+ const result = await syncRepositoryChanges(loaded);
132
+ return { record, result, dependencyInstall };
133
+ });
134
+ app.post("/api/update-local", async (request) => {
135
+ const loaded = requireConfig(config);
136
+ const skillId = requireSkillId(request.body);
137
+ const source = optionalLocalSource(request.body.source);
138
+ const { record, dependencyInstall } = await updateLocalSkill(loaded, skillId, { source });
139
+ const result = await syncRepositoryChanges(loaded);
140
+ return { record, result, dependencyInstall };
141
+ });
142
+ app.post("/api/remove-local", async (request) => {
143
+ const loaded = requireConfig(config);
144
+ const skillId = requireSkillId(request.body);
145
+ const source = optionalLocalSource(request.body.source);
146
+ const record = await removeLocalSkill(loaded, skillId, { source });
147
+ const result = await syncRepositoryChanges(loaded);
148
+ return { record, result };
149
+ });
150
+ app.post("/api/resolve-conflict", async (request) => {
151
+ const loaded = requireConfig(config);
152
+ const skillId = requireSkillId(request.body);
153
+ const strategy = requireResolveStrategy(request.body?.strategy);
154
+ const payload = await resolveConflict(loaded, skillId, { strategy });
155
+ return payload;
156
+ });
157
+ app.post("/api/skill-versions", async (request) => {
158
+ const loaded = requireConfig(config);
159
+ const skillId = requireSkillId(request.body);
160
+ const versions = await buildSkillVersions(loaded, skillId);
161
+ return { versions };
162
+ });
163
+ app.post("/api/stop-syncing", async (request) => {
164
+ const loaded = requireConfig(config);
165
+ const skillId = requireSkillId(request.body);
166
+ optionalLocalSource(request.body?.source);
167
+ const record = await stopSyncingSkill(loaded, skillId);
168
+ const result = await syncRepositoryChanges(loaded);
169
+ return { record, result };
170
+ });
171
+ app.get("/api/codex-archive", async (request) => {
172
+ const state = request.query.state === "trash" ? "trash" : "active";
173
+ const payload = await listCodexArchiveSessions(state);
174
+ return payload;
175
+ });
176
+ app.post("/api/codex-archive/preview", async (request) => {
177
+ const state = request.body?.state === "trash" ? "trash" : "active";
178
+ const fileName = requireArchiveFileName(request.body?.fileName);
179
+ const payload = await previewCodexArchiveSession(state, fileName);
180
+ return payload;
181
+ });
182
+ app.post("/api/codex-archive/delete", async (request) => {
183
+ const state = request.body?.state === "trash" ? "trash" : "active";
184
+ if (state !== "active") {
185
+ throw httpError(400, "Delete only supports state=active.");
186
+ }
187
+ const fileName = requireArchiveFileName(request.body?.fileName);
188
+ const item = await moveCodexArchiveSessionToTrash(fileName);
189
+ return { state: "trash", item };
190
+ });
191
+ app.post("/api/codex-archive/restore", async (request) => {
192
+ const state = request.body?.state === "active" ? "active" : "trash";
193
+ if (state !== "trash") {
194
+ throw httpError(400, "Restore only supports state=trash.");
195
+ }
196
+ const fileName = requireArchiveFileName(request.body?.fileName);
197
+ const item = await restoreCodexArchiveSession(fileName);
198
+ return { state: "active", item };
199
+ });
200
+ app.post("/api/codex-archive/unarchive", async (request) => {
201
+ const state = request.body?.state === "trash" ? "trash" : "active";
202
+ if (state !== "active") {
203
+ throw httpError(400, "Unarchive only supports state=active.");
204
+ }
205
+ const fileName = requireArchiveFileName(request.body?.fileName);
206
+ const payload = await unarchiveCodexArchiveSession(fileName);
207
+ return { state: "sessions", ...payload };
208
+ });
209
+ app.post("/api/record", async (request) => {
210
+ const loaded = requireConfig(config);
211
+ const skillId = requireSkillId(request.body);
212
+ const event = await recordUsageEvent(loaded, skillId, { invokedAt: optionalDate(request.body?.invokedAt) });
213
+ return { event };
214
+ });
215
+ app.post("/api/pull", async () => {
216
+ const loaded = requireConfig(config);
217
+ return pullRepositoryChanges(loaded);
218
+ });
219
+ app.get("/api/repo-conflicts", async () => {
220
+ const loaded = requireConfig(config);
221
+ return listRepositoryConflicts(loaded);
222
+ });
223
+ app.post("/api/repo-conflicts/resolve", async (request) => {
224
+ const loaded = requireConfig(config);
225
+ return resolveRepositoryConflicts(loaded, requireRepoConflictResolutions(request.body));
226
+ });
227
+ app.post("/api/skill-file", async (request) => {
228
+ const loaded = requireConfig(config);
229
+ const filePath = localSkillMdPath(loaded, request.body);
230
+ if (!existsSync(filePath)) {
231
+ throw httpError(404, "Local SKILL.md not found.");
232
+ }
233
+ return {
234
+ path: filePath,
235
+ content: await readFile(filePath, "utf8")
236
+ };
237
+ });
238
+ app.put("/api/skill-file", async (request) => {
239
+ const loaded = requireConfig(config);
240
+ const filePath = localSkillMdPath(loaded, request.body);
241
+ if (!existsSync(filePath)) {
242
+ throw httpError(404, "Local SKILL.md not found.");
243
+ }
244
+ await writeFile(filePath, requireSkillFileContent(request.body), "utf8");
245
+ autoSync.trigger();
246
+ return { path: filePath };
247
+ });
248
+ app.post("/api/sync", async (request) => {
249
+ const loaded = requireConfig(config);
250
+ const result = await syncSelectedSkills(loaded, requireSyncSelections(request.body));
251
+ return { result };
252
+ });
253
+ app.post("/api/bulk-action", async (request) => {
254
+ const loaded = requireConfig(config);
255
+ const endpoint = requireBulkActionEndpoint(request.body?.endpoint);
256
+ const selections = requireSyncSelections(request.body);
257
+ const records = [];
258
+ const dependencyInstalls = [];
259
+ for (const selection of selections) {
260
+ if (endpoint === "import") {
261
+ records.push(await importLocalSkill(loaded, selection.skillId, { force: true, source: selection.source }));
262
+ }
263
+ else if (endpoint === "install") {
264
+ const installed = await installRepoSkill(loaded, selection.skillId, { force: true, source: selection.source });
265
+ records.push(installed.record);
266
+ dependencyInstalls.push({ skillId: selection.skillId, ...installed.dependencyInstall });
267
+ }
268
+ else {
269
+ const installed = await updateLocalSkill(loaded, selection.skillId, { source: selection.source });
270
+ records.push(installed.record);
271
+ dependencyInstalls.push({ skillId: selection.skillId, ...installed.dependencyInstall });
272
+ }
273
+ }
274
+ const result = endpoint === "import" ? await syncSelectedSkills(loaded, selections) : await syncRepositoryChanges(loaded);
275
+ return { records, dependencyInstalls, result };
276
+ });
277
+ const webRoot = findWebRoot();
278
+ if (webRoot) {
279
+ await app.register(fastifyStatic, {
280
+ root: webRoot,
281
+ prefix: "/"
282
+ });
283
+ app.setNotFoundHandler((request, reply) => {
284
+ if (request.raw.url?.startsWith("/api/")) {
285
+ reply.code(404).send({ error: "Not found" });
286
+ return;
287
+ }
288
+ reply.sendFile("index.html");
289
+ });
290
+ }
291
+ else {
292
+ app.get("/", async (_request, reply) => {
293
+ reply.type("text/html").send("<main style=\"font-family: sans-serif; padding: 32px\"><h1>Skill Sync</h1><p>Web assets are not built yet. Run <code>npm run build</code> first.</p></main>");
294
+ });
295
+ }
296
+ const address = await app.listen({
297
+ host: options.host ?? "127.0.0.1",
298
+ port: options.port ?? 3017
299
+ });
300
+ return {
301
+ url: address,
302
+ close: async () => {
303
+ await autoSync.stop();
304
+ await usageMonitor.stop();
305
+ await app.close();
306
+ }
307
+ };
308
+ }
309
+ function requireConfig(config) {
310
+ if (!config) {
311
+ throw httpError(409, "Skill Sync is not initialized.");
312
+ }
313
+ return config;
314
+ }
315
+ function requireSkillId(body) {
316
+ if (!body?.skillId || typeof body.skillId !== "string") {
317
+ throw httpError(400, "Request body must include skillId.");
318
+ }
319
+ return body.skillId;
320
+ }
321
+ function requireSkillFileContent(body) {
322
+ if (!body || typeof body.content !== "string") {
323
+ throw httpError(400, "Request body must include content.");
324
+ }
325
+ return body.content;
326
+ }
327
+ function requireSyncSelections(body) {
328
+ if (!body || !Array.isArray(body.skills)) {
329
+ throw httpError(400, "Request body must include skills.");
330
+ }
331
+ return body.skills.map((skill) => ({
332
+ skillId: requireSkillId(skill),
333
+ source: optionalLocalSource(skill.source)
334
+ }));
335
+ }
336
+ function requireRepoConflictResolutions(body) {
337
+ if (!body || !Array.isArray(body.resolutions)) {
338
+ throw httpError(400, "Request body must include resolutions.");
339
+ }
340
+ return body.resolutions.map((resolution) => ({
341
+ skillId: requireSkillId(resolution),
342
+ source: requireRepositoryConflictSource(resolution.source)
343
+ }));
344
+ }
345
+ function requireRepositoryConflictSource(value) {
346
+ if (value === "github" || value === "syncRepo" || value === "codex" || value === "agents") {
347
+ return value;
348
+ }
349
+ throw httpError(400, "Repository conflict source must be github, syncRepo, codex, or agents.");
350
+ }
351
+ function requireBulkActionEndpoint(value) {
352
+ if (value === "import" || value === "install" || value === "update-local") {
353
+ return value;
354
+ }
355
+ throw httpError(400, "Bulk action endpoint must be import, install, or update-local.");
356
+ }
357
+ function optionalPath(value) {
358
+ if (value === undefined || value === null) {
359
+ return undefined;
360
+ }
361
+ if (typeof value !== "string") {
362
+ throw httpError(400, "Path values must be strings.");
363
+ }
364
+ const trimmed = value.trim();
365
+ return trimmed.length > 0 ? trimmed : undefined;
366
+ }
367
+ function optionalDate(value) {
368
+ if (value === undefined || value === null) {
369
+ return undefined;
370
+ }
371
+ if (typeof value !== "string") {
372
+ throw httpError(400, "invokedAt must be an ISO timestamp.");
373
+ }
374
+ const trimmed = value.trim();
375
+ if (trimmed.length === 0) {
376
+ return undefined;
377
+ }
378
+ if (Number.isNaN(new Date(trimmed).getTime())) {
379
+ throw httpError(400, "invokedAt must be an ISO timestamp.");
380
+ }
381
+ return trimmed;
382
+ }
383
+ function requireArchiveFileName(value) {
384
+ if (typeof value !== "string") {
385
+ throw httpError(400, "Request body must include a valid fileName.");
386
+ }
387
+ try {
388
+ return validateCodexArchiveFileName(value.trim());
389
+ }
390
+ catch (error) {
391
+ const message = error instanceof Error ? error.message : "Invalid file name.";
392
+ throw httpError(400, message);
393
+ }
394
+ }
395
+ function requireResolveStrategy(value) {
396
+ if (value === "codex" || value === "agents" || value === "repo") {
397
+ return value;
398
+ }
399
+ throw httpError(400, "Conflict strategy must be codex, agents, or repo.");
400
+ }
401
+ async function buildSkillVersions(config, skillId) {
402
+ const id = validateSkillId(skillId);
403
+ const sources = [
404
+ { source: "codex", path: resolveSkillPath(config.codexSkillsDir, id) },
405
+ { source: "agents", path: resolveSkillPath(config.agentsSkillsDir, id) },
406
+ { source: "repo", path: resolveSkillPath(repoSkillsDir(config.syncRepo), id) }
407
+ ];
408
+ const versions = await Promise.all(sources.map(async (entry) => {
409
+ const skillFilePath = path.join(entry.path, "SKILL.md");
410
+ if (!existsSync(skillFilePath)) {
411
+ return {
412
+ source: entry.source,
413
+ path: skillFilePath,
414
+ exists: false,
415
+ content: null
416
+ };
417
+ }
418
+ const content = await readFile(skillFilePath, "utf8");
419
+ return {
420
+ source: entry.source,
421
+ path: skillFilePath,
422
+ exists: true,
423
+ content
424
+ };
425
+ }));
426
+ return versions;
427
+ }
428
+ function optionalTitle(value) {
429
+ if (value === undefined || value === null) {
430
+ return undefined;
431
+ }
432
+ if (typeof value !== "string") {
433
+ throw httpError(400, "Directory picker title must be a string.");
434
+ }
435
+ const trimmed = value.trim();
436
+ return trimmed.length > 0 ? trimmed : undefined;
437
+ }
438
+ function optionalLocalSource(value) {
439
+ if (value === undefined || value === null) {
440
+ return undefined;
441
+ }
442
+ if (value === "codex" || value === "agents") {
443
+ return value;
444
+ }
445
+ throw httpError(400, "Skill source must be codex or agents.");
446
+ }
447
+ function requireLocalSource(value) {
448
+ const source = optionalLocalSource(value);
449
+ if (!source) {
450
+ throw httpError(400, "Request body must include source.");
451
+ }
452
+ return source;
453
+ }
454
+ function localSkillMdPath(config, body) {
455
+ const skillId = requireSkillId(body);
456
+ const source = requireLocalSource(body?.source);
457
+ const localRoot = source === "agents" ? config.agentsSkillsDir : config.codexSkillsDir;
458
+ try {
459
+ return path.join(resolveSkillPath(localRoot, skillId), "SKILL.md");
460
+ }
461
+ catch (error) {
462
+ const message = error instanceof Error ? error.message : "Invalid skillId.";
463
+ throw httpError(400, message);
464
+ }
465
+ }
466
+ function findWebRoot() {
467
+ const candidates = [
468
+ path.resolve(process.cwd(), "dist/web"),
469
+ fileURLToPath(new URL("../web", import.meta.url)),
470
+ fileURLToPath(new URL("../../dist/web", import.meta.url))
471
+ ];
472
+ return candidates.find((candidate) => existsSync(path.join(candidate, "index.html"))) ?? null;
473
+ }
474
+ function httpError(statusCode, message) {
475
+ const error = new Error(message);
476
+ error.apiMessage = message;
477
+ error.statusCode = statusCode;
478
+ return error;
479
+ }
480
+ function normalizeError(error) {
481
+ if (error instanceof Error) {
482
+ const statusCode = error.statusCode;
483
+ const apiMessage = error.apiMessage;
484
+ return {
485
+ statusCode: statusCode && statusCode >= 400 ? statusCode : 500,
486
+ message: apiMessage ?? error.message
487
+ };
488
+ }
489
+ return {
490
+ statusCode: 500,
491
+ message: String(error)
492
+ };
493
+ }
494
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { LocalConfig } from "./types.js";
2
+ import { type PathOptions } from "./paths.js";
3
+ type SessionRecordResult = {
4
+ scannedFiles: number;
5
+ recorded: number;
6
+ skillIds: string[];
7
+ };
8
+ type SessionUsageOptions = PathOptions & {
9
+ now?: () => Date;
10
+ initialScanBytes?: number;
11
+ threadId?: string | null;
12
+ };
13
+ export declare function recordUsageFromCodexSessions(config: LocalConfig, options?: SessionUsageOptions): Promise<SessionRecordResult>;
14
+ export {};