@ratio-mcp/dev-server 1.2.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 (100) hide show
  1. package/dist/data/scope-webhook-map.d.ts +26 -0
  2. package/dist/data/scope-webhook-map.d.ts.map +1 -0
  3. package/dist/data/scope-webhook-map.js +117 -0
  4. package/dist/data/scope-webhook-map.js.map +1 -0
  5. package/dist/index.d.ts +5 -4
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +11 -13
  8. package/dist/index.js.map +1 -1
  9. package/dist/orchestrated-index.d.ts +4 -9
  10. package/dist/orchestrated-index.d.ts.map +1 -1
  11. package/dist/orchestrated-index.js +6 -14
  12. package/dist/orchestrated-index.js.map +1 -1
  13. package/dist/orchestrated-server.d.ts +14 -9
  14. package/dist/orchestrated-server.d.ts.map +1 -1
  15. package/dist/orchestrated-server.js +86 -48
  16. package/dist/orchestrated-server.js.map +1 -1
  17. package/dist/services/session-state.d.ts +50 -16
  18. package/dist/services/session-state.d.ts.map +1 -1
  19. package/dist/services/session-state.js +195 -140
  20. package/dist/services/session-state.js.map +1 -1
  21. package/dist/services/tool-guard.d.ts +29 -9
  22. package/dist/services/tool-guard.d.ts.map +1 -1
  23. package/dist/services/tool-guard.js +83 -60
  24. package/dist/services/tool-guard.js.map +1 -1
  25. package/dist/templates/backend/.env.example +3 -0
  26. package/dist/templates/backend/package.json +2 -1
  27. package/dist/templates/backend/src/app.module.ts +2 -0
  28. package/dist/templates/backend/src/oauth/oauth-callback.controller.ts +62 -0
  29. package/dist/templates/backend/src/oauth/oauth-callback.module.ts +10 -0
  30. package/dist/templates/backend/src/oauth/oauth-callback.service.ts +158 -0
  31. package/dist/templates/frontend/.env.example +1 -1
  32. package/dist/templates/frontend/README.md +16 -0
  33. package/dist/templates/frontend/eslint.config.js +29 -0
  34. package/dist/templates/frontend/index.html +4 -4
  35. package/dist/templates/frontend/jsconfig.json +22 -0
  36. package/dist/templates/frontend/package.json +14 -11
  37. package/dist/templates/frontend/public/favicon.svg +1 -0
  38. package/dist/templates/frontend/public/icons.svg +24 -0
  39. package/dist/templates/frontend/src/App.css +184 -0
  40. package/dist/templates/frontend/src/App.jsx +121 -0
  41. package/dist/templates/frontend/src/assets/hero.png +0 -0
  42. package/dist/templates/frontend/src/assets/react.svg +1 -0
  43. package/dist/templates/frontend/src/assets/vite.svg +1 -0
  44. package/dist/templates/frontend/src/index.css +94 -31
  45. package/dist/templates/frontend/src/main.jsx +10 -0
  46. package/dist/templates/frontend/vite.config.js +19 -0
  47. package/dist/tools/app-management.d.ts.map +1 -1
  48. package/dist/tools/app-management.js +73 -13
  49. package/dist/tools/app-management.js.map +1 -1
  50. package/dist/tools/auth.d.ts.map +1 -1
  51. package/dist/tools/auth.js +15 -3
  52. package/dist/tools/auth.js.map +1 -1
  53. package/dist/tools/codegen.d.ts.map +1 -1
  54. package/dist/tools/codegen.js +312 -18
  55. package/dist/tools/codegen.js.map +1 -1
  56. package/dist/tools/gather-requirements.d.ts.map +1 -1
  57. package/dist/tools/gather-requirements.js +19 -19
  58. package/dist/tools/gather-requirements.js.map +1 -1
  59. package/dist/tools/get-status.d.ts +3 -0
  60. package/dist/tools/get-status.d.ts.map +1 -0
  61. package/dist/tools/get-status.js +122 -0
  62. package/dist/tools/get-status.js.map +1 -0
  63. package/dist/tools/hookdeck.d.ts +3 -0
  64. package/dist/tools/hookdeck.d.ts.map +1 -0
  65. package/dist/tools/hookdeck.js +101 -0
  66. package/dist/tools/hookdeck.js.map +1 -0
  67. package/dist/tools/index.d.ts.map +1 -1
  68. package/dist/tools/index.js +7 -3
  69. package/dist/tools/index.js.map +1 -1
  70. package/dist/tools/lifecycle.d.ts.map +1 -1
  71. package/dist/tools/lifecycle.js +22 -11
  72. package/dist/tools/lifecycle.js.map +1 -1
  73. package/dist/tools/reference-data.d.ts.map +1 -1
  74. package/dist/tools/reference-data.js +6 -4
  75. package/dist/tools/reference-data.js.map +1 -1
  76. package/dist/tools/requirements.d.ts.map +1 -1
  77. package/dist/tools/requirements.js +84 -5
  78. package/dist/tools/requirements.js.map +1 -1
  79. package/dist/tools/scaffold.d.ts.map +1 -1
  80. package/dist/tools/scaffold.js +30 -16
  81. package/dist/tools/scaffold.js.map +1 -1
  82. package/dist/tools/submission.js +4 -4
  83. package/dist/tools/submission.js.map +1 -1
  84. package/dist/tools/webhooks.d.ts +25 -0
  85. package/dist/tools/webhooks.d.ts.map +1 -1
  86. package/dist/tools/webhooks.js +143 -93
  87. package/dist/tools/webhooks.js.map +1 -1
  88. package/dist/utils/logger.js +17 -17
  89. package/dist/utils/logger.js.map +1 -1
  90. package/package.json +2 -2
  91. package/dist/templates/frontend/src/App.tsx +0 -32
  92. package/dist/templates/frontend/src/components/Layout.tsx +0 -53
  93. package/dist/templates/frontend/src/context/AuthContext.tsx +0 -59
  94. package/dist/templates/frontend/src/main.tsx +0 -16
  95. package/dist/templates/frontend/src/pages/Callback.tsx +0 -53
  96. package/dist/templates/frontend/src/pages/Dashboard.tsx +0 -24
  97. package/dist/templates/frontend/src/pages/Login.tsx +0 -42
  98. package/dist/templates/frontend/src/services/api.ts +0 -48
  99. package/dist/templates/frontend/tsconfig.json +0 -21
  100. package/dist/templates/frontend/vite.config.ts +0 -15
@@ -0,0 +1,122 @@
1
+ import { z } from 'zod';
2
+ import { getSession, getAppState, getActiveAppId, getAllCompletedTools } from '../services/session-state.js';
3
+ import { checkToolPrerequisites } from '../services/tool-guard.js';
4
+ import { logger } from '../utils/logger.js';
5
+ /**
6
+ * All tools in the system, grouped by purpose.
7
+ * Used to compute available/blocked status.
8
+ */
9
+ const ALL_TOOLS = [
10
+ // Auth
11
+ 'developer_login', 'developer_signup', 'developer_verify_otp',
12
+ // Read-only
13
+ 'get_categories', 'get_webhook_topics',
14
+ // App setup
15
+ 'create_app',
16
+ // Requirements
17
+ 'gather_requirements', 'define_app_requirements',
18
+ // Webhooks
19
+ 'create_webhooks',
20
+ // Frontend pipeline
21
+ 'scaffold_frontend', 'build_frontend', 'validate_build',
22
+ 'create_submission_zip', 'upload_build', 'submit_for_review',
23
+ // Review & publish
24
+ 'get_app_status', 'publish_app',
25
+ // Backend
26
+ 'scaffold_backend', 'generate_api_routes',
27
+ ];
28
+ /**
29
+ * Compute suggested next tool based on what's done and what's available.
30
+ * Picks the tool that unblocks the most downstream work.
31
+ */
32
+ function computeSuggestedNext(completed) {
33
+ // Priority order — the main happy path
34
+ const HAPPY_PATH = [
35
+ 'developer_login',
36
+ 'create_app',
37
+ 'gather_requirements',
38
+ 'define_app_requirements',
39
+ 'scaffold_frontend',
40
+ 'build_frontend',
41
+ 'validate_build',
42
+ 'create_submission_zip',
43
+ 'upload_build',
44
+ 'submit_for_review',
45
+ 'get_app_status',
46
+ 'publish_app',
47
+ 'scaffold_backend',
48
+ 'generate_api_routes',
49
+ ];
50
+ for (const tool of HAPPY_PATH) {
51
+ if (!completed.has(tool)) {
52
+ const guard = checkToolPrerequisites(tool);
53
+ if (guard.allowed)
54
+ return tool;
55
+ }
56
+ }
57
+ return undefined;
58
+ }
59
+ export const statusTools = [
60
+ {
61
+ name: 'get_status',
62
+ description: 'Returns the current session status: authenticated developer, active app, completed tools, ' +
63
+ 'available tools (unblocked), blocked tools (with reasons), and a suggested next step. ' +
64
+ 'Call this tool to orient yourself before taking any action. ' +
65
+ 'This is a read-only tool with no prerequisites — it can be called at any time.',
66
+ inputSchema: z.object({
67
+ app_id: z.string().optional().describe('Optional app ID to check status for. If omitted, uses the currently active app.'),
68
+ }),
69
+ handler: async (input) => {
70
+ const { app_id } = input;
71
+ const session = getSession();
72
+ const targetAppId = app_id || getActiveAppId();
73
+ logger.info(`[get_status] Checking status for app_id=${targetAppId || 'none'}`);
74
+ // Build completed set (global + app-specific)
75
+ const completedGlobal = new Set(session.completedTools);
76
+ const appState = targetAppId ? getAppState(targetAppId) : undefined;
77
+ const completedAll = new Set(getAllCompletedTools());
78
+ // Compute available and blocked tools
79
+ const available = [];
80
+ const blocked = {};
81
+ for (const tool of ALL_TOOLS) {
82
+ if (completedAll.has(tool))
83
+ continue; // Already done
84
+ const guard = checkToolPrerequisites(tool);
85
+ if (guard.allowed) {
86
+ available.push(tool);
87
+ }
88
+ else {
89
+ blocked[tool] = guard.hint || guard.message || 'Prerequisites not met';
90
+ }
91
+ }
92
+ const suggestedNext = computeSuggestedNext(completedAll);
93
+ const confirmedScopes = appState?.context.confirmedScopes || session.context.confirmedScopes;
94
+ return {
95
+ authenticated: completedGlobal.has('developer_login') || completedGlobal.has('developer_verify_otp'),
96
+ developer_id: session.context.developerId || null,
97
+ active_app: targetAppId ? {
98
+ app_id: targetAppId,
99
+ name: appState?.context.appName || session.context.appName || null,
100
+ client_id: appState?.context.clientId || session.context.clientId || null,
101
+ scopes_confirmed: appState?.context.scopesConfirmed || false,
102
+ confirmed_scopes: appState?.context.confirmedScopes || [],
103
+ webhooks_configured: appState?.context.webhooksConfigured || false,
104
+ app_approved: appState?.context.appApproved || false,
105
+ app_published: appState?.context.appPublished || false,
106
+ project_path: appState?.context.projectPath || session.context.projectPath || null,
107
+ completed_tools: appState ? [...appState.completedTools] : [],
108
+ } : null,
109
+ completed: [...completedAll],
110
+ available_now: available,
111
+ blocked,
112
+ suggested_next: suggestedNext || null,
113
+ // Hint for webhook setup if scopes confirmed but webhooks not configured
114
+ webhook_hint: (confirmedScopes && confirmedScopes.length > 0 && !appState?.context.webhooksConfigured)
115
+ ? 'Scopes are confirmed but webhooks not yet configured. Call get_webhook_topics to see available events.'
116
+ : undefined,
117
+ app_count: Object.keys(session.apps).length,
118
+ };
119
+ },
120
+ },
121
+ ];
122
+ //# sourceMappingURL=get-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-status.js","sourceRoot":"","sources":["../../src/tools/get-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from './index.js';
2
+ export declare const hookdeckTools: ToolDefinition[];
3
+ //# sourceMappingURL=hookdeck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookdeck.d.ts","sourceRoot":"","sources":["../../src/tools/hookdeck.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAsDjD,eAAO,MAAM,aAAa,EAAE,cAAc,EAyEzC,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { z } from 'zod';
2
+ import axios from 'axios';
3
+ import { HOOKDECK_API_KEY } from '@ratio-mcp/shared';
4
+ import { logger } from '../utils/logger.js';
5
+ const HOOKDECK_API_BASE = 'https://api.hookdeck.com/2025-07-01';
6
+ // ── Hookdeck API helpers ───────────────────────────────────────────────
7
+ async function hookdeckRequest(method, path, data) {
8
+ const apiKey = HOOKDECK_API_KEY;
9
+ if (!apiKey) {
10
+ throw new Error('Hookdeck API key not found in constants.ts. Contact team lead.');
11
+ }
12
+ const url = `${HOOKDECK_API_BASE}${path}`;
13
+ logger.info(`[hookdeck-api] ${method} ${url} — body=${data ? JSON.stringify(data).slice(0, 300) : 'none'}`);
14
+ try {
15
+ const response = await axios({
16
+ method,
17
+ url,
18
+ data,
19
+ headers: {
20
+ Authorization: `Bearer ${apiKey}`,
21
+ 'Content-Type': 'application/json',
22
+ },
23
+ });
24
+ logger.info(`[hookdeck-api] Response ${response.status}: ${JSON.stringify(response.data).slice(0, 500)}`);
25
+ return response.data;
26
+ }
27
+ catch (err) {
28
+ const status = err.response?.status;
29
+ const errBody = err.response?.data ? JSON.stringify(err.response.data).slice(0, 500) : err.message;
30
+ logger.error(`[hookdeck-api] ERROR ${status}: ${errBody}`);
31
+ throw err;
32
+ }
33
+ }
34
+ // ── Tool definitions ───────────────────────────────────────────────────
35
+ export const hookdeckTools = [
36
+ {
37
+ name: 'setup_hookdeck',
38
+ description: 'Set up a Hookdeck tunnel for OAuth callback URL. Provisions a persistent public URL that tunnels to the developer\'s localhost. ' +
39
+ 'This is used when the developer does NOT have their own callback URL. ' +
40
+ 'If the developer provides their own callback URL, skip this tool entirely. ' +
41
+ 'Just pass app_id and port to provision a new connection. API key is built-in.',
42
+ inputSchema: z.object({
43
+ app_id: z.string().optional().describe('App ID from create_app. Used to name the Hookdeck connection.'),
44
+ port: z.number().default(3000).describe('Local port the backend will run on. Defaults to 3000.'),
45
+ }),
46
+ handler: async (input) => {
47
+ const { app_id, port } = input;
48
+ logger.info(`[setup_hookdeck] START — app_id=${app_id}, port=${port}`);
49
+ // Provision Hookdeck connection
50
+ // app_id may not exist yet (called before create_app), so use a unique suffix
51
+ const suffix = app_id ? app_id.slice(0, 8) : Date.now().toString(36);
52
+ const connectionName = `ratio-app-${suffix}`;
53
+ const sourceName = `ratio-oauth-${suffix}`;
54
+ const destinationName = `ratio-local-${suffix}`;
55
+ logger.info(`[setup_hookdeck] Creating connection: ${connectionName}`);
56
+ try {
57
+ const connection = await hookdeckRequest('PUT', '/connections', {
58
+ name: connectionName,
59
+ source: {
60
+ name: sourceName,
61
+ config: {
62
+ allowed_http_methods: ['GET', 'POST'],
63
+ },
64
+ },
65
+ destination: {
66
+ name: destinationName,
67
+ config: {
68
+ url: `http://localhost:${port}`,
69
+ },
70
+ },
71
+ });
72
+ const hookdeckUrl = connection.source.url;
73
+ logger.info(`[setup_hookdeck] Connection created: ${connectionName}, URL: ${hookdeckUrl}`);
74
+ return {
75
+ success: true,
76
+ message: `Hookdeck tunnel provisioned. OAuth callback URL: ${hookdeckUrl}/callback`,
77
+ hookdeck_url: hookdeckUrl,
78
+ callback_url: `${hookdeckUrl}/callback`,
79
+ hookdeck_source_name: sourceName,
80
+ connection_id: connection.id,
81
+ source_id: connection.source.id,
82
+ destination_url: `http://localhost:${port}/callback`,
83
+ next_steps: [
84
+ `Use "${hookdeckUrl}/callback" as the redirect_uri when creating the app`,
85
+ 'The Hookdeck CLI will be started automatically with the backend',
86
+ ],
87
+ };
88
+ }
89
+ catch (error) {
90
+ const errMsg = error.response?.data?.message || error.message;
91
+ logger.error(`[setup_hookdeck] Failed to create connection: ${errMsg}`);
92
+ return {
93
+ error: true,
94
+ message: `Failed to provision Hookdeck connection: ${errMsg}`,
95
+ hint: 'Check your Hookdeck API key and account status at https://dashboard.hookdeck.com',
96
+ };
97
+ }
98
+ },
99
+ },
100
+ ];
101
+ //# sourceMappingURL=hookdeck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hookdeck.js","sourceRoot":"","sources":["../../src/tools/hookdeck.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAgBD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,cAAc,EAavC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC;IACvB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAkBD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,cAAc,EAevC,CAAC"}
@@ -10,7 +10,9 @@ import { codegenTools } from './codegen.js';
10
10
  import { buildTools } from './build.js';
11
11
  import { submissionTools } from './submission.js';
12
12
  import { webhookTools } from './webhooks.js';
13
+ import { hookdeckTools } from './hookdeck.js';
13
14
  import { lifecycleTools } from './lifecycle.js';
15
+ import { statusTools } from './get-status.js';
14
16
  /**
15
17
  * All dev-server tools in registration order
16
18
  * NOTE: get_available_scopes is in docs-server (static data, no auth needed)
@@ -18,16 +20,18 @@ import { lifecycleTools } from './lifecycle.js';
18
20
  export const allDevTools = [
19
21
  ...developerAuthTools, // 3 tools
20
22
  ...referenceDataTools, // 1 tool (get_categories — call before create_app)
23
+ ...hookdeckTools, // 1 tool (setup_hookdeck — optional, before create_app)
21
24
  ...appManagementTools, // 5 tools
22
25
  ...gatherRequirementsTools, // 1 tool (gather_requirements — NL → scope recommendations)
23
- ...requirementsTools, // 1 tool
26
+ ...requirementsTools, // 2 tools (define_app_requirements, validate_scopes)
24
27
  ...scaffoldTools, // 2 tools
25
- ...authTools, // 4 tools (request_auth_code, get_access_token, refresh, check_status)
28
+ ...authTools, // 2 tools (refresh_access_token, check_token_status — request_auth_code and get_access_token removed: OAuth happens via merchant install callback)
26
29
  ...codegenTools, // 1 tool
27
30
  ...buildTools, // 3 tools
28
31
  ...submissionTools, // 4 tools
29
32
  ...webhookTools, // 5 tools (get_webhook_topics, create_webhooks, list_webhooks, toggle_webhook, delete_webhook)
30
33
  ...lifecycleTools, // 1 tool
34
+ ...statusTools, // 1 tool (get_status — session status and available tools)
31
35
  ];
32
- // Total: 31 tools
36
+ // Total: 33 tools
33
37
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAYA,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,GAAG,kBAAkB,EAAK,UAAU;IACpC,GAAG,kBAAkB,EAAK,oDAAoD;IAC9E,GAAG,kBAAkB,EAAK,UAAU;IACpC,GAAG,uBAAuB,EAAE,6DAA6D;IACzF,GAAG,iBAAiB,EAAM,SAAS;IACnC,GAAG,aAAa,EAAU,UAAU;IACpC,GAAG,SAAS,EAAc,uEAAuE;IACjG,GAAG,YAAY,EAAW,SAAS;IACnC,GAAG,UAAU,EAAa,UAAU;IACpC,GAAG,eAAe,EAAQ,UAAU;IACpC,GAAG,YAAY,EAAW,+FAA+F;IACzH,GAAG,cAAc,EAAS,SAAS;CACpC,CAAC;AACF,kBAAkB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAYA,yBAAyB;AACzB,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,GAAG,kBAAkB,EAAK,UAAU;IACpC,GAAG,kBAAkB,EAAK,oDAAoD;IAC9E,GAAG,aAAa,EAAU,yDAAyD;IACnF,GAAG,kBAAkB,EAAK,UAAU;IACpC,GAAG,uBAAuB,EAAE,6DAA6D;IACzF,GAAG,iBAAiB,EAAM,qDAAqD;IAC/E,GAAG,aAAa,EAAU,UAAU;IACpC,GAAG,SAAS,EAAc,mJAAmJ;IAC7K,GAAG,YAAY,EAAW,SAAS;IACnC,GAAG,UAAU,EAAa,UAAU;IACpC,GAAG,eAAe,EAAQ,UAAU;IACpC,GAAG,YAAY,EAAW,+FAA+F;IACzH,GAAG,cAAc,EAAS,SAAS;IACnC,GAAG,WAAW,EAAY,4DAA4D;CACvF,CAAC;AACF,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqFjD,eAAO,MAAM,cAAc,EAAE,cAAc,EAyB1C,CAAC"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA4FjD,eAAO,MAAM,cAAc,EAAE,cAAc,EA4B1C,CAAC"}
@@ -18,9 +18,11 @@ const LIFECYCLE_PHASES = [
18
18
  name: 'App Creation',
19
19
  description: 'Create the app. Steps: ' +
20
20
  '1) Call get_categories and let the developer pick categories. ' +
21
- '2) Ask if they have a callback URL or should use localhost. ' +
22
- '3) Call create_app with name, description, categories, and callback URL.',
23
- tools: ['get_categories', 'create_app'],
21
+ '2) Ask the developer: "Do you have a callback URL for OAuth, or should we set one up for you?" ' +
22
+ ' - If NO: Call setup_hookdeck to provision a persistent public URL (tunnels to their localhost). ' +
23
+ ' - If YES: Use their URL directly, skip setup_hookdeck. ' +
24
+ '3) Call create_app with name, description, categories, and callback URL (auto-filled from Hookdeck if set up).',
25
+ tools: ['get_categories', 'setup_hookdeck', 'create_app'],
24
26
  },
25
27
  {
26
28
  phase: 3,
@@ -56,15 +58,21 @@ const LIFECYCLE_PHASES = [
56
58
  },
57
59
  {
58
60
  phase: 7,
59
- name: 'Publish & OAuth',
60
- description: 'Publish the approved app, then complete the OAuth flow with a merchant to get access tokens.',
61
- tools: ['publish_app', 'request_auth_code', 'get_access_token'],
61
+ name: 'Publish',
62
+ description: 'Publish the approved app so merchants can install it.',
63
+ tools: ['publish_app'],
62
64
  },
63
65
  {
64
66
  phase: 8,
65
- name: 'Backend Code Generation',
66
- description: 'Scaffold the NestJS backend (with OAuth tokens in .env), then auto-generate ' +
67
- 'API routes for each resource based on the confirmed scopes.',
67
+ name: 'Backend Code Generation & Auto-Start',
68
+ description: 'Scaffold the NestJS backend (with /callback handler for receiving merchant install tokens), ' +
69
+ 'then auto-generate API routes for each resource based on the confirmed scopes. ' +
70
+ 'generate_api_routes will AUTOMATICALLY: 1) Run npm install, 2) Start the backend server, ' +
71
+ '3) Start Hookdeck CLI tunnel if Hookdeck was configured. The developer does NOT need to run anything manually. ' +
72
+ 'Once the backend is running, merchants can install the app from the store. When a merchant clicks Install, ' +
73
+ 'the OAuth code is sent to the callback URL, the backend exchanges it for an access token, and the token + merchant_id ' +
74
+ 'are displayed in the console and stored in merchant-tokens.json. ' +
75
+ 'NOTE: Multi-merchant token management will be added in a future update.',
68
76
  tools: ['scaffold_backend', 'generate_api_routes'],
69
77
  docs_server_tools: ['get_scope_endpoint_map', 'get_api_reference'],
70
78
  },
@@ -87,14 +95,17 @@ export const lifecycleTools = [
87
95
  success: true,
88
96
  total_phases: LIFECYCLE_PHASES.length,
89
97
  phases: LIFECYCLE_PHASES,
90
- note: 'Tools prefixed with docs_server are from ratio-mcp-doc. All other tools are from ratio-mcp-dev.',
98
+ note: 'Tools prefixed with docs_server are from ratio-docs-server. All other tools are from ratio-dev-server.',
91
99
  important: [
92
100
  'Follow the phases in order — the tool guard will block out-of-order calls',
101
+ 'Ask if the developer has a callback URL — if not, call setup_hookdeck before create_app',
93
102
  'Scope selection is critical — it drives backend code generation AND webhook suggestions',
94
103
  'Always call define_app_requirements with confirmed=false first to preview scopes',
95
- 'Webhook events are auto-suggested based on confirmed scopes (Phase 4)',
96
104
  'Phase 4 (Webhooks) is optional — ask the developer if they need event notifications',
97
105
  'Backend code generation only works for codegen_ready resources (currently: orders, products)',
106
+ 'generate_api_routes auto-starts the backend + Hookdeck tunnel — developer never runs npm run dev manually',
107
+ 'OAuth happens automatically when merchants install the app — the backend /callback handler exchanges the code for a token and displays it in the console',
108
+ 'No need to call request_auth_code or get_access_token manually — the callback flow handles it',
98
109
  ],
99
110
  };
100
111
  },
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG;IACvB;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,oDAAoD;QACjE,KAAK,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC;KACvE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,yBAAyB;YACzB,gEAAgE;YAChE,8DAA8D;YAC9D,0EAA0E;QAC5E,KAAK,EAAE,CAAC,gBAAgB,EAAE,YAAY,CAAC;KACxC;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,iGAAiG;YACjG,2FAA2F;YAC3F,2FAA2F;YAC3F,+FAA+F;YAC/F,kFAAkF;QACpF,KAAK,EAAE,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;QACzD,iBAAiB,EAAE,CAAC,sBAAsB,CAAC;KAC5C;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,iFAAiF;YACjF,gGAAgG;YAChG,iGAAiG;YACjG,iEAAiE;QACnE,KAAK,EAAE,CAAC,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,CAAC;KAClE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,gGAAgG;QAClG,KAAK,EAAE,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,cAAc,EAAE,mBAAmB,CAAC;KAC7G;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,qDAAqD;QAClE,KAAK,EAAE,CAAC,gBAAgB,CAAC;KAC1B;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,8FAA8F;QAChG,KAAK,EAAE,CAAC,aAAa,EAAE,mBAAmB,EAAE,kBAAkB,CAAC;KAChE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,8EAA8E;YAC9E,6DAA6D;QAC/D,KAAK,EAAE,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;QAClD,iBAAiB,EAAE,CAAC,wBAAwB,EAAE,mBAAmB,CAAC;KACnE;IACD;QACE,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0DAA0D;QACvE,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;KACzC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,4FAA4F;YAC5F,6FAA6F;YAC7F,kCAAkC;QACpC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,gBAAgB,CAAC,MAAM;gBACrC,MAAM,EAAE,gBAAgB;gBACxB,IAAI,EAAE,iGAAiG;gBACvG,SAAS,EAAE;oBACT,2EAA2E;oBAC3E,yFAAyF;oBACzF,kFAAkF;oBAClF,uEAAuE;oBACvE,qFAAqF;oBACrF,8FAA8F;iBAC/F;aACF,CAAC;QACJ,CAAC;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/tools/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reference-data.d.ts","sourceRoot":"","sources":["../../src/tools/reference-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuCxF;AAED,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAyC9C,CAAC"}
1
+ {"version":3,"file":"reference-data.d.ts","sourceRoot":"","sources":["../../src/tools/reference-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD;;;GAGG;AACH,wBAAsB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuCxF;AAED,eAAO,MAAM,kBAAkB,EAAE,cAAc,EA2C9C,CAAC"}
@@ -68,10 +68,12 @@ export const referenceDataTools = [
68
68
  name: cat.name,
69
69
  description: cat.description || null,
70
70
  })),
71
- _instruction: 'Present these categories to the developer as a numbered list. ' +
72
- 'Ask them to pick the ones that best fit their app. ' +
73
- 'They can choose multiple. Use the slug values when calling create_app. ' +
74
- 'The slugs will be auto-resolved to UUIDs internally.',
71
+ _instruction: 'MANDATORY: You MUST present these categories to the developer as a numbered list and ask them to choose. ' +
72
+ 'Do NOT auto-select categories based on the app name or description. ' +
73
+ 'The developer MUST explicitly confirm which categories they want. ' +
74
+ 'After they confirm, call create_app with their chosen category slugs. ' +
75
+ 'create_app will BLOCK if the developer has not confirmed categories.',
76
+ requires_developer_confirmation: true,
75
77
  };
76
78
  },
77
79
  },
@@ -1 +1 @@
1
- {"version":3,"file":"reference-data.js","sourceRoot":"","sources":["../../src/tools/reference-data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reference-data.js","sourceRoot":"","sources":["../../src/tools/reference-data.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/tools/requirements.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,eAAO,MAAM,iBAAiB,EAAE,cAAc,EA0L7C,CAAC"}
1
+ {"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/tools/requirements.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD,eAAO,MAAM,iBAAiB,EAAE,cAAc,EA2Q7C,CAAC"}
@@ -1,7 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  import { ALL_SCOPE_CODES, getResourceForScope, RESOURCE_METADATA, SCOPES_BY_RESOURCE } from '@ratio-mcp/shared';
3
3
  import { saveRequirements } from '../store/requirements-store.js';
4
+ import { getRecommendedWebhookEvents } from './webhooks.js';
5
+ import { developerApiRequest } from '../api/developer.js';
4
6
  import { logger } from '../utils/logger.js';
7
+ // No client-side scope resolution needed — the backend's PATCH /applications/:id
8
+ // accepts both UUIDs and scope codes via its resolveScopeIds() method.
5
9
  export const requirementsTools = [
6
10
  {
7
11
  name: 'define_app_requirements',
@@ -114,7 +118,7 @@ export const requirementsTools = [
114
118
  suggestedAdditional.push({
115
119
  code: pairedCode,
116
120
  label: pairedData.label,
117
- reason: `Commonly needed with ${scope} — ${pairedData.description.split('.')[0]}.`,
121
+ reason: `Commonly needed with ${scope} — ${pairedData.label}.`,
118
122
  });
119
123
  }
120
124
  alreadySelected.add(pairedCode); // prevent re-suggesting
@@ -137,7 +141,7 @@ export const requirementsTools = [
137
141
  'Once approved, call define_app_requirements again with the final scopes and confirmed=true.',
138
142
  };
139
143
  }
140
- // ── If confirmed: save requirements ──────────────────────
144
+ // ── If confirmed: save requirements locally + update backend ──
141
145
  const requirements = {
142
146
  app_id,
143
147
  app_name,
@@ -148,11 +152,32 @@ export const requirementsTools = [
148
152
  updated_at: new Date().toISOString(),
149
153
  };
150
154
  saveRequirements(app_id, requirements);
151
- logger.info(`Requirements confirmed and saved for app: ${app_id}`);
155
+ logger.info(`Requirements confirmed and saved locally for app: ${app_id}`);
156
+ // Sync scopes to backend — send scope codes directly.
157
+ // The backend's PATCH /applications/:id accepts both UUIDs and scope codes
158
+ // via its resolveScopeIds() method, so no client-side resolution needed.
159
+ let backendSyncResult = { synced: false };
160
+ try {
161
+ await developerApiRequest('PATCH', `/applications/${app_id}`, {
162
+ scopeIds: validScopes,
163
+ });
164
+ backendSyncResult = { synced: true };
165
+ logger.info(`[requirements] Synced ${validScopes.length} scopes to backend for app: ${app_id}`);
166
+ }
167
+ catch (err) {
168
+ const errMsg = err instanceof Error ? err.message : String(err);
169
+ backendSyncResult = { synced: false, message: errMsg };
170
+ logger.error(`[requirements] Failed to sync scopes to backend: ${errMsg}`);
171
+ warnings.push(`Scopes saved locally but failed to sync to backend: ${errMsg}`);
172
+ }
173
+ // Fetch real webhook events from backend, filtered by confirmed scopes
174
+ const webhookRecs = await getRecommendedWebhookEvents(validScopes);
175
+ const hasRecommendations = webhookRecs.recommended.length > 0 || webhookRecs.always_recommended.length > 0;
152
176
  return {
153
177
  success: true,
154
178
  confirmed: true,
155
- message: `Requirements saved for app ${app_id}`,
179
+ message: `Requirements saved for app ${app_id}` +
180
+ (backendSyncResult.synced ? ' and synced to backend' : ' (local only — backend sync failed)'),
156
181
  requirements: {
157
182
  app_id,
158
183
  scopes: validScopes,
@@ -160,8 +185,62 @@ export const requirementsTools = [
160
185
  codegen_resources: [...dataNeedsSet].filter((r) => RESOURCE_METADATA[r]?.codegen_ready),
161
186
  features,
162
187
  },
188
+ backend_sync: backendSyncResult,
189
+ webhook_recommendations: hasRecommendations ? {
190
+ message: 'Based on your confirmed scopes, these webhook events are available:',
191
+ recommended_events: webhookRecs.recommended,
192
+ always_recommended_events: webhookRecs.always_recommended,
193
+ _instruction: 'Show these REAL event names to the developer. These come directly from the backend. ' +
194
+ 'Ask if they want to subscribe to any. If yes, ask for their webhook URL and call create_webhooks ' +
195
+ 'with the exact event_name values shown here. If no, proceed to scaffold_frontend.',
196
+ } : undefined,
163
197
  warnings: warnings.length > 0 ? warnings : undefined,
164
- next_step: 'Call scaffold_frontend to create the frontend project.',
198
+ next_step: hasRecommendations
199
+ ? 'Show the developer the recommended webhook events and ask if they want to subscribe.'
200
+ : 'Call scaffold_frontend to create the frontend project.',
201
+ doc_hint: 'Call get_webhook_topics to see ALL available events beyond the recommendations.',
202
+ };
203
+ },
204
+ },
205
+ {
206
+ name: 'validate_scopes',
207
+ description: 'Validate a list of scope codes against the platform. Returns which scopes are valid and which are not. ' +
208
+ 'MANDATORY: You MUST call this tool before presenting any scope recommendations to the developer. ' +
209
+ 'This prevents showing scopes that do not exist on the platform.',
210
+ inputSchema: z.object({
211
+ scopes: z
212
+ .array(z.string())
213
+ .min(1)
214
+ .describe('Array of scope codes to validate (e.g. ["read_orders", "read_payments"])'),
215
+ }),
216
+ handler: async (input) => {
217
+ const { scopes } = input;
218
+ logger.info(`[validate_scopes] Validating ${scopes.length} scopes`);
219
+ const valid = [];
220
+ const invalid = [];
221
+ for (const code of scopes) {
222
+ if (ALL_SCOPE_CODES.has(code)) {
223
+ const resource = getResourceForScope(code);
224
+ const scopeData = resource ? (SCOPES_BY_RESOURCE[resource] || []).find((s) => s.code === code) : undefined;
225
+ valid.push({
226
+ code,
227
+ label: scopeData?.label || code,
228
+ resource: resource || 'unknown',
229
+ });
230
+ }
231
+ else {
232
+ invalid.push(code);
233
+ }
234
+ }
235
+ logger.info(`[validate_scopes] Result: ${valid.length} valid, ${invalid.length} invalid`);
236
+ return {
237
+ valid,
238
+ invalid,
239
+ total_valid: valid.length,
240
+ total_invalid: invalid.length,
241
+ _instruction: 'ONLY present the scopes listed in "valid" to the developer. ' +
242
+ 'Do NOT mention, suggest, or include any scope from the "invalid" list. ' +
243
+ 'If you were about to recommend an invalid scope, silently drop it.',
165
244
  };
166
245
  },
167
246
  },
@@ -1 +1 @@
1
- {"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/tools/requirements.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/tools/requirements.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BjD,eAAO,MAAM,aAAa,EAAE,cAAc,EAuOzC,CAAC"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BjD,eAAO,MAAM,aAAa,EAAE,cAAc,EAqPzC,CAAC"}