@sota-io/mcp 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CLAUDE.md +13 -5
  2. package/README.md +82 -1
  3. package/dist/auth/disposable-check.d.ts +2 -0
  4. package/dist/auth/disposable-check.d.ts.map +1 -0
  5. package/dist/auth/disposable-check.js +30 -0
  6. package/dist/auth/disposable-check.js.map +1 -0
  7. package/dist/auth/token-bridge.d.ts +28 -0
  8. package/dist/auth/token-bridge.d.ts.map +1 -0
  9. package/dist/auth/token-bridge.js +152 -0
  10. package/dist/auth/token-bridge.js.map +1 -0
  11. package/dist/auth/verify-jwt.d.ts +13 -0
  12. package/dist/auth/verify-jwt.d.ts.map +1 -0
  13. package/dist/auth/verify-jwt.js +84 -0
  14. package/dist/auth/verify-jwt.js.map +1 -0
  15. package/dist/http.d.ts +21 -0
  16. package/dist/http.d.ts.map +1 -0
  17. package/dist/http.js +259 -0
  18. package/dist/http.js.map +1 -0
  19. package/dist/tools/create-account.d.ts +23 -0
  20. package/dist/tools/create-account.d.ts.map +1 -0
  21. package/dist/tools/create-account.js +171 -0
  22. package/dist/tools/create-account.js.map +1 -0
  23. package/dist/tools/deploy.d.ts.map +1 -1
  24. package/dist/tools/deploy.js +2 -1
  25. package/dist/tools/deploy.js.map +1 -1
  26. package/dist/tools/domains.d.ts.map +1 -1
  27. package/dist/tools/domains.js +4 -0
  28. package/dist/tools/domains.js.map +1 -1
  29. package/dist/tools/env.d.ts.map +1 -1
  30. package/dist/tools/env.js +4 -2
  31. package/dist/tools/env.js.map +1 -1
  32. package/dist/tools/logs.d.ts.map +1 -1
  33. package/dist/tools/logs.js +1 -0
  34. package/dist/tools/logs.js.map +1 -1
  35. package/dist/tools/projects.d.ts.map +1 -1
  36. package/dist/tools/projects.js +3 -0
  37. package/dist/tools/projects.js.map +1 -1
  38. package/dist/tools/rollback.d.ts.map +1 -1
  39. package/dist/tools/rollback.js +1 -0
  40. package/dist/tools/rollback.js.map +1 -1
  41. package/dist/tools/status.d.ts.map +1 -1
  42. package/dist/tools/status.js +1 -0
  43. package/dist/tools/status.js.map +1 -1
  44. package/package.json +14 -7
package/dist/http.js ADDED
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * sota.io MCP Server — HTTP Transport (remote)
4
+ *
5
+ * Streamable HTTP variant of the existing stdio MCP server. Same 13 tools,
6
+ * exposed via mcp.sota.io/mcp for one-click installation from Claude Desktop
7
+ * and Claude.ai.
8
+ *
9
+ * Phase 57-01 (this file): scaffold + transport + RFC 9728 metadata.
10
+ * Auth is currently a pass-through Bearer API key — clients send their
11
+ * existing sota_xxx key as `Authorization: Bearer <key>` and it gets
12
+ * forwarded to sota-api. No OAuth validation yet.
13
+ *
14
+ * Phase 57-02 (next): OAuth 2.1 + JWT validation against Supabase JWKS,
15
+ * token-to-API-key bridge with `source=claude` audit tagging.
16
+ *
17
+ * Phase 57-03 (next): `create_account` tool for net-new user signup from
18
+ * inside Claude + plan-based capability gating.
19
+ */
20
+ import crypto from 'node:crypto';
21
+ import express from 'express';
22
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
23
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
24
+ import { SotaClient } from '@sota-io/sdk';
25
+ import { registerProjectTools } from './tools/projects.js';
26
+ import { registerDeployTool } from './tools/deploy.js';
27
+ import { registerLogsTool } from './tools/logs.js';
28
+ import { registerEnvTools } from './tools/env.js';
29
+ import { registerRollbackTool } from './tools/rollback.js';
30
+ import { registerStatusTool } from './tools/status.js';
31
+ import { registerDomainTools } from './tools/domains.js';
32
+ import { verifyJwt, JwtVerificationError } from './auth/verify-jwt.js';
33
+ import { getOrProvisionApiKey } from './auth/token-bridge.js';
34
+ import { registerCreateAccountTool } from './tools/create-account.js';
35
+ // Tools that may be invoked WITHOUT authentication. Currently only
36
+ // create_account — net-new users obviously don't have an API key yet.
37
+ // Discovery requests (initialize, tools/list) are also allowed
38
+ // unauthenticated so Claude can fetch capabilities before OAuth.
39
+ const UNAUTHENTICATED_TOOLS = new Set(['create_account']);
40
+ const UNAUTHENTICATED_METHODS = new Set(['initialize', 'notifications/initialized', 'tools/list']);
41
+ function isUnauthenticatedAllowed(body) {
42
+ if (!body || typeof body !== 'object')
43
+ return false;
44
+ const b = body;
45
+ const method = typeof b.method === 'string' ? b.method : '';
46
+ if (UNAUTHENTICATED_METHODS.has(method))
47
+ return true;
48
+ if (method === 'tools/call') {
49
+ const params = (b.params ?? {});
50
+ const name = typeof params.name === 'string' ? params.name : '';
51
+ return UNAUTHENTICATED_TOOLS.has(name);
52
+ }
53
+ return false;
54
+ }
55
+ const PORT = Number(process.env.PORT ?? 8080);
56
+ const SOTA_API_URL = process.env.SOTA_API_URL ?? 'https://api.sota.io';
57
+ const PUBLIC_ORIGIN = process.env.PUBLIC_ORIGIN ?? 'https://mcp.sota.io';
58
+ const AUTH_SERVER = process.env.AUTH_SERVER ?? 'https://auth.sota.io/auth/v1';
59
+ const VERSION = process.env.MCP_SERVER_VERSION ?? '1.4.0-pre';
60
+ const app = express();
61
+ app.use(express.json({ limit: '4mb' }));
62
+ // ───────────────────────────────────────────────────────────────────────────
63
+ // /health — Traefik / Docker healthcheck target
64
+ // ───────────────────────────────────────────────────────────────────────────
65
+ app.get('/health', (_req, res) => {
66
+ res.json({
67
+ ok: true,
68
+ service: 'sota-mcp',
69
+ version: VERSION,
70
+ transport: 'streamable-http',
71
+ ts: new Date().toISOString(),
72
+ });
73
+ });
74
+ // ───────────────────────────────────────────────────────────────────────────
75
+ // RFC 9728 Protected Resource Metadata
76
+ // ───────────────────────────────────────────────────────────────────────────
77
+ // MCP clients fetch this BEFORE attempting auth. It points them at the
78
+ // Authorization Server (Supabase) and declares the audience binding.
79
+ // Spec: https://datatracker.ietf.org/doc/html/rfc9728
80
+ // MCP requirement: https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
81
+ app.get('/.well-known/oauth-protected-resource', (_req, res) => {
82
+ res.json({
83
+ resource: PUBLIC_ORIGIN,
84
+ authorization_servers: [AUTH_SERVER],
85
+ bearer_methods_supported: ['header'],
86
+ resource_documentation: 'https://sota.io/docs/integrations/claude',
87
+ scopes_supported: ['openid', 'profile', 'email'],
88
+ resource_signing_alg_values_supported: ['RS256', 'ES256'],
89
+ });
90
+ });
91
+ // ───────────────────────────────────────────────────────────────────────────
92
+ // /mcp — Streamable HTTP transport endpoint
93
+ // ───────────────────────────────────────────────────────────────────────────
94
+ // Stateless mode: every request gets a fresh McpServer + transport instance.
95
+ // Adequate for low-traffic; revisit if we see > 100 RPS sustained.
96
+ function unauthorized(res, reason, detail) {
97
+ res
98
+ .status(401)
99
+ .header('WWW-Authenticate', `Bearer realm="${PUBLIC_ORIGIN}", error="${reason}", resource_metadata="${PUBLIC_ORIGIN}/.well-known/oauth-protected-resource"`)
100
+ .json({ error: 'unauthorized', reason, detail });
101
+ }
102
+ async function handleMcpRequest(req, res) {
103
+ // ── 57-02 Auth: OAuth JWT validation + token-to-key bridge ──
104
+ // Accept Bearer <jwt> (Claude/MCP path) OR Bearer <sota_xxx> (testing/CLI path).
105
+ // sota_-prefixed tokens skip JWT validation and pass through directly.
106
+ const authHeader = req.headers.authorization ?? '';
107
+ const rawToken = authHeader.startsWith('Bearer ')
108
+ ? authHeader.slice('Bearer '.length).trim()
109
+ : '';
110
+ const startedAt = Date.now();
111
+ const auditMeta = {
112
+ request_id: crypto.randomUUID(),
113
+ started_at: new Date(startedAt).toISOString(),
114
+ };
115
+ // Anonymous path for discovery + create_account. The MCP server is still
116
+ // constructed, but with a "phantom" apiKey that never reaches sota-api
117
+ // (only the create_account tool is registered and it doesn't use SotaClient).
118
+ let apiKey = '';
119
+ const allowAnonymous = !rawToken && isUnauthenticatedAllowed(req.body);
120
+ if (!rawToken && !allowAnonymous) {
121
+ unauthorized(res, 'missing_token', 'Pass Authorization: Bearer <jwt>');
122
+ return;
123
+ }
124
+ if (allowAnonymous) {
125
+ auditMeta.auth_path = 'anonymous';
126
+ apiKey = 'anonymous';
127
+ }
128
+ else if (rawToken.startsWith('sota_')) {
129
+ // Direct API-key path — legacy testing + CLI use, no OAuth involved.
130
+ apiKey = rawToken;
131
+ auditMeta.auth_path = 'direct_api_key';
132
+ auditMeta.key_prefix = rawToken.slice(0, 13);
133
+ }
134
+ else {
135
+ // JWT path — Claude OAuth
136
+ try {
137
+ const claims = await verifyJwt(rawToken);
138
+ auditMeta.auth_path = 'jwt';
139
+ auditMeta.user_id = claims.sub;
140
+ auditMeta.email = claims.email;
141
+ auditMeta.iss = claims.iss;
142
+ const bridge = await getOrProvisionApiKey(claims.sub);
143
+ apiKey = bridge.apiKey;
144
+ auditMeta.key_provisioned = bridge.created;
145
+ auditMeta.key_rotated = bridge.rotated;
146
+ }
147
+ catch (err) {
148
+ if (err instanceof JwtVerificationError) {
149
+ // eslint-disable-next-line no-console
150
+ console.log(JSON.stringify({
151
+ ...auditMeta,
152
+ event: 'auth_failed',
153
+ error_code: err.code,
154
+ error_message: err.message,
155
+ }));
156
+ unauthorized(res, err.code, err.message);
157
+ return;
158
+ }
159
+ // Database / network problem during bridge — surface as 503, not 401
160
+ // eslint-disable-next-line no-console
161
+ console.error(JSON.stringify({
162
+ ...auditMeta,
163
+ event: 'bridge_error',
164
+ error_message: err instanceof Error ? err.message : String(err),
165
+ }));
166
+ res.status(503).json({
167
+ error: 'bridge_unavailable',
168
+ message: 'Could not provision an API key for this Claude session — try again in a moment.',
169
+ });
170
+ return;
171
+ }
172
+ }
173
+ // Build a fresh MCP server per request (stateless mode).
174
+ const server = new McpServer({
175
+ name: 'sota',
176
+ version: VERSION,
177
+ title: 'sota.io',
178
+ });
179
+ // create_account is registered ALWAYS — it's the wedge tool that lets
180
+ // brand-new users sign up from inside Claude before they have an API key.
181
+ registerCreateAccountTool(server);
182
+ // The sota-api-backed tools are only registered when the request carries
183
+ // valid auth. For anonymous requests (initialize / tools/list / tools/call
184
+ // create_account), the user just sees create_account in the catalog.
185
+ if (!allowAnonymous) {
186
+ const client = new SotaClient({ apiKey, baseUrl: SOTA_API_URL });
187
+ registerProjectTools(server, client);
188
+ registerDeployTool(server, client);
189
+ registerLogsTool(server, client);
190
+ registerEnvTools(server, client);
191
+ registerRollbackTool(server, client);
192
+ registerStatusTool(server, client);
193
+ registerDomainTools(server, client);
194
+ }
195
+ // Stateless transport — no session header required.
196
+ const transport = new StreamableHTTPServerTransport({
197
+ sessionIdGenerator: undefined,
198
+ });
199
+ res.on('close', () => {
200
+ transport.close().catch(() => { });
201
+ server.close().catch(() => { });
202
+ });
203
+ try {
204
+ await server.connect(transport);
205
+ await transport.handleRequest(req, res, req.body);
206
+ // Structured audit log per request (Claude path only — direct API key calls don't audit here)
207
+ // eslint-disable-next-line no-console
208
+ console.log(JSON.stringify({
209
+ ...auditMeta,
210
+ event: 'mcp_request',
211
+ method: req.body?.method,
212
+ duration_ms: Date.now() - startedAt,
213
+ }));
214
+ }
215
+ catch (err) {
216
+ // eslint-disable-next-line no-console
217
+ console.error(JSON.stringify({
218
+ ...auditMeta,
219
+ event: 'mcp_error',
220
+ error_message: err instanceof Error ? err.message : String(err),
221
+ duration_ms: Date.now() - startedAt,
222
+ }));
223
+ if (!res.headersSent) {
224
+ res.status(500).json({
225
+ jsonrpc: '2.0',
226
+ error: { code: -32603, message: err instanceof Error ? err.message : String(err) },
227
+ id: null,
228
+ });
229
+ }
230
+ }
231
+ }
232
+ app.post('/mcp', handleMcpRequest);
233
+ app.get('/mcp', (_req, res) => {
234
+ // GET on /mcp without an active session = 405 Method Not Allowed.
235
+ // (Stateful mode would use GET for the SSE response stream; we're stateless.)
236
+ res.status(405).json({ error: 'method_not_allowed', allowed: 'POST' });
237
+ });
238
+ // ───────────────────────────────────────────────────────────────────────────
239
+ // Root index for humans hitting mcp.sota.io directly
240
+ // ───────────────────────────────────────────────────────────────────────────
241
+ app.get('/', (_req, res) => {
242
+ res.json({
243
+ service: 'sota-mcp',
244
+ version: VERSION,
245
+ description: 'MCP server for sota.io — EU-native PaaS. Use the Streamable HTTP transport at /mcp.',
246
+ docs: 'https://sota.io/docs/integrations/claude',
247
+ endpoints: {
248
+ health: `${PUBLIC_ORIGIN}/health`,
249
+ mcp: `${PUBLIC_ORIGIN}/mcp`,
250
+ protected_resource_metadata: `${PUBLIC_ORIGIN}/.well-known/oauth-protected-resource`,
251
+ },
252
+ });
253
+ });
254
+ // ───────────────────────────────────────────────────────────────────────────
255
+ app.listen(PORT, '0.0.0.0', () => {
256
+ // eslint-disable-next-line no-console
257
+ console.log(`sota-mcp listening on http://0.0.0.0:${PORT} (public: ${PUBLIC_ORIGIN})`);
258
+ });
259
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `create_account` MCP tool — net-new sota.io signup from inside Claude.
3
+ *
4
+ * Two-step flow:
5
+ * 1. create_account({ email }) → triggers Supabase OTP send
6
+ * 2. create_account({ email, code }) → verifies, provisions plan + key
7
+ *
8
+ * The tool is INTENTIONALLY callable without prior authentication. The HTTP
9
+ * server's middleware whitelists this specific tool/call combination so
10
+ * net-new users (who don't have a Supabase JWT yet) can sign up entirely
11
+ * via Claude tool calls.
12
+ *
13
+ * Why this is OK from a security perspective:
14
+ * - Disposable-email blocking (Phase pre-62) filters obvious abuse
15
+ * - Supabase has its own per-email OTP rate limits (default 30/h)
16
+ * - The tool ONLY hits Supabase's public OTP endpoints + our own DB
17
+ * via the bridge — no sota-api access without authentication
18
+ * - The returned `sota_xxx` key is delivered in the tool RESPONSE, not
19
+ * stored in Claude — the user must save it themselves
20
+ */
21
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
+ export declare function registerCreateAccountTool(server: McpServer): void;
23
+ //# sourceMappingURL=create-account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-account.d.ts","sourceRoot":"","sources":["../../src/tools/create-account.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAcpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA+K1D"}
@@ -0,0 +1,171 @@
1
+ import { z } from "zod";
2
+ import { isDisposableEmailDomain } from "../auth/disposable-check.js";
3
+ import { provisionPlanAndKey } from "../auth/token-bridge.js";
4
+ const SUPABASE_URL = process.env.SUPABASE_URL ?? "https://auth.sota.io/auth/v1";
5
+ const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY ?? "";
6
+ const SUPABASE_SERVICE_ROLE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY ?? "";
7
+ export function registerCreateAccountTool(server) {
8
+ server.registerTool("create_account", {
9
+ description: `Sign up for a brand-new sota.io account from inside Claude — no browser, no copy-paste. Two-step flow:
10
+
11
+ STEP 1: Call with just \`email\`. We send a 6-digit confirmation code to that email.
12
+ STEP 2: Call again with \`email\` + \`code\`. We verify, create the account on the Free tier (3 projects, EU-hosted, no credit card), generate a sota.io API key, and return it to you.
13
+
14
+ After Step 2 you'll get back a key like \`sota_…\`. **Save it in a safe place** — you'll need it for any subsequent sota.io tool call in Claude (or you can use it with the sota CLI). It is shown ONCE and never recoverable.
15
+
16
+ sota.io is an EU-native PaaS hosted in Germany — GDPR-compliant by default, no CLOUD Act exposure. Disposable / throwaway email addresses are not accepted; use a real address.`,
17
+ inputSchema: {
18
+ email: z
19
+ .string()
20
+ .email()
21
+ .describe("A real email address. We send the confirmation code here. Throwaway / disposable email services are blocked."),
22
+ code: z
23
+ .string()
24
+ .optional()
25
+ .describe("The 6-digit code from the confirmation email. Provide on the second call to complete signup. Omit on the first call."),
26
+ },
27
+ annotations: {
28
+ readOnlyHint: false,
29
+ destructiveHint: false,
30
+ idempotentHint: false,
31
+ openWorldHint: false,
32
+ },
33
+ }, async ({ email, code }) => {
34
+ const normalizedEmail = email.trim().toLowerCase();
35
+ // Hard gate: reject disposable-email domains at the tool layer too
36
+ // (the web /api/auth/check-email runs at sign-up; this one catches
37
+ // direct-MCP-callers that bypass the web form).
38
+ if (await isDisposableEmailDomain(normalizedEmail)) {
39
+ return {
40
+ isError: true,
41
+ content: [
42
+ {
43
+ type: "text",
44
+ text: "❌ This email address can't be used. Throwaway / disposable email services are not supported by sota.io. Please retry with a permanent address.",
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ if (!SUPABASE_ANON_KEY || !SUPABASE_SERVICE_ROLE_KEY) {
50
+ return {
51
+ isError: true,
52
+ content: [
53
+ {
54
+ type: "text",
55
+ text: "Server misconfigured: SUPABASE keys are missing. Contact info@sota.io.",
56
+ },
57
+ ],
58
+ };
59
+ }
60
+ // ── Step 1: no code → request OTP ──
61
+ if (!code) {
62
+ try {
63
+ const r = await fetch(`${SUPABASE_URL}/otp`, {
64
+ method: "POST",
65
+ headers: {
66
+ "Content-Type": "application/json",
67
+ apikey: SUPABASE_ANON_KEY,
68
+ Authorization: `Bearer ${SUPABASE_ANON_KEY}`,
69
+ },
70
+ body: JSON.stringify({
71
+ email: normalizedEmail,
72
+ create_user: true,
73
+ data: { source: "claude-mcp" },
74
+ }),
75
+ });
76
+ if (!r.ok) {
77
+ const detail = await r.text();
78
+ return {
79
+ isError: true,
80
+ content: [
81
+ {
82
+ type: "text",
83
+ text: `Could not send confirmation code: HTTP ${r.status}. Detail: ${detail.slice(0, 200)}`,
84
+ },
85
+ ],
86
+ };
87
+ }
88
+ return {
89
+ content: [
90
+ {
91
+ type: "text",
92
+ text: `✉️ Confirmation code sent to ${normalizedEmail}.\n\nCheck your inbox (and spam folder — subject: "Your sota.io login code") for a 6-digit code. Then call \`create_account\` again with both \`email\` and \`code\` to complete signup.\n\nThe code expires in 10 minutes. If you don't get it, call this tool again with the same email to resend.`,
93
+ },
94
+ ],
95
+ };
96
+ }
97
+ catch (err) {
98
+ return {
99
+ isError: true,
100
+ content: [
101
+ {
102
+ type: "text",
103
+ text: `Network error reaching Supabase: ${err instanceof Error ? err.message : String(err)}`,
104
+ },
105
+ ],
106
+ };
107
+ }
108
+ }
109
+ // ── Step 2: code provided → verify + provision ──
110
+ try {
111
+ const verifyRes = await fetch(`${SUPABASE_URL}/verify`, {
112
+ method: "POST",
113
+ headers: {
114
+ "Content-Type": "application/json",
115
+ apikey: SUPABASE_ANON_KEY,
116
+ },
117
+ body: JSON.stringify({
118
+ type: "email",
119
+ email: normalizedEmail,
120
+ token: code.trim(),
121
+ }),
122
+ });
123
+ if (!verifyRes.ok) {
124
+ const detail = await verifyRes.text();
125
+ return {
126
+ isError: true,
127
+ content: [
128
+ {
129
+ type: "text",
130
+ text: `❌ Code verification failed (HTTP ${verifyRes.status}). The code may have expired, been mistyped, or already been used. Call \`create_account\` again with just the email to get a fresh code.\n\nDetail: ${detail.slice(0, 200)}`,
131
+ },
132
+ ],
133
+ };
134
+ }
135
+ const session = (await verifyRes.json());
136
+ if (!session.user?.id || !session.user?.email) {
137
+ return {
138
+ isError: true,
139
+ content: [
140
+ {
141
+ type: "text",
142
+ text: "Verification succeeded but Supabase returned no user record. Contact info@sota.io.",
143
+ },
144
+ ],
145
+ };
146
+ }
147
+ // Provision: user_plans (Free tier) + sota_xxx key tagged source=claude
148
+ const result = await provisionPlanAndKey(session.user.id);
149
+ return {
150
+ content: [
151
+ {
152
+ type: "text",
153
+ text: `✅ Account created — welcome to sota.io!\n\n**Your API key (save this — shown once):**\n\`${result.apiKey}\`\n\nYour account:\n- Email: ${session.user.email}\n- User ID: ${session.user.id}\n- Plan: Free (3 projects, EU-hosted, no credit card)\n- Region: Germany (Hetzner Cloud)\n\nNext steps:\n1. **Save the API key** above somewhere safe — it's shown ONCE and never recoverable.\n2. To use sota.io tools in this Claude session, you need to re-install the connector OR pass this key directly. Easiest: log out / log back in to the sota.io connector in Claude (the OAuth flow will now work with your fresh account).\n3. Or use the key with the \`sota\` CLI: \`export SOTA_API_KEY=${result.apiKey}\` then \`sota deploy\`.\n\nDocs: https://sota.io/docs/integrations/claude`,
154
+ },
155
+ ],
156
+ };
157
+ }
158
+ catch (err) {
159
+ return {
160
+ isError: true,
161
+ content: [
162
+ {
163
+ type: "text",
164
+ text: `Provisioning error: ${err instanceof Error ? err.message : String(err)}. Contact info@sota.io with this message.`,
165
+ },
166
+ ],
167
+ };
168
+ }
169
+ });
170
+ }
171
+ //# sourceMappingURL=create-account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-account.js","sourceRoot":"","sources":["../../src/tools/create-account.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/tools/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAmEvE"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/tools/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAoEvE"}
@@ -13,13 +13,14 @@ export function registerDeployTool(server, client) {
13
13
 
14
14
  IMPORTANT: Your app MUST listen on the PORT environment variable. For auto-detected frameworks (Next.js, Node.js, Python) PORT is 8080. For custom Dockerfiles, the port is auto-detected from the EXPOSE directive (e.g. EXPOSE 3000 sets PORT=3000). If no EXPOSE is found, it defaults to 8080.
15
15
 
16
- Every project includes a managed PostgreSQL 17 database. The DATABASE_URL environment variable is auto-injected into your container — no manual database configuration needed. Your app just needs to read DATABASE_URL to connect. If your app needs database migrations, run them on startup.
16
+ Every project includes a managed PostgreSQL 17 database. Six environment variables are auto-injected into your container — no manual database configuration needed: DATABASE_URL (full connection string), PGHOST, PGPORT, PGUSER, PGPASSWORD, and PGDATABASE. Libraries that follow libpq conventions (node-postgres, pgx, psycopg2, Django) pick up the PG* variables automatically with no configuration. If your app needs database migrations, run them on startup.
17
17
 
18
18
  Deployments use blue-green strategy for zero downtime. The old container keeps running until the new one passes health checks (60s timeout). Use get-logs to monitor build progress. Files matching .gitignore and .sotaignore are excluded from the archive.`,
19
19
  inputSchema: {
20
20
  project_id: z.string().describe('Project ID (UUID) to deploy to. Use list-projects to find the ID'),
21
21
  directory: z.string().optional().describe('Absolute path to the directory to deploy. Defaults to current working directory. Must contain your app source code (package.json, requirements.txt, or Dockerfile)'),
22
22
  },
23
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
23
24
  }, async ({ project_id, directory }) => {
24
25
  const dir = directory ? resolve(directory) : process.cwd();
25
26
  if (!existsSync(dir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/tools/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAkB;IACtE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5B,WAAW,EAAE;;;;;;;;;;;8PAW6O;QAC1P,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;YACnG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oKAAoK,CAAC;SAChN;KACF,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAE3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,+BAA+B,GAAG,EAAE;qBAC3C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,mEAAmE;YACnE,MAAM,WAAW,GAAG,oBAAoB,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;YAC5D,QAAQ,CACN,YAAY,WAAW,wFAAwF,GAAG,IAAI,EACtH,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;YAEF,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAChD,UAAU,CAAC,WAAW,CAAC,CAAC;YAExB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAElE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,8BAA8B,UAAU,CAAC,EAAE,eAAe,UAAU,CAAC,MAAM,YAAY,UAAU,CAAC,GAAG,IAAI,SAAS,2CAA2C;qBACpK;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACjF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/tools/deploy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAkB;IACtE,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5B,WAAW,EAAE;;;;;;;;;;;8PAW6O;QAC1P,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kEAAkE,CAAC;YACnG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oKAAoK,CAAC;SAChN;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;KACzG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAE3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,+BAA+B,GAAG,EAAE;qBAC3C;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,mEAAmE;YACnE,MAAM,WAAW,GAAG,oBAAoB,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;YAC5D,QAAQ,CACN,YAAY,WAAW,wFAAwF,GAAG,IAAI,EACtH,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;YAEF,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAChD,UAAU,CAAC,WAAW,CAAC,CAAC;YAExB,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAElE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,8BAA8B,UAAU,CAAC,EAAE,eAAe,UAAU,CAAC,MAAM,YAAY,UAAU,CAAC,GAAG,IAAI,SAAS,2CAA2C;qBACpK;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACjF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../src/tools/domains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAqHxE"}
1
+ {"version":3,"file":"domains.d.ts","sourceRoot":"","sources":["../../src/tools/domains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAyHxE"}
@@ -6,6 +6,7 @@ export function registerDomainTools(server, client) {
6
6
  project_id: z.string().describe('Project ID (UUID) to add the domain to. Use list-projects to find the ID'),
7
7
  domain: z.string().describe('Domain name to add (e.g. "app.example.com" or "example.com")'),
8
8
  },
9
+ annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false },
9
10
  }, async ({ project_id, domain }) => {
10
11
  try {
11
12
  const result = await client.addDomain(project_id, domain);
@@ -32,6 +33,7 @@ export function registerDomainTools(server, client) {
32
33
  inputSchema: {
33
34
  project_id: z.string().describe('Project ID (UUID) to list domains for. Use list-projects to find the ID'),
34
35
  },
36
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
35
37
  }, async ({ project_id }) => {
36
38
  try {
37
39
  const domains = await client.listDomains(project_id);
@@ -58,6 +60,7 @@ export function registerDomainTools(server, client) {
58
60
  project_id: z.string().describe('Project ID (UUID). Use list-projects to find the ID'),
59
61
  domain_id: z.string().describe('Domain ID (UUID). Use list-domains to find the ID'),
60
62
  },
63
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
61
64
  }, async ({ project_id, domain_id }) => {
62
65
  try {
63
66
  const result = await client.getDomain(project_id, domain_id);
@@ -90,6 +93,7 @@ export function registerDomainTools(server, client) {
90
93
  project_id: z.string().describe('Project ID (UUID). Use list-projects to find the ID'),
91
94
  domain_id: z.string().describe('Domain ID (UUID). Use list-domains to find the ID'),
92
95
  },
96
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
93
97
  }, async ({ project_id, domain_id }) => {
94
98
  try {
95
99
  await client.removeDomain(project_id, domain_id);
@@ -1 +1 @@
1
- {"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/tools/domains.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/tools/domains.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAwErE"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QA0ErE"}
package/dist/tools/env.js CHANGED
@@ -1,12 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  export function registerEnvTools(server, client) {
3
3
  server.registerTool('set-env', {
4
- description: 'Set an environment variable for a project. Variables are encrypted at rest (AES-256-GCM) and injected at container runtime. NOTE: DATABASE_URL is auto-injected for the managed PostgreSQL database — you do NOT need to set it manually. The PORT variable is auto-managed: 8080 for auto-detected frameworks (Next.js, Node.js, Python), or auto-detected from the Dockerfile EXPOSE directive for custom Dockerfile builds. IMPORTANT: Changing env vars does NOT auto-redeploy. You must call deploy or use the redeploy API endpoint to apply changes. For Next.js apps, NEXT_PUBLIC_* variables must be set BEFORE deploying since they are embedded at build time.',
4
+ description: 'Set an environment variable for a project. Variables are encrypted at rest (AES-256-GCM) and injected at container runtime. NOTE: DATABASE_URL, PGHOST, PGPORT, PGUSER, PGPASSWORD, and PGDATABASE are all auto-injected for the managed PostgreSQL database — you do NOT need to set any of them manually. The PORT variable is auto-managed: 8080 for auto-detected frameworks (Next.js, Node.js, Python), or auto-detected from the Dockerfile EXPOSE directive for custom Dockerfile builds. IMPORTANT: Changing env vars does NOT auto-redeploy. You must call deploy or use the redeploy API endpoint to apply changes. For Next.js apps, NEXT_PUBLIC_* variables must be set BEFORE deploying since they are embedded at build time.',
5
5
  inputSchema: {
6
6
  project_id: z.string().describe('Project ID (UUID)'),
7
7
  key: z.string().describe('Environment variable name (e.g., STRIPE_KEY, REDIS_URL, API_SECRET). Do NOT set DATABASE_URL — it is auto-managed'),
8
8
  value: z.string().describe('Environment variable value. Will be encrypted at rest'),
9
9
  },
10
+ annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
10
11
  }, async ({ project_id, key, value }) => {
11
12
  try {
12
13
  await client.setEnvVar(project_id, { key, value });
@@ -32,10 +33,11 @@ export function registerEnvTools(server, client) {
32
33
  }
33
34
  });
34
35
  server.registerTool('get-env', {
35
- description: 'List environment variables for a project. Values are masked for security. Auto-injected variables (DATABASE_URL, PORT) may not appear in this list but are always available in the container at runtime.',
36
+ description: 'List environment variables for a project. Values are masked for security. Auto-injected variables (DATABASE_URL, PGHOST, PGPORT, PGUSER, PGPASSWORD, PGDATABASE, PORT) may not appear in this list but are always available in the container at runtime.',
36
37
  inputSchema: {
37
38
  project_id: z.string().describe('Project ID (UUID)'),
38
39
  },
40
+ annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
39
41
  }, async ({ project_id }) => {
40
42
  try {
41
43
  const envVars = await client.listEnvVars(project_id);
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAkB;IACpE,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE;QAC7B,WAAW,EAAE,2oBAA2oB;QACxpB,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACpD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mHAAmH,CAAC;YAC7I,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;SACpF;KACF,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,wBAAwB,GAAG,oBAAoB;qBACtD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE;QAC7B,WAAW,EAAE,0MAA0M;QACvN,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACrD;KACF,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,+BAA+B;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACpD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAkB;IACpE,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE;QAC7B,WAAW,EAAE,6sBAA6sB;QAC1tB,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACpD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mHAAmH,CAAC;YAC7I,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;SACpF;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACxG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,wBAAwB,GAAG,oBAAoB;qBACtD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzF;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE;QAC7B,WAAW,EAAE,0PAA0P;QACvQ,WAAW,EAAE;YACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;SACrD;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACxG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,+BAA+B;yBACtC;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC;YACrE,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACpD;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAiDrE"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAkDrE"}