@yiaany/ghostapi 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.
- package/CHANGELOG.md +29 -0
- package/CONTRIBUTING.md +117 -0
- package/LICENSE +21 -0
- package/README.md +354 -0
- package/SECURITY.md +37 -0
- package/dist/agents/agentPrompt.d.ts +5 -0
- package/dist/agents/agentPrompt.js +30 -0
- package/dist/agents/agentPrompt.js.map +1 -0
- package/dist/ai/aiClient.d.ts +7 -0
- package/dist/ai/aiClient.js +30 -0
- package/dist/ai/aiClient.js.map +1 -0
- package/dist/ai/aiGenerator.d.ts +10 -0
- package/dist/ai/aiGenerator.js +101 -0
- package/dist/ai/aiGenerator.js.map +1 -0
- package/dist/ai/genericInference.d.ts +5 -0
- package/dist/ai/genericInference.js +80 -0
- package/dist/ai/genericInference.js.map +1 -0
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/jsonRepair.d.ts +2 -0
- package/dist/ai/jsonRepair.js +31 -0
- package/dist/ai/jsonRepair.js.map +1 -0
- package/dist/ai/prompts.d.ts +4 -0
- package/dist/ai/prompts.js +81 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/behavior/behaviorStore.d.ts +12 -0
- package/dist/behavior/behaviorStore.js +72 -0
- package/dist/behavior/behaviorStore.js.map +1 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.js +34 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cli/errors.d.ts +4 -0
- package/dist/cli/errors.js +9 -0
- package/dist/cli/errors.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +277 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +56 -0
- package/dist/cli/parser.js +169 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/config/localConfig.d.ts +16 -0
- package/dist/config/localConfig.js +58 -0
- package/dist/config/localConfig.js.map +1 -0
- package/dist/config/serverConfig.d.ts +13 -0
- package/dist/config/serverConfig.js +44 -0
- package/dist/config/serverConfig.js.map +1 -0
- package/dist/dashboard/app.js +615 -0
- package/dist/dashboard/dashboard.d.ts +4 -0
- package/dist/dashboard/dashboard.js +20 -0
- package/dist/dashboard/dashboard.js.map +1 -0
- package/dist/dashboard/index.d.ts +1 -0
- package/dist/dashboard/index.html +298 -0
- package/dist/dashboard/index.js +2 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/styles.css +349 -0
- package/dist/errors/errorEngine.d.ts +3 -0
- package/dist/errors/errorEngine.js +65 -0
- package/dist/errors/errorEngine.js.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/providerErrors.d.ts +3 -0
- package/dist/errors/providerErrors.js +6 -0
- package/dist/errors/providerErrors.js.map +1 -0
- package/dist/fault/faultLab.d.ts +27 -0
- package/dist/fault/faultLab.js +89 -0
- package/dist/fault/faultLab.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/landing/assets/index-BXR41fAD.css +1 -0
- package/dist/landing/assets/index-D8_ggMRE.js +55 -0
- package/dist/landing/index.html +15 -0
- package/dist/landing/landing.d.ts +3 -0
- package/dist/landing/landing.js +12 -0
- package/dist/landing/landing.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +52 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/providers/discord.d.ts +2 -0
- package/dist/providers/discord.js +11 -0
- package/dist/providers/discord.js.map +1 -0
- package/dist/providers/generic.d.ts +2 -0
- package/dist/providers/generic.js +13 -0
- package/dist/providers/generic.js.map +1 -0
- package/dist/providers/github.d.ts +2 -0
- package/dist/providers/github.js +11 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +2 -0
- package/dist/providers/openai.js +15 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +12 -0
- package/dist/providers/registry.js +23 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/resend.d.ts +2 -0
- package/dist/providers/resend.js +12 -0
- package/dist/providers/resend.js.map +1 -0
- package/dist/providers/stripe.d.ts +2 -0
- package/dist/providers/stripe.js +15 -0
- package/dist/providers/stripe.js.map +1 -0
- package/dist/providers/twilio.d.ts +2 -0
- package/dist/providers/twilio.js +14 -0
- package/dist/providers/twilio.js.map +1 -0
- package/dist/providers/types.d.ts +13 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/proxy/cacheKey.d.ts +2 -0
- package/dist/proxy/cacheKey.js +37 -0
- package/dist/proxy/cacheKey.js.map +1 -0
- package/dist/proxy/providerDetector.d.ts +11 -0
- package/dist/proxy/providerDetector.js +74 -0
- package/dist/proxy/providerDetector.js.map +1 -0
- package/dist/proxy/proxyHandler.d.ts +3 -0
- package/dist/proxy/proxyHandler.js +114 -0
- package/dist/proxy/proxyHandler.js.map +1 -0
- package/dist/proxy/requestNormalizer.d.ts +11 -0
- package/dist/proxy/requestNormalizer.js +30 -0
- package/dist/proxy/requestNormalizer.js.map +1 -0
- package/dist/report/safetyReport.d.ts +13 -0
- package/dist/report/safetyReport.js +65 -0
- package/dist/report/safetyReport.js.map +1 -0
- package/dist/rules/aiRules.d.ts +7 -0
- package/dist/rules/aiRules.js +31 -0
- package/dist/rules/aiRules.js.map +1 -0
- package/dist/scenarios/scenarioStore.d.ts +37 -0
- package/dist/scenarios/scenarioStore.js +201 -0
- package/dist/scenarios/scenarioStore.js.map +1 -0
- package/dist/security/headerSanitizer.d.ts +3 -0
- package/dist/security/headerSanitizer.js +12 -0
- package/dist/security/headerSanitizer.js.map +1 -0
- package/dist/security/maskSecrets.d.ts +1 -0
- package/dist/security/maskSecrets.js +2 -0
- package/dist/security/maskSecrets.js.map +1 -0
- package/dist/security/secrets.d.ts +4 -0
- package/dist/security/secrets.js +61 -0
- package/dist/security/secrets.js.map +1 -0
- package/dist/server/createServer.d.ts +8 -0
- package/dist/server/createServer.js +42 -0
- package/dist/server/createServer.js.map +1 -0
- package/dist/server/eventsStore.d.ts +17 -0
- package/dist/server/eventsStore.js +31 -0
- package/dist/server/eventsStore.js.map +1 -0
- package/dist/server/routes.d.ts +3 -0
- package/dist/server/routes.js +189 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/sse.d.ts +5 -0
- package/dist/server/sse.js +32 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/setup/sdkDetector.d.ts +9 -0
- package/dist/setup/sdkDetector.js +31 -0
- package/dist/setup/sdkDetector.js.map +1 -0
- package/dist/setup/setupGenerator.d.ts +28 -0
- package/dist/setup/setupGenerator.js +146 -0
- package/dist/setup/setupGenerator.js.map +1 -0
- package/dist/state/index.d.ts +1 -0
- package/dist/state/index.js +2 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/stateExtractor.d.ts +3 -0
- package/dist/state/stateExtractor.js +36 -0
- package/dist/state/stateExtractor.js.map +1 -0
- package/dist/state/stateResolver.d.ts +8 -0
- package/dist/state/stateResolver.js +95 -0
- package/dist/state/stateResolver.js.map +1 -0
- package/dist/state/stateStore.d.ts +4 -0
- package/dist/state/stateStore.js +72 -0
- package/dist/state/stateStore.js.map +1 -0
- package/dist/tests/testGenerator.d.ts +6 -0
- package/dist/tests/testGenerator.js +33 -0
- package/dist/tests/testGenerator.js.map +1 -0
- package/dist/utils/json.d.ts +2 -0
- package/dist/utils/json.js +10 -0
- package/dist/utils/json.js.map +1 -0
- package/docs/release-checklist.md +71 -0
- package/examples/agent-instructions/README.md +39 -0
- package/examples/generic-rest/README.md +27 -0
- package/examples/github-fetch/README.md +35 -0
- package/examples/resend-node/README.md +22 -0
- package/examples/stripe-node/README.md +29 -0
- package/examples/twilio-node/README.md +21 -0
- package/package.json +67 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import http from "node:http";
|
|
3
|
+
import https from "node:https";
|
|
4
|
+
import net from "node:net";
|
|
5
|
+
import { access, mkdir } from "node:fs/promises";
|
|
6
|
+
import { constants } from "node:fs";
|
|
7
|
+
import { spawn } from "node:child_process";
|
|
8
|
+
import { generate } from "selfsigned";
|
|
9
|
+
import { createServer } from "../server/createServer.js";
|
|
10
|
+
import { clearCache } from "../cache/index.js";
|
|
11
|
+
import { clearState } from "../state/stateStore.js";
|
|
12
|
+
import { clearEvents } from "../server/eventsStore.js";
|
|
13
|
+
import { DEFAULT_MODEL, loadServerConfig } from "../config/serverConfig.js";
|
|
14
|
+
import { CONFIG_PATH, GHOSTAPI_DIR, initializeLocalConfig, readLocalConfig, writeLocalConfig } from "../config/localConfig.js";
|
|
15
|
+
import { isRegisteredProvider, providerRegistry } from "../providers/registry.js";
|
|
16
|
+
import { parseCliArgs } from "./parser.js";
|
|
17
|
+
import { CliError } from "./errors.js";
|
|
18
|
+
import { startMcpServer } from "../mcp/server.js";
|
|
19
|
+
import { generateRepoSetup, writeRepoSetup } from "../setup/setupGenerator.js";
|
|
20
|
+
import { generateSafetyReport } from "../report/safetyReport.js";
|
|
21
|
+
async function main() {
|
|
22
|
+
const command = parseCliArgs(process.argv.slice(2));
|
|
23
|
+
switch (command.name) {
|
|
24
|
+
case "start": {
|
|
25
|
+
const config = loadServerConfig(process.env, [], command.options);
|
|
26
|
+
await startServer(config, command.options.open === true);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
case "clear":
|
|
30
|
+
await clearTarget(command.target);
|
|
31
|
+
return;
|
|
32
|
+
case "model-get":
|
|
33
|
+
await printModel();
|
|
34
|
+
return;
|
|
35
|
+
case "model-set":
|
|
36
|
+
await setModel(command.model);
|
|
37
|
+
return;
|
|
38
|
+
case "providers-list":
|
|
39
|
+
listProviders();
|
|
40
|
+
return;
|
|
41
|
+
case "providers-inspect":
|
|
42
|
+
inspectProvider(command.provider);
|
|
43
|
+
return;
|
|
44
|
+
case "doctor":
|
|
45
|
+
await runDoctor(command.options.port);
|
|
46
|
+
return;
|
|
47
|
+
case "init":
|
|
48
|
+
await initProject();
|
|
49
|
+
return;
|
|
50
|
+
case "setup":
|
|
51
|
+
await printRepoSetup(command.options.write === true);
|
|
52
|
+
return;
|
|
53
|
+
case "open":
|
|
54
|
+
openDashboard(command.options);
|
|
55
|
+
return;
|
|
56
|
+
case "report":
|
|
57
|
+
await printSafetyReport();
|
|
58
|
+
return;
|
|
59
|
+
case "mcp":
|
|
60
|
+
await startMcpServer();
|
|
61
|
+
return;
|
|
62
|
+
case "help":
|
|
63
|
+
printHelp();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function startServer(config, open = false) {
|
|
68
|
+
const app = await createServer(config);
|
|
69
|
+
const protocol = config.https ? "https" : "http";
|
|
70
|
+
const server = config.https
|
|
71
|
+
? https.createServer(await createDevTlsOptions(config.host), app)
|
|
72
|
+
: http.createServer(app);
|
|
73
|
+
server.on("error", (error) => {
|
|
74
|
+
if (error.code === "EADDRINUSE") {
|
|
75
|
+
console.error(`Error: Port ${config.port} is already in use.`);
|
|
76
|
+
console.error(`Hint: Run ghostapi start --port <free-port> or stop the process using ${config.port}.`);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
console.error(`Error: ${error.message}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
});
|
|
82
|
+
server.listen(config.port, config.host, () => {
|
|
83
|
+
const dashboardUrl = `${protocol}://${config.host}:${config.port}/dashboard`;
|
|
84
|
+
console.log(`GhostAPI listening on ${protocol}://${config.host}:${config.port}`);
|
|
85
|
+
console.log(`Dashboard: ${dashboardUrl}`);
|
|
86
|
+
console.log(`Model: ${config.model}${config.offline ? " (offline)" : ""}`);
|
|
87
|
+
if (open)
|
|
88
|
+
openUrl(dashboardUrl);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
async function createDevTlsOptions(host) {
|
|
92
|
+
const pems = await generate([{ name: "commonName", value: host }], {
|
|
93
|
+
algorithm: "sha256",
|
|
94
|
+
keySize: 2048,
|
|
95
|
+
extensions: [
|
|
96
|
+
{ name: "basicConstraints", cA: false },
|
|
97
|
+
{ name: "keyUsage", digitalSignature: true, keyEncipherment: true },
|
|
98
|
+
{ name: "extKeyUsage", serverAuth: true },
|
|
99
|
+
{ name: "subjectAltName", altNames: [{ type: 2, value: "localhost" }, { type: 7, ip: "127.0.0.1" }] }
|
|
100
|
+
]
|
|
101
|
+
});
|
|
102
|
+
return { key: pems.private, cert: pems.cert };
|
|
103
|
+
}
|
|
104
|
+
async function clearTarget(target) {
|
|
105
|
+
if (target === "cache" || target === "all")
|
|
106
|
+
await clearCache();
|
|
107
|
+
if (target === "state" || target === "all")
|
|
108
|
+
await clearState();
|
|
109
|
+
if (target === "events" || target === "all")
|
|
110
|
+
await clearEvents();
|
|
111
|
+
console.log(`Cleared ${target}.`);
|
|
112
|
+
}
|
|
113
|
+
async function initProject() {
|
|
114
|
+
const result = await initializeLocalConfig();
|
|
115
|
+
console.log(result.created ? `Created ${CONFIG_PATH}.` : `${CONFIG_PATH} already exists.`);
|
|
116
|
+
console.log(`Model: ${result.config.model ?? DEFAULT_MODEL}`);
|
|
117
|
+
}
|
|
118
|
+
async function printRepoSetup(write) {
|
|
119
|
+
const written = write ? await writeRepoSetup() : null;
|
|
120
|
+
const setup = written?.setup ?? await generateRepoSetup();
|
|
121
|
+
console.log(setup.summary);
|
|
122
|
+
console.log("");
|
|
123
|
+
console.log("Commands:");
|
|
124
|
+
for (const command of setup.commands)
|
|
125
|
+
console.log(` ${command}`);
|
|
126
|
+
console.log("");
|
|
127
|
+
console.log("Files to copy:");
|
|
128
|
+
for (const file of setup.files)
|
|
129
|
+
console.log(` ${file.path} - ${file.description}`);
|
|
130
|
+
console.log("");
|
|
131
|
+
console.log("Patches:");
|
|
132
|
+
for (const patch of setup.patches)
|
|
133
|
+
console.log(` ${patch.title} -> ${patch.appliesTo}`);
|
|
134
|
+
if (written !== null) {
|
|
135
|
+
const { result } = written;
|
|
136
|
+
console.log("");
|
|
137
|
+
console.log(`Created: ${result.created.length > 0 ? result.created.join(", ") : "none"}`);
|
|
138
|
+
console.log(`Skipped existing: ${result.skipped.length > 0 ? result.skipped.join(", ") : "none"}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function openDashboard(options) {
|
|
142
|
+
const protocol = options.https ? "https" : "http";
|
|
143
|
+
const host = options.host ?? "127.0.0.1";
|
|
144
|
+
const port = options.port ?? 8080;
|
|
145
|
+
const url = `${protocol}://${host}:${port}/dashboard`;
|
|
146
|
+
openUrl(url);
|
|
147
|
+
console.log(`Opened ${url}`);
|
|
148
|
+
}
|
|
149
|
+
function openUrl(url) {
|
|
150
|
+
const command = process.platform === "win32" ? "cmd" : process.platform === "darwin" ? "open" : "xdg-open";
|
|
151
|
+
const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
152
|
+
const child = spawn(command, args, { detached: true, stdio: "ignore" });
|
|
153
|
+
child.unref();
|
|
154
|
+
}
|
|
155
|
+
async function printSafetyReport() {
|
|
156
|
+
const report = await generateSafetyReport();
|
|
157
|
+
console.log(`GhostAPI safety report for ${report.projectRoot}`);
|
|
158
|
+
console.log(`Detected SDKs: ${report.detected.length > 0 ? report.detected.join(", ") : "none"}`);
|
|
159
|
+
console.log("");
|
|
160
|
+
if (report.findings.length === 0) {
|
|
161
|
+
console.log("No high-risk provider usage found.");
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
console.log("Findings:");
|
|
165
|
+
for (const finding of report.findings) {
|
|
166
|
+
console.log(` ${finding.severity.toUpperCase()} ${finding.file ? `${finding.file}: ` : ""}${finding.message}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
console.log("");
|
|
170
|
+
console.log("Recommendations:");
|
|
171
|
+
for (const recommendation of report.recommendations)
|
|
172
|
+
console.log(` - ${recommendation}`);
|
|
173
|
+
}
|
|
174
|
+
async function printModel() {
|
|
175
|
+
const config = await readLocalConfig();
|
|
176
|
+
console.log(config.model ?? process.env.GHOSTAPI_MODEL ?? DEFAULT_MODEL);
|
|
177
|
+
}
|
|
178
|
+
async function setModel(model) {
|
|
179
|
+
const config = await readLocalConfig();
|
|
180
|
+
await writeLocalConfig({ ...config, model });
|
|
181
|
+
console.log(`Model set to ${model}.`);
|
|
182
|
+
}
|
|
183
|
+
function listProviders() {
|
|
184
|
+
for (const adapter of Object.values(providerRegistry)) {
|
|
185
|
+
console.log(`${adapter.name.padEnd(8)} ${adapter.displayName}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function inspectProvider(provider) {
|
|
189
|
+
if (!isRegisteredProvider(provider)) {
|
|
190
|
+
throw new CliError(`Unknown provider: ${provider}`, `Run ghostapi providers list to see supported providers.`);
|
|
191
|
+
}
|
|
192
|
+
const adapter = providerRegistry[provider];
|
|
193
|
+
console.log(`${adapter.displayName}`);
|
|
194
|
+
console.log(`Name: ${adapter.name}`);
|
|
195
|
+
console.log(`Mode: ${adapter.name === "generic" ? "fallback" : "built-in adapter"}`);
|
|
196
|
+
console.log("Error formatting: supported");
|
|
197
|
+
}
|
|
198
|
+
async function runDoctor(portOverride) {
|
|
199
|
+
const config = loadServerConfig(process.env, [], portOverride ? { port: portOverride } : {});
|
|
200
|
+
const checks = [];
|
|
201
|
+
const major = Number(process.versions.node.split(".")[0]);
|
|
202
|
+
checks.push({ label: "Node version", ok: major >= 20, detail: process.versions.node, hint: "Install Node.js 20 or newer." });
|
|
203
|
+
const writeAccess = await canWriteGhostApiDir();
|
|
204
|
+
checks.push({ label: ".ghostapi write access", ok: writeAccess, detail: GHOSTAPI_DIR, hint: "Check directory permissions in the project root." });
|
|
205
|
+
const portAvailable = await isPortAvailable(config.host, config.port);
|
|
206
|
+
checks.push({ label: "Port availability", ok: portAvailable, detail: `${config.host}:${config.port}`, hint: `Run ghostapi start --port <free-port>.` });
|
|
207
|
+
checks.push({ label: "Model config", ok: config.model.trim() !== "", detail: config.model, hint: "Run ghostapi model set <model>." });
|
|
208
|
+
const hasApiKey = Boolean(config.apiKey);
|
|
209
|
+
checks.push({
|
|
210
|
+
label: "LLM API key",
|
|
211
|
+
ok: config.offline || hasApiKey,
|
|
212
|
+
detail: config.offline ? "offline mode" : hasApiKey ? "present" : "missing",
|
|
213
|
+
hint: "Set GHOSTAPI_LLM_API_KEY, OPENAI_API_KEY, or run ghostapi start --offline."
|
|
214
|
+
});
|
|
215
|
+
const tlsBypass = process.env.NODE_TLS_REJECT_UNAUTHORIZED === "0";
|
|
216
|
+
checks.push({ label: "TLS safety", ok: !tlsBypass, detail: tlsBypass ? "NODE_TLS_REJECT_UNAUTHORIZED=0" : "safe", hint: "Unset NODE_TLS_REJECT_UNAUTHORIZED." });
|
|
217
|
+
let failed = 0;
|
|
218
|
+
for (const check of checks) {
|
|
219
|
+
const marker = check.ok ? "ok" : "fail";
|
|
220
|
+
console.log(`${marker.padEnd(4)} ${check.label}: ${check.detail}`);
|
|
221
|
+
if (!check.ok) {
|
|
222
|
+
failed += 1;
|
|
223
|
+
if (check.hint)
|
|
224
|
+
console.log(` Hint: ${check.hint}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (failed > 0)
|
|
228
|
+
throw new CliError(`Doctor found ${failed} issue${failed === 1 ? "" : "s"}.`);
|
|
229
|
+
}
|
|
230
|
+
async function canWriteGhostApiDir() {
|
|
231
|
+
try {
|
|
232
|
+
await mkdir(GHOSTAPI_DIR, { recursive: true });
|
|
233
|
+
await access(GHOSTAPI_DIR, constants.W_OK);
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
function isPortAvailable(host, port) {
|
|
241
|
+
return new Promise((resolve) => {
|
|
242
|
+
const server = net.createServer();
|
|
243
|
+
server.once("error", () => resolve(false));
|
|
244
|
+
server.once("listening", () => server.close(() => resolve(true)));
|
|
245
|
+
server.listen(port, host);
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function printHelp() {
|
|
249
|
+
console.log(`GhostAPI CLI
|
|
250
|
+
|
|
251
|
+
Usage:
|
|
252
|
+
ghostapi start [--host 127.0.0.1] [--port 8080] [--model gpt-4o-mini] [--offline] [--https] [--open]
|
|
253
|
+
ghostapi open [--host 127.0.0.1] [--port 8080] [--https]
|
|
254
|
+
ghostapi clear cache|state|events|all
|
|
255
|
+
ghostapi model get
|
|
256
|
+
ghostapi model set <model>
|
|
257
|
+
ghostapi providers list
|
|
258
|
+
ghostapi providers inspect <provider>
|
|
259
|
+
ghostapi setup [--write]
|
|
260
|
+
ghostapi report
|
|
261
|
+
ghostapi mcp
|
|
262
|
+
ghostapi doctor [--port 8080]
|
|
263
|
+
ghostapi init`);
|
|
264
|
+
}
|
|
265
|
+
main().catch((error) => {
|
|
266
|
+
if (error instanceof CliError) {
|
|
267
|
+
console.error(`Error: ${error.message}`);
|
|
268
|
+
if (error.hint)
|
|
269
|
+
console.error(`Hint: ${error.hint}`);
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
const message = error instanceof Error ? error.message : "Unknown CLI error";
|
|
273
|
+
console.error(`Error: ${message}`);
|
|
274
|
+
console.error("Hint: Run ghostapi doctor for environment diagnostics.");
|
|
275
|
+
process.exit(1);
|
|
276
|
+
});
|
|
277
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type CliCommand = {
|
|
2
|
+
name: "start";
|
|
3
|
+
options: StartOptions;
|
|
4
|
+
} | {
|
|
5
|
+
name: "clear";
|
|
6
|
+
target: ClearTarget;
|
|
7
|
+
} | {
|
|
8
|
+
name: "model-get";
|
|
9
|
+
} | {
|
|
10
|
+
name: "model-set";
|
|
11
|
+
model: string;
|
|
12
|
+
} | {
|
|
13
|
+
name: "providers-list";
|
|
14
|
+
} | {
|
|
15
|
+
name: "providers-inspect";
|
|
16
|
+
provider: string;
|
|
17
|
+
} | {
|
|
18
|
+
name: "doctor";
|
|
19
|
+
options: DoctorOptions;
|
|
20
|
+
} | {
|
|
21
|
+
name: "init";
|
|
22
|
+
} | {
|
|
23
|
+
name: "setup";
|
|
24
|
+
options: SetupOptions;
|
|
25
|
+
} | {
|
|
26
|
+
name: "open";
|
|
27
|
+
options: OpenOptions;
|
|
28
|
+
} | {
|
|
29
|
+
name: "report";
|
|
30
|
+
} | {
|
|
31
|
+
name: "mcp";
|
|
32
|
+
} | {
|
|
33
|
+
name: "help";
|
|
34
|
+
};
|
|
35
|
+
export type StartOptions = {
|
|
36
|
+
host?: string;
|
|
37
|
+
port?: number;
|
|
38
|
+
model?: string;
|
|
39
|
+
offline?: boolean;
|
|
40
|
+
https?: boolean;
|
|
41
|
+
open?: boolean;
|
|
42
|
+
};
|
|
43
|
+
export type DoctorOptions = {
|
|
44
|
+
port?: number;
|
|
45
|
+
};
|
|
46
|
+
export type SetupOptions = {
|
|
47
|
+
write?: boolean;
|
|
48
|
+
};
|
|
49
|
+
export type OpenOptions = {
|
|
50
|
+
host?: string;
|
|
51
|
+
port?: number;
|
|
52
|
+
https?: boolean;
|
|
53
|
+
};
|
|
54
|
+
export type ClearTarget = "cache" | "state" | "events" | "all";
|
|
55
|
+
export declare function parseCliArgs(args: string[]): CliCommand;
|
|
56
|
+
export declare function parsePort(value: string, label: string): number;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { CliError } from "./errors.js";
|
|
2
|
+
export function parseCliArgs(args) {
|
|
3
|
+
const [command = "start", subcommand, ...rest] = args;
|
|
4
|
+
if (command === "--help" || command === "-h" || command === "help") {
|
|
5
|
+
return { name: "help" };
|
|
6
|
+
}
|
|
7
|
+
if (command === "start") {
|
|
8
|
+
return { name: "start", options: parseStartOptions(args.slice(1)) };
|
|
9
|
+
}
|
|
10
|
+
if (command === "clear") {
|
|
11
|
+
if (!isClearTarget(subcommand)) {
|
|
12
|
+
throw new CliError(`Unknown clear target: ${subcommand ?? "<missing>"}`, "Use one of: ghostapi clear cache | state | events | all");
|
|
13
|
+
}
|
|
14
|
+
if (rest.length > 0) {
|
|
15
|
+
throw new CliError(`Unexpected argument: ${rest[0]}`, `Use: ghostapi clear ${subcommand}`);
|
|
16
|
+
}
|
|
17
|
+
return { name: "clear", target: subcommand };
|
|
18
|
+
}
|
|
19
|
+
if (command === "model") {
|
|
20
|
+
if (subcommand === "get")
|
|
21
|
+
return { name: "model-get" };
|
|
22
|
+
if (subcommand === "set") {
|
|
23
|
+
const model = rest[0];
|
|
24
|
+
if (!model)
|
|
25
|
+
throw new CliError("Missing model name.", "Use: ghostapi model set gemini-flash");
|
|
26
|
+
if (rest.length > 1)
|
|
27
|
+
throw new CliError(`Unexpected argument: ${rest[1]}`, "Model names cannot contain spaces.");
|
|
28
|
+
return { name: "model-set", model };
|
|
29
|
+
}
|
|
30
|
+
throw new CliError(`Unknown model command: ${subcommand ?? "<missing>"}`, "Use: ghostapi model get | ghostapi model set <model>");
|
|
31
|
+
}
|
|
32
|
+
if (command === "providers") {
|
|
33
|
+
if (subcommand === "list")
|
|
34
|
+
return { name: "providers-list" };
|
|
35
|
+
if (subcommand === "inspect") {
|
|
36
|
+
const provider = rest[0];
|
|
37
|
+
if (!provider)
|
|
38
|
+
throw new CliError("Missing provider name.", "Use: ghostapi providers inspect stripe");
|
|
39
|
+
if (rest.length > 1)
|
|
40
|
+
throw new CliError(`Unexpected argument: ${rest[1]}`, `Use: ghostapi providers inspect ${provider}`);
|
|
41
|
+
return { name: "providers-inspect", provider };
|
|
42
|
+
}
|
|
43
|
+
throw new CliError(`Unknown providers command: ${subcommand ?? "<missing>"}`, "Use: ghostapi providers list | ghostapi providers inspect <name>");
|
|
44
|
+
}
|
|
45
|
+
if (command === "doctor") {
|
|
46
|
+
return { name: "doctor", options: parseDoctorOptions(args.slice(1)) };
|
|
47
|
+
}
|
|
48
|
+
if (command === "init") {
|
|
49
|
+
if (args.length > 1)
|
|
50
|
+
throw new CliError(`Unexpected argument: ${args[1]}`, "Use: ghostapi init");
|
|
51
|
+
return { name: "init" };
|
|
52
|
+
}
|
|
53
|
+
if (command === "setup") {
|
|
54
|
+
return { name: "setup", options: parseSetupOptions(args.slice(1)) };
|
|
55
|
+
}
|
|
56
|
+
if (command === "open") {
|
|
57
|
+
return { name: "open", options: parseOpenOptions(args.slice(1)) };
|
|
58
|
+
}
|
|
59
|
+
if (command === "report") {
|
|
60
|
+
if (args.length > 1)
|
|
61
|
+
throw new CliError(`Unexpected argument: ${args[1]}`, "Use: ghostapi report");
|
|
62
|
+
return { name: "report" };
|
|
63
|
+
}
|
|
64
|
+
if (command === "mcp") {
|
|
65
|
+
if (args.length > 1)
|
|
66
|
+
throw new CliError(`Unexpected argument: ${args[1]}`, "Use: ghostapi mcp");
|
|
67
|
+
return { name: "mcp" };
|
|
68
|
+
}
|
|
69
|
+
throw new CliError(`Unknown command: ${args.join(" ")}`, "Run ghostapi --help to see available commands.");
|
|
70
|
+
}
|
|
71
|
+
function parseStartOptions(args) {
|
|
72
|
+
const options = {};
|
|
73
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
74
|
+
const arg = args[index];
|
|
75
|
+
if (arg === "--offline") {
|
|
76
|
+
options.offline = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (arg === "--https") {
|
|
80
|
+
options.https = true;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (arg === "--open") {
|
|
84
|
+
options.open = true;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (arg === "--host") {
|
|
88
|
+
options.host = readValue(args, index, arg);
|
|
89
|
+
index += 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (arg === "--port") {
|
|
93
|
+
options.port = parsePort(readValue(args, index, arg), "--port");
|
|
94
|
+
index += 1;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (arg === "--model") {
|
|
98
|
+
options.model = readValue(args, index, arg);
|
|
99
|
+
index += 1;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
throw new CliError(`Unknown start option: ${arg}`, "Supported options: --host, --port, --model, --offline, --https, --open");
|
|
103
|
+
}
|
|
104
|
+
return options;
|
|
105
|
+
}
|
|
106
|
+
function parseSetupOptions(args) {
|
|
107
|
+
const options = {};
|
|
108
|
+
for (const arg of args) {
|
|
109
|
+
if (arg === "--write") {
|
|
110
|
+
options.write = true;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
throw new CliError(`Unknown setup option: ${arg}`, "Supported option: --write");
|
|
114
|
+
}
|
|
115
|
+
return options;
|
|
116
|
+
}
|
|
117
|
+
function parseOpenOptions(args) {
|
|
118
|
+
const options = {};
|
|
119
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
120
|
+
const arg = args[index];
|
|
121
|
+
if (arg === "--https") {
|
|
122
|
+
options.https = true;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (arg === "--host") {
|
|
126
|
+
options.host = readValue(args, index, arg);
|
|
127
|
+
index += 1;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (arg === "--port") {
|
|
131
|
+
options.port = parsePort(readValue(args, index, arg), "--port");
|
|
132
|
+
index += 1;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
throw new CliError(`Unknown open option: ${arg}`, "Supported options: --host, --port, --https");
|
|
136
|
+
}
|
|
137
|
+
return options;
|
|
138
|
+
}
|
|
139
|
+
function parseDoctorOptions(args) {
|
|
140
|
+
const options = {};
|
|
141
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
142
|
+
const arg = args[index];
|
|
143
|
+
if (arg === "--port") {
|
|
144
|
+
options.port = parsePort(readValue(args, index, arg), "--port");
|
|
145
|
+
index += 1;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
throw new CliError(`Unknown doctor option: ${arg}`, "Supported option: --port 8080");
|
|
149
|
+
}
|
|
150
|
+
return options;
|
|
151
|
+
}
|
|
152
|
+
function readValue(args, index, flag) {
|
|
153
|
+
const value = args[index + 1];
|
|
154
|
+
if (!value || value.startsWith("--")) {
|
|
155
|
+
throw new CliError(`Missing value for ${flag}.`, `Use ${flag} <value>.`);
|
|
156
|
+
}
|
|
157
|
+
return value;
|
|
158
|
+
}
|
|
159
|
+
export function parsePort(value, label) {
|
|
160
|
+
const port = Number(value);
|
|
161
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
162
|
+
throw new CliError(`Invalid ${label}: ${value}`, "Port must be an integer between 1 and 65535.");
|
|
163
|
+
}
|
|
164
|
+
return port;
|
|
165
|
+
}
|
|
166
|
+
function isClearTarget(value) {
|
|
167
|
+
return value === "cache" || value === "state" || value === "events" || value === "all";
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type GhostApiFileConfig = {
|
|
2
|
+
host?: string;
|
|
3
|
+
port?: number;
|
|
4
|
+
model?: string;
|
|
5
|
+
offline?: boolean;
|
|
6
|
+
https?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare const GHOSTAPI_DIR = ".ghostapi";
|
|
9
|
+
export declare const CONFIG_PATH = ".ghostapi/config.json";
|
|
10
|
+
export declare function readLocalConfigSync(): GhostApiFileConfig;
|
|
11
|
+
export declare function readLocalConfig(): Promise<GhostApiFileConfig>;
|
|
12
|
+
export declare function writeLocalConfig(config: GhostApiFileConfig): Promise<void>;
|
|
13
|
+
export declare function initializeLocalConfig(): Promise<{
|
|
14
|
+
created: boolean;
|
|
15
|
+
config: GhostApiFileConfig;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { isJsonObject } from "../utils/json.js";
|
|
5
|
+
export const GHOSTAPI_DIR = ".ghostapi";
|
|
6
|
+
export const CONFIG_PATH = ".ghostapi/config.json";
|
|
7
|
+
export function readLocalConfigSync() {
|
|
8
|
+
if (!existsSync(CONFIG_PATH))
|
|
9
|
+
return {};
|
|
10
|
+
const parsed = JSON.parse(readFileSync(CONFIG_PATH, "utf8"));
|
|
11
|
+
return sanitizeConfig(parsed);
|
|
12
|
+
}
|
|
13
|
+
export async function readLocalConfig() {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = JSON.parse(await readFile(CONFIG_PATH, "utf8"));
|
|
16
|
+
return sanitizeConfig(parsed);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof Error && "code" in error && error.code === "ENOENT")
|
|
20
|
+
return {};
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export async function writeLocalConfig(config) {
|
|
25
|
+
await mkdir(dirname(CONFIG_PATH), { recursive: true });
|
|
26
|
+
await writeFile(CONFIG_PATH, JSON.stringify(sanitizeConfig(config), null, 2) + "\n", "utf8");
|
|
27
|
+
}
|
|
28
|
+
export async function initializeLocalConfig() {
|
|
29
|
+
if (existsSync(CONFIG_PATH)) {
|
|
30
|
+
return { created: false, config: await readLocalConfig() };
|
|
31
|
+
}
|
|
32
|
+
const config = {
|
|
33
|
+
host: "127.0.0.1",
|
|
34
|
+
port: 8080,
|
|
35
|
+
model: "gpt-4o-mini",
|
|
36
|
+
offline: false,
|
|
37
|
+
https: false
|
|
38
|
+
};
|
|
39
|
+
await writeLocalConfig(config);
|
|
40
|
+
return { created: true, config };
|
|
41
|
+
}
|
|
42
|
+
function sanitizeConfig(value) {
|
|
43
|
+
if (!isJsonObject(value))
|
|
44
|
+
return {};
|
|
45
|
+
const config = {};
|
|
46
|
+
if (typeof value.host === "string" && value.host.trim() !== "")
|
|
47
|
+
config.host = value.host;
|
|
48
|
+
if (typeof value.model === "string" && value.model.trim() !== "")
|
|
49
|
+
config.model = value.model;
|
|
50
|
+
if (typeof value.port === "number" && Number.isInteger(value.port) && value.port >= 1 && value.port <= 65535)
|
|
51
|
+
config.port = value.port;
|
|
52
|
+
if (typeof value.offline === "boolean")
|
|
53
|
+
config.offline = value.offline;
|
|
54
|
+
if (typeof value.https === "boolean")
|
|
55
|
+
config.https = value.https;
|
|
56
|
+
return config;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=localConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localConfig.js","sourceRoot":"","sources":["../../src/config/localConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type GhostApiFileConfig } from "./localConfig.js";
|
|
2
|
+
export type ServerConfig = {
|
|
3
|
+
host: string;
|
|
4
|
+
port: number;
|
|
5
|
+
model: string;
|
|
6
|
+
offline?: boolean;
|
|
7
|
+
https?: boolean;
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const DEFAULT_HOST = "127.0.0.1";
|
|
11
|
+
export declare const DEFAULT_PORT = 8080;
|
|
12
|
+
export declare const DEFAULT_MODEL = "gpt-4o-mini";
|
|
13
|
+
export declare function loadServerConfig(env?: NodeJS.ProcessEnv, args?: string[], overrides?: GhostApiFileConfig): ServerConfig;
|