@skybridge/devtools 1.2.6 → 1.3.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.
@@ -0,0 +1,7 @@
1
+ import { type Router } from "express";
2
+ /**
3
+ * Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
4
+ * in-process (no CLI spawning): `/status` is a plain request, deploy progress
5
+ * streams over SSE at `/events`.
6
+ */
7
+ export declare function createDeployRouter(): Router;
@@ -0,0 +1,206 @@
1
+ import express, {} from "express";
2
+ import { alpic } from "./alpic-sdk.js";
3
+ const errMessage = (err, fallback) => err instanceof Error ? err.message : fallback;
4
+ /**
5
+ * Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
6
+ * in-process (no CLI spawning): `/status` is a plain request, deploy progress
7
+ * streams over SSE at `/events`.
8
+ */
9
+ export function createDeployRouter() {
10
+ const router = express.Router();
11
+ let state = { status: "idle" };
12
+ const subscribers = new Set();
13
+ const write = (res, s) => {
14
+ res.write(`event: state\ndata: ${JSON.stringify(s)}\n\n`);
15
+ };
16
+ const setState = (s) => {
17
+ state = s;
18
+ for (const res of subscribers) {
19
+ write(res, s);
20
+ }
21
+ };
22
+ const runDeploy = async (environmentId, teamId) => {
23
+ const startedAt = Date.now();
24
+ setState({ status: "deploying", startedAt, deploymentPageUrl: null });
25
+ let pageUrl = null;
26
+ try {
27
+ const result = await alpic.deployments.deploy({
28
+ environmentId,
29
+ teamId,
30
+ onProgress: (event) => {
31
+ if (event.type === "deploying" && event.deploymentPageUrl) {
32
+ pageUrl = event.deploymentPageUrl;
33
+ }
34
+ setState({
35
+ status: "deploying",
36
+ startedAt,
37
+ deploymentPageUrl: pageUrl,
38
+ });
39
+ },
40
+ });
41
+ if (result.status === "deployed") {
42
+ setState({
43
+ status: "deployed",
44
+ mcpServerUrl: result.mcpServerUrl,
45
+ deploymentPageUrl: result.deploymentPageUrl,
46
+ });
47
+ }
48
+ else {
49
+ setState({
50
+ status: "failed",
51
+ message: `Deployment ${result.status}.`,
52
+ deploymentPageUrl: result.deploymentPageUrl,
53
+ });
54
+ }
55
+ }
56
+ catch (err) {
57
+ setState({
58
+ status: "failed",
59
+ message: errMessage(err, "Deployment failed"),
60
+ deploymentPageUrl: pageUrl,
61
+ });
62
+ }
63
+ };
64
+ router.get("/__skybridge/deploy/status", async (_req, res) => {
65
+ try {
66
+ const whoami = await alpic.whoami();
67
+ if (whoami.method === "unauthenticated") {
68
+ res.json({ state: "signedOut" });
69
+ return;
70
+ }
71
+ const loaded = alpic.projects.loadConfig();
72
+ const cfg = loaded && (await alpic.projects.validateLink(loaded));
73
+ const staleConfig = loaded !== null && cfg === null;
74
+ if (!cfg) {
75
+ const teams = await alpic.api.teams.list.v1();
76
+ const team = teams[0];
77
+ if (!team) {
78
+ res.json({ state: "noTeam" });
79
+ return;
80
+ }
81
+ res.json({
82
+ state: "needsProject",
83
+ teams,
84
+ defaultTeamId: team.id,
85
+ staleConfig,
86
+ });
87
+ return;
88
+ }
89
+ let lastDeployGit = null;
90
+ let lastDeployStatus;
91
+ let lastDeployStartedAt;
92
+ let mcpServerUrl;
93
+ let deploymentPageUrl = null;
94
+ if (cfg.environmentId) {
95
+ try {
96
+ const latest = await alpic.deployments.getLatestForEnvironment(cfg.environmentId);
97
+ if (latest.sourceCommitId !== null) {
98
+ lastDeployGit = {
99
+ ref: latest.sourceRef,
100
+ commitMessage: latest.sourceCommitMessage,
101
+ author: latest.authorUsername,
102
+ };
103
+ }
104
+ lastDeployStatus = latest.status;
105
+ lastDeployStartedAt = latest.startedAt?.getTime();
106
+ deploymentPageUrl = latest.deploymentPageUrl;
107
+ if (latest.status === "deployed") {
108
+ const environment = await alpic.api.environments.get.v1({
109
+ environmentId: cfg.environmentId,
110
+ });
111
+ mcpServerUrl = environment.mcpServerUrl;
112
+ }
113
+ }
114
+ catch {
115
+ // no deployments yet — leave defaults
116
+ }
117
+ }
118
+ res.json({
119
+ state: "ready",
120
+ lastDeployGit,
121
+ lastDeployStatus,
122
+ lastDeployStartedAt,
123
+ mcpServerUrl,
124
+ deploymentPageUrl,
125
+ });
126
+ }
127
+ catch (err) {
128
+ res.status(502).json({
129
+ state: "error",
130
+ message: errMessage(err, "Alpic API unavailable"),
131
+ });
132
+ }
133
+ });
134
+ router.post("/__skybridge/deploy/project", async (req, res) => {
135
+ if (state.status === "deploying") {
136
+ res.status(409).json({ message: "A deployment is already in progress." });
137
+ return;
138
+ }
139
+ const name = typeof req.body?.name === "string" ? req.body.name.trim() : "";
140
+ const teamId = typeof req.body?.teamId === "string" ? req.body.teamId : "";
141
+ const teamName = typeof req.body?.teamName === "string" ? req.body.teamName : undefined;
142
+ if (!name || !teamId) {
143
+ res.status(400).json({ message: "name and teamId are required." });
144
+ return;
145
+ }
146
+ try {
147
+ const existing = await alpic.api.projects.list.v1({ teamId });
148
+ if (existing.some((p) => p.name === name)) {
149
+ res
150
+ .status(409)
151
+ .json({ message: `A project named "${name}" already exists.` });
152
+ return;
153
+ }
154
+ const cfg = await alpic.projects.createLinked({
155
+ name,
156
+ teamId,
157
+ teamName,
158
+ runtime: alpic.projects.detectRuntime() ?? "node24",
159
+ });
160
+ res.status(202).json({ ok: true });
161
+ void runDeploy(cfg.environmentId, cfg.teamId);
162
+ }
163
+ catch (err) {
164
+ res.status(502).json({
165
+ message: errMessage(err, "Failed to create project"),
166
+ });
167
+ }
168
+ });
169
+ router.post("/__skybridge/deploy/login", async (_req, res) => {
170
+ try {
171
+ await alpic.auth.login();
172
+ res.json({ ok: true });
173
+ }
174
+ catch (err) {
175
+ res.status(502).json({
176
+ message: errMessage(err, "Sign-in failed"),
177
+ });
178
+ }
179
+ });
180
+ router.post("/__skybridge/deploy", (_req, res) => {
181
+ if (state.status === "deploying") {
182
+ res.status(409).json({ message: "A deployment is already in progress." });
183
+ return;
184
+ }
185
+ const cfg = alpic.projects.loadConfig();
186
+ if (!cfg?.environmentId) {
187
+ res.status(409).json({ message: "No linked project to redeploy." });
188
+ return;
189
+ }
190
+ res.status(202).json({ ok: true });
191
+ void runDeploy(cfg.environmentId, cfg.teamId);
192
+ });
193
+ router.get("/__skybridge/deploy/events", (req, res) => {
194
+ res.setHeader("Content-Type", "text/event-stream");
195
+ res.setHeader("Cache-Control", "no-cache, no-transform");
196
+ res.setHeader("Connection", "keep-alive");
197
+ res.flushHeaders?.();
198
+ write(res, state);
199
+ subscribers.add(res);
200
+ req.on("close", () => {
201
+ subscribers.delete(res);
202
+ });
203
+ });
204
+ return router;
205
+ }
206
+ //# sourceMappingURL=deploy-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-router.js","sourceRoot":"","sources":["../src/deploy-router.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { fileURLToPath } from "node:url";
3
3
  import cors from "cors";
4
4
  import express, {} from "express";
5
+ import { createDeployRouter } from "./deploy-router.js";
5
6
  const detectPackageManager = () => {
6
7
  const userAgent = process.env.npm_config_user_agent ?? "";
7
8
  if (userAgent.startsWith("pnpm")) {
@@ -36,6 +37,7 @@ export const devtoolsStaticServer = async () => {
36
37
  router.get("/__skybridge/devtools/project", (_req, res) => {
37
38
  res.json({ packageManager: detectPackageManager() });
38
39
  });
40
+ router.use(createDeployRouter());
39
41
  router.use(express.static(distDir));
40
42
  router.get("/", (_req, res, next) => {
41
43
  const indexHtmlPath = path.join(distDir, "index.html");
@@ -1 +1 @@
1
- {"version":3,"file":"devtoolsStaticServer.js","sourceRoot":"","sources":["../src/devtoolsStaticServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAI/C,MAAM,oBAAoB,GAAG,GAAmB,EAAE;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC1D,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAqB,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
1
+ {"version":3,"file":"devtoolsStaticServer.js","sourceRoot":"","sources":["../src/devtoolsStaticServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAIxD,MAAM,oBAAoB,GAAG,GAAmB,EAAE;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IAC1D,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAAqB,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACxD,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
package/dist/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/favicon.ico" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>Skybridge MCP devtools</title>
8
- <script type="module" crossorigin src="/assets/index-BQIJfzpz.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-CiEa4JLr.css">
8
+ <script type="module" crossorigin src="/assets/index-R5erQwQK.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DAVIy1qN.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -1,4 +1,5 @@
1
1
  <svg width="90" height="90" viewBox="0 0 90 90" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <title>Skybridge</title>
2
3
  <g clip-path="url(#clip0_3933_970)">
3
4
  <mask id="mask0_3933_970" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="90" height="90">
4
5
  <path d="M90 0H0V90H90V0Z" fill="white"/>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skybridge/devtools",
3
- "version": "1.2.6",
3
+ "version": "1.3.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,68 +16,70 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
+ "@alpic-ai/sdk": "^1.155.0",
19
20
  "@t3-oss/env-core": "^0.13.11",
20
21
  "cors": "^2.8.6",
21
22
  "express": "^5.2.1",
22
- "zod": "^4.3.5"
23
+ "zod": "^4.4.3"
23
24
  },
24
25
  "devDependencies": {
25
- "@alpic-ai/ui": "^1.116.0",
26
- "@base-ui/react": "^1.3.0",
27
- "@fontsource-variable/jetbrains-mono": "^5.2.8",
26
+ "@alpic-ai/ui": "^1.155.0",
27
+ "@base-ui/react": "^1.6.0",
28
+ "@fontsource-variable/jetbrains-mono": "^5.3.0",
28
29
  "@modelcontextprotocol/sdk": "^1.29.0",
29
- "@playwright/test": "^1.49.0",
30
- "@radix-ui/react-accordion": "^1.2.12",
31
- "@radix-ui/react-tooltip": "^1.2.8",
32
- "@rjsf/core": "^6.4.2",
33
- "@rjsf/shadcn": "^6.4.2",
34
- "@rjsf/utils": "^6.4.2",
35
- "@rjsf/validator-ajv8": "^6.4.2",
36
- "@tailwindcss/vite": "^4.2.2",
37
- "@tanstack/react-query": "^5.95.2",
30
+ "@playwright/test": "^1.61.1",
31
+ "@radix-ui/react-accordion": "^1.2.16",
32
+ "@radix-ui/react-tooltip": "^1.2.12",
33
+ "@rjsf/core": "^6.7.0",
34
+ "@rjsf/shadcn": "^6.7.0",
35
+ "@rjsf/utils": "^6.7.0",
36
+ "@rjsf/validator-ajv8": "^6.7.0",
37
+ "@tailwindcss/vite": "^4.3.3",
38
+ "@tanstack/react-query": "^5.101.2",
38
39
  "@total-typescript/tsconfig": "^1.0.4",
39
40
  "@types/cors": "^2.8.19",
40
41
  "@types/express": "^5.0.6",
41
42
  "@types/lodash-es": "^4.17.12",
42
- "@types/react": "^19.2.14",
43
+ "@types/react": "^19.2.17",
43
44
  "@types/react-dom": "^19.2.3",
44
45
  "@types/react-syntax-highlighter": "^15.5.13",
45
- "@vitejs/plugin-react": "^6.0.1",
46
+ "@vitejs/plugin-react": "^6.0.3",
46
47
  "ahooks": "^3.9.7",
47
- "autoprefixer": "^10.4.27",
48
+ "autoprefixer": "^10.5.4",
48
49
  "class-variance-authority": "^0.7.1",
49
50
  "clsx": "^2.1.1",
50
51
  "cmdk": "^1.1.1",
51
- "framer-motion": "^12.38.0",
52
- "lodash-es": "^4.17.23",
53
- "lucide-react": "^1.7.0",
54
- "motion": "^12.38.0",
55
- "nuqs": "^2.8.9",
56
- "postcss": "^8.5.8",
57
- "react": "^19.2.4",
58
- "react-dom": "^19.2.4",
59
- "react-resizable-panels": "^4.11.0",
52
+ "lodash-es": "^4.18.1",
53
+ "lucide-react": "^1.25.0",
54
+ "motion": "^12.42.2",
55
+ "nuqs": "^2.9.1",
56
+ "postcss": "^8.5.19",
57
+ "react": "^19.2.7",
58
+ "react-dom": "^19.2.7",
59
+ "react-resizable-panels": "^4.12.2",
60
60
  "react-syntax-highlighter": "^16.1.1",
61
- "shadcn": "^4.1.1",
62
- "shiki": "^4.0.2",
63
- "tailwind-merge": "^3.5.0",
64
- "tailwindcss": "^4.2.2",
61
+ "shadcn": "^4.13.1",
62
+ "shiki": "^4.3.1",
63
+ "tailwind-merge": "^3.6.0",
64
+ "tailwindcss": "^4.3.3",
65
65
  "tailwindcss-animate": "^1.0.7",
66
- "tsx": "^4.21.0",
66
+ "tsx": "^4.23.1",
67
67
  "tw-animate-css": "^1.4.0",
68
- "typescript": "~6.0.2",
69
- "vite": "^8.0.3",
70
- "zustand": "^5.0.12",
71
- "skybridge": "1.2.6"
68
+ "typescript": "~6.0.3",
69
+ "vite": "^8.1.5",
70
+ "vitest": "^4.1.10",
71
+ "zustand": "^5.0.14",
72
+ "skybridge": "1.3.0"
72
73
  },
73
74
  "scripts": {
74
75
  "dev": "vite",
75
76
  "build": "tsc -b && vite build && pnpm run build:server",
76
77
  "build:server": "tsc -p tsconfig.server.json",
77
- "test": "pnpm run test:format && pnpm run test:types",
78
+ "test": "pnpm run test:format && pnpm run test:types && pnpm run test:unit",
78
79
  "format": "biome check --write --error-on-warnings",
79
80
  "test:format": "biome ci",
80
81
  "test:types": "tsc --noEmit -p e2e/tsconfig.json",
82
+ "test:unit": "vitest run",
81
83
  "preview": "vite preview",
82
84
  "e2e:fixture": "tsx ./e2e/fixtures/server.ts",
83
85
  "test:e2e": "playwright test --config e2e/playwright.config.ts",