@minicor/mcp-server 3.6.0 → 3.9.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/README.md +66 -1
  2. package/dist/__tests__/builder-discovery.test.d.ts +2 -0
  3. package/dist/__tests__/builder-discovery.test.d.ts.map +1 -0
  4. package/dist/__tests__/builder-discovery.test.js +120 -0
  5. package/dist/__tests__/builder-discovery.test.js.map +1 -0
  6. package/dist/__tests__/codemode.test.js +35 -0
  7. package/dist/__tests__/codemode.test.js.map +1 -1
  8. package/dist/__tests__/config-stores.test.d.ts +2 -0
  9. package/dist/__tests__/config-stores.test.d.ts.map +1 -0
  10. package/dist/__tests__/config-stores.test.js +88 -0
  11. package/dist/__tests__/config-stores.test.js.map +1 -0
  12. package/dist/__tests__/dev-mode-draft.test.d.ts +2 -0
  13. package/dist/__tests__/dev-mode-draft.test.d.ts.map +1 -0
  14. package/dist/__tests__/dev-mode-draft.test.js +260 -0
  15. package/dist/__tests__/dev-mode-draft.test.js.map +1 -0
  16. package/dist/__tests__/disk-token-store.test.d.ts +2 -0
  17. package/dist/__tests__/disk-token-store.test.d.ts.map +1 -0
  18. package/dist/__tests__/disk-token-store.test.js +231 -0
  19. package/dist/__tests__/disk-token-store.test.js.map +1 -0
  20. package/dist/__tests__/laminar-client.test.js +154 -0
  21. package/dist/__tests__/laminar-client.test.js.map +1 -1
  22. package/dist/__tests__/lib-dev-mode.test.d.ts +2 -0
  23. package/dist/__tests__/lib-dev-mode.test.d.ts.map +1 -0
  24. package/dist/__tests__/lib-dev-mode.test.js +48 -0
  25. package/dist/__tests__/lib-dev-mode.test.js.map +1 -0
  26. package/dist/__tests__/paths.test.d.ts +2 -0
  27. package/dist/__tests__/paths.test.d.ts.map +1 -0
  28. package/dist/__tests__/paths.test.js +55 -0
  29. package/dist/__tests__/paths.test.js.map +1 -0
  30. package/dist/__tests__/recording-frames.test.d.ts +2 -0
  31. package/dist/__tests__/recording-frames.test.d.ts.map +1 -0
  32. package/dist/__tests__/recording-frames.test.js +46 -0
  33. package/dist/__tests__/recording-frames.test.js.map +1 -0
  34. package/dist/__tests__/server-profile.test.d.ts +2 -0
  35. package/dist/__tests__/server-profile.test.d.ts.map +1 -0
  36. package/dist/__tests__/server-profile.test.js +311 -0
  37. package/dist/__tests__/server-profile.test.js.map +1 -0
  38. package/dist/builder-index.d.ts +3 -0
  39. package/dist/builder-index.d.ts.map +1 -0
  40. package/dist/builder-index.js +5 -0
  41. package/dist/builder-index.js.map +1 -0
  42. package/dist/cli.js +4 -3
  43. package/dist/cli.js.map +1 -1
  44. package/dist/codemode.d.ts +3 -1
  45. package/dist/codemode.d.ts.map +1 -1
  46. package/dist/codemode.js +20 -6
  47. package/dist/codemode.js.map +1 -1
  48. package/dist/disk-token-store.d.ts +101 -0
  49. package/dist/disk-token-store.d.ts.map +1 -0
  50. package/dist/disk-token-store.js +398 -0
  51. package/dist/disk-token-store.js.map +1 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +98 -111
  54. package/dist/index.js.map +1 -1
  55. package/dist/laminar-client.d.ts +111 -0
  56. package/dist/laminar-client.d.ts.map +1 -1
  57. package/dist/laminar-client.js +47 -1
  58. package/dist/laminar-client.js.map +1 -1
  59. package/dist/lib.d.ts +4 -0
  60. package/dist/lib.d.ts.map +1 -1
  61. package/dist/lib.js +53 -58
  62. package/dist/lib.js.map +1 -1
  63. package/dist/paths.d.ts +4 -0
  64. package/dist/paths.d.ts.map +1 -1
  65. package/dist/paths.js +33 -0
  66. package/dist/paths.js.map +1 -1
  67. package/dist/prompts/debug-execution.d.ts.map +1 -1
  68. package/dist/prompts/debug-execution.js +3 -2
  69. package/dist/prompts/debug-execution.js.map +1 -1
  70. package/dist/recording-frames.d.ts +58 -0
  71. package/dist/recording-frames.d.ts.map +1 -0
  72. package/dist/recording-frames.js +244 -0
  73. package/dist/recording-frames.js.map +1 -0
  74. package/dist/seed-skills.js +3 -2
  75. package/dist/seed-skills.js.map +1 -1
  76. package/dist/server-profile.d.ts +11 -0
  77. package/dist/server-profile.d.ts.map +1 -0
  78. package/dist/server-profile.js +104 -0
  79. package/dist/server-profile.js.map +1 -0
  80. package/dist/setup.d.ts +1 -0
  81. package/dist/setup.d.ts.map +1 -1
  82. package/dist/setup.js +81 -71
  83. package/dist/setup.js.map +1 -1
  84. package/dist/tools/builder-discovery.d.ts +17 -0
  85. package/dist/tools/builder-discovery.d.ts.map +1 -0
  86. package/dist/tools/builder-discovery.js +131 -0
  87. package/dist/tools/builder-discovery.js.map +1 -0
  88. package/dist/tools/core.d.ts.map +1 -1
  89. package/dist/tools/core.js +117 -43
  90. package/dist/tools/core.js.map +1 -1
  91. package/dist/tools/dev-mode-draft.d.ts +3 -0
  92. package/dist/tools/dev-mode-draft.d.ts.map +1 -0
  93. package/dist/tools/dev-mode-draft.js +279 -0
  94. package/dist/tools/dev-mode-draft.js.map +1 -0
  95. package/dist/tools/vm.d.ts.map +1 -1
  96. package/dist/tools/vm.js +3 -35
  97. package/dist/tools/vm.js.map +1 -1
  98. package/dist/types.d.ts +9 -0
  99. package/dist/types.d.ts.map +1 -1
  100. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-frames.js","sourceRoot":"","sources":["../src/recording-frames.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@
12
12
  import fs from "node:fs";
13
13
  import { loadAllSkills } from "./skills.js";
14
14
  import { apiToPlatformBase } from "./agent-service-client.js";
15
- import { getTokenPath } from "./paths.js";
15
+ import { getTokenPath, resolveApiBase } from "./paths.js";
16
16
  const adminKey = process.env.SKILLS_ADMIN_KEY;
17
17
  if (!adminKey) {
18
18
  console.error("SKILLS_ADMIN_KEY is required");
@@ -25,11 +25,12 @@ function loadAuthToken() {
25
25
  return null;
26
26
  const raw = JSON.parse(fs.readFileSync(tokenPath, "utf-8"));
27
27
  const region = raw.us || raw.ca || raw;
28
+ const regionKey = raw.ca || region.region === "ca" ? "ca" : "us";
28
29
  if (!region?.access_token)
29
30
  return null;
30
31
  return {
31
32
  token: region.access_token,
32
- apiBase: region.api_base || "https://api.laminar.run",
33
+ apiBase: resolveApiBase(regionKey, region.api_base),
33
34
  };
34
35
  }
35
36
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"seed-skills.js","sourceRoot":"","sources":["../src/seed-skills.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AAE9C,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,YAAY;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,OAAO,EAAE,MAAM,CAAC,QAAQ,IAAI,yBAAyB;SACtD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,yBAAyB,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC,CAAC;IAEJ,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,YAAY,yBAAyB,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACrC,aAAa,EAAE,QAAS;SACzB;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC1C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,MAAM,IAAI,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,UAAW,MAAc,CAAC,MAAM,UAAU,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,IAAK,MAAc,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"seed-skills.js","sourceRoot":"","sources":["../src/seed-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { ToolDeps } from "./types.js";
2
+ export declare const SERVER_PROFILES: readonly ["full", "builder"];
3
+ export type MinicorServerProfile = (typeof SERVER_PROFILES)[number];
4
+ export declare const FULL_INSTRUCTIONS = "You are connected to the Minicor MCP server for RPA workflow automation.\n\nCRITICAL: If the current directory contains a minicor.json file, you are in a workspace clone.\nYou MUST call session_start(directory) as your FIRST action. It returns the workspace rules\n(AGENTS.md), prior session state for resuming, and all context you need. Follow the phase loop\nit describes.\n\nBefore ending your session, call session_end() to persist your progress. Other agents (on other\nmachines, scheduled, or human-triggered) depend on this to resume where you left off.\n\nIf you are NOT in a workspace clone, use the tools freely \u2014 list_workspaces, clone_workspace, etc.";
5
+ export declare const BUILDER_INSTRUCTIONS = "You are connected to the focused Minicor Builder MCP server.\nUse it to create and discover workflows, develop workflow drafts, manage configuration stores,\npublish workflows, and build or run Jobs.\n\nCall list_workspaces before workspace-scoped operations so the server can resolve the workspace's\nregion. Find or create the workflow, call dev_mode_load, inspect and edit its draft steps, and use\nthe configuration-store tools when the draft needs configuration values. Every dev_mode_run call\nmust include vmId. Test the draft before publishing. Publishing requires confirm: true and reloads\nthe draft from the newly published workflow, so it may be run again afterward.\n\nRun progress is ephemeral. dev_mode_stop_run requests a cooperative stop after the current step;\nit cannot interrupt that step. To abandon work safely, request the stop from a concurrent client,\nwait until dev_mode_get_run_status returns active: false, then call dev_mode_delete_draft with\nconfirm: true. Deleting a draft does not change production and does not stop a run by itself.\n\nJobs execute published workflows rather than unpublished Dev Mode drafts. Publish the workflow\nbefore using it in an end-to-end Job run or test.";
6
+ export declare function parseServerProfile(args?: readonly string[], env?: NodeJS.ProcessEnv): MinicorServerProfile;
7
+ export declare function serverNameForProfile(profile: MinicorServerProfile): string;
8
+ export declare function instructionsForProfile(profile: MinicorServerProfile): string;
9
+ export declare function profileUsesSessions(profile: MinicorServerProfile): boolean;
10
+ export declare function registerProfile(deps: ToolDeps, profile: MinicorServerProfile): void;
11
+ //# sourceMappingURL=server-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-profile.d.ts","sourceRoot":"","sources":["../src/server-profile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0B3C,eAAO,MAAM,eAAe,8BAA+B,CAAC;AAC5D,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,eAAO,MAAM,iBAAiB,gqBAUqE,CAAC;AAEpG,eAAO,MAAM,oBAAoB,ssCAgBiB,CAAC;AAEnD,wBAAgB,kBAAkB,CAChC,IAAI,GAAE,SAAS,MAAM,EAA0B,EAC/C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,oBAAoB,CAsBtB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAE1E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAE5E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAE1E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,QA8B5E"}
@@ -0,0 +1,104 @@
1
+ import { registerWorkflowDiscovery, registerVmDiscovery, } from "./tools/builder-discovery.js";
2
+ import { register as registerCore } from "./tools/core.js";
3
+ import { register as registerWorkflowOps } from "./tools/workflow-ops.js";
4
+ import { register as registerConfigStores } from "./tools/config-stores.js";
5
+ import { register as registerSyncTools } from "./tools/sync-tools.js";
6
+ import { register as registerVm } from "./tools/vm.js";
7
+ import { register as registerVmRpa } from "./tools/vm-rpa.js";
8
+ import { register as registerDevModeDraft } from "./tools/dev-mode-draft.js";
9
+ import { register as registerTfa } from "./tools/tfa.js";
10
+ import { register as registerIssues } from "./tools/issues.js";
11
+ import { register as registerAgents } from "./tools/agents.js";
12
+ import { register as registerSkills } from "./tools/skills.js";
13
+ import { register as registerJobs } from "./tools/jobs.js";
14
+ import { register as registerSession } from "./tools/session.js";
15
+ import { register as registerWorkflowGuide } from "./prompts/workflow-guide.js";
16
+ import { register as registerDebugExecution } from "./prompts/debug-execution.js";
17
+ import { register as registerBuildRpa } from "./prompts/build-rpa.js";
18
+ import { register as registerNestjsToJob } from "./prompts/nestjs-to-job.js";
19
+ import { register as registerTfaGuide } from "./prompts/tfa-guide.js";
20
+ import { register as registerWorkspaceSession } from "./prompts/workspace-session.js";
21
+ export const SERVER_PROFILES = ["full", "builder"];
22
+ export const FULL_INSTRUCTIONS = `You are connected to the Minicor MCP server for RPA workflow automation.
23
+
24
+ CRITICAL: If the current directory contains a minicor.json file, you are in a workspace clone.
25
+ You MUST call session_start(directory) as your FIRST action. It returns the workspace rules
26
+ (AGENTS.md), prior session state for resuming, and all context you need. Follow the phase loop
27
+ it describes.
28
+
29
+ Before ending your session, call session_end() to persist your progress. Other agents (on other
30
+ machines, scheduled, or human-triggered) depend on this to resume where you left off.
31
+
32
+ If you are NOT in a workspace clone, use the tools freely — list_workspaces, clone_workspace, etc.`;
33
+ export const BUILDER_INSTRUCTIONS = `You are connected to the focused Minicor Builder MCP server.
34
+ Use it to create and discover workflows, develop workflow drafts, manage configuration stores,
35
+ publish workflows, and build or run Jobs.
36
+
37
+ Call list_workspaces before workspace-scoped operations so the server can resolve the workspace's
38
+ region. Find or create the workflow, call dev_mode_load, inspect and edit its draft steps, and use
39
+ the configuration-store tools when the draft needs configuration values. Every dev_mode_run call
40
+ must include vmId. Test the draft before publishing. Publishing requires confirm: true and reloads
41
+ the draft from the newly published workflow, so it may be run again afterward.
42
+
43
+ Run progress is ephemeral. dev_mode_stop_run requests a cooperative stop after the current step;
44
+ it cannot interrupt that step. To abandon work safely, request the stop from a concurrent client,
45
+ wait until dev_mode_get_run_status returns active: false, then call dev_mode_delete_draft with
46
+ confirm: true. Deleting a draft does not change production and does not stop a run by itself.
47
+
48
+ Jobs execute published workflows rather than unpublished Dev Mode drafts. Publish the workflow
49
+ before using it in an end-to-end Job run or test.`;
50
+ export function parseServerProfile(args = process.argv.slice(2), env = process.env) {
51
+ const equalsArg = args.find((arg) => arg.startsWith("--profile="));
52
+ const profileIndex = args.indexOf("--profile");
53
+ if ((equalsArg !== undefined && equalsArg.slice("--profile=".length) === "") ||
54
+ (profileIndex >= 0 && !args[profileIndex + 1])) {
55
+ throw new Error("Missing value after --profile.");
56
+ }
57
+ const requested = equalsArg?.slice("--profile=".length) ||
58
+ (profileIndex >= 0 ? args[profileIndex + 1] : undefined) ||
59
+ env.MINICOR_MCP_PROFILE ||
60
+ "full";
61
+ if (!SERVER_PROFILES.includes(requested)) {
62
+ throw new Error(`Unknown MCP profile "${requested}". Expected one of: ${SERVER_PROFILES.join(", ")}.`);
63
+ }
64
+ return requested;
65
+ }
66
+ export function serverNameForProfile(profile) {
67
+ return profile === "builder" ? "minicor-builder" : "minicor";
68
+ }
69
+ export function instructionsForProfile(profile) {
70
+ return profile === "builder" ? BUILDER_INSTRUCTIONS : FULL_INSTRUCTIONS;
71
+ }
72
+ export function profileUsesSessions(profile) {
73
+ return profile === "full";
74
+ }
75
+ export function registerProfile(deps, profile) {
76
+ if (profile === "builder") {
77
+ registerWorkflowDiscovery(deps);
78
+ registerVmDiscovery(deps);
79
+ registerConfigStores(deps);
80
+ registerDevModeDraft(deps);
81
+ registerJobs(deps);
82
+ return;
83
+ }
84
+ registerCore(deps);
85
+ registerWorkflowOps(deps);
86
+ registerConfigStores(deps);
87
+ registerSyncTools(deps);
88
+ registerVm(deps);
89
+ registerVmRpa(deps);
90
+ registerDevModeDraft(deps);
91
+ registerTfa(deps);
92
+ registerIssues(deps);
93
+ registerAgents(deps);
94
+ registerSkills(deps);
95
+ registerJobs(deps);
96
+ registerSession(deps);
97
+ registerWorkflowGuide(deps);
98
+ registerDebugExecution(deps);
99
+ registerBuildRpa(deps);
100
+ registerNestjsToJob(deps);
101
+ registerTfaGuide(deps);
102
+ registerWorkspaceSession(deps);
103
+ }
104
+ //# sourceMappingURL=server-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-profile.js","sourceRoot":"","sources":["../src/server-profile.ts"],"names":[],"mappings":"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"}
package/dist/setup.d.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * Browser mode (default): opens a local page with sign-in/sign-up + workspace creation
6
6
  * CLI mode (--cli): terminal prompts for headless environments
7
+ * Add --with-builder to also configure the focused minicor-builder MCP.
7
8
  *
8
9
  * Tokens stored in ~/.minicor/tokens.json, MCP config written to ~/.cursor/mcp.json
9
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
package/dist/setup.js CHANGED
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * Browser mode (default): opens a local page with sign-in/sign-up + workspace creation
6
6
  * CLI mode (--cli): terminal prompts for headless environments
7
+ * Add --with-builder to also configure the focused minicor-builder MCP.
7
8
  *
8
9
  * Tokens stored in ~/.minicor/tokens.json, MCP config written to ~/.cursor/mcp.json
9
10
  */
@@ -13,7 +14,8 @@ import http from "node:http";
13
14
  import os from "node:os";
14
15
  import path from "node:path";
15
16
  import readline from "node:readline";
16
- import { apiBaseToRegion, getTokenPath, getWriteConfigPath, getWriteTokenPath, regionToApiBase } from "./paths.js";
17
+ import { getWriteConfigPath, getWriteTokenPath, normalizeBaseUrl, resolveApiBase, resolveDefaultApiBase, validateApiBaseUrl, } from "./paths.js";
18
+ import { DiskTokenStore, } from "./disk-token-store.js";
17
19
  const VERSION = (() => {
18
20
  try {
19
21
  const pkg = JSON.parse(fs.readFileSync(path.resolve(path.dirname(new URL(import.meta.url).pathname), "..", "package.json"), "utf-8"));
@@ -24,6 +26,9 @@ const VERSION = (() => {
24
26
  }
25
27
  })();
26
28
  const MCP_ENTRY = path.resolve(path.dirname(new URL(import.meta.url).pathname), "index.js");
29
+ const BUILDER_MCP_ENTRY = path.resolve(path.dirname(new URL(import.meta.url).pathname), "builder-index.js");
30
+ const INCLUDE_BUILDER_MCP = process.argv.includes("--with-builder");
31
+ const tokenStore = new DiskTokenStore();
27
32
  async function signIn(apiBase, email, password) {
28
33
  const res = await fetch(`${apiBase}/auth/signin`, {
29
34
  method: "POST",
@@ -71,53 +76,19 @@ async function createWorkspace(apiBase, token, name) {
71
76
  return (await res.json());
72
77
  }
73
78
  function readExistingTokens() {
74
- const writePath = getWriteTokenPath();
75
- if (!fs.existsSync(writePath)) {
76
- const readPath = getTokenPath();
77
- if (!fs.existsSync(readPath))
78
- return {};
79
- try {
80
- const raw = JSON.parse(fs.readFileSync(readPath, "utf-8"));
81
- if (raw.us || raw.ca)
82
- return raw;
83
- if (raw.access_token) {
84
- const r = raw.region || apiBaseToRegion(raw.api_base || "");
85
- return { [r]: raw };
86
- }
87
- return {};
88
- }
89
- catch {
90
- return {};
91
- }
92
- }
93
- try {
94
- const raw = JSON.parse(fs.readFileSync(writePath, "utf-8"));
95
- if (raw.us || raw.ca)
96
- return raw;
97
- if (raw.access_token) {
98
- const r = raw.region || apiBaseToRegion(raw.api_base || "");
99
- return { [r]: raw };
100
- }
101
- return {};
102
- }
103
- catch {
104
- return {};
105
- }
79
+ return tokenStore.readAll();
106
80
  }
107
- function storeTokens(loginData, region) {
81
+ async function storeTokens(loginData, region, apiBase) {
108
82
  const writePath = getWriteTokenPath();
109
- const dir = path.dirname(writePath);
110
- if (!fs.existsSync(dir))
111
- fs.mkdirSync(dir, { recursive: true });
112
- const existing = readExistingTokens();
113
- existing[region] = {
83
+ const tokens = {
114
84
  access_token: loginData.access_token,
115
85
  refresh_token: loginData.refresh_token || null,
116
86
  expires_at: Date.now() + loginData.expires_in * 1000,
117
- api_base: regionToApiBase(region),
118
87
  region,
119
88
  };
120
- fs.writeFileSync(writePath, JSON.stringify(existing, null, 2) + "\n", { mode: 0o600 });
89
+ if (apiBase)
90
+ tokens.api_base = normalizeBaseUrl(apiBase);
91
+ await tokenStore.writeRegion(region, tokens);
121
92
  return writePath;
122
93
  }
123
94
  function writeMcpConfig() {
@@ -139,6 +110,12 @@ function writeMcpConfig() {
139
110
  command: "node",
140
111
  args: [MCP_ENTRY],
141
112
  };
113
+ if (INCLUDE_BUILDER_MCP) {
114
+ existing.mcpServers["minicor-builder"] = {
115
+ command: "node",
116
+ args: [BUILDER_MCP_ENTRY],
117
+ };
118
+ }
142
119
  fs.writeFileSync(configPath, JSON.stringify(existing, null, 2) + "\n");
143
120
  return configPath;
144
121
  }
@@ -170,6 +147,13 @@ function send(res, status, body) {
170
147
  res.writeHead(status, { "Content-Type": "application/json" });
171
148
  res.end(JSON.stringify(body));
172
149
  }
150
+ function resolveSetupApiBase(region, input) {
151
+ if (input && input.trim() !== "") {
152
+ const storedApiBase = validateApiBaseUrl(input);
153
+ return { apiBase: storedApiBase, storedApiBase };
154
+ }
155
+ return { apiBase: validateApiBaseUrl(resolveDefaultApiBase(region)) };
156
+ }
173
157
  // ─── HTML ────────────────────────────────────────────────────
174
158
  const HTML = `<!DOCTYPE html>
175
159
  <html lang="en">
@@ -321,6 +305,11 @@ const HTML = `<!DOCTYPE html>
321
305
  <label><input type="radio" name="login-region" value="ca" /><span>Canada</span></label>
322
306
  </div>
323
307
  </div>
308
+ <div class="field">
309
+ <label for="login-api-base">Backend API URL</label>
310
+ <input id="login-api-base" type="text" placeholder="Leave blank for selected region default" autocomplete="off" />
311
+ <div class="hint">Only change this if instructed by your administrator.</div>
312
+ </div>
324
313
  <button type="submit" class="btn-primary" id="btn-login">Sign in</button>
325
314
  </form>
326
315
  </div>
@@ -358,6 +347,11 @@ const HTML = `<!DOCTYPE html>
358
347
  <label><input type="radio" name="signup-region" value="ca" /><span>Canada</span></label>
359
348
  </div>
360
349
  </div>
350
+ <div class="field">
351
+ <label for="signup-api-base">Backend API URL</label>
352
+ <input id="signup-api-base" type="text" placeholder="Leave blank for selected region default" autocomplete="off" />
353
+ <div class="hint">Only change this if instructed by your administrator.</div>
354
+ </div>
361
355
  <button type="submit" class="btn-primary" id="btn-signup">Create account</button>
362
356
  </form>
363
357
  </div>
@@ -454,9 +448,10 @@ document.getElementById('login-form').addEventListener('submit',async(e)=>{
454
448
  const email=document.getElementById('login-email').value.trim();
455
449
  const password=document.getElementById('login-password').value;
456
450
  const region=document.querySelector('input[name="login-region"]:checked').value;
451
+ const apiBase=document.getElementById('login-api-base').value.trim();
457
452
  if(!email||!password)return showError('auth-error','Email and password are required.');
458
453
  const btn=document.getElementById('btn-login');btn.dataset.label='Sign in';
459
- await doAuth('/api/connect',{email,password,region},btn,'Signing in\\u2026');
454
+ await doAuth('/api/connect',{email,password,region,apiBase},btn,'Signing in\\u2026');
460
455
  });
461
456
 
462
457
  document.getElementById('signup-form').addEventListener('submit',async(e)=>{
@@ -467,13 +462,14 @@ document.getElementById('signup-form').addEventListener('submit',async(e)=>{
467
462
  const password=document.getElementById('signup-password').value;
468
463
  const confirm=document.getElementById('signup-confirm').value;
469
464
  const region=document.querySelector('input[name="signup-region"]:checked').value;
465
+ const apiBase=document.getElementById('signup-api-base').value.trim();
470
466
  if(!firstName||!lastName||!email||!password)return showError('auth-error','All fields are required.');
471
467
  if(password!==confirm)return showError('auth-error','Passwords do not match.');
472
468
  if(password.length<8)return showError('auth-error','Password must be at least 8 characters.');
473
469
  if(!/[A-Z]/.test(password))return showError('auth-error','Password must contain an uppercase letter.');
474
470
  if(!/[^a-zA-Z0-9]/.test(password))return showError('auth-error','Password must contain a symbol.');
475
471
  const btn=document.getElementById('btn-signup');btn.dataset.label='Create account';
476
- await doAuth('/api/register',{firstName,lastName,email,password,region},btn,'Creating account\\u2026');
472
+ await doAuth('/api/register',{firstName,lastName,email,password,region,apiBase},btn,'Creating account\\u2026');
477
473
  });
478
474
 
479
475
  async function loadWorkspaces(token){
@@ -521,6 +517,8 @@ function addAnotherRegion(){
521
517
  goTo('auth');
522
518
  document.getElementById('login-email').value='';
523
519
  document.getElementById('login-password').value='';
520
+ document.getElementById('login-api-base').value='';
521
+ document.getElementById('signup-api-base').value='';
524
522
  clearAlerts(['auth-error']);
525
523
  }
526
524
  </script>
@@ -528,7 +526,7 @@ function addAnotherRegion(){
528
526
  </html>`;
529
527
  // ─── Browser server ──────────────────────────────────────────
530
528
  let storedAccessToken = null;
531
- let lastSignedInRegion = "us";
529
+ let lastSignedInApiBase = resolveApiBase("us");
532
530
  async function startBrowserSetup() {
533
531
  const srv = http.createServer(async (req, res) => {
534
532
  res.setHeader("Access-Control-Allow-Origin", "*");
@@ -562,6 +560,7 @@ async function startBrowserSetup() {
562
560
  region: r,
563
561
  label: r === "ca" ? "Canada" : "US",
564
562
  expiresAt: t.expires_at,
563
+ apiBase: resolveApiBase(r, t.api_base),
565
564
  });
566
565
  }
567
566
  }
@@ -577,9 +576,7 @@ async function startBrowserSetup() {
577
576
  return send(res, 200, { hasSession: false, serviceConfig });
578
577
  }
579
578
  if (url.pathname === "/api/logout" && req.method === "POST") {
580
- const tokenPath = getTokenPath();
581
- if (fs.existsSync(tokenPath))
582
- fs.unlinkSync(tokenPath);
579
+ await tokenStore.clear();
583
580
  for (const base of [
584
581
  path.join(os.homedir(), ".cursor"),
585
582
  path.join(process.cwd(), ".cursor"),
@@ -589,6 +586,7 @@ async function startBrowserSetup() {
589
586
  try {
590
587
  const cfg = JSON.parse(fs.readFileSync(mcpPath, "utf-8"));
591
588
  delete cfg.mcpServers?.minicor;
589
+ delete cfg.mcpServers?.["minicor-builder"];
592
590
  delete cfg.mcpServers?.laminar;
593
591
  fs.writeFileSync(mcpPath, JSON.stringify(cfg, null, 2) + "\n");
594
592
  }
@@ -596,19 +594,23 @@ async function startBrowserSetup() {
596
594
  }
597
595
  }
598
596
  storedAccessToken = null;
597
+ lastSignedInApiBase = resolveApiBase("us");
599
598
  console.log("Session cleared.");
600
599
  return send(res, 200, { ok: true });
601
600
  }
602
601
  if (url.pathname === "/api/connect" && req.method === "POST") {
603
- const { email, password, region } = await jsonBody(req);
602
+ const { email, password, region, apiBase: apiBaseInput, } = await jsonBody(req);
604
603
  const r = region === "ca" ? "ca" : "us";
605
- const apiBase = regionToApiBase(r);
606
- const loginData = await signIn(apiBase, email, password);
607
- const tokenPath = storeTokens(loginData, r);
604
+ const apiBaseConfig = resolveSetupApiBase(r, apiBaseInput);
605
+ const loginData = await signIn(apiBaseConfig.apiBase, email, password);
606
+ const tokenPath = await storeTokens(loginData, r, apiBaseConfig.storedApiBase);
608
607
  const configPath = writeMcpConfig();
609
608
  storedAccessToken = loginData.access_token;
610
- lastSignedInRegion = r;
609
+ lastSignedInApiBase = apiBaseConfig.apiBase;
611
610
  console.log(`\n✓ Tokens stored at ${tokenPath}`);
611
+ console.log(apiBaseConfig.storedApiBase
612
+ ? `✓ Backend API base set to ${apiBaseConfig.storedApiBase}`
613
+ : `✓ Backend API base reset to default resolution (${apiBaseConfig.apiBase})`);
612
614
  console.log(`✓ MCP config written to ${configPath}`);
613
615
  return send(res, 200, {
614
616
  accessToken: loginData.access_token,
@@ -617,17 +619,20 @@ async function startBrowserSetup() {
617
619
  });
618
620
  }
619
621
  if (url.pathname === "/api/register" && req.method === "POST") {
620
- const { firstName, lastName, email, password, region } = await jsonBody(req);
622
+ const { firstName, lastName, email, password, region, apiBase: apiBaseInput, } = await jsonBody(req);
621
623
  const r = region === "ca" ? "ca" : "us";
622
- const apiBase = regionToApiBase(r);
623
- await register(apiBase, { firstName, lastName, email, password });
624
- const loginData = await signIn(apiBase, email, password);
625
- const tokenPath = storeTokens(loginData, r);
624
+ const apiBaseConfig = resolveSetupApiBase(r, apiBaseInput);
625
+ await register(apiBaseConfig.apiBase, { firstName, lastName, email, password });
626
+ const loginData = await signIn(apiBaseConfig.apiBase, email, password);
627
+ const tokenPath = await storeTokens(loginData, r, apiBaseConfig.storedApiBase);
626
628
  const configPath = writeMcpConfig();
627
629
  storedAccessToken = loginData.access_token;
628
- lastSignedInRegion = r;
630
+ lastSignedInApiBase = apiBaseConfig.apiBase;
629
631
  console.log(`\n✓ Account created and signed in`);
630
632
  console.log(`✓ Tokens stored at ${tokenPath}`);
633
+ console.log(apiBaseConfig.storedApiBase
634
+ ? `✓ Backend API base set to ${apiBaseConfig.storedApiBase}`
635
+ : `✓ Backend API base reset to default resolution (${apiBaseConfig.apiBase})`);
631
636
  console.log(`✓ MCP config written to ${configPath}`);
632
637
  return send(res, 200, {
633
638
  accessToken: loginData.access_token,
@@ -639,8 +644,7 @@ async function startBrowserSetup() {
639
644
  const token = req.headers["x-token"] || storedAccessToken;
640
645
  if (!token)
641
646
  return send(res, 401, { error: "No token" });
642
- const apiBase = regionToApiBase(lastSignedInRegion);
643
- const workspaces = await listWorkspaces(apiBase, token);
647
+ const workspaces = await listWorkspaces(lastSignedInApiBase, token);
644
648
  return send(res, 200, { workspaces });
645
649
  }
646
650
  if (url.pathname === "/api/create-workspace" && req.method === "POST") {
@@ -648,8 +652,7 @@ async function startBrowserSetup() {
648
652
  const token = storedAccessToken;
649
653
  if (!token)
650
654
  return send(res, 401, { error: "No token" });
651
- const apiBase = regionToApiBase(lastSignedInRegion);
652
- const ws = await createWorkspace(apiBase, token, name);
655
+ const ws = await createWorkspace(lastSignedInApiBase, token, name);
653
656
  return send(res, 200, { workspace: ws });
654
657
  }
655
658
  send(res, 404, { error: "Not found" });
@@ -686,7 +689,9 @@ async function startCliSetup() {
686
689
  const isSignup = hasAccount.trim().toLowerCase() === "n";
687
690
  const regionStr = await ask(rl, "Region (us/ca) [us]: ");
688
691
  const region = regionStr.trim().toLowerCase() === "ca" ? "ca" : "us";
689
- const apiBase = regionToApiBase(region);
692
+ const defaultApiBase = resolveDefaultApiBase(region);
693
+ const apiBaseInput = await ask(rl, `Backend API URL [${defaultApiBase}]: `);
694
+ const apiBaseConfig = resolveSetupApiBase(region, apiBaseInput);
690
695
  let email;
691
696
  let password;
692
697
  if (isSignup) {
@@ -702,7 +707,7 @@ async function startCliSetup() {
702
707
  process.exit(1);
703
708
  }
704
709
  try {
705
- await register(apiBase, {
710
+ await register(apiBaseConfig.apiBase, {
706
711
  firstName: firstName.trim(),
707
712
  lastName: lastName.trim(),
708
713
  email: email.trim(),
@@ -722,17 +727,20 @@ async function startCliSetup() {
722
727
  password = await ask(rl, " Password: ");
723
728
  }
724
729
  try {
725
- const loginData = await signIn(apiBase, email.trim(), password);
726
- const tokenPath = storeTokens(loginData, region);
730
+ const loginData = await signIn(apiBaseConfig.apiBase, email.trim(), password);
731
+ const tokenPath = await storeTokens(loginData, region, apiBaseConfig.storedApiBase);
727
732
  const configPath = writeMcpConfig();
728
733
  console.log(`\n✓ Signed in.`);
729
734
  console.log(`✓ Tokens stored at ${tokenPath}`);
735
+ console.log(apiBaseConfig.storedApiBase
736
+ ? `✓ Backend API base set to ${apiBaseConfig.storedApiBase}`
737
+ : `✓ Backend API base reset to default resolution (${apiBaseConfig.apiBase})`);
730
738
  console.log(`✓ MCP config written to ${configPath}`);
731
- const workspaces = await listWorkspaces(apiBase, loginData.access_token);
739
+ const workspaces = await listWorkspaces(apiBaseConfig.apiBase, loginData.access_token);
732
740
  if (workspaces.length === 0) {
733
741
  const wsName = await ask(rl, "\nYou have no workspaces. Create one? Name: ");
734
742
  if (wsName.trim().length >= 3) {
735
- const ws = await createWorkspace(apiBase, loginData.access_token, wsName.trim());
743
+ const ws = await createWorkspace(apiBaseConfig.apiBase, loginData.access_token, wsName.trim());
736
744
  console.log(`✓ Workspace "${ws.name}" created (ID: ${ws.id})`);
737
745
  }
738
746
  }
@@ -742,13 +750,15 @@ async function startCliSetup() {
742
750
  const otherRegion = region === "us" ? "ca" : "us";
743
751
  const addAnother = await ask(rl, `\nSign in to ${otherRegion.toUpperCase()} region as well? (y/N): `);
744
752
  if (addAnother.trim().toLowerCase() === "y") {
745
- const otherApiBase = regionToApiBase(otherRegion);
753
+ const otherDefaultApiBase = resolveDefaultApiBase(otherRegion);
754
+ const otherApiBaseInput = await ask(rl, `Backend API URL for ${otherRegion.toUpperCase()} [${otherDefaultApiBase}]: `);
755
+ const otherApiBaseConfig = resolveSetupApiBase(otherRegion, otherApiBaseInput);
746
756
  console.log(`\nSign in to ${otherRegion.toUpperCase()}:`);
747
757
  const otherEmail = await ask(rl, " Email: ");
748
758
  const otherPassword = await ask(rl, " Password: ");
749
759
  try {
750
- const otherLogin = await signIn(otherApiBase, otherEmail.trim(), otherPassword);
751
- storeTokens(otherLogin, otherRegion);
760
+ const otherLogin = await signIn(otherApiBaseConfig.apiBase, otherEmail.trim(), otherPassword);
761
+ await storeTokens(otherLogin, otherRegion, otherApiBaseConfig.storedApiBase);
752
762
  console.log(`✓ Signed in to ${otherRegion.toUpperCase()}.`);
753
763
  }
754
764
  catch (e) {