@tiny-machine/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/commands/create/context.d.ts +28 -0
  2. package/dist/commands/create/context.d.ts.map +1 -0
  3. package/dist/commands/create/context.js +35 -0
  4. package/dist/commands/create/context.js.map +1 -0
  5. package/dist/commands/create/display.d.ts +7 -0
  6. package/dist/commands/create/display.d.ts.map +1 -0
  7. package/dist/commands/create/display.js +45 -0
  8. package/dist/commands/create/display.js.map +1 -0
  9. package/dist/commands/create/index.d.ts +3 -0
  10. package/dist/commands/create/index.d.ts.map +1 -0
  11. package/dist/commands/create/index.js +36 -0
  12. package/dist/commands/create/index.js.map +1 -0
  13. package/dist/commands/create/stages/activate.d.ts +12 -0
  14. package/dist/commands/create/stages/activate.d.ts.map +1 -0
  15. package/dist/commands/create/stages/activate.js +73 -0
  16. package/dist/commands/create/stages/activate.js.map +1 -0
  17. package/dist/commands/create/stages/channel.d.ts +11 -0
  18. package/dist/commands/create/stages/channel.d.ts.map +1 -0
  19. package/dist/commands/create/stages/channel.js +27 -0
  20. package/dist/commands/create/stages/channel.js.map +1 -0
  21. package/dist/commands/create/stages/configure.d.ts +10 -0
  22. package/dist/commands/create/stages/configure.d.ts.map +1 -0
  23. package/dist/commands/create/stages/configure.js +134 -0
  24. package/dist/commands/create/stages/configure.js.map +1 -0
  25. package/dist/commands/create/stages/connect.d.ts +11 -0
  26. package/dist/commands/create/stages/connect.d.ts.map +1 -0
  27. package/dist/commands/create/stages/connect.js +266 -0
  28. package/dist/commands/create/stages/connect.js.map +1 -0
  29. package/dist/commands/create/stages/create-machine.d.ts +10 -0
  30. package/dist/commands/create/stages/create-machine.d.ts.map +1 -0
  31. package/dist/commands/create/stages/create-machine.js +43 -0
  32. package/dist/commands/create/stages/create-machine.js.map +1 -0
  33. package/dist/commands/create/stages/interpret.d.ts +8 -0
  34. package/dist/commands/create/stages/interpret.d.ts.map +1 -0
  35. package/dist/commands/create/stages/interpret.js +43 -0
  36. package/dist/commands/create/stages/interpret.js.map +1 -0
  37. package/dist/commands/create/stages/refine.d.ts +11 -0
  38. package/dist/commands/create/stages/refine.d.ts.map +1 -0
  39. package/dist/commands/create/stages/refine.js +35 -0
  40. package/dist/commands/create/stages/refine.js.map +1 -0
  41. package/dist/commands/create/stages/test-and-refine.d.ts +7 -0
  42. package/dist/commands/create/stages/test-and-refine.d.ts.map +1 -0
  43. package/dist/commands/create/stages/test-and-refine.js +159 -0
  44. package/dist/commands/create/stages/test-and-refine.js.map +1 -0
  45. package/dist/commands/create.d.ts +2 -0
  46. package/dist/commands/create.d.ts.map +1 -0
  47. package/dist/commands/create.js +2 -0
  48. package/dist/commands/create.js.map +1 -0
  49. package/dist/commands/destroy.d.ts +3 -0
  50. package/dist/commands/destroy.d.ts.map +1 -0
  51. package/dist/commands/destroy.js +52 -0
  52. package/dist/commands/destroy.js.map +1 -0
  53. package/dist/commands/list.d.ts +3 -0
  54. package/dist/commands/list.d.ts.map +1 -0
  55. package/dist/commands/list.js +77 -0
  56. package/dist/commands/list.js.map +1 -0
  57. package/dist/commands/login.d.ts +3 -0
  58. package/dist/commands/login.d.ts.map +1 -0
  59. package/dist/commands/login.js +57 -0
  60. package/dist/commands/login.js.map +1 -0
  61. package/dist/commands/logout.d.ts +3 -0
  62. package/dist/commands/logout.d.ts.map +1 -0
  63. package/dist/commands/logout.js +15 -0
  64. package/dist/commands/logout.js.map +1 -0
  65. package/dist/commands/logs.d.ts +3 -0
  66. package/dist/commands/logs.d.ts.map +1 -0
  67. package/dist/commands/logs.js +128 -0
  68. package/dist/commands/logs.js.map +1 -0
  69. package/dist/commands/pause.d.ts +3 -0
  70. package/dist/commands/pause.d.ts.map +1 -0
  71. package/dist/commands/pause.js +53 -0
  72. package/dist/commands/pause.js.map +1 -0
  73. package/dist/commands/run.d.ts +3 -0
  74. package/dist/commands/run.d.ts.map +1 -0
  75. package/dist/commands/run.js +25 -0
  76. package/dist/commands/run.js.map +1 -0
  77. package/dist/commands/signup.d.ts +3 -0
  78. package/dist/commands/signup.d.ts.map +1 -0
  79. package/dist/commands/signup.js +9 -0
  80. package/dist/commands/signup.js.map +1 -0
  81. package/dist/index.d.ts +3 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +40 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/lib/api/auth.d.ts +8 -0
  86. package/dist/lib/api/auth.d.ts.map +1 -0
  87. package/dist/lib/api/auth.js +11 -0
  88. package/dist/lib/api/auth.js.map +1 -0
  89. package/dist/lib/api/index.d.ts +215 -0
  90. package/dist/lib/api/index.d.ts.map +1 -0
  91. package/dist/lib/api/index.js +11 -0
  92. package/dist/lib/api/index.js.map +1 -0
  93. package/dist/lib/api/machines.d.ts +97 -0
  94. package/dist/lib/api/machines.d.ts.map +1 -0
  95. package/dist/lib/api/machines.js +52 -0
  96. package/dist/lib/api/machines.js.map +1 -0
  97. package/dist/lib/api/mcp.d.ts +98 -0
  98. package/dist/lib/api/mcp.d.ts.map +1 -0
  99. package/dist/lib/api/mcp.js +38 -0
  100. package/dist/lib/api/mcp.js.map +1 -0
  101. package/dist/lib/api/subscriptions.d.ts +13 -0
  102. package/dist/lib/api/subscriptions.d.ts.map +1 -0
  103. package/dist/lib/api/subscriptions.js +16 -0
  104. package/dist/lib/api/subscriptions.js.map +1 -0
  105. package/dist/lib/api/transport.d.ts +5 -0
  106. package/dist/lib/api/transport.d.ts.map +1 -0
  107. package/dist/lib/api/transport.js +121 -0
  108. package/dist/lib/api/transport.js.map +1 -0
  109. package/dist/lib/api.d.ts +2 -0
  110. package/dist/lib/api.d.ts.map +1 -0
  111. package/dist/lib/api.js +2 -0
  112. package/dist/lib/api.js.map +1 -0
  113. package/dist/lib/auth-guard.d.ts +2 -0
  114. package/dist/lib/auth-guard.d.ts.map +1 -0
  115. package/dist/lib/auth-guard.js +9 -0
  116. package/dist/lib/auth-guard.js.map +1 -0
  117. package/dist/lib/config.d.ts +7 -0
  118. package/dist/lib/config.d.ts.map +1 -0
  119. package/dist/lib/config.js +30 -0
  120. package/dist/lib/config.js.map +1 -0
  121. package/dist/lib/cron.d.ts +2 -0
  122. package/dist/lib/cron.d.ts.map +1 -0
  123. package/dist/lib/cron.js +10 -0
  124. package/dist/lib/cron.js.map +1 -0
  125. package/dist/lib/errors.d.ts +7 -0
  126. package/dist/lib/errors.d.ts.map +1 -0
  127. package/dist/lib/errors.js +27 -0
  128. package/dist/lib/errors.js.map +1 -0
  129. package/dist/lib/resolve-machine.d.ts +6 -0
  130. package/dist/lib/resolve-machine.d.ts.map +1 -0
  131. package/dist/lib/resolve-machine.js +21 -0
  132. package/dist/lib/resolve-machine.js.map +1 -0
  133. package/dist/lib/session-logger.d.ts +31 -0
  134. package/dist/lib/session-logger.d.ts.map +1 -0
  135. package/dist/lib/session-logger.js +177 -0
  136. package/dist/lib/session-logger.js.map +1 -0
  137. package/dist/types.d.ts +77 -0
  138. package/dist/types.d.ts.map +1 -0
  139. package/dist/types.js +2 -0
  140. package/dist/types.js.map +1 -0
  141. package/package.json +34 -0
@@ -0,0 +1,266 @@
1
+ import chalk from "chalk";
2
+ import { loggedOra as ora, loggedConfirm as confirm, loggedSelect as select, loggedInput as input } from "../../../lib/session-logger.js";
3
+ import open from "open";
4
+ import { api } from "../../../lib/api.js";
5
+ import { ApiError } from "../../../lib/errors.js";
6
+ /**
7
+ * Test a Smithery connection and report results.
8
+ * FIX: the original returned null on both branches of the skip prompt.
9
+ * Now offers a retry-or-skip selector when the connection test fails.
10
+ */
11
+ async function testAndReport(displayName, smitheryConnectionId, dbConnectionId) {
12
+ const testSpinner = ora(`Testing ${displayName} connection...`).start();
13
+ try {
14
+ const result = await api.testConnection(smitheryConnectionId);
15
+ if (result.ok) {
16
+ testSpinner.succeed(`${displayName} connected (${result.toolCount} tools available)`);
17
+ return dbConnectionId;
18
+ }
19
+ testSpinner.fail(`${displayName} connection test failed: ${result.error}`);
20
+ }
21
+ catch (err) {
22
+ testSpinner.fail(`${displayName} connection test failed: ${err.message}`);
23
+ }
24
+ const action = await select({
25
+ message: `${displayName} connection failed. What would you like to do?`,
26
+ choices: [
27
+ { name: "Retry", value: "retry" },
28
+ { name: "Skip this integration", value: "skip" },
29
+ ],
30
+ });
31
+ if (action === "retry") {
32
+ return testAndReport(displayName, smitheryConnectionId, dbConnectionId);
33
+ }
34
+ return null;
35
+ }
36
+ /**
37
+ * Poll for OAuth completion.
38
+ * FIX: bare catch now discriminates transient vs fatal errors using ApiError.
39
+ */
40
+ async function pollOAuthCompletion(smitheryConnectionId, displayName, pollSpinner, maxAttempts = 60) {
41
+ for (let i = 0; i < maxAttempts; i++) {
42
+ await new Promise((r) => setTimeout(r, 2000));
43
+ const remaining = Math.ceil((maxAttempts - i - 1) * 2);
44
+ pollSpinner.text = `Waiting for ${displayName} authorization... (${remaining}s remaining)`;
45
+ try {
46
+ const status = await api.pollConnectionStatus(smitheryConnectionId);
47
+ if (status.status === "connected" && status.id) {
48
+ return status.id;
49
+ }
50
+ if (status.status === "error") {
51
+ return null;
52
+ }
53
+ }
54
+ catch (err) {
55
+ // Fatal API errors (4xx) should stop polling immediately
56
+ if (err instanceof ApiError && err.status < 500) {
57
+ return null;
58
+ }
59
+ // Transient errors (5xx, network) — keep polling
60
+ }
61
+ }
62
+ return null;
63
+ }
64
+ /**
65
+ * Stage 4 — Connect MCP servers needed by the plan.
66
+ * Supports reuse of existing connections, OAuth, and API key flows.
67
+ */
68
+ export async function connectServers(ctx) {
69
+ const { plan } = ctx;
70
+ const connectedMap = new Map();
71
+ const connectedIds = [];
72
+ const existingConnections = await api.listMcpConnections();
73
+ const existingByServer = new Map();
74
+ for (const c of existingConnections) {
75
+ const list = existingByServer.get(c.serverQualifiedName) ?? [];
76
+ list.push(c);
77
+ existingByServer.set(c.serverQualifiedName, list);
78
+ }
79
+ for (const server of plan.mcpServers) {
80
+ const existing = existingByServer.get(server.qualifiedName) ?? [];
81
+ let action = "new";
82
+ let reuseConnection;
83
+ if (existing.length > 0) {
84
+ const choices = [
85
+ ...existing.map((c, i) => ({
86
+ name: `Use existing connection${existing.length > 1 ? ` #${i + 1}` : ""} (connected ${c.connectedAt})`,
87
+ value: `reuse-${i}`,
88
+ })),
89
+ { name: "Connect a new account", value: "new" },
90
+ { name: "Skip", value: "skip" },
91
+ ];
92
+ const answer = await select({
93
+ message: `${server.displayName} — how to connect?`,
94
+ choices,
95
+ });
96
+ if (answer === "skip") {
97
+ action = "skip";
98
+ }
99
+ else if (answer === "new") {
100
+ action = "new";
101
+ }
102
+ else {
103
+ action = "reuse";
104
+ const idx = parseInt(answer.replace("reuse-", ""), 10);
105
+ reuseConnection = existing[idx];
106
+ }
107
+ }
108
+ else {
109
+ const connect = await confirm({
110
+ message: `Connect ${server.displayName}?`,
111
+ default: true,
112
+ });
113
+ if (!connect)
114
+ action = "skip";
115
+ }
116
+ if (action === "skip")
117
+ continue;
118
+ if (action === "reuse" && reuseConnection) {
119
+ const testSpinner = ora(`Testing existing ${server.displayName} connection...`).start();
120
+ try {
121
+ const testResult = await api.testConnectionById(reuseConnection.id);
122
+ if (testResult.ok) {
123
+ testSpinner.succeed(`${server.displayName} connected (${testResult.toolCount} tools available)`);
124
+ connectedIds.push(reuseConnection.id);
125
+ connectedMap.set(server.qualifiedName, reuseConnection.id);
126
+ }
127
+ else {
128
+ testSpinner.fail(`${server.displayName} connection failed: ${testResult.error}`);
129
+ const retry = await confirm({
130
+ message: `Reconnect ${server.displayName} with new credentials?`,
131
+ default: true,
132
+ });
133
+ if (!retry)
134
+ continue;
135
+ action = "new";
136
+ }
137
+ }
138
+ catch (err) {
139
+ testSpinner.fail(`${server.displayName} connection test failed: ${err.message}`);
140
+ const retry = await confirm({
141
+ message: `Reconnect ${server.displayName} with new credentials?`,
142
+ default: true,
143
+ });
144
+ if (!retry)
145
+ continue;
146
+ action = "new";
147
+ }
148
+ }
149
+ if (action === "new") {
150
+ const detailSpinner = ora(`Loading ${server.displayName} setup...`).start();
151
+ try {
152
+ const detail = await api.getServerDetail(server.qualifiedName);
153
+ detailSpinner.stop();
154
+ if (detail.needsOAuth && detail.deploymentUrl) {
155
+ // OAuth flow via Smithery Connect
156
+ const connectSpinner = ora(`Initiating ${server.displayName} connection...`).start();
157
+ const result = await api.initiateConnection({
158
+ serverQualifiedName: server.qualifiedName,
159
+ serverDisplayName: server.displayName,
160
+ deploymentUrl: detail.deploymentUrl,
161
+ });
162
+ if (result.status === "connected" && result.id) {
163
+ connectSpinner.stop();
164
+ const connId = await testAndReport(server.displayName, result.smitheryConnectionId, result.id);
165
+ if (connId) {
166
+ connectedIds.push(connId);
167
+ connectedMap.set(server.qualifiedName, connId);
168
+ }
169
+ continue;
170
+ }
171
+ if (result.status === "auth_required" && result.authorizationUrl) {
172
+ connectSpinner.stop();
173
+ console.log(chalk.cyan(`\nOpening ${server.displayName} authorization in your browser...\n`));
174
+ await open(result.authorizationUrl);
175
+ const pollSpinner = ora(`Waiting for ${server.displayName} authorization... (120s remaining)`).start();
176
+ const connId = await pollOAuthCompletion(result.smitheryConnectionId, server.displayName, pollSpinner);
177
+ if (connId) {
178
+ pollSpinner.stop();
179
+ const testedId = await testAndReport(server.displayName, result.smitheryConnectionId, connId);
180
+ if (testedId) {
181
+ connectedIds.push(testedId);
182
+ connectedMap.set(server.qualifiedName, testedId);
183
+ }
184
+ }
185
+ else {
186
+ pollSpinner.fail(`${server.displayName} authorization timed out`);
187
+ }
188
+ continue;
189
+ }
190
+ connectSpinner.fail(`Failed to connect ${server.displayName}`);
191
+ }
192
+ else {
193
+ // API key flow — prompt using config schema
194
+ const schema = detail.configSchema;
195
+ const properties = schema.properties ?? {};
196
+ const required = schema.required ?? [];
197
+ const fieldNames = Object.keys(properties);
198
+ const headers = {};
199
+ if (fieldNames.length > 0) {
200
+ console.log(chalk.dim(`\n${server.displayName} needs the following to connect:\n`));
201
+ for (const fieldName of fieldNames) {
202
+ const prop = properties[fieldName];
203
+ const isRequired = required.includes(fieldName);
204
+ const label = prop.description ?? fieldName;
205
+ const reqTag = isRequired ? chalk.red("*") : "";
206
+ const value = await input({
207
+ message: `${label}${reqTag}:`,
208
+ validate: (v) => isRequired && !v ? `${fieldName} is required` : true,
209
+ });
210
+ if (value)
211
+ headers[fieldName] = value;
212
+ }
213
+ }
214
+ if (detail.deploymentUrl) {
215
+ const connectSpinner = ora(`Connecting ${server.displayName}...`).start();
216
+ try {
217
+ const result = await api.initiateConnection({
218
+ serverQualifiedName: server.qualifiedName,
219
+ serverDisplayName: server.displayName,
220
+ deploymentUrl: detail.deploymentUrl,
221
+ headers,
222
+ });
223
+ if (result.id) {
224
+ connectSpinner.stop();
225
+ const testedId = await testAndReport(server.displayName, result.smitheryConnectionId, result.id);
226
+ if (testedId) {
227
+ connectedIds.push(testedId);
228
+ connectedMap.set(server.qualifiedName, testedId);
229
+ }
230
+ }
231
+ else {
232
+ connectSpinner.fail(`Failed to connect ${server.displayName}`);
233
+ }
234
+ }
235
+ catch {
236
+ connectSpinner.fail(`Failed to connect ${server.displayName}`);
237
+ }
238
+ }
239
+ else {
240
+ const connectSpinner = ora(`Saving ${server.displayName} connection...`).start();
241
+ try {
242
+ const conn = await api.saveMcpConnection({
243
+ serverQualifiedName: server.qualifiedName,
244
+ serverDisplayName: server.displayName,
245
+ config: headers,
246
+ toolsAvailable: [],
247
+ });
248
+ connectedIds.push(conn.id);
249
+ connectedMap.set(server.qualifiedName, conn.id);
250
+ connectSpinner.succeed(`${server.displayName} connected`);
251
+ }
252
+ catch {
253
+ connectSpinner.fail(`Failed to save ${server.displayName} connection`);
254
+ }
255
+ }
256
+ }
257
+ }
258
+ catch (err) {
259
+ detailSpinner.stop();
260
+ console.log(chalk.yellow(`Could not load ${server.displayName} details: ${err.message}`));
261
+ }
262
+ }
263
+ }
264
+ return { ...ctx, connectedIds, connectedMap };
265
+ }
266
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CreateContext } from "../../../types.js";
2
+ type PartialCtx = Omit<CreateContext, "currentMachine"> & {
3
+ currentMachine: null;
4
+ };
5
+ /**
6
+ * Stage 6 — Create the machine via the API and display the result.
7
+ */
8
+ export declare function createMachine(ctx: PartialCtx): Promise<CreateContext>;
9
+ export {};
10
+ //# sourceMappingURL=create-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-machine.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/create-machine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnF;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAgD3E"}
@@ -0,0 +1,43 @@
1
+ import chalk from "chalk";
2
+ import { loggedOra as ora } from "../../../lib/session-logger.js";
3
+ import { api } from "../../../lib/api.js";
4
+ import { cronToHuman } from "../../../lib/cron.js";
5
+ /**
6
+ * Stage 6 — Create the machine via the API and display the result.
7
+ */
8
+ export async function createMachine(ctx) {
9
+ const { plan, instruction, connectedIds } = ctx;
10
+ const createSpinner = ora("Creating machine...").start();
11
+ const machine = await api.createMachine({
12
+ name: plan.name,
13
+ instruction,
14
+ triggerType: plan.triggerType,
15
+ scheduleCron: plan.scheduleCron ?? "",
16
+ outputSpec: plan.outputSpec,
17
+ communicationMessage: plan.communicationMessage,
18
+ mcpConnectionIds: connectedIds,
19
+ steps: plan.steps,
20
+ });
21
+ createSpinner.succeed(chalk.green("Machine created"));
22
+ console.log();
23
+ console.log(`${chalk.bold(machine.name)} ${chalk.dim(`(${machine.id.slice(0, 8)})`)}`);
24
+ if (plan.triggerType === "webhook" && machine.webhookUrl) {
25
+ console.log(`${chalk.bold("Trigger:")} Webhook`);
26
+ console.log();
27
+ console.log(`${chalk.bold("Webhook URL:")}`);
28
+ console.log(`${chalk.cyan(`POST ${machine.webhookUrl}`)}`);
29
+ console.log();
30
+ console.log(chalk.dim(`Send a POST request with a JSON body to trigger this machine.`));
31
+ }
32
+ else {
33
+ console.log(`${chalk.dim("Schedule:")} ${cronToHuman(plan.scheduleCron ?? "")}`);
34
+ }
35
+ const channelLabel = plan.communicationChannel === "email" ? "Email" : plan.communicationChannel;
36
+ console.log(`${chalk.dim(`${channelLabel}: ${plan.communicationMessage}`)}`);
37
+ console.log();
38
+ return {
39
+ ...ctx,
40
+ currentMachine: machine,
41
+ };
42
+ }
43
+ //# sourceMappingURL=create-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-machine.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/create-machine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe;IACjD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC;IAEhD,MAAM,aAAa,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW;QACX,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE;QACrC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,gBAAgB,EAAE,YAAY;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAC1E,CAAC;IAEF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,+DAA+D,CAChE,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAChB,IAAI,CAAC,oBAAoB,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAC9E,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAChE,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,OAAO;QACL,GAAG,GAAG;QACN,cAAc,EAAE,OAAO;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CreateContext } from "../../../types.js";
2
+ /**
3
+ * Stage 1 — Interpret the user's natural-language instruction into a Plan.
4
+ */
5
+ export declare function interpret(instruction: string): Promise<Omit<CreateContext, "currentMachine"> & {
6
+ currentMachine: null;
7
+ }>;
8
+ //# sourceMappingURL=interpret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpret.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/interpret.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG7D;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC,CA0C3E"}
@@ -0,0 +1,43 @@
1
+ import chalk from "chalk";
2
+ import { loggedOra as ora } from "../../../lib/session-logger.js";
3
+ import { api } from "../../../lib/api.js";
4
+ import { showPlan } from "../display.js";
5
+ /**
6
+ * Stage 1 — Interpret the user's natural-language instruction into a Plan.
7
+ */
8
+ export async function interpret(instruction) {
9
+ const spinner = ora("Interpreting your instruction...").start();
10
+ const spec = await api.interpretInstruction(instruction);
11
+ spinner.stop();
12
+ if (spec.triggerType === "webhook") {
13
+ console.log(chalk.yellow("\nTiny Machine currently supports scheduled tasks only — things that run on a repeating schedule (e.g. daily, hourly, every Monday).\n" +
14
+ "Event-triggered actions (like \"when X happens, do Y\") aren't supported yet, but they're coming soon!\n" +
15
+ "Try rephrasing as a scheduled task, for example:\n" +
16
+ chalk.dim(' "Every morning, check for new support emails and send me a summary"\n')));
17
+ process.exit(0);
18
+ }
19
+ const plan = {
20
+ name: spec.name,
21
+ triggerType: spec.triggerType,
22
+ triggerDescription: spec.triggerDescription,
23
+ integrationsNeeded: spec.integrationsNeeded,
24
+ configurationNeeded: spec.configurationNeeded ?? {},
25
+ scheduleCron: spec.schedule,
26
+ outputSpec: spec.outputSpec,
27
+ communicationMessage: spec.communicationMessage ?? "You'll receive results via email",
28
+ communicationChannel: "email",
29
+ steps: spec.steps,
30
+ mcpServers: spec.mcpServers,
31
+ confidence: spec.confidence ?? 'medium',
32
+ confidenceReason: spec.confidenceReason ?? '',
33
+ };
34
+ showPlan(plan);
35
+ return {
36
+ instruction,
37
+ plan,
38
+ connectedIds: [],
39
+ connectedMap: new Map(),
40
+ currentMachine: null,
41
+ };
42
+ }
43
+ //# sourceMappingURL=interpret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interpret.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/interpret.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,WAAmB;IAEnB,MAAM,OAAO,GAAG,GAAG,CAAC,kCAAkC,CAAC,CAAC,KAAK,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,wIAAwI;YACxI,0GAA0G;YAC1G,oDAAoD;YACpD,KAAK,CAAC,GAAG,CAAC,yEAAyE,CAAC,CACrF,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAS;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,EAAE;QACnD,YAAY,EAAE,IAAI,CAAC,QAAQ;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,IAAI,kCAAkC;QACrF,oBAAoB,EAAE,OAAO;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,QAAQ;QACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;KAC9C,CAAC;IAEF,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEf,OAAO;QACL,WAAW;QACX,IAAI;QACJ,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,IAAI,GAAG,EAAkB;QACvC,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CreateContext } from "../../../types.js";
2
+ type PartialCtx = Omit<CreateContext, "currentMachine"> & {
3
+ currentMachine: null;
4
+ };
5
+ /**
6
+ * Stage 3 — Conversational edit loop.
7
+ * The user can type changes or press Enter to confirm the plan.
8
+ */
9
+ export declare function refineLoop(ctx: PartialCtx): Promise<PartialCtx>;
10
+ export {};
11
+ //# sourceMappingURL=refine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/refine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnF;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CA+BrE"}
@@ -0,0 +1,35 @@
1
+ import chalk from "chalk";
2
+ import { loggedOra as ora, loggedInput as input } from "../../../lib/session-logger.js";
3
+ import { api } from "../../../lib/api.js";
4
+ import { applyRefinement } from "../context.js";
5
+ import { showPlan } from "../display.js";
6
+ /**
7
+ * Stage 3 — Conversational edit loop.
8
+ * The user can type changes or press Enter to confirm the plan.
9
+ */
10
+ export async function refineLoop(ctx) {
11
+ let { plan } = ctx;
12
+ while (true) {
13
+ const change = await input({
14
+ message: chalk.dim("Press Enter to confirm, or type changes:"),
15
+ });
16
+ if (!change.trim())
17
+ break;
18
+ const editSpinner = ora("Updating plan...").start();
19
+ const updated = await api.refinePlan({
20
+ name: plan.name,
21
+ triggerType: plan.triggerType,
22
+ triggerDescription: plan.triggerDescription,
23
+ integrationsNeeded: plan.integrationsNeeded,
24
+ scheduleCron: plan.scheduleCron,
25
+ outputSpec: plan.outputSpec,
26
+ communicationMessage: plan.communicationMessage,
27
+ steps: plan.steps,
28
+ }, change);
29
+ editSpinner.stop();
30
+ plan = applyRefinement(plan, updated);
31
+ showPlan(plan);
32
+ }
33
+ return { ...ctx, plan };
34
+ }
35
+ //# sourceMappingURL=refine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/refine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,WAAW,IAAI,KAAK,EAAE,MAAM,gCAAgC,CAAC;AACxF,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAIzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe;IAC9C,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAEnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC;YACzB,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC;SAC/D,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,MAAM;QAE1B,MAAM,WAAW,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,UAAU,CAClC;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,EACD,MAAM,CACP,CAAC;QACF,WAAW,CAAC,IAAI,EAAE,CAAC;QAEnB,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CreateContext } from "../../../types.js";
2
+ /**
3
+ * Stage 7 — Iterative test-and-refine loop with subscription/activation flow.
4
+ * Stream a test run, collect feedback, destroy/refine/recreate as needed.
5
+ */
6
+ export declare function testAndRefineLoop(ctx: CreateContext): Promise<void>;
7
+ //# sourceMappingURL=test-and-refine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-and-refine.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/test-and-refine.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA6FvD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FzE"}
@@ -0,0 +1,159 @@
1
+ import chalk from "chalk";
2
+ import { loggedOra as ora, loggedInput as input, loggedSelect as select } from "../../../lib/session-logger.js";
3
+ import { api } from "../../../lib/api.js";
4
+ import { isUserCancelled } from "../../../lib/errors.js";
5
+ import { applyRefinement } from "../context.js";
6
+ import { showPlan } from "../display.js";
7
+ import { activateOrSubscribe, buildActivateChoices } from "./activate.js";
8
+ async function streamTestRun(machineId) {
9
+ console.log(chalk.bold("\nTest run\n"));
10
+ const statusIcons = {
11
+ success: chalk.green("✓"),
12
+ error: chalk.red("✗"),
13
+ warning: chalk.yellow("!"),
14
+ };
15
+ try {
16
+ await api.streamTestRun(machineId, (event, data) => {
17
+ if (event === "done") {
18
+ console.log(`\n${chalk.green("✓")} ${chalk.bold("Test run complete")}\n`);
19
+ return;
20
+ }
21
+ if (event === "error") {
22
+ console.log(`\n${chalk.red("✗")} ${chalk.bold("Test run failed:")} ${data.message}\n`);
23
+ return;
24
+ }
25
+ const step = data.step;
26
+ const message = data.message;
27
+ const status = data.status;
28
+ const icon = status ? statusIcons[status] ?? "→" : "→";
29
+ switch (step) {
30
+ case "init":
31
+ console.log(`${chalk.dim("⚡")} ${message}`);
32
+ break;
33
+ case "tools":
34
+ console.log(`${icon} ${message}`);
35
+ break;
36
+ case "execute":
37
+ console.log(`\n${chalk.cyan("⚡")} ${message}`);
38
+ break;
39
+ case "thinking":
40
+ console.log(chalk.dim(`\n[thinking] ${message.slice(0, 300)}${message.length > 300 ? "..." : ""}\n`));
41
+ break;
42
+ case "response":
43
+ console.log(chalk.dim(`\n${message.slice(0, 300)}${message.length > 300 ? "..." : ""}\n`));
44
+ break;
45
+ case "tool_call":
46
+ console.log(`${chalk.yellow("→")} ${chalk.bold(data.server)}.${data.tool}`);
47
+ break;
48
+ case "tool_result":
49
+ if (status === "error") {
50
+ console.log(` ${chalk.red("✗")} ${message}`);
51
+ }
52
+ else {
53
+ const preview = data.preview;
54
+ console.log(` ${chalk.green("✓")} ${message}`);
55
+ if (preview) {
56
+ console.log(chalk.dim(` ${preview.slice(0, 120)}${preview.length > 120 ? "..." : ""}`));
57
+ }
58
+ }
59
+ break;
60
+ case "complete":
61
+ if (message)
62
+ console.log(`\n${icon} ${chalk.bold(message)}`);
63
+ break;
64
+ default:
65
+ console.log(`${icon} ${message}`);
66
+ }
67
+ });
68
+ }
69
+ catch (err) {
70
+ console.log(chalk.red(`\nTest run error: ${err.message}\n`));
71
+ }
72
+ }
73
+ /**
74
+ * Stage 7 — Iterative test-and-refine loop with subscription/activation flow.
75
+ * Stream a test run, collect feedback, destroy/refine/recreate as needed.
76
+ */
77
+ export async function testAndRefineLoop(ctx) {
78
+ const { plan, instruction, connectedIds } = ctx;
79
+ let currentMachine = ctx.currentMachine;
80
+ let currentPlan = { ...plan };
81
+ try {
82
+ // Check subscription status once at the start
83
+ const subStatus = await api.getSubscriptionStatus();
84
+ const hasSub = subStatus.status === "active";
85
+ while (true) {
86
+ // PRE-TEST select: activate or run test
87
+ const preAction = await select({
88
+ message: "What would you like to do?",
89
+ choices: [
90
+ ...buildActivateChoices(hasSub),
91
+ { name: "Run test", value: "test" },
92
+ ],
93
+ });
94
+ if (preAction === "activate") {
95
+ await activateOrSubscribe(currentMachine.id);
96
+ break;
97
+ }
98
+ // Run test
99
+ console.log();
100
+ await streamTestRun(currentMachine.id);
101
+ // POST-TEST select: activate or edit
102
+ const postAction = await select({
103
+ message: "What would you like to do?",
104
+ choices: [
105
+ ...buildActivateChoices(hasSub),
106
+ { name: "Edit Machine", value: "edit" },
107
+ ],
108
+ });
109
+ if (postAction === "activate") {
110
+ await activateOrSubscribe(currentMachine.id);
111
+ break;
112
+ }
113
+ // Edit flow (existing refine logic)
114
+ const change = await input({
115
+ message: "Describe the changes you'd like to make:",
116
+ });
117
+ if (!change.trim())
118
+ break;
119
+ // Destroy old machine
120
+ const destroySpinner = ora("Updating machine...").start();
121
+ await api.destroyMachine(currentMachine.id);
122
+ // Refine plan
123
+ const updated = await api.refinePlan({
124
+ name: currentPlan.name,
125
+ triggerType: currentPlan.triggerType,
126
+ triggerDescription: currentPlan.triggerDescription,
127
+ integrationsNeeded: currentPlan.integrationsNeeded,
128
+ scheduleCron: currentPlan.scheduleCron,
129
+ outputSpec: currentPlan.outputSpec,
130
+ communicationMessage: currentPlan.communicationMessage,
131
+ steps: currentPlan.steps,
132
+ }, change);
133
+ currentPlan = applyRefinement(currentPlan, updated);
134
+ // Recreate machine with updated plan
135
+ const newMachine = await api.createMachine({
136
+ name: currentPlan.name,
137
+ instruction,
138
+ triggerType: currentPlan.triggerType,
139
+ scheduleCron: currentPlan.scheduleCron ?? "",
140
+ outputSpec: currentPlan.outputSpec,
141
+ communicationMessage: currentPlan.communicationMessage,
142
+ mcpConnectionIds: connectedIds,
143
+ steps: currentPlan.steps,
144
+ });
145
+ currentMachine = newMachine;
146
+ destroySpinner.succeed(chalk.green("Machine updated"));
147
+ console.log();
148
+ showPlan(currentPlan);
149
+ }
150
+ }
151
+ catch (err) {
152
+ // Ctrl+C / prompt cancellation — exit gracefully
153
+ if (isUserCancelled(err))
154
+ return;
155
+ // Real errors should propagate
156
+ throw err;
157
+ }
158
+ }
159
+ //# sourceMappingURL=test-and-refine.js.map