@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,28 @@
1
+ import type { Plan, CreateContext, CreateMachineResponse } from "../../types.js";
2
+ /**
3
+ * Map API refine/interpret response fields onto an existing Plan.
4
+ * Centralises the mapping that was previously duplicated in the refine
5
+ * loop and the test-and-refine loop.
6
+ */
7
+ export declare function applyRefinement(plan: Plan, updated: {
8
+ name: string;
9
+ triggerType: "cron" | "webhook";
10
+ triggerDescription: string;
11
+ integrationsNeeded: string[];
12
+ configurationNeeded?: Record<string, string>;
13
+ scheduleCron?: string | null;
14
+ schedule?: string | null;
15
+ outputSpec: string;
16
+ communicationMessage: string;
17
+ steps: string[];
18
+ mcpServers: Plan["mcpServers"];
19
+ confidence?: 'low' | 'medium' | 'high';
20
+ confidenceReason?: string;
21
+ }): Plan;
22
+ /**
23
+ * Build the initial CreateContext after interpretation and channel selection.
24
+ */
25
+ export declare function createInitialContext(instruction: string, plan: Plan): Omit<CreateContext, "currentMachine"> & {
26
+ currentMachine: CreateMachineResponse | null;
27
+ };
28
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/commands/create/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEjF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,IAAI,CAgBP;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,IAAI,GACT,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAAE,CAQ1F"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Map API refine/interpret response fields onto an existing Plan.
3
+ * Centralises the mapping that was previously duplicated in the refine
4
+ * loop and the test-and-refine loop.
5
+ */
6
+ export function applyRefinement(plan, updated) {
7
+ return {
8
+ ...plan,
9
+ name: updated.name,
10
+ triggerType: updated.triggerType,
11
+ triggerDescription: updated.triggerDescription,
12
+ integrationsNeeded: updated.integrationsNeeded,
13
+ configurationNeeded: updated.configurationNeeded ?? {},
14
+ scheduleCron: updated.scheduleCron ?? updated.schedule ?? plan.scheduleCron,
15
+ outputSpec: updated.outputSpec,
16
+ communicationMessage: updated.communicationMessage,
17
+ steps: updated.steps,
18
+ mcpServers: updated.mcpServers,
19
+ confidence: updated.confidence ?? plan.confidence,
20
+ confidenceReason: updated.confidenceReason ?? plan.confidenceReason,
21
+ };
22
+ }
23
+ /**
24
+ * Build the initial CreateContext after interpretation and channel selection.
25
+ */
26
+ export function createInitialContext(instruction, plan) {
27
+ return {
28
+ instruction,
29
+ plan,
30
+ connectedIds: [],
31
+ connectedMap: new Map(),
32
+ currentMachine: null,
33
+ };
34
+ }
35
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/commands/create/context.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU,EAAE,OAc3C;IACC,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,IAAI,EAAE;QACtD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY;QAC3E,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;QAClD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU;QACjD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB;KACpE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,IAAU;IAEV,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,7 @@
1
+ import type { Plan } from "../../types.js";
2
+ /**
3
+ * Pretty-print the current plan to the console.
4
+ * Pure display — no side effects beyond console output.
5
+ */
6
+ export declare function showPlan(plan: Plan): void;
7
+ //# sourceMappingURL=display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/commands/create/display.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CA4CzC"}
@@ -0,0 +1,45 @@
1
+ import chalk from "chalk";
2
+ import { logger } from "../../lib/session-logger.js";
3
+ import { cronToHuman } from "../../lib/cron.js";
4
+ /**
5
+ * Pretty-print the current plan to the console.
6
+ * Pure display — no side effects beyond console output.
7
+ */
8
+ export function showPlan(plan) {
9
+ logger.log({ type: "output", message: "showPlan", data: plan });
10
+ console.log(chalk.bold("\nHere's the plan:\n"));
11
+ console.log(`${chalk.bold("Name:")} ${chalk.cyan(plan.name)}`);
12
+ if (plan.triggerType === "webhook") {
13
+ console.log(`${chalk.bold("Type:")} ${chalk.magenta("⚡ Webhook")}`);
14
+ console.log(`${chalk.bold("Trigger:")} ${chalk.cyan(plan.triggerDescription)}`);
15
+ }
16
+ else {
17
+ console.log(`${chalk.bold("Type:")} ${chalk.blue("⏱ Scheduled")}`);
18
+ console.log(`${chalk.bold("Schedule:")} ${chalk.cyan(cronToHuman(plan.scheduleCron ?? ""))}`);
19
+ }
20
+ const confidenceDots = { high: '●●●', medium: '●●○', low: '●○○' };
21
+ const confidenceColors = { high: chalk.blue, medium: chalk.yellow, low: chalk.red };
22
+ const confidenceLabels = { high: 'High', medium: 'Medium', low: 'Low' };
23
+ const cfColor = confidenceColors[plan.confidence] ?? chalk.yellow;
24
+ console.log(`${chalk.bold("Confidence:")} ${cfColor(confidenceDots[plan.confidence] ?? '●●○')} ${cfColor(confidenceLabels[plan.confidence] ?? 'Medium')} ${chalk.dim("—")} ${chalk.dim(plan.confidenceReason || 'No details provided')}`);
25
+ console.log(`${chalk.bold("Output:")} ${chalk.cyan(plan.outputSpec)}`);
26
+ const channelLabel = plan.communicationChannel === "email" ? "Email" : plan.communicationChannel;
27
+ console.log(`${chalk.bold("Notify via:")} ${chalk.cyan(channelLabel)} ${chalk.dim("—")} ${chalk.cyan(plan.communicationMessage)}`);
28
+ console.log(chalk.bold("\nSteps:"));
29
+ for (const step of plan.steps) {
30
+ console.log(chalk.dim(` → ${step}`));
31
+ }
32
+ if (plan.mcpServers.length > 0) {
33
+ console.log(chalk.bold("\nIntegrations:"));
34
+ for (const server of plan.mcpServers) {
35
+ const tag = server.isRemote
36
+ ? chalk.green("[remote]")
37
+ : chalk.yellow("[local]");
38
+ const configHint = plan.configurationNeeded?.[server.keyword];
39
+ const hint = configHint ? chalk.dim(` — will ask: ${configHint}`) : "";
40
+ console.log(` ${chalk.yellow("◆")} ${server.displayName} ${tag}${hint}`);
41
+ }
42
+ }
43
+ console.log();
44
+ }
45
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../../src/commands/create/display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const createCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/create/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,aAAa,SA8BtB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { requireAuth } from "../../lib/auth-guard.js";
4
+ import { handleCommandError } from "../../lib/errors.js";
5
+ import { interpret } from "./stages/interpret.js";
6
+ import { selectChannel } from "./stages/channel.js";
7
+ import { refineLoop } from "./stages/refine.js";
8
+ import { connectServers } from "./stages/connect.js";
9
+ import { configureServers } from "./stages/configure.js";
10
+ import { createMachine } from "./stages/create-machine.js";
11
+ import { testAndRefineLoop } from "./stages/test-and-refine.js";
12
+ export const createCommand = new Command("start")
13
+ .alias("create")
14
+ .description("Create a new machine from a natural language instruction")
15
+ .argument("<instruction>", "What should this machine do?")
16
+ .action(async (instruction) => {
17
+ requireAuth();
18
+ try {
19
+ let ctx = await interpret(instruction);
20
+ ctx = await selectChannel(ctx);
21
+ ctx = await refineLoop(ctx);
22
+ ctx = await connectServers(ctx);
23
+ ctx = await configureServers(ctx);
24
+ // Warn if required integrations failed to connect
25
+ const missing = ctx.plan.mcpServers.filter((s) => !ctx.connectedMap.has(s.qualifiedName));
26
+ if (missing.length > 0) {
27
+ console.log(chalk.yellow(`\nWarning: ${missing.map((s) => s.displayName).join(", ")} not connected. The machine may not work correctly.\n`));
28
+ }
29
+ const fullCtx = await createMachine(ctx);
30
+ await testAndRefineLoop(fullCtx);
31
+ }
32
+ catch (err) {
33
+ handleCommandError(err);
34
+ }
35
+ });
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/create/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC9C,KAAK,CAAC,QAAQ,CAAC;KACf,WAAW,CAAC,0DAA0D,CAAC;KACvE,QAAQ,CAAC,eAAe,EAAE,8BAA8B,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,EAAE;IACpC,WAAW,EAAE,CAAC;IACd,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QACvC,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QAC/B,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QAChC,GAAG,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAElC,kDAAkD;QAClD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAC9C,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,cAAc,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,uDAAuD,CAClH,CACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Returns choices for the activate action, adapting label based on subscription state.
3
+ */
4
+ export declare function buildActivateChoices(hasSubscription: boolean): {
5
+ name: string;
6
+ value: "activate";
7
+ }[];
8
+ /**
9
+ * Handles subscription checkout (if needed) and machine activation.
10
+ */
11
+ export declare function activateOrSubscribe(machineId: string): Promise<void>;
12
+ //# sourceMappingURL=activate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/activate.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,OAAO;;;IAU5D;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE1E"}
@@ -0,0 +1,73 @@
1
+ import chalk from "chalk";
2
+ import open from "open";
3
+ import { loggedOra as ora, loggedSelect as select } from "../../../lib/session-logger.js";
4
+ import { api } from "../../../lib/api.js";
5
+ import { ApiError } from "../../../lib/errors.js";
6
+ /**
7
+ * Returns choices for the activate action, adapting label based on subscription state.
8
+ */
9
+ export function buildActivateChoices(hasSubscription) {
10
+ if (hasSubscription) {
11
+ return [{ name: "Activate machine", value: "activate" }];
12
+ }
13
+ return [
14
+ {
15
+ name: chalk.yellow("Start subscription and activate machine"),
16
+ value: "activate",
17
+ },
18
+ ];
19
+ }
20
+ /**
21
+ * Handles subscription checkout (if needed) and machine activation.
22
+ */
23
+ export async function activateOrSubscribe(machineId) {
24
+ const subStatus = await api.getSubscriptionStatus();
25
+ if (subStatus.status !== "active") {
26
+ // User needs a subscription first
27
+ const plan = await select({
28
+ message: "Choose a plan:",
29
+ choices: [
30
+ { name: "Basic ($15/mo)", value: "basic" },
31
+ { name: "Pro ($45/mo)", value: "pro" },
32
+ ],
33
+ });
34
+ const { url } = await api.createCheckoutSession(plan);
35
+ await open(url);
36
+ console.log(chalk.cyan("\nA checkout page has been opened in your browser. Complete payment to continue.\n"));
37
+ // Poll for subscription activation — up to 5 minutes, every 3 seconds
38
+ const maxAttempts = 100; // 100 * 3s = 300s = 5 min
39
+ const spinner = ora("Waiting for subscription activation... (300s remaining)").start();
40
+ let activated = false;
41
+ for (let i = 0; i < maxAttempts; i++) {
42
+ await sleep(3000);
43
+ const remaining = Math.ceil((maxAttempts - i - 1) * 3);
44
+ spinner.text = `Waiting for subscription activation... (${remaining}s remaining)`;
45
+ const status = await api.getSubscriptionStatus();
46
+ if (status.status === "active") {
47
+ activated = true;
48
+ break;
49
+ }
50
+ }
51
+ if (!activated) {
52
+ spinner.fail("Subscription activation timed out. Please try again.");
53
+ return;
54
+ }
55
+ spinner.succeed("Subscription active!");
56
+ }
57
+ // Activate the machine
58
+ try {
59
+ await api.activateMachine(machineId);
60
+ console.log(chalk.green("\nMachine activated!\n"));
61
+ }
62
+ catch (err) {
63
+ if (err instanceof ApiError && err.status === 402) {
64
+ console.log(chalk.red("\nPayment required — your subscription may have an issue. Please check your billing settings.\n"));
65
+ return;
66
+ }
67
+ throw err;
68
+ }
69
+ }
70
+ function sleep(ms) {
71
+ return new Promise((resolve) => setTimeout(resolve, ms));
72
+ }
73
+ //# sourceMappingURL=activate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/activate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,SAAS,IAAI,GAAG,EAAE,YAAY,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,eAAwB;IAC3D,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAmB,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO;QACL;YACE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC;YAC7D,KAAK,EAAE,UAAmB;SAC3B;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,qBAAqB,EAAE,CAAC;IAEpD,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClC,kCAAkC;QAClC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAkB;YACzC,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC1C,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE;aACvC;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;QAEhB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,oFAAoF,CACrF,CACF,CAAC;QAEF,sEAAsE;QACtE,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,0BAA0B;QACnD,MAAM,OAAO,GAAG,GAAG,CACjB,yDAAyD,CAC1D,CAAC,KAAK,EAAE,CAAC;QAEV,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,IAAI,GAAG,2CAA2C,SAAS,cAAc,CAAC;YAElF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,qBAAqB,EAAE,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,iGAAiG,CAClG,CACF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,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 2 — Prompt the user for their preferred communication channel.
7
+ * Auto-selects if only one option is enabled.
8
+ */
9
+ export declare function selectChannel(ctx: PartialCtx): Promise<PartialCtx>;
10
+ export {};
11
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC;AAOnF;;;GAGG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBxE"}
@@ -0,0 +1,27 @@
1
+ import chalk from "chalk";
2
+ import { loggedSelect as select } from "../../../lib/session-logger.js";
3
+ const CHANNEL_CHOICES = [
4
+ { name: "Email", value: "email" },
5
+ { name: "SMS (coming soon)", value: "sms", disabled: true },
6
+ ];
7
+ /**
8
+ * Stage 2 — Prompt the user for their preferred communication channel.
9
+ * Auto-selects if only one option is enabled.
10
+ */
11
+ export async function selectChannel(ctx) {
12
+ const enabled = CHANNEL_CHOICES.filter((c) => !c.disabled);
13
+ let channel;
14
+ if (enabled.length === 1) {
15
+ channel = enabled[0].value;
16
+ console.log(chalk.dim(`Delivery: ${enabled[0].name}`));
17
+ }
18
+ else {
19
+ channel = await select({
20
+ message: "How should results be delivered?",
21
+ choices: [...CHANNEL_CHOICES],
22
+ });
23
+ }
24
+ const plan = { ...ctx.plan, communicationChannel: channel };
25
+ return { ...ctx, plan };
26
+ }
27
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAKxE,MAAM,eAAe,GAA0D;IAC7E,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACjC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE;CAC5D,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAe;IACjD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3D,IAAI,OAAe,CAAC;IACpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,MAAM,MAAM,CAAC;YACrB,OAAO,EAAE,kCAAkC;YAC3C,OAAO,EAAE,CAAC,GAAG,eAAe,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,CAAC;IAC5D,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CreateContext } from "../../../types.js";
2
+ type PartialCtx = Omit<CreateContext, "currentMachine"> & {
3
+ currentMachine: null;
4
+ };
5
+ /**
6
+ * Stage 5 — Resource configuration loop for connected MCP servers.
7
+ */
8
+ export declare function configureServers(ctx: PartialCtx): Promise<PartialCtx>;
9
+ export {};
10
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/configure.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC;AAsHnF;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAyC3E"}
@@ -0,0 +1,134 @@
1
+ import chalk from "chalk";
2
+ import { loggedOra as ora, loggedConfirm as confirm, loggedSelect as select, loggedCheckbox as checkbox, loggedInput as input } from "../../../lib/session-logger.js";
3
+ import { api } from "../../../lib/api.js";
4
+ async function renderUiAction(action) {
5
+ switch (action.type) {
6
+ case "select": {
7
+ const answer = await select({
8
+ message: action.message,
9
+ choices: (action.choices ?? []).map((c) => ({
10
+ name: c.name,
11
+ value: c.value,
12
+ })),
13
+ });
14
+ return answer;
15
+ }
16
+ case "multi_select": {
17
+ const answers = await checkbox({
18
+ message: action.message,
19
+ choices: (action.choices ?? []).map((c) => ({
20
+ name: c.name,
21
+ value: c.value,
22
+ })),
23
+ });
24
+ return JSON.stringify(answers);
25
+ }
26
+ case "text_input": {
27
+ const answer = await input({
28
+ message: action.message,
29
+ default: action.defaultValue,
30
+ });
31
+ return answer;
32
+ }
33
+ case "confirm": {
34
+ const answer = await confirm({
35
+ message: action.message,
36
+ default: action.defaultValue === "true",
37
+ });
38
+ return String(answer);
39
+ }
40
+ default:
41
+ return "";
42
+ }
43
+ }
44
+ async function runConfigurationLoop(mcpConnectionId, serverQualifiedName, serverDisplayName, instruction) {
45
+ let conversationHistory = [];
46
+ let userResponse;
47
+ const connections = await api.listMcpConnections();
48
+ const conn = connections.find((c) => c.id === mcpConnectionId);
49
+ if (!conn)
50
+ return;
51
+ const configSpinner = ora(` Discovering ${serverDisplayName} resources...`).start();
52
+ let result = await api.configureMcpConnection({
53
+ smitheryConnectionId: "",
54
+ serverQualifiedName,
55
+ serverDisplayName,
56
+ mcpConnectionId,
57
+ instruction,
58
+ conversationHistory,
59
+ userResponse,
60
+ });
61
+ configSpinner.stop();
62
+ while (result.status === "needs_input" || result.status === "continue") {
63
+ if (result.status === "continue") {
64
+ conversationHistory = result.conversationHistory;
65
+ const continueSpinner = ora(` Discovering resources...`).start();
66
+ result = await api.configureMcpConnection({
67
+ smitheryConnectionId: "",
68
+ serverQualifiedName,
69
+ serverDisplayName,
70
+ mcpConnectionId,
71
+ instruction,
72
+ conversationHistory,
73
+ cachedTools: result.cachedTools,
74
+ });
75
+ continueSpinner.stop();
76
+ continue;
77
+ }
78
+ // needs_input — show prompt to user
79
+ const answer = await renderUiAction(result.action);
80
+ conversationHistory = result.conversationHistory;
81
+ const continueSpinner = ora(` Processing...`).start();
82
+ result = await api.configureMcpConnection({
83
+ smitheryConnectionId: "",
84
+ serverQualifiedName,
85
+ serverDisplayName,
86
+ mcpConnectionId,
87
+ instruction,
88
+ conversationHistory,
89
+ userResponse: { toolUseId: result.action.toolUseId, result: answer },
90
+ cachedTools: result.cachedTools,
91
+ });
92
+ continueSpinner.stop();
93
+ }
94
+ if (result.status === "complete" && result.summary) {
95
+ console.log(chalk.green(`${chalk.bold("✓")} ${result.summary}`));
96
+ }
97
+ }
98
+ /**
99
+ * Stage 5 — Resource configuration loop for connected MCP servers.
100
+ */
101
+ export async function configureServers(ctx) {
102
+ const { plan, connectedMap, instruction } = ctx;
103
+ if (connectedMap.size > 0 &&
104
+ Object.keys(plan.configurationNeeded ?? {}).length > 0) {
105
+ for (const server of plan.mcpServers) {
106
+ const configHint = plan.configurationNeeded?.[server.keyword];
107
+ if (!configHint)
108
+ continue;
109
+ const connId = connectedMap.get(server.qualifiedName);
110
+ if (!connId)
111
+ continue;
112
+ console.log(chalk.bold(`\nConfiguring ${server.displayName}...`));
113
+ let configured = false;
114
+ while (!configured) {
115
+ try {
116
+ await runConfigurationLoop(connId, server.qualifiedName, server.displayName, instruction);
117
+ configured = true;
118
+ }
119
+ catch {
120
+ console.log(chalk.yellow(`\nConfiguration cancelled.`));
121
+ const retry = await confirm({
122
+ message: `Retry configuring ${server.displayName}?`,
123
+ default: true,
124
+ });
125
+ if (!retry) {
126
+ configured = true; // skip and continue
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ return ctx;
133
+ }
134
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../../../src/commands/create/stages/configure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { CreateContext } from "../../../types.js";
2
+ type PartialCtx = Omit<CreateContext, "currentMachine"> & {
3
+ currentMachine: null;
4
+ };
5
+ /**
6
+ * Stage 4 — Connect MCP servers needed by the plan.
7
+ * Supports reuse of existing connections, OAuth, and API key flows.
8
+ */
9
+ export declare function connectServers(ctx: PartialCtx): Promise<PartialCtx>;
10
+ export {};
11
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../../src/commands/create/stages/connect.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,KAAK,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG;IAAE,cAAc,EAAE,IAAI,CAAA;CAAE,CAAC;AA8EnF;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAkQzE"}