@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.
Files changed (184) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/CONTRIBUTING.md +117 -0
  3. package/LICENSE +21 -0
  4. package/README.md +354 -0
  5. package/SECURITY.md +37 -0
  6. package/dist/agents/agentPrompt.d.ts +5 -0
  7. package/dist/agents/agentPrompt.js +30 -0
  8. package/dist/agents/agentPrompt.js.map +1 -0
  9. package/dist/ai/aiClient.d.ts +7 -0
  10. package/dist/ai/aiClient.js +30 -0
  11. package/dist/ai/aiClient.js.map +1 -0
  12. package/dist/ai/aiGenerator.d.ts +10 -0
  13. package/dist/ai/aiGenerator.js +101 -0
  14. package/dist/ai/aiGenerator.js.map +1 -0
  15. package/dist/ai/genericInference.d.ts +5 -0
  16. package/dist/ai/genericInference.js +80 -0
  17. package/dist/ai/genericInference.js.map +1 -0
  18. package/dist/ai/index.d.ts +3 -0
  19. package/dist/ai/index.js +2 -0
  20. package/dist/ai/index.js.map +1 -0
  21. package/dist/ai/jsonRepair.d.ts +2 -0
  22. package/dist/ai/jsonRepair.js +31 -0
  23. package/dist/ai/jsonRepair.js.map +1 -0
  24. package/dist/ai/prompts.d.ts +4 -0
  25. package/dist/ai/prompts.js +81 -0
  26. package/dist/ai/prompts.js.map +1 -0
  27. package/dist/behavior/behaviorStore.d.ts +12 -0
  28. package/dist/behavior/behaviorStore.js +72 -0
  29. package/dist/behavior/behaviorStore.js.map +1 -0
  30. package/dist/cache/index.d.ts +9 -0
  31. package/dist/cache/index.js +34 -0
  32. package/dist/cache/index.js.map +1 -0
  33. package/dist/cli/errors.d.ts +4 -0
  34. package/dist/cli/errors.js +9 -0
  35. package/dist/cli/errors.js.map +1 -0
  36. package/dist/cli/index.d.ts +2 -0
  37. package/dist/cli/index.js +277 -0
  38. package/dist/cli/index.js.map +1 -0
  39. package/dist/cli/parser.d.ts +56 -0
  40. package/dist/cli/parser.js +169 -0
  41. package/dist/cli/parser.js.map +1 -0
  42. package/dist/config/localConfig.d.ts +16 -0
  43. package/dist/config/localConfig.js +58 -0
  44. package/dist/config/localConfig.js.map +1 -0
  45. package/dist/config/serverConfig.d.ts +13 -0
  46. package/dist/config/serverConfig.js +44 -0
  47. package/dist/config/serverConfig.js.map +1 -0
  48. package/dist/dashboard/app.js +615 -0
  49. package/dist/dashboard/dashboard.d.ts +4 -0
  50. package/dist/dashboard/dashboard.js +20 -0
  51. package/dist/dashboard/dashboard.js.map +1 -0
  52. package/dist/dashboard/index.d.ts +1 -0
  53. package/dist/dashboard/index.html +298 -0
  54. package/dist/dashboard/index.js +2 -0
  55. package/dist/dashboard/index.js.map +1 -0
  56. package/dist/dashboard/styles.css +349 -0
  57. package/dist/errors/errorEngine.d.ts +3 -0
  58. package/dist/errors/errorEngine.js +65 -0
  59. package/dist/errors/errorEngine.js.map +1 -0
  60. package/dist/errors/index.d.ts +3 -0
  61. package/dist/errors/index.js +3 -0
  62. package/dist/errors/index.js.map +1 -0
  63. package/dist/errors/providerErrors.d.ts +3 -0
  64. package/dist/errors/providerErrors.js +6 -0
  65. package/dist/errors/providerErrors.js.map +1 -0
  66. package/dist/fault/faultLab.d.ts +27 -0
  67. package/dist/fault/faultLab.js +89 -0
  68. package/dist/fault/faultLab.js.map +1 -0
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.js +2 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/landing/assets/index-BXR41fAD.css +1 -0
  73. package/dist/landing/assets/index-D8_ggMRE.js +55 -0
  74. package/dist/landing/index.html +15 -0
  75. package/dist/landing/landing.d.ts +3 -0
  76. package/dist/landing/landing.js +12 -0
  77. package/dist/landing/landing.js.map +1 -0
  78. package/dist/mcp/server.d.ts +1 -0
  79. package/dist/mcp/server.js +52 -0
  80. package/dist/mcp/server.js.map +1 -0
  81. package/dist/providers/discord.d.ts +2 -0
  82. package/dist/providers/discord.js +11 -0
  83. package/dist/providers/discord.js.map +1 -0
  84. package/dist/providers/generic.d.ts +2 -0
  85. package/dist/providers/generic.js +13 -0
  86. package/dist/providers/generic.js.map +1 -0
  87. package/dist/providers/github.d.ts +2 -0
  88. package/dist/providers/github.js +11 -0
  89. package/dist/providers/github.js.map +1 -0
  90. package/dist/providers/index.d.ts +2 -0
  91. package/dist/providers/index.js +2 -0
  92. package/dist/providers/index.js.map +1 -0
  93. package/dist/providers/openai.d.ts +2 -0
  94. package/dist/providers/openai.js +15 -0
  95. package/dist/providers/openai.js.map +1 -0
  96. package/dist/providers/registry.d.ts +12 -0
  97. package/dist/providers/registry.js +23 -0
  98. package/dist/providers/registry.js.map +1 -0
  99. package/dist/providers/resend.d.ts +2 -0
  100. package/dist/providers/resend.js +12 -0
  101. package/dist/providers/resend.js.map +1 -0
  102. package/dist/providers/stripe.d.ts +2 -0
  103. package/dist/providers/stripe.js +15 -0
  104. package/dist/providers/stripe.js.map +1 -0
  105. package/dist/providers/twilio.d.ts +2 -0
  106. package/dist/providers/twilio.js +14 -0
  107. package/dist/providers/twilio.js.map +1 -0
  108. package/dist/providers/types.d.ts +13 -0
  109. package/dist/providers/types.js +2 -0
  110. package/dist/providers/types.js.map +1 -0
  111. package/dist/proxy/cacheKey.d.ts +2 -0
  112. package/dist/proxy/cacheKey.js +37 -0
  113. package/dist/proxy/cacheKey.js.map +1 -0
  114. package/dist/proxy/providerDetector.d.ts +11 -0
  115. package/dist/proxy/providerDetector.js +74 -0
  116. package/dist/proxy/providerDetector.js.map +1 -0
  117. package/dist/proxy/proxyHandler.d.ts +3 -0
  118. package/dist/proxy/proxyHandler.js +114 -0
  119. package/dist/proxy/proxyHandler.js.map +1 -0
  120. package/dist/proxy/requestNormalizer.d.ts +11 -0
  121. package/dist/proxy/requestNormalizer.js +30 -0
  122. package/dist/proxy/requestNormalizer.js.map +1 -0
  123. package/dist/report/safetyReport.d.ts +13 -0
  124. package/dist/report/safetyReport.js +65 -0
  125. package/dist/report/safetyReport.js.map +1 -0
  126. package/dist/rules/aiRules.d.ts +7 -0
  127. package/dist/rules/aiRules.js +31 -0
  128. package/dist/rules/aiRules.js.map +1 -0
  129. package/dist/scenarios/scenarioStore.d.ts +37 -0
  130. package/dist/scenarios/scenarioStore.js +201 -0
  131. package/dist/scenarios/scenarioStore.js.map +1 -0
  132. package/dist/security/headerSanitizer.d.ts +3 -0
  133. package/dist/security/headerSanitizer.js +12 -0
  134. package/dist/security/headerSanitizer.js.map +1 -0
  135. package/dist/security/maskSecrets.d.ts +1 -0
  136. package/dist/security/maskSecrets.js +2 -0
  137. package/dist/security/maskSecrets.js.map +1 -0
  138. package/dist/security/secrets.d.ts +4 -0
  139. package/dist/security/secrets.js +61 -0
  140. package/dist/security/secrets.js.map +1 -0
  141. package/dist/server/createServer.d.ts +8 -0
  142. package/dist/server/createServer.js +42 -0
  143. package/dist/server/createServer.js.map +1 -0
  144. package/dist/server/eventsStore.d.ts +17 -0
  145. package/dist/server/eventsStore.js +31 -0
  146. package/dist/server/eventsStore.js.map +1 -0
  147. package/dist/server/routes.d.ts +3 -0
  148. package/dist/server/routes.js +189 -0
  149. package/dist/server/routes.js.map +1 -0
  150. package/dist/server/sse.d.ts +5 -0
  151. package/dist/server/sse.js +32 -0
  152. package/dist/server/sse.js.map +1 -0
  153. package/dist/setup/sdkDetector.d.ts +9 -0
  154. package/dist/setup/sdkDetector.js +31 -0
  155. package/dist/setup/sdkDetector.js.map +1 -0
  156. package/dist/setup/setupGenerator.d.ts +28 -0
  157. package/dist/setup/setupGenerator.js +146 -0
  158. package/dist/setup/setupGenerator.js.map +1 -0
  159. package/dist/state/index.d.ts +1 -0
  160. package/dist/state/index.js +2 -0
  161. package/dist/state/index.js.map +1 -0
  162. package/dist/state/stateExtractor.d.ts +3 -0
  163. package/dist/state/stateExtractor.js +36 -0
  164. package/dist/state/stateExtractor.js.map +1 -0
  165. package/dist/state/stateResolver.d.ts +8 -0
  166. package/dist/state/stateResolver.js +95 -0
  167. package/dist/state/stateResolver.js.map +1 -0
  168. package/dist/state/stateStore.d.ts +4 -0
  169. package/dist/state/stateStore.js +72 -0
  170. package/dist/state/stateStore.js.map +1 -0
  171. package/dist/tests/testGenerator.d.ts +6 -0
  172. package/dist/tests/testGenerator.js +33 -0
  173. package/dist/tests/testGenerator.js.map +1 -0
  174. package/dist/utils/json.d.ts +2 -0
  175. package/dist/utils/json.js +10 -0
  176. package/dist/utils/json.js.map +1 -0
  177. package/docs/release-checklist.md +71 -0
  178. package/examples/agent-instructions/README.md +39 -0
  179. package/examples/generic-rest/README.md +27 -0
  180. package/examples/github-fetch/README.md +35 -0
  181. package/examples/resend-node/README.md +22 -0
  182. package/examples/stripe-node/README.md +29 -0
  183. package/examples/twilio-node/README.md +21 -0
  184. package/package.json +67 -0
@@ -0,0 +1,101 @@
1
+ import { hasBooleanFlag } from "../utils/json.js";
2
+ import { askLLM } from "./aiClient.js";
3
+ import { getSystemPrompt, getUserPrompt } from "./prompts.js";
4
+ import { repairJson } from "./jsonRepair.js";
5
+ import { createProviderError } from "../errors/index.js";
6
+ import { inferResourceName, isLikelyCollectionPath } from "./genericInference.js";
7
+ export async function generateAiMock(request, provider, response, config) {
8
+ const isStreamRequested = hasBooleanFlag(request.body, "stream") || hasBooleanFlag(request.query, "stream") || request.headers.accept === "text/event-stream";
9
+ if (isStreamRequested) {
10
+ return handleStreamResponse(request, provider, response);
11
+ }
12
+ let body = null;
13
+ if (config.offline) {
14
+ return {
15
+ status: 200,
16
+ headers: { "content-type": "application/json" },
17
+ body: generateOfflineMock(request, provider)
18
+ };
19
+ }
20
+ try {
21
+ const systemPrompt = getSystemPrompt(provider);
22
+ const userPrompt = getUserPrompt(request.method, request.path, request.query, request.body, provider);
23
+ const textOutput = await askLLM([
24
+ { role: "system", content: systemPrompt },
25
+ { role: "user", content: userPrompt }
26
+ ], config);
27
+ const repaired = repairJson(textOutput);
28
+ if (repaired === null) {
29
+ return {
30
+ status: 500,
31
+ headers: { "content-type": "application/json" },
32
+ body: createProviderError(provider, { status: 500, type: "api_error", message: "Failed to generate valid JSON from AI." })
33
+ };
34
+ }
35
+ body = repaired;
36
+ }
37
+ catch (error) {
38
+ body = generateOfflineMock(request, provider);
39
+ }
40
+ return {
41
+ status: 200,
42
+ headers: { "content-type": "application/json" },
43
+ body
44
+ };
45
+ }
46
+ function generateOfflineMock(request, provider) {
47
+ if (provider === "generic") {
48
+ return generateGenericOfflineMock(request);
49
+ }
50
+ const mockId = `mock_${provider}_${Date.now().toString(36)}`;
51
+ const segments = request.path.split("/").filter(Boolean);
52
+ const resourceType = segments.length >= 2 ? (segments.length % 2 === 1 ? segments[segments.length - 2] : segments[segments.length - 1]) : "mock_response";
53
+ return {
54
+ id: mockId,
55
+ object: resourceType ? resourceType.replace(/s$/i, "") : "mock_response",
56
+ provider,
57
+ method: request.method,
58
+ path: request.path,
59
+ status: "ok"
60
+ };
61
+ }
62
+ function generateGenericOfflineMock(request) {
63
+ const resource = inferResourceName(request.path);
64
+ const base = {
65
+ id: `${resource}_mock_${Date.now().toString(36)}`,
66
+ object: resource,
67
+ provider: "generic",
68
+ method: request.method,
69
+ path: request.path,
70
+ status: "ok",
71
+ ...copyObjectBody(request.body)
72
+ };
73
+ if (isLikelyCollectionPath(request.method, request.path)) {
74
+ return {
75
+ object: "list",
76
+ data: [base],
77
+ has_more: false
78
+ };
79
+ }
80
+ return base;
81
+ }
82
+ function copyObjectBody(body) {
83
+ if (body === null || typeof body !== "object" || Array.isArray(body))
84
+ return {};
85
+ return body;
86
+ }
87
+ async function handleStreamResponse(request, provider, response) {
88
+ response.setHeader("Content-Type", "text/event-stream");
89
+ response.setHeader("Cache-Control", "no-cache");
90
+ response.setHeader("Connection", "keep-alive");
91
+ response.setHeader("x-ghostapi-cache", "MISS");
92
+ response.flushHeaders();
93
+ const mockId = `mock_stream_${provider}_${Date.now().toString(36)}`;
94
+ response.write(`data: ${JSON.stringify({ id: mockId, object: "chunk", status: "started" })}\n\n`);
95
+ await new Promise((resolve) => setTimeout(resolve, 100));
96
+ response.write(`data: ${JSON.stringify({ id: mockId, object: "chunk", status: "completed" })}\n\n`);
97
+ response.write(`data: [DONE]\n\n`);
98
+ response.end();
99
+ return "streamed";
100
+ }
101
+ //# sourceMappingURL=aiGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiGenerator.js","sourceRoot":"","sources":["../../src/ai/aiGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type GenericServiceLabel = "generic:gmail-like" | "generic:google-drive-like" | "generic:google-calendar-like" | "generic:gitlab-like" | "generic:slack-like" | "generic:notion-like" | "generic:linear-like" | "generic:jira-like" | "generic:trello-like" | "generic:airtable-like" | "generic:supabase-like" | "generic:firebase-like" | "generic:aws-like" | "generic:shopify-like" | "generic:hubspot-like" | "generic:salesforce-like" | "generic:sendgrid-like" | "generic:mailgun-like" | "generic:postmark-like" | "generic:openai-like" | "generic:anthropic-like" | "generic:deepseek-like" | "generic:gemini-like" | "generic:elevenlabs-like" | "generic:telegram-like" | "generic:whatsapp-like" | "generic:paypal-like" | "generic:plaid-like" | "generic:clerk-like" | "generic:auth0-like" | "generic:workos-like" | "generic:vercel-like" | "generic:netlify-like" | "generic:cloudflare-like" | "generic:docker-hub-like" | "generic:npm-registry-like" | "generic:rest-like";
2
+ export declare function inferGenericService(path: string, query?: Record<string, unknown>, body?: unknown): GenericServiceLabel;
3
+ export declare function inferResourceName(path: string): string;
4
+ export declare function isLikelyCollectionPath(method: string, path: string): boolean;
5
+ export declare function isLikelyResourceByIdPath(path: string): boolean;
@@ -0,0 +1,80 @@
1
+ const SERVICE_RULES = [
2
+ { label: "generic:gmail-like", patterns: [/gmail/i, /\/messages\/send/i] },
3
+ { label: "generic:google-drive-like", patterns: [/drive\/v\d/i, /\/files(?:\/|$)/i] },
4
+ { label: "generic:google-calendar-like", patterns: [/calendar\/v\d/i, /\/calendars(?:\/|$)/i, /\/events(?:\/|$)/i] },
5
+ { label: "generic:gitlab-like", patterns: [/gitlab/i, /\/projects\/[^/]+\/merge_requests/i] },
6
+ { label: "generic:slack-like", patterns: [/slack/i, /\/api\/chat\.postMessage/i] },
7
+ { label: "generic:notion-like", patterns: [/notion/i, /\/v\d\/pages(?=\/|\s|$)/i, /\/v\d\/databases(?=\/|\s|$)/i] },
8
+ { label: "generic:linear-like", patterns: [/linear/i, /\/graphql(?:\/|$)/i] },
9
+ { label: "generic:jira-like", patterns: [/jira/i, /\/rest\/api\/\d+\/issue/i] },
10
+ { label: "generic:trello-like", patterns: [/trello/i, /\/1\/cards(?:\/|$)/i, /\/1\/boards(?:\/|$)/i] },
11
+ { label: "generic:airtable-like", patterns: [/airtable/i, /\/v0\/app[a-z0-9]+/i] },
12
+ { label: "generic:supabase-like", patterns: [/supabase/i, /\/rest\/v1(?:\/|$)/i] },
13
+ { label: "generic:firebase-like", patterns: [/firebase/i, /firestore/i, /\/v1\/projects\/[^/]+\/databases/i] },
14
+ { label: "generic:aws-like", patterns: [/amazonaws/i, /\/s3\//i, /\bqueueurl\b/i, /\baction=(?:sendemail|publish|sendmessage)/i] },
15
+ { label: "generic:shopify-like", patterns: [/shopify/i, /\/admin\/api\//i, /products\.json/i] },
16
+ { label: "generic:hubspot-like", patterns: [/hubspot/i, /\/crm\/v3\//i] },
17
+ { label: "generic:salesforce-like", patterns: [/salesforce/i, /\/services\/data\/v/i] },
18
+ { label: "generic:sendgrid-like", patterns: [/sendgrid/i, /\/v3\/mail\/send/i] },
19
+ { label: "generic:mailgun-like", patterns: [/mailgun/i, /\/messages(?:\/|$)/i] },
20
+ { label: "generic:postmark-like", patterns: [/postmark/i, /\/email(?:\/|$)/i] },
21
+ { label: "generic:openai-like", patterns: [/openai/i, /\/v1\/(?:chat\/completions|responses|embeddings)/i] },
22
+ { label: "generic:anthropic-like", patterns: [/anthropic/i, /\/v1\/messages/i] },
23
+ { label: "generic:deepseek-like", patterns: [/deepseek/i] },
24
+ { label: "generic:gemini-like", patterns: [/gemini/i, /generativelanguage/i] },
25
+ { label: "generic:elevenlabs-like", patterns: [/elevenlabs/i, /\/v1\/text-to-speech/i] },
26
+ { label: "generic:telegram-like", patterns: [/telegram/i, /\/bot[^/]+\/sendMessage/i] },
27
+ { label: "generic:whatsapp-like", patterns: [/whatsapp/i, /\/messages(?:\/|$)/i] },
28
+ { label: "generic:paypal-like", patterns: [/paypal/i, /\/v\d\/checkout\/orders/i] },
29
+ { label: "generic:plaid-like", patterns: [/plaid/i, /\/transactions\//i] },
30
+ { label: "generic:clerk-like", patterns: [/clerk/i, /\/v1\/users(?:\/|$)/i] },
31
+ { label: "generic:auth0-like", patterns: [/auth0/i, /\/api\/v2\//i] },
32
+ { label: "generic:workos-like", patterns: [/workos/i, /\/user_management\//i] },
33
+ { label: "generic:vercel-like", patterns: [/vercel/i, /\/v\d\/projects(?:\/|$)/i] },
34
+ { label: "generic:netlify-like", patterns: [/netlify/i, /\/api\/v\d\/sites/i] },
35
+ { label: "generic:cloudflare-like", patterns: [/cloudflare/i, /\/client\/v4\//i] },
36
+ { label: "generic:docker-hub-like", patterns: [/docker/i, /\/v2\/repositories/i] },
37
+ { label: "generic:npm-registry-like", patterns: [/registry\.npmjs/i, /\/-\/package\//i] }
38
+ ];
39
+ export function inferGenericService(path, query = {}, body = null) {
40
+ const haystack = `${path}\n${JSON.stringify(query)}\n${JSON.stringify(body)}`;
41
+ for (const rule of SERVICE_RULES) {
42
+ if (rule.patterns.some((pattern) => pattern.test(haystack))) {
43
+ return rule.label;
44
+ }
45
+ }
46
+ return "generic:rest-like";
47
+ }
48
+ export function inferResourceName(path) {
49
+ const segments = pathWithoutQuery(path)
50
+ .split("/")
51
+ .filter(Boolean)
52
+ .filter((segment) => !/^v\d+(?:\.\d+)?$/i.test(segment) && segment !== "api" && segment !== "admin");
53
+ const last = segments.at(-1)?.replace(/\.json$/i, "") ?? "resource";
54
+ const candidate = isLikelyId(last) ? segments.at(-2) ?? "resource" : last;
55
+ return singularize(candidate.replace(/[^a-z0-9_-]/gi, "_").toLowerCase()) || "resource";
56
+ }
57
+ export function isLikelyCollectionPath(method, path) {
58
+ if (method !== "GET")
59
+ return false;
60
+ const last = pathWithoutQuery(path).split("/").filter(Boolean).at(-1) ?? "";
61
+ return !isLikelyId(last) && (/s(?:\.json)?$/i.test(last) || last.includes("."));
62
+ }
63
+ export function isLikelyResourceByIdPath(path) {
64
+ const last = pathWithoutQuery(path).split("/").filter(Boolean).at(-1) ?? "";
65
+ return isLikelyId(last);
66
+ }
67
+ function pathWithoutQuery(path) {
68
+ return path.split(/[?#]/)[0] ?? path;
69
+ }
70
+ function isLikelyId(value) {
71
+ return /^[a-z]+_[a-z0-9]+$/i.test(value) || /^[a-z]+-\d+$/i.test(value) || /^[0-9a-f-]{8,}$/i.test(value) || /^\d{4,}$/.test(value);
72
+ }
73
+ function singularize(value) {
74
+ if (value.endsWith("ies"))
75
+ return `${value.slice(0, -3)}y`;
76
+ if (value.endsWith("s") && value.length > 1)
77
+ return value.slice(0, -1);
78
+ return value;
79
+ }
80
+ //# sourceMappingURL=genericInference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genericInference.js","sourceRoot":"","sources":["../../src/ai/genericInference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type AiMockResponse = {
2
+ body: unknown;
3
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function extractJson(text: string): string;
2
+ export declare function repairJson(text: string): unknown | null;
@@ -0,0 +1,31 @@
1
+ export function extractJson(text) {
2
+ let content = text.trim();
3
+ // Remove markdown code blocks if the LLM wraps it
4
+ if (content.startsWith("```json")) {
5
+ content = content.slice(7);
6
+ }
7
+ else if (content.startsWith("```")) {
8
+ content = content.slice(3);
9
+ }
10
+ if (content.endsWith("```")) {
11
+ content = content.slice(0, -3);
12
+ }
13
+ return content.trim();
14
+ }
15
+ export function repairJson(text) {
16
+ const extracted = extractJson(text);
17
+ try {
18
+ return JSON.parse(extracted);
19
+ }
20
+ catch {
21
+ // Basic repair if the LLM cuts off a bracket or leaves trailing commas
22
+ try {
23
+ const repaired = extracted.replace(/,\s*([\]}])/g, "$1");
24
+ return JSON.parse(repaired);
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=jsonRepair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonRepair.js","sourceRoot":"","sources":["../../src/ai/jsonRepair.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE1B,kDAAkD;IAClD,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ProviderName } from "../providers/types.js";
2
+ export declare function getSystemPrompt(provider: ProviderName): string;
3
+ export declare function getUserPrompt(method: string, path: string, query: Record<string, unknown>, body: unknown, provider?: ProviderName): string;
4
+ export declare function buildGenericPromptContext(method: string, path: string, query: Record<string, unknown>, body: unknown): string;
@@ -0,0 +1,81 @@
1
+ import { inferGenericService, inferResourceName, isLikelyCollectionPath, isLikelyResourceByIdPath } from "./genericInference.js";
2
+ export function getSystemPrompt(provider) {
3
+ const base = `You are GhostAPI, an autonomous local internet simulator.
4
+ Your job is to generate a realistic JSON response for a given authenticated HTTP request to an external API.
5
+ Return ONLY valid JSON. No markdown wrapping unless explicitly requested, no explanations, no text before or after the JSON.
6
+ Keep IDs seemingly real, but prefixed with mock identifiers where appropriate (e.g. mock_cus_123).
7
+ `;
8
+ switch (provider) {
9
+ case "stripe":
10
+ return `${base}
11
+ - This is the Stripe API.
12
+ - Use Stripe object structures (e.g., {"object": "charge", ...}).
13
+ - IDs usually start with prefixes like ch_, cus_, pi_. Use mock_ch_, mock_cus_, etc.
14
+ - In lists, wrap results in {"object": "list", "data": [], "has_more": false}.
15
+ `;
16
+ case "twilio":
17
+ return `${base}
18
+ - This is the Twilio REST API.
19
+ - Use Twilio structures. Return SID, account_sid, date_created, etc.
20
+ - Always include 'uri' ending in .json.
21
+ `;
22
+ case "resend":
23
+ return `${base}
24
+ - This is the Resend Email API.
25
+ - The standard response for sending an email is a single object with an 'id' string.
26
+ `;
27
+ case "github":
28
+ return `${base}
29
+ - This is the GitHub REST API.
30
+ - Use exact GitHub payload shapes.
31
+ `;
32
+ case "discord":
33
+ return `${base}
34
+ - This is the Discord REST API.
35
+ - Discord IDs are large integers represented as strings.
36
+ `;
37
+ case "openai":
38
+ return `${base}
39
+ - This is the OpenAI API.
40
+ - Use OpenAI-like response objects such as chat.completion, response, embedding, model, file, or image generation depending on the path.
41
+ - IDs should use realistic mock prefixes like chatcmpl_mock_, resp_mock_, embd_mock_, model_mock_, file_mock_, or img_mock_.
42
+ - For chat completions, include choices with message objects and usage token counts.
43
+ - For embeddings, include object: "list", data entries, model, and usage.
44
+ - For model/file lists, wrap results in {"object":"list","data":[]}.
45
+ `;
46
+ case "generic":
47
+ default:
48
+ return `${base}
49
+ - This is the generic fallback, not a full official API implementation.
50
+ - Analyze the URL path, method, query, and body to infer the service style and resource type.
51
+ - Preserve safe request body fields in the response when it makes sense, especially names, emails, titles, amounts, status, metadata, message content, and IDs supplied by the caller.
52
+ - Generate mock IDs from the inferred singular resource name: product_mock_xxx, message_mock_xxx, issue_mock_xxx, page_mock_xxx, file_mock_xxx, etc.
53
+ - If the path looks like a collection endpoint, return either a JSON array or a list object with data/items/results according to the service style.
54
+ - If the path looks like a resource-by-id endpoint, return one object matching that resource.
55
+ - For create/update methods, return one created or updated object and echo relevant body fields.
56
+ - Keep the response small, deterministic-looking, and useful for local agent testing.
57
+ `;
58
+ }
59
+ }
60
+ export function getUserPrompt(method, path, query, body, provider = "generic") {
61
+ const genericContext = provider === "generic" ? buildGenericPromptContext(method, path, query, body) : "";
62
+ return `Generate a realistic JSON response for this request:
63
+ Method: ${method}
64
+ Path: ${path}
65
+ Query: ${JSON.stringify(query)}
66
+ Body: ${JSON.stringify(body)}
67
+ ${genericContext}
68
+ `;
69
+ }
70
+ export function buildGenericPromptContext(method, path, query, body) {
71
+ const serviceLabel = inferGenericService(path, query, body);
72
+ const resourceName = inferResourceName(path);
73
+ const endpointShape = isLikelyCollectionPath(method, path) ? "collection" : isLikelyResourceByIdPath(path) ? "resource-by-id" : "mutation-or-action";
74
+ return `Generic fallback context:
75
+ Service label: ${serviceLabel}
76
+ Inferred resource: ${resourceName}
77
+ Endpoint shape: ${endpointShape}
78
+ ID format: ${resourceName}_mock_<short_random_suffix>
79
+ Body echo rule: copy safe, relevant body fields into the response instead of inventing unrelated values.`;
80
+ }
81
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/ai/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjI,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,MAAM,IAAI,GAAG;;;;CAId,CAAC;IAEA,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI;;;;;CAKnB,CAAC;QACE,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI;;;;CAInB,CAAC;QACE,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI;;;CAGnB,CAAC;QACE,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI;;;CAGnB,CAAC;QACE,KAAK,SAAS;YACZ,OAAO,GAAG,IAAI;;;CAGnB,CAAC;QACE,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI;;;;;;;CAOnB,CAAC;QACE,KAAK,SAAS,CAAC;QACf;YACE,OAAO,GAAG,IAAI;;;;;;;;;CASnB,CAAC;IACA,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAY,EAAE,KAA8B,EAAE,IAAa,EAAE,WAAyB,SAAS;IAC3I,MAAM,cAAc,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1G,OAAO;UACC,MAAM;QACR,IAAI;SACH,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;EAC1B,cAAc;CACf,CAAC;AACF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAc,EAAE,IAAY,EAAE,KAA8B,EAAE,IAAa;IACnH,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAErJ,OAAO;iBACQ,YAAY;qBACR,YAAY;kBACf,aAAa;aAClB,YAAY;yGACgF,CAAC;AAC1G,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { NormalizedRequest } from "../proxy/requestNormalizer.js";
2
+ export type ApiBehavior = {
3
+ path: string;
4
+ method: string;
5
+ status: number;
6
+ body: unknown;
7
+ headers?: Record<string, string>;
8
+ };
9
+ export declare function setApiBehavior(behavior: ApiBehavior): Promise<ApiBehavior>;
10
+ export declare function findApiBehavior(request: NormalizedRequest): Promise<ApiBehavior | null>;
11
+ export declare function getApiBehaviors(): Promise<Record<string, ApiBehavior>>;
12
+ export declare function clearApiBehaviorsForTests(): Promise<void>;
@@ -0,0 +1,72 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ const BEHAVIOR_FILE_PATH = ".ghostapi/behaviors.json";
4
+ let writeLock = Promise.resolve();
5
+ export async function setApiBehavior(behavior) {
6
+ return withWriteLock(async () => {
7
+ const behaviors = await getApiBehaviors();
8
+ const normalized = normalizeBehavior(behavior);
9
+ const key = behaviorKey(normalized.method, normalized.path);
10
+ behaviors[key] = normalized;
11
+ await writeBehaviors(behaviors);
12
+ return normalized;
13
+ });
14
+ }
15
+ export async function findApiBehavior(request) {
16
+ const behaviors = await getApiBehaviors();
17
+ return behaviors[behaviorKey(request.method, request.path)] ?? null;
18
+ }
19
+ export async function getApiBehaviors() {
20
+ try {
21
+ const parsed = JSON.parse(await readFile(BEHAVIOR_FILE_PATH, "utf8"));
22
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
23
+ return {};
24
+ return Object.fromEntries(Object.entries(parsed).filter((entry) => isApiBehavior(entry[1])));
25
+ }
26
+ catch (error) {
27
+ if (error instanceof Error && "code" in error && error.code === "ENOENT")
28
+ return {};
29
+ throw error;
30
+ }
31
+ }
32
+ export async function clearApiBehaviorsForTests() {
33
+ await withWriteLock(async () => {
34
+ await writeBehaviors({});
35
+ });
36
+ }
37
+ async function withWriteLock(operation) {
38
+ const previous = writeLock;
39
+ let release;
40
+ writeLock = new Promise((resolve) => { release = resolve; });
41
+ await previous;
42
+ try {
43
+ return await operation();
44
+ }
45
+ finally {
46
+ release();
47
+ }
48
+ }
49
+ function normalizeBehavior(behavior) {
50
+ const path = behavior.path.startsWith("/") ? behavior.path : `/${behavior.path}`;
51
+ const method = behavior.method.toUpperCase();
52
+ if (!Number.isInteger(behavior.status) || behavior.status < 100 || behavior.status > 599) {
53
+ throw new Error("Behavior status must be an integer between 100 and 599.");
54
+ }
55
+ return { ...behavior, path, method };
56
+ }
57
+ function behaviorKey(method, path) {
58
+ return `${method.toUpperCase()} ${path}`;
59
+ }
60
+ async function writeBehaviors(behaviors) {
61
+ await mkdir(dirname(BEHAVIOR_FILE_PATH), { recursive: true });
62
+ await writeFile(BEHAVIOR_FILE_PATH, JSON.stringify(behaviors, null, 2), "utf8");
63
+ }
64
+ function isApiBehavior(value) {
65
+ return value !== null
66
+ && typeof value === "object"
67
+ && !Array.isArray(value)
68
+ && typeof value.path === "string"
69
+ && typeof value.method === "string"
70
+ && typeof value.status === "number";
71
+ }
72
+ //# sourceMappingURL=behaviorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behaviorStore.js","sourceRoot":"","sources":["../../src/behavior/behaviorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type CacheEntry = {
2
+ status: number;
3
+ headers: Record<string, string | string[]>;
4
+ body: unknown;
5
+ };
6
+ export declare function initializeCacheDir(): Promise<void>;
7
+ export declare function getCachedResponse(provider: string, hash: string): Promise<CacheEntry | null>;
8
+ export declare function setCachedResponse(provider: string, hash: string, entry: CacheEntry): Promise<void>;
9
+ export declare function clearCache(): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ const BASE_CACHE_DIR = ".ghostapi/cache";
5
+ export async function initializeCacheDir() {
6
+ await mkdir(BASE_CACHE_DIR, { recursive: true });
7
+ }
8
+ export async function getCachedResponse(provider, hash) {
9
+ try {
10
+ const filePath = join(BASE_CACHE_DIR, provider, `${hash}.json`);
11
+ const content = await readFile(filePath, "utf8");
12
+ return JSON.parse(content);
13
+ }
14
+ catch (error) {
15
+ if (error instanceof Error && "code" in error && error.code === "ENOENT") {
16
+ return null;
17
+ }
18
+ throw error;
19
+ }
20
+ }
21
+ export async function setCachedResponse(provider, hash, entry) {
22
+ const providerDir = join(BASE_CACHE_DIR, provider);
23
+ const filePath = join(providerDir, `${hash}.json`);
24
+ const tempFilePath = join(providerDir, `${hash}.tmp.${randomUUID()}`);
25
+ await mkdir(providerDir, { recursive: true });
26
+ const content = JSON.stringify(entry, null, 2);
27
+ await writeFile(tempFilePath, content, "utf8");
28
+ await rename(tempFilePath, filePath);
29
+ }
30
+ export async function clearCache() {
31
+ await rm(BASE_CACHE_DIR, { recursive: true, force: true });
32
+ await initializeCacheDir();
33
+ }
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAW,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,IAAY;IACpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB,EAAE,IAAY,EAAE,KAAiB;IACvF,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,QAAQ,UAAU,EAAE,EAAE,CAAC,CAAC;IAEtE,MAAM,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE/C,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,kBAAkB,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare class CliError extends Error {
2
+ readonly hint?: string;
3
+ constructor(message: string, hint?: string);
4
+ }
@@ -0,0 +1,9 @@
1
+ export class CliError extends Error {
2
+ hint;
3
+ constructor(message, hint) {
4
+ super(message);
5
+ this.name = "CliError";
6
+ this.hint = hint;
7
+ }
8
+ }
9
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/cli/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAU;IAEvB,YAAY,OAAe,EAAE,IAAa;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};