@occam-scaly/mcp-server 0.1.2

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 (91) hide show
  1. package/README.md +166 -0
  2. package/bin/scaly-mcp.js +6 -0
  3. package/dist/audit.d.ts +25 -0
  4. package/dist/audit.d.ts.map +1 -0
  5. package/dist/audit.js +182 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/client.d.ts +16 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +142 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/config.d.ts +24 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +76 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/index.d.ts +3 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +279 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/resources/index.d.ts +17 -0
  20. package/dist/resources/index.d.ts.map +1 -0
  21. package/dist/resources/index.js +505 -0
  22. package/dist/resources/index.js.map +1 -0
  23. package/dist/tools/addons.d.ts +3 -0
  24. package/dist/tools/addons.d.ts.map +1 -0
  25. package/dist/tools/addons.js +128 -0
  26. package/dist/tools/addons.js.map +1 -0
  27. package/dist/tools/apps.d.ts +3 -0
  28. package/dist/tools/apps.d.ts.map +1 -0
  29. package/dist/tools/apps.js +121 -0
  30. package/dist/tools/apps.js.map +1 -0
  31. package/dist/tools/compute.d.ts +3 -0
  32. package/dist/tools/compute.d.ts.map +1 -0
  33. package/dist/tools/compute.js +135 -0
  34. package/dist/tools/compute.js.map +1 -0
  35. package/dist/tools/db.d.ts +3 -0
  36. package/dist/tools/db.d.ts.map +1 -0
  37. package/dist/tools/db.js +597 -0
  38. package/dist/tools/db.js.map +1 -0
  39. package/dist/tools/deployments.d.ts +3 -0
  40. package/dist/tools/deployments.d.ts.map +1 -0
  41. package/dist/tools/deployments.js +354 -0
  42. package/dist/tools/deployments.js.map +1 -0
  43. package/dist/tools/diagnose.d.ts +3 -0
  44. package/dist/tools/diagnose.d.ts.map +1 -0
  45. package/dist/tools/diagnose.js +213 -0
  46. package/dist/tools/diagnose.js.map +1 -0
  47. package/dist/tools/env.d.ts +3 -0
  48. package/dist/tools/env.d.ts.map +1 -0
  49. package/dist/tools/env.js +216 -0
  50. package/dist/tools/env.js.map +1 -0
  51. package/dist/tools/index.d.ts +38 -0
  52. package/dist/tools/index.d.ts.map +1 -0
  53. package/dist/tools/index.js +48 -0
  54. package/dist/tools/index.js.map +1 -0
  55. package/dist/tools/jobs.d.ts +3 -0
  56. package/dist/tools/jobs.d.ts.map +1 -0
  57. package/dist/tools/jobs.js +160 -0
  58. package/dist/tools/jobs.js.map +1 -0
  59. package/dist/tools/logs.d.ts +3 -0
  60. package/dist/tools/logs.d.ts.map +1 -0
  61. package/dist/tools/logs.js +157 -0
  62. package/dist/tools/logs.js.map +1 -0
  63. package/dist/tools/operations.d.ts +3 -0
  64. package/dist/tools/operations.d.ts.map +1 -0
  65. package/dist/tools/operations.js +262 -0
  66. package/dist/tools/operations.js.map +1 -0
  67. package/dist/tools/project.d.ts +3 -0
  68. package/dist/tools/project.d.ts.map +1 -0
  69. package/dist/tools/project.js +341 -0
  70. package/dist/tools/project.js.map +1 -0
  71. package/dist/tools/s3.d.ts +3 -0
  72. package/dist/tools/s3.d.ts.map +1 -0
  73. package/dist/tools/s3.js +256 -0
  74. package/dist/tools/s3.js.map +1 -0
  75. package/dist/tools/status.d.ts +3 -0
  76. package/dist/tools/status.d.ts.map +1 -0
  77. package/dist/tools/status.js +139 -0
  78. package/dist/tools/status.js.map +1 -0
  79. package/dist/tools/write.d.ts +3 -0
  80. package/dist/tools/write.d.ts.map +1 -0
  81. package/dist/tools/write.js +900 -0
  82. package/dist/tools/write.js.map +1 -0
  83. package/dist/utils/jwt.d.ts +3 -0
  84. package/dist/utils/jwt.d.ts.map +1 -0
  85. package/dist/utils/jwt.js +32 -0
  86. package/dist/utils/jwt.js.map +1 -0
  87. package/dist/utils/paths.d.ts +5 -0
  88. package/dist/utils/paths.d.ts.map +1 -0
  89. package/dist/utils/paths.js +26 -0
  90. package/dist/utils/paths.js.map +1 -0
  91. package/package.json +50 -0
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.envTools = void 0;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../client.js");
6
+ const index_js_1 = require("./index.js");
7
+ const blockedKeyPatterns = ['SECRET', 'TOKEN', 'KEY', 'PASSWORD', 'CREDENTIAL'];
8
+ function isBlockedEnvKey(key) {
9
+ const upper = key.toUpperCase();
10
+ return blockedKeyPatterns.some((p) => upper.includes(p));
11
+ }
12
+ async function setEnvVar(appId, name, value) {
13
+ const getAppGql = `
14
+ query GetApp($where: AppWhereUniqueInput!) {
15
+ getApp(where: $where) {
16
+ id
17
+ name
18
+ envVars {
19
+ id
20
+ name
21
+ }
22
+ }
23
+ }
24
+ `;
25
+ const appResult = await (0, client_js_1.query)(getAppGql, {
26
+ where: { id: appId }
27
+ });
28
+ if (!appResult.getApp) {
29
+ return {
30
+ ok: false,
31
+ error: {
32
+ code: 'RESOURCE_NOT_FOUND',
33
+ message: `App not found: ${appId}`,
34
+ retriable: false
35
+ }
36
+ };
37
+ }
38
+ const existing = appResult.getApp.envVars?.find((v) => v.name === name);
39
+ const updateGql = `
40
+ mutation UpdateApp($where: AppWhereUniqueInput!, $data: AppUpdateInput) {
41
+ updateApp(where: $where, data: $data) {
42
+ id
43
+ }
44
+ }
45
+ `;
46
+ if (existing) {
47
+ await (0, client_js_1.query)(updateGql, {
48
+ where: { id: appId },
49
+ data: {
50
+ envVars: {
51
+ update: [
52
+ {
53
+ where: { id: existing.id },
54
+ data: { value }
55
+ }
56
+ ]
57
+ }
58
+ }
59
+ });
60
+ return {
61
+ ok: true,
62
+ app: appResult.getApp,
63
+ action: 'updated',
64
+ env_var_id: existing.id
65
+ };
66
+ }
67
+ await (0, client_js_1.query)(updateGql, {
68
+ where: { id: appId },
69
+ data: {
70
+ envVars: {
71
+ create: [{ name, value }]
72
+ }
73
+ }
74
+ });
75
+ return {
76
+ ok: true,
77
+ app: appResult.getApp,
78
+ action: 'created',
79
+ env_var_id: null
80
+ };
81
+ }
82
+ const SetEnvSchema = zod_1.z.object({
83
+ app_id: zod_1.z.string().describe('The app ID to set the environment variable on'),
84
+ name: zod_1.z
85
+ .string()
86
+ .regex(/^[A-Z][A-Z0-9_]*$/, 'name must be uppercase with underscores')
87
+ .describe('The environment variable name (e.g., DATABASE_URL)'),
88
+ value: zod_1.z.string().describe('The value to set')
89
+ });
90
+ const SetEnvVarLegacySchema = zod_1.z.object({
91
+ app_id: zod_1.z.string().describe('The app ID to set the environment variable on'),
92
+ key: zod_1.z
93
+ .string()
94
+ .regex(/^[A-Z][A-Z0-9_]*$/, 'key must be uppercase with underscores')
95
+ .describe('DEPRECATED: use name'),
96
+ value: zod_1.z.string().describe('The value to set')
97
+ });
98
+ const GetEnvSchema = zod_1.z.object({
99
+ app_id: zod_1.z.string().describe('The app ID to list environment variables for')
100
+ });
101
+ exports.envTools = [
102
+ {
103
+ name: 'scaly_set_env',
104
+ description: 'Set an environment variable for an app (imperative; creates drift from .scaly/config.yaml). ' +
105
+ 'For secret-like keys, use scaly secrets set via CLI instead.',
106
+ inputSchema: SetEnvSchema,
107
+ handler: async (input) => {
108
+ try {
109
+ if (isBlockedEnvKey(input.name)) {
110
+ return (0, index_js_1.fail)({
111
+ code: 'VALIDATION_ERROR',
112
+ message: 'Refusing to set secret-like key via scaly_set_env; use scaly secrets set (CLI) instead.',
113
+ retriable: false,
114
+ details: { name: input.name }
115
+ });
116
+ }
117
+ const result = await setEnvVar(input.app_id, input.name, input.value);
118
+ if (!result.ok)
119
+ return (0, index_js_1.fail)(result.error);
120
+ return (0, index_js_1.ok)({
121
+ app: { id: result.app.id, name: result.app.name },
122
+ name: input.name,
123
+ action: result.action,
124
+ redeploy_required: true,
125
+ drift_warning: true
126
+ });
127
+ }
128
+ catch (err) {
129
+ return (0, index_js_1.fail)({
130
+ code: 'INTERNAL_ERROR',
131
+ message: err.message,
132
+ retriable: true
133
+ });
134
+ }
135
+ }
136
+ },
137
+ {
138
+ name: 'scaly_set_env_var',
139
+ description: 'DEPRECATED alias for scaly_set_env (kept for backward compatibility).',
140
+ inputSchema: SetEnvVarLegacySchema,
141
+ handler: async (input) => {
142
+ try {
143
+ if (isBlockedEnvKey(input.key)) {
144
+ return (0, index_js_1.fail)({
145
+ code: 'VALIDATION_ERROR',
146
+ message: 'Refusing to set secret-like key via scaly_set_env_var; use scaly secrets set (CLI) instead.',
147
+ retriable: false,
148
+ details: { key: input.key }
149
+ });
150
+ }
151
+ const result = await setEnvVar(input.app_id, input.key, input.value);
152
+ if (!result.ok)
153
+ return (0, index_js_1.fail)(result.error);
154
+ return (0, index_js_1.ok)({
155
+ app: { id: result.app.id, name: result.app.name },
156
+ name: input.key,
157
+ action: result.action,
158
+ redeploy_required: true,
159
+ drift_warning: true
160
+ });
161
+ }
162
+ catch (err) {
163
+ return (0, index_js_1.fail)({
164
+ code: 'INTERNAL_ERROR',
165
+ message: err.message,
166
+ retriable: true
167
+ });
168
+ }
169
+ }
170
+ },
171
+ {
172
+ name: 'scaly_get_env_vars',
173
+ description: 'List environment variable names configured for an app (values are never returned).',
174
+ inputSchema: GetEnvSchema,
175
+ handler: async (input) => {
176
+ try {
177
+ const gql = `
178
+ query GetApp($where: AppWhereUniqueInput!) {
179
+ getApp(where: $where) {
180
+ id
181
+ name
182
+ envVars {
183
+ id
184
+ name
185
+ }
186
+ }
187
+ }
188
+ `;
189
+ const result = await (0, client_js_1.query)(gql, {
190
+ where: { id: input.app_id }
191
+ });
192
+ if (!result.getApp) {
193
+ return (0, index_js_1.fail)({
194
+ code: 'RESOURCE_NOT_FOUND',
195
+ message: `App not found: ${input.app_id}`,
196
+ retriable: false
197
+ });
198
+ }
199
+ const names = (result.getApp.envVars || []).map((v) => v.name).sort();
200
+ return (0, index_js_1.ok)({
201
+ app: { id: result.getApp.id, name: result.getApp.name },
202
+ env_var_names: names,
203
+ count: names.length
204
+ });
205
+ }
206
+ catch (err) {
207
+ return (0, index_js_1.fail)({
208
+ code: 'INTERNAL_ERROR',
209
+ message: err.message,
210
+ retriable: true
211
+ });
212
+ }
213
+ }
214
+ }
215
+ ];
216
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/tools/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ export type ErrorCode = 'VALIDATION_ERROR' | 'RESOURCE_NOT_FOUND' | 'RESOURCE_EXISTS' | 'PERMISSION_DENIED' | 'TOKEN_EXPIRED' | 'RATE_LIMITED' | 'TIMEOUT' | 'INTERNAL_ERROR' | 'OPERATION_PENDING' | 'PLAN_STALE' | 'NOT_SUPPORTED';
3
+ export interface ToolError {
4
+ code: ErrorCode;
5
+ message: string;
6
+ retriable: boolean;
7
+ retry_after_ms?: number;
8
+ details?: unknown;
9
+ }
10
+ export interface ToolMeta {
11
+ request_id: string;
12
+ duration_ms: number;
13
+ }
14
+ export interface ToolResponse<T> {
15
+ success: boolean;
16
+ data?: T;
17
+ error?: ToolError;
18
+ meta: ToolMeta;
19
+ }
20
+ export type ToolHandlerResult<T> = {
21
+ success: true;
22
+ data: T;
23
+ } | {
24
+ success: false;
25
+ error: ToolError;
26
+ data?: unknown;
27
+ };
28
+ export interface ToolDefinition {
29
+ name: string;
30
+ description: string;
31
+ inputSchema: z.ZodObject<any>;
32
+ handler: (input: any) => Promise<ToolHandlerResult<unknown>>;
33
+ }
34
+ export declare function ok<T>(data: T): ToolHandlerResult<T>;
35
+ export declare function fail(error: ToolError, data?: unknown): ToolHandlerResult<never>;
36
+ export declare const allTools: ToolDefinition[];
37
+ export declare const toolMap: Map<string, ToolDefinition>;
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,oBAAoB,GACpB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,cAAc,GACd,SAAS,GACT,gBAAgB,GAChB,mBAAmB,GACnB,YAAY,GACZ,eAAe,CAAC;AAEpB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAC3B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;CAC9D;AAED,wBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAEnD;AAED,wBAAgB,IAAI,CAClB,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,OAAO,GACb,iBAAiB,CAAC,KAAK,CAAC,CAI1B;AAmBD,eAAO,MAAM,QAAQ,EAAE,cAAc,EAepC,CAAC;AAGF,eAAO,MAAM,OAAO,6BAEnB,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toolMap = exports.allTools = void 0;
4
+ exports.ok = ok;
5
+ exports.fail = fail;
6
+ function ok(data) {
7
+ return { success: true, data };
8
+ }
9
+ function fail(error, data) {
10
+ return data === undefined
11
+ ? { success: false, error }
12
+ : { success: false, error, data };
13
+ }
14
+ // Import all tools
15
+ const apps_js_1 = require("./apps.js");
16
+ const compute_js_1 = require("./compute.js");
17
+ const jobs_js_1 = require("./jobs.js");
18
+ const deployments_js_1 = require("./deployments.js");
19
+ const logs_js_1 = require("./logs.js");
20
+ const diagnose_js_1 = require("./diagnose.js");
21
+ const env_js_1 = require("./env.js");
22
+ const operations_js_1 = require("./operations.js");
23
+ const status_js_1 = require("./status.js");
24
+ const project_js_1 = require("./project.js");
25
+ const addons_js_1 = require("./addons.js");
26
+ const write_js_1 = require("./write.js");
27
+ const db_js_1 = require("./db.js");
28
+ const s3_js_1 = require("./s3.js");
29
+ // Export all tools as a flat array
30
+ exports.allTools = [
31
+ ...apps_js_1.listAppsTools,
32
+ ...compute_js_1.listComputeTools,
33
+ ...jobs_js_1.listJobsTools,
34
+ ...addons_js_1.addOnTools,
35
+ ...deployments_js_1.deploymentTools,
36
+ ...logs_js_1.logTools,
37
+ ...diagnose_js_1.diagnoseTools,
38
+ ...env_js_1.envTools,
39
+ ...operations_js_1.operationTools,
40
+ ...status_js_1.statusTools,
41
+ ...project_js_1.projectTools,
42
+ ...write_js_1.writeTools,
43
+ ...db_js_1.dbTools,
44
+ ...s3_js_1.s3Tools
45
+ ];
46
+ // Export tool map for quick lookup
47
+ exports.toolMap = new Map(exports.allTools.map((tool) => [tool.name, tool]));
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;AA+CA,gBAEC;AAED,oBAOC;AAXD,SAAgB,EAAE,CAAI,IAAO;IAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAgB,IAAI,CAClB,KAAgB,EAChB,IAAc;IAEd,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;QAC3B,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,mBAAmB;AACnB,uCAA0C;AAC1C,6CAAgD;AAChD,uCAA0C;AAC1C,qDAAmD;AACnD,uCAAqC;AACrC,+CAA8C;AAC9C,qCAAoC;AACpC,mDAAiD;AACjD,2CAA0C;AAC1C,6CAA4C;AAC5C,2CAAyC;AACzC,yCAAwC;AACxC,mCAAkC;AAClC,mCAAkC;AAElC,mCAAmC;AACtB,QAAA,QAAQ,GAAqB;IACxC,GAAG,uBAAa;IAChB,GAAG,6BAAgB;IACnB,GAAG,uBAAa;IAChB,GAAG,sBAAU;IACb,GAAG,gCAAe;IAClB,GAAG,kBAAQ;IACX,GAAG,2BAAa;IAChB,GAAG,iBAAQ;IACX,GAAG,8BAAc;IACjB,GAAG,uBAAW;IACd,GAAG,yBAAY;IACf,GAAG,qBAAU;IACb,GAAG,eAAO;IACV,GAAG,eAAO;CACX,CAAC;AAEF,mCAAmC;AACtB,QAAA,OAAO,GAAG,IAAI,GAAG,CAC5B,gBAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from './index.js';
2
+ export declare const listJobsTools: ToolDefinition[];
3
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,YAAY,CAAC;AA2E3D,eAAO,MAAM,aAAa,EAAE,cAAc,EA0IzC,CAAC"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listJobsTools = void 0;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../client.js");
6
+ const index_js_1 = require("./index.js");
7
+ // Schemas
8
+ const ListJobsSchema = zod_1.z.object({
9
+ account_id: zod_1.z
10
+ .string()
11
+ .optional()
12
+ .describe('The account ID to list jobs for. If omitted, the server will infer it from your accessible stacks.')
13
+ });
14
+ const RunJobSchema = zod_1.z.object({
15
+ job_id: zod_1.z.string().describe('The scheduled job ID to run'),
16
+ account_id: zod_1.z
17
+ .string()
18
+ .optional()
19
+ .describe('The account ID that owns the job. If omitted, the server will infer it from your accessible stacks.')
20
+ });
21
+ async function resolveAccountId(explicit) {
22
+ if (explicit)
23
+ return explicit;
24
+ const result = await (0, client_js_1.query)(`
25
+ query ResolveAccountId {
26
+ listStacks(take: 1) {
27
+ accountId
28
+ }
29
+ }
30
+ `);
31
+ return result.listStacks?.[0]?.accountId ?? null;
32
+ }
33
+ // Tools
34
+ exports.listJobsTools = [
35
+ {
36
+ name: 'scaly_list_jobs',
37
+ description: 'List all scheduled jobs for an account. ' +
38
+ 'Shows job name, schedule, status, and last/next run times.',
39
+ inputSchema: ListJobsSchema,
40
+ handler: async (input) => {
41
+ try {
42
+ const accountId = await resolveAccountId(input.account_id);
43
+ if (!accountId) {
44
+ return (0, index_js_1.fail)({
45
+ code: 'VALIDATION_ERROR',
46
+ message: 'account_id is required (unable to infer account from accessible stacks)',
47
+ retriable: false
48
+ });
49
+ }
50
+ const gql = `
51
+ query AccountScheduledJobs($accountId: ID!) {
52
+ accountScheduledJobs(accountId: $accountId) {
53
+ id
54
+ name
55
+ appId
56
+ command
57
+ schedule
58
+ timezone
59
+ status
60
+ lastRunAt
61
+ lastRunStatus
62
+ nextRunAt
63
+ app {
64
+ name
65
+ }
66
+ }
67
+ }
68
+ `;
69
+ const result = await (0, client_js_1.query)(gql, {
70
+ accountId
71
+ });
72
+ const jobs = result.accountScheduledJobs || [];
73
+ return (0, index_js_1.ok)({ jobs, count: jobs.length, account_id: accountId });
74
+ }
75
+ catch (err) {
76
+ return (0, index_js_1.fail)({
77
+ code: 'INTERNAL_ERROR',
78
+ message: err.message,
79
+ retriable: true
80
+ });
81
+ }
82
+ }
83
+ },
84
+ {
85
+ name: 'scaly_run_job',
86
+ description: 'Trigger a scheduled job to run immediately. ' +
87
+ 'Use this to test jobs or run them outside their normal schedule.',
88
+ inputSchema: RunJobSchema,
89
+ handler: async (input) => {
90
+ try {
91
+ const accountId = await resolveAccountId(input.account_id);
92
+ if (!accountId) {
93
+ return (0, index_js_1.fail)({
94
+ code: 'VALIDATION_ERROR',
95
+ message: 'account_id is required (unable to infer account from accessible stacks)',
96
+ retriable: false
97
+ });
98
+ }
99
+ // First get the job to confirm it exists and show details
100
+ const getGql = `
101
+ query ScheduledJob($id: ID!, $accountId: ID!) {
102
+ scheduledJob(id: $id, accountId: $accountId) {
103
+ id
104
+ name
105
+ appId
106
+ status
107
+ }
108
+ }
109
+ `;
110
+ const getResult = await (0, client_js_1.query)(getGql, {
111
+ id: input.job_id,
112
+ accountId
113
+ });
114
+ if (!getResult.scheduledJob) {
115
+ return (0, index_js_1.fail)({
116
+ code: 'RESOURCE_NOT_FOUND',
117
+ message: `Job not found: ${input.job_id}`,
118
+ retriable: false
119
+ });
120
+ }
121
+ const job = getResult.scheduledJob;
122
+ // Trigger the job run
123
+ const runGql = `
124
+ mutation RunScheduledJobNow($id: ID!, $accountId: ID!) {
125
+ runScheduledJobNow(id: $id, accountId: $accountId) {
126
+ id
127
+ jobId
128
+ status
129
+ startedAt
130
+ triggeredBy
131
+ }
132
+ }
133
+ `;
134
+ const runResult = await (0, client_js_1.query)(runGql, {
135
+ id: input.job_id,
136
+ accountId
137
+ });
138
+ const run = runResult.runScheduledJobNow;
139
+ return (0, index_js_1.ok)({
140
+ job: {
141
+ id: job.id,
142
+ name: job.name,
143
+ app_id: job.appId,
144
+ status: job.status
145
+ },
146
+ run,
147
+ account_id: accountId
148
+ });
149
+ }
150
+ catch (err) {
151
+ return (0, index_js_1.fail)({
152
+ code: 'INTERNAL_ERROR',
153
+ message: err.message,
154
+ retriable: true
155
+ });
156
+ }
157
+ }
158
+ }
159
+ ];
160
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,4CAAqC;AACrC,yCAA2D;AA0C3D,UAAU;AACV,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IAC9B,UAAU,EAAE,OAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,oGAAoG,CACrG;CACJ,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC1D,UAAU,EAAE,OAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,qGAAqG,CACtG;CACJ,CAAC,CAAC;AAEH,KAAK,UAAU,gBAAgB,CAAC,QAAiB;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAK,EAA+C;;;;;;GAMxE,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC;AACnD,CAAC;AAED,QAAQ;AACK,QAAA,aAAa,GAAqB;IAC7C;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,0CAA0C;YAC1C,4DAA4D;QAC9D,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,KAAK,EAAE,KAAqC,EAAE,EAAE;YACvD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,IAAA,eAAI,EAAC;wBACV,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EACL,yEAAyE;wBAC3E,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;SAkBX,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAK,EAAmB,GAAG,EAAE;oBAChD,SAAS;iBACV,CAAC,CAAC;gBAEH,MAAM,IAAI,GAAG,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;gBAC/C,OAAO,IAAA,aAAE,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YACjE,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,IAAA,eAAI,EAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF;IAED;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,8CAA8C;YAC9C,kEAAkE;QACpE,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,KAAK,EAAE,KAAmC,EAAE,EAAE;YACrD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,IAAA,eAAI,EAAC;wBACV,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EACL,yEAAyE;wBAC3E,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,0DAA0D;gBAC1D,MAAM,MAAM,GAAG;;;;;;;;;SASd,CAAC;gBAEF,MAAM,SAAS,GAAG,MAAM,IAAA,iBAAK,EAAiB,MAAM,EAAE;oBACpD,EAAE,EAAE,KAAK,CAAC,MAAM;oBAChB,SAAS;iBACV,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;oBAC5B,OAAO,IAAA,eAAI,EAAC;wBACV,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,kBAAkB,KAAK,CAAC,MAAM,EAAE;wBACzC,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC;gBAEnC,sBAAsB;gBACtB,MAAM,MAAM,GAAG;;;;;;;;;;SAUd,CAAC;gBAEF,MAAM,SAAS,GAAG,MAAM,IAAA,iBAAK,EAAiB,MAAM,EAAE;oBACpD,EAAE,EAAE,KAAK,CAAC,MAAM;oBAChB,SAAS;iBACV,CAAC,CAAC;gBAEH,MAAM,GAAG,GAAG,SAAS,CAAC,kBAAkB,CAAC;gBACzC,OAAO,IAAA,aAAE,EAAC;oBACR,GAAG,EAAE;wBACH,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,MAAM,EAAE,GAAG,CAAC,KAAK;wBACjB,MAAM,EAAE,GAAG,CAAC,MAAM;qBACnB;oBACD,GAAG;oBACH,UAAU,EAAE,SAAS;iBACtB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,OAAO,IAAA,eAAI,EAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from './index.js';
2
+ export declare const logTools: ToolDefinition[];
3
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAY,MAAM,YAAY,CAAC;AAiG3D,eAAO,MAAM,QAAQ,EAAE,cAAc,EA8GpC,CAAC"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logTools = void 0;
4
+ const zod_1 = require("zod");
5
+ const client_js_1 = require("../client.js");
6
+ const index_js_1 = require("./index.js");
7
+ const GetLogsSchema = zod_1.z.object({
8
+ app_id: zod_1.z.string().describe('The app ID to get logs for'),
9
+ time_range: zod_1.z
10
+ .string()
11
+ .optional()
12
+ .default('1h')
13
+ .describe('Lookback window (e.g., 15m, 1h, 6h, 1d). Default: 1h'),
14
+ level: zod_1.z
15
+ .enum(['error', 'warn', 'info', 'debug', 'all'])
16
+ .optional()
17
+ .default('all')
18
+ .describe('Filter logs by level'),
19
+ limit: zod_1.z
20
+ .number()
21
+ .int()
22
+ .min(1)
23
+ .max(500)
24
+ .optional()
25
+ .default(100)
26
+ .describe('Maximum number of log events to return (max 500)'),
27
+ q: zod_1.z.string().optional().describe('Optional search string (server-side)'),
28
+ page_token: zod_1.z
29
+ .string()
30
+ .optional()
31
+ .describe('Pagination token from a previous response')
32
+ });
33
+ function parseTimeRangeToLookbackHours(timeRange) {
34
+ const m = String(timeRange)
35
+ .trim()
36
+ .match(/^(\d+)([smhd])$/i);
37
+ if (!m)
38
+ return null;
39
+ const value = Number(m[1]);
40
+ const unit = m[2].toLowerCase();
41
+ if (!Number.isFinite(value) || value <= 0)
42
+ return null;
43
+ switch (unit) {
44
+ case 's':
45
+ return value / 3600;
46
+ case 'm':
47
+ return value / 60;
48
+ case 'h':
49
+ return value;
50
+ case 'd':
51
+ return value * 24;
52
+ default:
53
+ return null;
54
+ }
55
+ }
56
+ exports.logTools = [
57
+ {
58
+ name: 'scaly_get_logs',
59
+ description: 'Get recent logs for an app. Returns structured JSON (unified logs).',
60
+ inputSchema: GetLogsSchema,
61
+ handler: async (input) => {
62
+ try {
63
+ const getAppGql = `
64
+ query GetApp($where: AppWhereUniqueInput!) {
65
+ getApp(where: $where) {
66
+ id
67
+ name
68
+ stackId
69
+ accountId
70
+ }
71
+ }
72
+ `;
73
+ const appResult = await (0, client_js_1.query)(getAppGql, {
74
+ where: { id: input.app_id }
75
+ });
76
+ if (!appResult.getApp) {
77
+ return (0, index_js_1.fail)({
78
+ code: 'RESOURCE_NOT_FOUND',
79
+ message: `App not found: ${input.app_id}`,
80
+ retriable: false
81
+ });
82
+ }
83
+ const app = appResult.getApp;
84
+ const lookbackHours = parseTimeRangeToLookbackHours(input.time_range);
85
+ if (!lookbackHours) {
86
+ return (0, index_js_1.fail)({
87
+ code: 'VALIDATION_ERROR',
88
+ message: 'Invalid time_range; expected like 15m, 1h, 6h, 1d (e.g., "30m")',
89
+ retriable: false
90
+ });
91
+ }
92
+ const levels = input.level === 'all'
93
+ ? undefined
94
+ : [
95
+ input.level === 'error'
96
+ ? 'Error'
97
+ : input.level === 'warn'
98
+ ? 'Warn'
99
+ : input.level === 'info'
100
+ ? 'Info'
101
+ : 'Debug'
102
+ ];
103
+ const logsGql = `
104
+ query GetUnifiedLogs($where: UnifiedLogsWhereInput!) {
105
+ getUnifiedLogs(where: $where) {
106
+ truncated
107
+ nextToken
108
+ cursorStart
109
+ cursorEnd
110
+ diagnosticsBundleUrl
111
+ events {
112
+ id
113
+ ts
114
+ message
115
+ level
116
+ source
117
+ appId
118
+ appName
119
+ stackId
120
+ stackName
121
+ deploymentId
122
+ logStreamName
123
+ ingestionTime
124
+ jsonPayload
125
+ }
126
+ }
127
+ }
128
+ `;
129
+ const where = {
130
+ accountId: app.accountId,
131
+ appIds: [input.app_id],
132
+ lookbackHours,
133
+ limit: input.limit,
134
+ q: input.q,
135
+ pageToken: input.page_token
136
+ };
137
+ if (levels)
138
+ where.levels = levels;
139
+ const logsResult = await (0, client_js_1.query)(logsGql, {
140
+ where
141
+ });
142
+ return (0, index_js_1.ok)({
143
+ app: { id: app.id, name: app.name, stack_id: app.stackId },
144
+ logs: logsResult.getUnifiedLogs
145
+ });
146
+ }
147
+ catch (err) {
148
+ return (0, index_js_1.fail)({
149
+ code: 'INTERNAL_ERROR',
150
+ message: err.message,
151
+ retriable: true
152
+ });
153
+ }
154
+ }
155
+ }
156
+ ];
157
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"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"}