@ulpi/cli 0.1.5 → 0.1.7
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/README.md +143 -214
- package/dist/{auth-PN7TMQHV-2W4ICG64.js → auth-FWM7MM4Q-VZC3U2XZ.js} +1 -1
- package/dist/{auth-BFFBUJUC.js → auth-HDK7ECJL.js} +2 -1
- package/dist/{chunk-RJIRWQJD.js → chunk-3BCW6ABU.js} +402 -142
- package/dist/{chunk-L3PWNHSA.js → chunk-3WB5CXH4.js} +180 -5
- package/dist/{chunk-K4OVPFY2.js → chunk-4UCJIAOU.js} +2 -2
- package/dist/chunk-4XTHZVDS.js +109 -0
- package/dist/chunk-4ZPOZULQ.js +6522 -0
- package/dist/{chunk-SIAQVRKG.js → chunk-5MI5GIXM.js} +48 -2
- package/dist/{chunk-KLEASXUR.js → chunk-6ZL6NXMV.js} +1 -1
- package/dist/{chunk-AV5RB3N2.js → chunk-76D3BYJD.js} +48 -0
- package/dist/{chunk-DOIKS6C5.js → chunk-AWOSRA5F.js} +1 -1
- package/dist/{chunk-UCMT5OKP.js → chunk-BFEKZZHM.js} +274 -57
- package/dist/chunk-C7CLUQI6.js +1286 -0
- package/dist/{chunk-ELTGWMDE.js → chunk-E3B5NROU.js} +7 -7
- package/dist/chunk-EJ7TW77N.js +1418 -0
- package/dist/{chunk-P2RESJRN.js → chunk-EWLYVXQ4.js} +2 -2
- package/dist/{chunk-6OURRFP7.js → chunk-IV6MWETF.js} +383 -168
- package/dist/chunk-IZPJHSPX.js +1478 -0
- package/dist/chunk-JLHNLM3C.js +228 -0
- package/dist/chunk-PO4NUZUU.js +147 -0
- package/dist/chunk-S6ANCSYO.js +1271 -0
- package/dist/chunk-SEU7WWNQ.js +1251 -0
- package/dist/chunk-SNQ7NAIS.js +453 -0
- package/dist/{ulpi-RMMCUAGP-EWYUE7RU.js → chunk-TSLDGT5O.js} +73 -35
- package/dist/{chunk-EIWYSP3A.js → chunk-UXHCHOWQ.js} +83 -62
- package/dist/chunk-WED4LM5N.js +322 -0
- package/dist/chunk-WVOZE25N.js +6757 -0
- package/dist/{chunk-5SCG7UYM.js → chunk-XKF4DPUM.js} +7 -7
- package/dist/{chunk-74WVVWJ4.js → chunk-YOKL7RB5.js} +184 -15
- package/dist/chunk-Z53CAR7G.js +298 -0
- package/dist/{ci-JQ56YIKC.js → ci-COZRTPGQ.js} +124 -26
- package/dist/cloud-2F3NLVHN.js +274 -0
- package/dist/{codemap-HMYBXJL2.js → codemap-XNGMAF3F.js} +37 -37
- package/dist/codex-MB5YTMRT.js +132 -0
- package/dist/{config-YYWEN7U2.js → config-OOELBYTH.js} +1 -1
- package/dist/dist-2BJYR5EI.js +59 -0
- package/dist/dist-3EIQTZHT.js +1380 -0
- package/dist/{dist-WAMAQVPK.js → dist-4U5L2X2C.js} +2 -2
- package/dist/{dist-4XTJ6HLM.js → dist-54KAMNLO.js} +16 -15
- package/dist/dist-6M4MZWZW.js +58 -0
- package/dist/dist-6X576SU2.js +27 -0
- package/dist/dist-7QOEYLFX.js +103 -0
- package/dist/dist-AYBGHEDY.js +2541 -0
- package/dist/dist-EK45QNEM.js +45 -0
- package/dist/{dist-U7ZIJMZD.js → dist-FKFEJRPX.js} +16 -15
- package/dist/dist-GTEJUBBT.js +66 -0
- package/dist/dist-HA74OKJZ.js +40 -0
- package/dist/{dist-XG2GG5SD.js → dist-HU5RZAON.js} +14 -2
- package/dist/dist-IYE3OBRB.js +374 -0
- package/dist/{dist-7WLLPWWB.js → dist-JLU26AB6.js} +12 -9
- package/dist/{dist-6G7JC2RA.js → dist-KUCI6JFE.js} +49 -9
- package/dist/dist-NUEMFZFL.js +33 -0
- package/dist/{dist-GWGTAHNM.js → dist-NUXMDXZ3.js} +31 -3
- package/dist/{dist-5R4RYNQO.js → dist-YCNWHSLN.js} +15 -5
- package/dist/{dist-6MFVWIFF.js → dist-YFFG2ZD6.js} +9 -16
- package/dist/dist-ZG4OKCSR.js +15 -0
- package/dist/doctor-FKYSIHER.js +345 -0
- package/dist/{export-import-4A5MWLIA.js → export-import-JFQH4KSJ.js} +1 -1
- package/dist/{history-RNUWO4JZ.js → history-UMGQNQQ7.js} +7 -7
- package/dist/{hooks-installer-K2JXEBNN.js → hooks-installer-YEYTYA6Q.js} +2 -2
- package/dist/index.js +398 -622
- package/dist/{init-NQWFZPKO.js → init-TJYW5ROZ.js} +78 -12
- package/dist/job-HIDMAFW2.js +376 -0
- package/dist/jobs.memory-PLMMSFHB-VBECCTHN.js +33 -0
- package/dist/kiro-VMUHDFGK.js +153 -0
- package/dist/{launchd-OYXUAVW6.js → launchd-U3MSWBRH.js} +9 -17
- package/dist/mcp-PDUD7SGP.js +249 -0
- package/dist/mcp-installer-PQU3XOGO.js +259 -0
- package/dist/mcp-setup-OA7IB3H3.js +263 -0
- package/dist/{memory-D6ZFFCI2.js → memory-ZNAEAK3B.js} +17 -17
- package/dist/{ollama-3XCUZMZT-FYKHW4TZ.js → ollama-3XCUZMZT-4JMH6B7P.js} +1 -1
- package/dist/{openai-E7G2YAHU-IG33BFYF.js → openai-E7G2YAHU-T3HMBPH7.js} +2 -2
- package/dist/portal-JYWVHXDU.js +210 -0
- package/dist/prd-Q4J5NVAR.js +408 -0
- package/dist/repos-WWZXNN3P.js +271 -0
- package/dist/review-integration-RQE4KMAV.js +14 -0
- package/dist/{rules-3OFGWHP4.js → rules-Y4VSOY5Y.js} +3 -3
- package/dist/run-VPNXEIBY.js +687 -0
- package/dist/server-COL4AXKU-P7S7NNF6.js +11 -0
- package/dist/server-U7PQ6FTS-MG4MJPTS.js +20 -0
- package/dist/{skills-GY2CTPWN.js → skills-QEYU2N27.js} +4 -2
- package/dist/start-IJKY5RVT.js +303 -0
- package/dist/{status-SE43TIFJ.js → status-BHQYYGAL.js} +2 -2
- package/dist/{templates-O2XDKB5R.js → templates-CBRUJ66V.js} +6 -5
- package/dist/tui-DP7736EX.js +61 -0
- package/dist/ulpi-5EN6JCAS-LFE3WSL4.js +10 -0
- package/dist/{uninstall-KWGSGZTI.js → uninstall-BX6FOV77.js} +3 -3
- package/dist/{update-QYZA4D23.js → update-AQKTHFVQ.js} +3 -3
- package/dist/{version-checker-MVB74DEX.js → version-checker-5L5PUOEX.js} +2 -2
- package/package.json +13 -4
- package/dist/chunk-26LLDX2T.js +0 -553
- package/dist/chunk-DDRLI6JU.js +0 -331
- package/dist/chunk-IFATANHR.js +0 -453
- package/dist/chunk-JWUUVXIV.js +0 -13694
- package/dist/chunk-LD52XG3X.js +0 -4273
- package/dist/chunk-MIAQVCFW.js +0 -39
- package/dist/chunk-YYZOFYS6.js +0 -415
- package/dist/dist-XD4YI27T.js +0 -26
- package/dist/mcp-installer-TOYDP77X.js +0 -124
- package/dist/projects-COUJP4ZC.js +0 -271
- package/dist/review-KMGP2S25.js +0 -152
- package/dist/server-USLHY6GH-F4JSXCWA.js +0 -18
- package/dist/server-X5P6WH2M-ULZF5WHZ.js +0 -11
- package/dist/ui-4SM2SUI6.js +0 -167
- package/dist/ui.html +0 -698
- /package/dist/skills/{ulpi-generate-guardian → ulpi-generate-guards}/SKILL.md +0 -0
- /package/dist/skills/{ulpi-generate-guardian → ulpi-generate-guards}/references/framework-rules.md +0 -0
- /package/dist/skills/{ulpi-generate-guardian → ulpi-generate-guards}/references/language-rules.md +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CLI_BIN_NAME,
|
|
3
3
|
getBinaryPath
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-C7CLUQI6.js";
|
|
5
5
|
|
|
6
6
|
// src/hooks-installer.ts
|
|
7
7
|
import * as fs from "fs";
|
|
@@ -51,14 +51,14 @@ function installHooks(projectDir) {
|
|
|
51
51
|
function findSkillSource() {
|
|
52
52
|
if (process.argv[1]) {
|
|
53
53
|
const entryDir = path.dirname(path.resolve(process.argv[1]));
|
|
54
|
-
const bundled = path.join(entryDir, "skills", "ulpi-generate-
|
|
54
|
+
const bundled = path.join(entryDir, "skills", "ulpi-generate-guards");
|
|
55
55
|
if (fs.existsSync(bundled)) return bundled;
|
|
56
56
|
}
|
|
57
57
|
if (process.argv[1]) {
|
|
58
58
|
let dir = path.dirname(path.resolve(process.argv[1]));
|
|
59
59
|
for (let i = 0; i < 5; i++) {
|
|
60
60
|
dir = path.dirname(dir);
|
|
61
|
-
const candidate = path.join(dir, ".claude", "skills", "ulpi-generate-
|
|
61
|
+
const candidate = path.join(dir, ".claude", "skills", "ulpi-generate-guards");
|
|
62
62
|
if (fs.existsSync(candidate)) return candidate;
|
|
63
63
|
}
|
|
64
64
|
}
|
|
@@ -66,7 +66,7 @@ function findSkillSource() {
|
|
|
66
66
|
}
|
|
67
67
|
function installGlobalSkill() {
|
|
68
68
|
const homeDir = os.homedir();
|
|
69
|
-
const globalSkillsDir = path.join(homeDir, ".claude", "skills", "ulpi-generate-
|
|
69
|
+
const globalSkillsDir = path.join(homeDir, ".claude", "skills", "ulpi-generate-guards");
|
|
70
70
|
if (fs.existsSync(globalSkillsDir)) {
|
|
71
71
|
return { installed: false, message: "Skill already installed globally" };
|
|
72
72
|
}
|
|
@@ -77,13 +77,13 @@ function installGlobalSkill() {
|
|
|
77
77
|
try {
|
|
78
78
|
fs.mkdirSync(path.dirname(globalSkillsDir), { recursive: true });
|
|
79
79
|
copyDirRecursive(skillSource, globalSkillsDir);
|
|
80
|
-
return { installed: true, message: `Installed /ulpi-generate-
|
|
80
|
+
return { installed: true, message: `Installed /ulpi-generate-guards skill globally to ${globalSkillsDir}` };
|
|
81
81
|
} catch (err) {
|
|
82
82
|
return { installed: false, message: `Failed to install skill: ${err instanceof Error ? err.message : String(err)}` };
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
function installLocalSkill(projectDir) {
|
|
86
|
-
const localSkillsDir = path.join(projectDir, ".claude", "skills", "ulpi-generate-
|
|
86
|
+
const localSkillsDir = path.join(projectDir, ".claude", "skills", "ulpi-generate-guards");
|
|
87
87
|
if (fs.existsSync(localSkillsDir)) {
|
|
88
88
|
return { installed: false, message: "Skill already installed locally" };
|
|
89
89
|
}
|
|
@@ -94,7 +94,7 @@ function installLocalSkill(projectDir) {
|
|
|
94
94
|
try {
|
|
95
95
|
fs.mkdirSync(path.dirname(localSkillsDir), { recursive: true });
|
|
96
96
|
copyDirRecursive(skillSource, localSkillsDir);
|
|
97
|
-
return { installed: true, message: `Installed /ulpi-generate-
|
|
97
|
+
return { installed: true, message: `Installed /ulpi-generate-guards skill locally` };
|
|
98
98
|
} catch (err) {
|
|
99
99
|
return { installed: false, message: `Failed to install skill: ${err instanceof Error ? err.message : String(err)}` };
|
|
100
100
|
}
|
|
@@ -136,9 +136,9 @@ var PlanStatusSchema = external_exports.enum([
|
|
|
136
136
|
"executing",
|
|
137
137
|
"completed"
|
|
138
138
|
]);
|
|
139
|
-
var
|
|
140
|
-
var
|
|
141
|
-
provider:
|
|
139
|
+
var EmbeddingProviderSchema = external_exports.enum(["openai", "ollama", "ulpi"]);
|
|
140
|
+
var EmbeddingConfigSchema = external_exports.object({
|
|
141
|
+
provider: EmbeddingProviderSchema.default("ulpi"),
|
|
142
142
|
model: external_exports.string().max(100).default("code"),
|
|
143
143
|
dimensions: external_exports.number().int().positive().max(4096).default(1024),
|
|
144
144
|
baseUrl: external_exports.string().url().max(200).optional()
|
|
@@ -175,13 +175,15 @@ var CodemapHybridConfigSchema = external_exports.object({
|
|
|
175
175
|
weights: CodemapHybridWeightsSchema.default({})
|
|
176
176
|
});
|
|
177
177
|
var CodemapConfigSchema = external_exports.object({
|
|
178
|
-
embedding:
|
|
178
|
+
embedding: EmbeddingConfigSchema.default({}),
|
|
179
179
|
chunking: CodemapChunkingConfigSchema.default({}),
|
|
180
180
|
batch: CodemapBatchConfigSchema.default({}),
|
|
181
181
|
hybrid: CodemapHybridConfigSchema.default({}),
|
|
182
182
|
deny: external_exports.array(external_exports.string().max(500)).max(200).default(["**/.env*", "**/secrets/**", "**/certs/**"]),
|
|
183
183
|
maxFileSize: external_exports.number().int().positive().default(1048576),
|
|
184
184
|
// 1MB
|
|
185
|
+
searchTimeoutMs: external_exports.number().int().positive().default(15e3),
|
|
186
|
+
// Search embed timeout
|
|
185
187
|
autoExport: external_exports.boolean().default(true),
|
|
186
188
|
// Export to shadow branch on push / session-end
|
|
187
189
|
autoImport: external_exports.boolean().default(true)
|
|
@@ -256,12 +258,6 @@ var MemoryEntrySchema = external_exports.object({
|
|
|
256
258
|
lastAccessedAt: external_exports.string().optional(),
|
|
257
259
|
supersededBy: external_exports.string().max(64).optional()
|
|
258
260
|
});
|
|
259
|
-
var MemoryEmbeddingConfigSchema = external_exports.object({
|
|
260
|
-
provider: external_exports.enum(["openai", "ollama", "ulpi"]).default("ulpi"),
|
|
261
|
-
model: external_exports.string().max(100).default("code"),
|
|
262
|
-
dimensions: external_exports.number().int().positive().max(4096).default(1024),
|
|
263
|
-
baseUrl: external_exports.string().url().max(200).optional()
|
|
264
|
-
});
|
|
265
261
|
var MemoryClassifierConfigSchema = external_exports.object({
|
|
266
262
|
enabled: external_exports.boolean().default(true),
|
|
267
263
|
model: external_exports.string().max(100).default("claude-sonnet-4-20250514"),
|
|
@@ -294,7 +290,7 @@ var MemoryConfigSchema = external_exports.object({
|
|
|
294
290
|
captureMode: CaptureModeSchema.default("continuous"),
|
|
295
291
|
surfaceOnStart: external_exports.boolean().default(true),
|
|
296
292
|
surfaceLimit: external_exports.number().int().positive().max(20).default(5),
|
|
297
|
-
embedding:
|
|
293
|
+
embedding: EmbeddingConfigSchema.default({ model: "memory" }),
|
|
298
294
|
classifier: MemoryClassifierConfigSchema.default({}),
|
|
299
295
|
retention: MemoryRetentionConfigSchema.default({}),
|
|
300
296
|
ranking: MemoryRankingConfigSchema.default({}),
|
|
@@ -328,6 +324,159 @@ var DepgraphConfigSchema = external_exports.object({
|
|
|
328
324
|
excludeUnranked: external_exports.boolean().default(false),
|
|
329
325
|
excludeUnrankedThreshold: external_exports.number().nonnegative().default(1e-4)
|
|
330
326
|
});
|
|
327
|
+
var TrackerTaskStatusSchema = external_exports.enum([
|
|
328
|
+
"open",
|
|
329
|
+
"in_progress",
|
|
330
|
+
"done",
|
|
331
|
+
"failed",
|
|
332
|
+
"skipped"
|
|
333
|
+
]);
|
|
334
|
+
var TaskPrioritySchema = external_exports.union([
|
|
335
|
+
external_exports.literal(0),
|
|
336
|
+
external_exports.literal(1),
|
|
337
|
+
external_exports.literal(2),
|
|
338
|
+
external_exports.literal(3),
|
|
339
|
+
external_exports.literal(4)
|
|
340
|
+
]);
|
|
341
|
+
var TrackerTaskSchema = external_exports.object({
|
|
342
|
+
id: external_exports.string(),
|
|
343
|
+
title: external_exports.string(),
|
|
344
|
+
status: TrackerTaskStatusSchema,
|
|
345
|
+
priority: TaskPrioritySchema,
|
|
346
|
+
description: external_exports.string().optional(),
|
|
347
|
+
labels: external_exports.array(external_exports.string()).optional(),
|
|
348
|
+
type: external_exports.string().optional(),
|
|
349
|
+
parentId: external_exports.string().optional(),
|
|
350
|
+
dependsOn: external_exports.array(external_exports.string()).optional(),
|
|
351
|
+
blocks: external_exports.array(external_exports.string()).optional(),
|
|
352
|
+
assignee: external_exports.string().optional(),
|
|
353
|
+
createdAt: external_exports.string().optional(),
|
|
354
|
+
updatedAt: external_exports.string().optional(),
|
|
355
|
+
metadata: external_exports.record(external_exports.unknown()).optional()
|
|
356
|
+
});
|
|
357
|
+
var TaskFilterSchema = external_exports.object({
|
|
358
|
+
status: external_exports.union([TrackerTaskStatusSchema, external_exports.array(TrackerTaskStatusSchema)]).optional(),
|
|
359
|
+
priority: external_exports.union([TaskPrioritySchema, external_exports.array(TaskPrioritySchema)]).optional(),
|
|
360
|
+
labels: external_exports.array(external_exports.string()).optional(),
|
|
361
|
+
assignee: external_exports.string().optional(),
|
|
362
|
+
type: external_exports.union([external_exports.string(), external_exports.array(external_exports.string())]).optional(),
|
|
363
|
+
parentId: external_exports.string().optional(),
|
|
364
|
+
ready: external_exports.boolean().optional(),
|
|
365
|
+
limit: external_exports.number().int().positive().optional(),
|
|
366
|
+
offset: external_exports.number().int().nonnegative().optional(),
|
|
367
|
+
excludeIds: external_exports.array(external_exports.string()).optional()
|
|
368
|
+
});
|
|
369
|
+
var TaskCompletionResultSchema = external_exports.object({
|
|
370
|
+
taskId: external_exports.string(),
|
|
371
|
+
status: TrackerTaskStatusSchema,
|
|
372
|
+
summary: external_exports.string(),
|
|
373
|
+
filesChanged: external_exports.array(external_exports.string()).optional(),
|
|
374
|
+
commitSha: external_exports.string().optional()
|
|
375
|
+
});
|
|
376
|
+
var AgentPluginMetaSchema = external_exports.object({
|
|
377
|
+
name: external_exports.string(),
|
|
378
|
+
version: external_exports.string(),
|
|
379
|
+
description: external_exports.string(),
|
|
380
|
+
cliCommand: external_exports.string(),
|
|
381
|
+
supportsHooks: external_exports.boolean(),
|
|
382
|
+
supportsSkills: external_exports.boolean(),
|
|
383
|
+
supportsStreaming: external_exports.boolean(),
|
|
384
|
+
supportsSubagentTracing: external_exports.boolean()
|
|
385
|
+
});
|
|
386
|
+
var ExecuteOptionsSchema = external_exports.object({
|
|
387
|
+
prompt: external_exports.string(),
|
|
388
|
+
workingDir: external_exports.string(),
|
|
389
|
+
timeout: external_exports.number().positive().optional(),
|
|
390
|
+
env: external_exports.record(external_exports.string()).optional(),
|
|
391
|
+
sandboxConfig: external_exports.record(external_exports.unknown()).optional()
|
|
392
|
+
});
|
|
393
|
+
var ExecuteResultSchema = external_exports.object({
|
|
394
|
+
exitCode: external_exports.number(),
|
|
395
|
+
stdout: external_exports.string(),
|
|
396
|
+
stderr: external_exports.string(),
|
|
397
|
+
duration: external_exports.number(),
|
|
398
|
+
tokenUsage: external_exports.object({
|
|
399
|
+
input: external_exports.number().optional(),
|
|
400
|
+
output: external_exports.number().optional()
|
|
401
|
+
}).optional()
|
|
402
|
+
});
|
|
403
|
+
var TrackerPluginMetaSchema = external_exports.object({
|
|
404
|
+
id: external_exports.string(),
|
|
405
|
+
name: external_exports.string(),
|
|
406
|
+
description: external_exports.string(),
|
|
407
|
+
version: external_exports.string(),
|
|
408
|
+
supportsBidirectionalSync: external_exports.boolean(),
|
|
409
|
+
supportsHierarchy: external_exports.boolean(),
|
|
410
|
+
supportsDependencies: external_exports.boolean()
|
|
411
|
+
});
|
|
412
|
+
var SyncResultSchema = external_exports.object({
|
|
413
|
+
success: external_exports.boolean(),
|
|
414
|
+
message: external_exports.string(),
|
|
415
|
+
added: external_exports.number().optional(),
|
|
416
|
+
updated: external_exports.number().optional(),
|
|
417
|
+
removed: external_exports.number().optional(),
|
|
418
|
+
error: external_exports.string().optional(),
|
|
419
|
+
syncedAt: external_exports.string()
|
|
420
|
+
});
|
|
421
|
+
var McpConfigFieldSchema = external_exports.object({
|
|
422
|
+
type: external_exports.enum(["string", "number", "boolean"]).default("string"),
|
|
423
|
+
format: external_exports.enum(["env-ref", "plain"]).optional(),
|
|
424
|
+
required: external_exports.boolean().default(false),
|
|
425
|
+
sensitive: external_exports.boolean().default(false),
|
|
426
|
+
description: external_exports.string().optional(),
|
|
427
|
+
default: external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean()]).optional()
|
|
428
|
+
});
|
|
429
|
+
var McpTransportSchema = external_exports.enum(["stdio", "sse", "http"]).default("stdio");
|
|
430
|
+
var McpCategorySchema = external_exports.enum([
|
|
431
|
+
"database",
|
|
432
|
+
"api",
|
|
433
|
+
"devtools",
|
|
434
|
+
"comms",
|
|
435
|
+
"analytics",
|
|
436
|
+
"cloud",
|
|
437
|
+
"ai",
|
|
438
|
+
"search",
|
|
439
|
+
"monitoring",
|
|
440
|
+
"project-management",
|
|
441
|
+
"design",
|
|
442
|
+
"custom"
|
|
443
|
+
]).default("custom");
|
|
444
|
+
var McpSourceSchema = external_exports.enum(["catalog", "manual"]).default("manual");
|
|
445
|
+
var McpDetectSignalsSchema = external_exports.object({
|
|
446
|
+
dependencies: external_exports.array(external_exports.string()).default([]),
|
|
447
|
+
env_vars: external_exports.array(external_exports.string()).default([]),
|
|
448
|
+
docker_services: external_exports.array(external_exports.string()).default([]),
|
|
449
|
+
config_files: external_exports.array(external_exports.string()).default([])
|
|
450
|
+
}).partial();
|
|
451
|
+
var McpDefinitionSchema = external_exports.object({
|
|
452
|
+
name: external_exports.string().min(1).max(128),
|
|
453
|
+
display_name: external_exports.string().max(256).optional(),
|
|
454
|
+
description: external_exports.string().max(1024).optional(),
|
|
455
|
+
command: external_exports.string().min(1).max(256),
|
|
456
|
+
args: external_exports.array(external_exports.string()).default([]),
|
|
457
|
+
transport: McpTransportSchema,
|
|
458
|
+
category: McpCategorySchema,
|
|
459
|
+
config_schema: external_exports.record(external_exports.string(), McpConfigFieldSchema).optional(),
|
|
460
|
+
tags: external_exports.array(external_exports.string()).default([]),
|
|
461
|
+
source: McpSourceSchema,
|
|
462
|
+
added_at: external_exports.string().optional()
|
|
463
|
+
});
|
|
464
|
+
var McpLibrarySchema = external_exports.object({
|
|
465
|
+
mcps: external_exports.record(external_exports.string(), McpDefinitionSchema).default({})
|
|
466
|
+
});
|
|
467
|
+
var McpActivationSchema = external_exports.object({
|
|
468
|
+
enabled: external_exports.boolean().default(true),
|
|
469
|
+
config: external_exports.record(external_exports.string(), external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean()])).default({})
|
|
470
|
+
});
|
|
471
|
+
var McpRepoConfigSchema = external_exports.object({
|
|
472
|
+
mcps: external_exports.record(external_exports.string(), McpActivationSchema).default({})
|
|
473
|
+
});
|
|
474
|
+
var McpCatalogEntrySchema = McpDefinitionSchema.extend({
|
|
475
|
+
detect_signals: McpDetectSignalsSchema.optional()
|
|
476
|
+
});
|
|
477
|
+
var McpCatalogSchema = external_exports.object({
|
|
478
|
+
catalog: external_exports.array(McpCatalogEntrySchema).default([])
|
|
479
|
+
});
|
|
331
480
|
|
|
332
481
|
export {
|
|
333
482
|
BlockTypeSchema,
|
|
@@ -349,8 +498,8 @@ export {
|
|
|
349
498
|
ReviewDecisionSchema,
|
|
350
499
|
RepoInfoSchema,
|
|
351
500
|
PlanStatusSchema,
|
|
352
|
-
|
|
353
|
-
|
|
501
|
+
EmbeddingProviderSchema,
|
|
502
|
+
EmbeddingConfigSchema,
|
|
354
503
|
CodemapChunkingStrategySchema,
|
|
355
504
|
CodemapChunkingConfigSchema,
|
|
356
505
|
CodemapBatchConfigSchema,
|
|
@@ -363,7 +512,6 @@ export {
|
|
|
363
512
|
CaptureModeSchema,
|
|
364
513
|
MemorySourceSchema,
|
|
365
514
|
MemoryEntrySchema,
|
|
366
|
-
MemoryEmbeddingConfigSchema,
|
|
367
515
|
MemoryClassifierConfigSchema,
|
|
368
516
|
MemoryRetentionConfigSchema,
|
|
369
517
|
MemoryRankingConfigSchema,
|
|
@@ -371,5 +519,26 @@ export {
|
|
|
371
519
|
ClassificationResultSchema,
|
|
372
520
|
DepgraphPersonalizationConfigSchema,
|
|
373
521
|
DepgraphPagerankConfigSchema,
|
|
374
|
-
DepgraphConfigSchema
|
|
522
|
+
DepgraphConfigSchema,
|
|
523
|
+
TrackerTaskStatusSchema,
|
|
524
|
+
TaskPrioritySchema,
|
|
525
|
+
TrackerTaskSchema,
|
|
526
|
+
TaskFilterSchema,
|
|
527
|
+
TaskCompletionResultSchema,
|
|
528
|
+
AgentPluginMetaSchema,
|
|
529
|
+
ExecuteOptionsSchema,
|
|
530
|
+
ExecuteResultSchema,
|
|
531
|
+
TrackerPluginMetaSchema,
|
|
532
|
+
SyncResultSchema,
|
|
533
|
+
McpConfigFieldSchema,
|
|
534
|
+
McpTransportSchema,
|
|
535
|
+
McpCategorySchema,
|
|
536
|
+
McpSourceSchema,
|
|
537
|
+
McpDetectSignalsSchema,
|
|
538
|
+
McpDefinitionSchema,
|
|
539
|
+
McpLibrarySchema,
|
|
540
|
+
McpActivationSchema,
|
|
541
|
+
McpRepoConfigSchema,
|
|
542
|
+
McpCatalogEntrySchema,
|
|
543
|
+
McpCatalogSchema
|
|
375
544
|
};
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
// ../../packages/http/dist/middleware/auth.js
|
|
2
|
+
import { randomBytes } from "crypto";
|
|
3
|
+
var apiSecret;
|
|
4
|
+
function generateApiSecret() {
|
|
5
|
+
return randomBytes(32).toString("hex");
|
|
6
|
+
}
|
|
7
|
+
function setApiSecret(secret) {
|
|
8
|
+
apiSecret = secret;
|
|
9
|
+
}
|
|
10
|
+
function getApiSecret() {
|
|
11
|
+
return apiSecret;
|
|
12
|
+
}
|
|
13
|
+
var LOOPBACK_ADDRESSES = /* @__PURE__ */ new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
|
|
14
|
+
function validateLoopback(req) {
|
|
15
|
+
const remoteAddr = req.socket.remoteAddress ?? "";
|
|
16
|
+
return LOOPBACK_ADDRESSES.has(remoteAddr);
|
|
17
|
+
}
|
|
18
|
+
function validateAuth(req) {
|
|
19
|
+
if (!validateLoopback(req))
|
|
20
|
+
return false;
|
|
21
|
+
if (apiSecret) {
|
|
22
|
+
const headerSecret = req.headers["x-ulpi-secret"];
|
|
23
|
+
if (headerSecret === apiSecret)
|
|
24
|
+
return true;
|
|
25
|
+
try {
|
|
26
|
+
const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
|
|
27
|
+
const paramSecret = url.searchParams.get("secret");
|
|
28
|
+
if (paramSecret === apiSecret)
|
|
29
|
+
return true;
|
|
30
|
+
} catch {
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ../../packages/http/dist/router.js
|
|
38
|
+
function createRouter() {
|
|
39
|
+
const routes = [];
|
|
40
|
+
function add(method, pattern, handler) {
|
|
41
|
+
routes.push({ method, pattern, handler });
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
get(pattern, handler) {
|
|
45
|
+
add("GET", pattern, handler);
|
|
46
|
+
},
|
|
47
|
+
post(pattern, handler) {
|
|
48
|
+
add("POST", pattern, handler);
|
|
49
|
+
},
|
|
50
|
+
put(pattern, handler) {
|
|
51
|
+
add("PUT", pattern, handler);
|
|
52
|
+
},
|
|
53
|
+
patch(pattern, handler) {
|
|
54
|
+
add("PATCH", pattern, handler);
|
|
55
|
+
},
|
|
56
|
+
delete(pattern, handler) {
|
|
57
|
+
add("DELETE", pattern, handler);
|
|
58
|
+
},
|
|
59
|
+
/**
|
|
60
|
+
* Try each registered route in order. For string patterns, performs an
|
|
61
|
+
* exact match against `ctx.pathname`. For RegExp patterns, tests the
|
|
62
|
+
* pathname and extracts named groups (or positional captures indexed by
|
|
63
|
+
* their number) into `params`.
|
|
64
|
+
*
|
|
65
|
+
* Returns `true` if a matching route was found (and its handler was
|
|
66
|
+
* invoked), `false` otherwise.
|
|
67
|
+
*/
|
|
68
|
+
async handle(ctx) {
|
|
69
|
+
for (const route of routes) {
|
|
70
|
+
if (route.method !== ctx.method)
|
|
71
|
+
continue;
|
|
72
|
+
let params = {};
|
|
73
|
+
if (typeof route.pattern === "string") {
|
|
74
|
+
if (ctx.pathname !== route.pattern)
|
|
75
|
+
continue;
|
|
76
|
+
} else {
|
|
77
|
+
const match = route.pattern.exec(ctx.pathname);
|
|
78
|
+
if (!match)
|
|
79
|
+
continue;
|
|
80
|
+
if (match.groups) {
|
|
81
|
+
params = { ...match.groups };
|
|
82
|
+
}
|
|
83
|
+
for (let i = 1; i < match.length; i++) {
|
|
84
|
+
if (match[i] !== void 0) {
|
|
85
|
+
params[String(i)] = decodeURIComponent(match[i]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
await route.handler({ ...ctx, params });
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ../../packages/http/dist/request.js
|
|
98
|
+
function readBody(req, maxSize = 1048576) {
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const chunks = [];
|
|
101
|
+
let size = 0;
|
|
102
|
+
req.on("data", (chunk) => {
|
|
103
|
+
size += chunk.length;
|
|
104
|
+
if (size > maxSize) {
|
|
105
|
+
req.destroy();
|
|
106
|
+
reject(new Error("Request body too large"));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
chunks.push(chunk);
|
|
110
|
+
});
|
|
111
|
+
req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
|
|
112
|
+
req.on("error", reject);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function readBodyRaw(req, maxSize = 5 * 1024 * 1024) {
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
const chunks = [];
|
|
118
|
+
let size = 0;
|
|
119
|
+
req.on("data", (chunk) => {
|
|
120
|
+
size += chunk.length;
|
|
121
|
+
if (size > maxSize) {
|
|
122
|
+
req.destroy();
|
|
123
|
+
reject(new Error("Request body too large"));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
chunks.push(chunk);
|
|
127
|
+
});
|
|
128
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
129
|
+
req.on("error", reject);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async function parseJsonBody(req) {
|
|
133
|
+
try {
|
|
134
|
+
const raw = await readBody(req);
|
|
135
|
+
const parsed = JSON.parse(raw);
|
|
136
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
137
|
+
return { data: null, error: "Expected a JSON object" };
|
|
138
|
+
}
|
|
139
|
+
return { data: parsed, error: null };
|
|
140
|
+
} catch (err) {
|
|
141
|
+
const message = err instanceof Error ? err.message : "Invalid JSON body";
|
|
142
|
+
return { data: null, error: message };
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
function parseMultipartImage(body, boundary) {
|
|
146
|
+
const boundaryBuffer = Buffer.from(`--${boundary}`);
|
|
147
|
+
const start = body.indexOf(boundaryBuffer);
|
|
148
|
+
if (start === -1)
|
|
149
|
+
return null;
|
|
150
|
+
const headerEnd = body.indexOf(Buffer.from("\r\n\r\n"), start);
|
|
151
|
+
if (headerEnd === -1)
|
|
152
|
+
return null;
|
|
153
|
+
const headers = body.subarray(start + boundaryBuffer.length + 2, headerEnd).toString();
|
|
154
|
+
const ctMatch = headers.match(/Content-Type:\s*(.+)/i);
|
|
155
|
+
const contentType = ctMatch ? ctMatch[1].trim() : "image/png";
|
|
156
|
+
const dataStart = headerEnd + 4;
|
|
157
|
+
const nextBoundary = body.indexOf(boundaryBuffer, dataStart);
|
|
158
|
+
const dataEnd = nextBoundary !== -1 ? nextBoundary - 2 : body.length;
|
|
159
|
+
return { data: body.subarray(dataStart, dataEnd), contentType };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ../../packages/http/dist/response.js
|
|
163
|
+
function resolveOrigin(options, req) {
|
|
164
|
+
if (!options)
|
|
165
|
+
return "*";
|
|
166
|
+
if (typeof options.origin === "function")
|
|
167
|
+
return options.origin(req);
|
|
168
|
+
return options.origin;
|
|
169
|
+
}
|
|
170
|
+
function corsHeaders(options, req) {
|
|
171
|
+
const headers = {
|
|
172
|
+
"Access-Control-Allow-Origin": resolveOrigin(options, req),
|
|
173
|
+
"Access-Control-Allow-Methods": options?.methods ?? "GET, POST, PUT, PATCH, DELETE, OPTIONS",
|
|
174
|
+
"Access-Control-Allow-Headers": options?.headers ?? "Content-Type, Authorization"
|
|
175
|
+
};
|
|
176
|
+
if (options?.credentials) {
|
|
177
|
+
headers["Access-Control-Allow-Credentials"] = "true";
|
|
178
|
+
}
|
|
179
|
+
if (options?.maxAge) {
|
|
180
|
+
headers["Access-Control-Max-Age"] = String(options.maxAge);
|
|
181
|
+
}
|
|
182
|
+
return headers;
|
|
183
|
+
}
|
|
184
|
+
function jsonResponse(res, data, status = 200, req, cors) {
|
|
185
|
+
const body = JSON.stringify(data);
|
|
186
|
+
res.writeHead(status, {
|
|
187
|
+
"Content-Type": "application/json",
|
|
188
|
+
...corsHeaders(cors, req)
|
|
189
|
+
});
|
|
190
|
+
res.end(body);
|
|
191
|
+
}
|
|
192
|
+
function notFound(res, message = "Not found", req, cors) {
|
|
193
|
+
jsonResponse(res, { error: message }, 404, req, cors);
|
|
194
|
+
}
|
|
195
|
+
function sseHeaders(res, req, cors) {
|
|
196
|
+
res.writeHead(200, {
|
|
197
|
+
"Content-Type": "text/event-stream",
|
|
198
|
+
"Cache-Control": "no-cache",
|
|
199
|
+
Connection: "keep-alive",
|
|
200
|
+
...corsHeaders(cors, req)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
function sseEvent(res, eventName, data) {
|
|
204
|
+
res.write(`event: ${eventName}
|
|
205
|
+
data: ${JSON.stringify(data)}
|
|
206
|
+
|
|
207
|
+
`);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ../../packages/http/dist/middleware/rate-limit.js
|
|
211
|
+
var store = /* @__PURE__ */ new Map();
|
|
212
|
+
var CLEANUP_INTERVAL = 6e4;
|
|
213
|
+
setInterval(() => {
|
|
214
|
+
const now = Date.now();
|
|
215
|
+
for (const [key, entry] of store) {
|
|
216
|
+
if (now >= entry.resetAt) {
|
|
217
|
+
store.delete(key);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}, CLEANUP_INTERVAL).unref();
|
|
221
|
+
function checkRateLimit(key, limit = 200, windowMs = 6e4) {
|
|
222
|
+
const now = Date.now();
|
|
223
|
+
const entry = store.get(key);
|
|
224
|
+
if (!entry || now >= entry.resetAt) {
|
|
225
|
+
store.set(key, { count: 1, resetAt: now + windowMs });
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
entry.count++;
|
|
229
|
+
return entry.count <= limit;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ../../packages/http/dist/middleware/cors.js
|
|
233
|
+
function handleCorsPreFlight(req, res, options) {
|
|
234
|
+
if ((req.method ?? "GET") !== "OPTIONS")
|
|
235
|
+
return false;
|
|
236
|
+
res.writeHead(204, corsHeaders(options, req));
|
|
237
|
+
res.end();
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// ../../packages/http/dist/websocket.js
|
|
242
|
+
import { WebSocketServer } from "ws";
|
|
243
|
+
|
|
244
|
+
// ../../packages/http/dist/sse.js
|
|
245
|
+
var SSEBroadcaster = class _SSEBroadcaster {
|
|
246
|
+
static MAX_CLIENTS = 100;
|
|
247
|
+
clients = /* @__PURE__ */ new Set();
|
|
248
|
+
/** Check if the broadcaster can accept another client. */
|
|
249
|
+
canAccept() {
|
|
250
|
+
return this.clients.size < _SSEBroadcaster.MAX_CLIENTS;
|
|
251
|
+
}
|
|
252
|
+
/** Register a new SSE client. */
|
|
253
|
+
add(res) {
|
|
254
|
+
this.clients.add(res);
|
|
255
|
+
}
|
|
256
|
+
/** Remove a disconnected SSE client. */
|
|
257
|
+
remove(res) {
|
|
258
|
+
this.clients.delete(res);
|
|
259
|
+
}
|
|
260
|
+
/** Broadcast a named SSE event to every connected client. */
|
|
261
|
+
broadcast(eventName, data) {
|
|
262
|
+
const message = `event: ${eventName}
|
|
263
|
+
data: ${JSON.stringify(data)}
|
|
264
|
+
|
|
265
|
+
`;
|
|
266
|
+
for (const client of this.clients) {
|
|
267
|
+
try {
|
|
268
|
+
client.write(message);
|
|
269
|
+
} catch {
|
|
270
|
+
this.clients.delete(client);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/** Number of currently connected clients. */
|
|
275
|
+
get size() {
|
|
276
|
+
return this.clients.size;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
export {
|
|
281
|
+
createRouter,
|
|
282
|
+
readBody,
|
|
283
|
+
readBodyRaw,
|
|
284
|
+
parseJsonBody,
|
|
285
|
+
parseMultipartImage,
|
|
286
|
+
jsonResponse,
|
|
287
|
+
notFound,
|
|
288
|
+
sseHeaders,
|
|
289
|
+
sseEvent,
|
|
290
|
+
generateApiSecret,
|
|
291
|
+
setApiSecret,
|
|
292
|
+
getApiSecret,
|
|
293
|
+
validateLoopback,
|
|
294
|
+
validateAuth,
|
|
295
|
+
checkRateLimit,
|
|
296
|
+
handleCorsPreFlight,
|
|
297
|
+
SSEBroadcaster
|
|
298
|
+
};
|