@skybridge/devtools 0.0.0-next.ddc1afb → 0.0.0-next.e2587af

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,224 @@
1
+ import express, {} from "express";
2
+ import { alpic } from "./alpic-sdk.js";
3
+ const TOTAL_STEPS = 4;
4
+ const PHASE_STEPS = {
5
+ collecting: { step: 1, label: "Collecting files" },
6
+ collected: { step: 1, label: "Collecting files" },
7
+ uploading: { step: 2, label: "Uploading source" },
8
+ triggering: { step: 3, label: "Triggering deployment" },
9
+ deploying: { step: 4, label: "Deploying" },
10
+ };
11
+ const phaseText = (type) => {
12
+ const { step, label } = PHASE_STEPS[type];
13
+ return `${step}/${TOTAL_STEPS} ${label}`;
14
+ };
15
+ const errMessage = (err, fallback) => err instanceof Error ? err.message : fallback;
16
+ /**
17
+ * Dev-only router that drives the devtools Deploy button. Runs `@alpic-ai/sdk`
18
+ * in-process (no CLI spawning): `/status` is a plain request, deploy progress
19
+ * streams over SSE at `/events`.
20
+ */
21
+ export function createDeployRouter() {
22
+ const router = express.Router();
23
+ let state = { status: "idle" };
24
+ const subscribers = new Set();
25
+ const write = (res, s) => {
26
+ res.write(`event: state\ndata: ${JSON.stringify(s)}\n\n`);
27
+ };
28
+ const setState = (s) => {
29
+ state = s;
30
+ for (const res of subscribers) {
31
+ write(res, s);
32
+ }
33
+ };
34
+ const runDeploy = async (environmentId, teamId) => {
35
+ const startedAt = Date.now();
36
+ setState({
37
+ status: "deploying",
38
+ phase: phaseText("collecting"),
39
+ startedAt,
40
+ deploymentPageUrl: null,
41
+ });
42
+ let pageUrl = null;
43
+ try {
44
+ const result = await alpic.deployments.deploy({
45
+ environmentId,
46
+ teamId,
47
+ onProgress: (event) => {
48
+ if (event.type === "deploying" && event.deploymentPageUrl) {
49
+ pageUrl = event.deploymentPageUrl;
50
+ }
51
+ setState({
52
+ status: "deploying",
53
+ phase: phaseText(event.type),
54
+ startedAt,
55
+ deploymentPageUrl: pageUrl,
56
+ });
57
+ },
58
+ });
59
+ if (result.status === "deployed") {
60
+ setState({
61
+ status: "deployed",
62
+ mcpServerUrl: result.mcpServerUrl,
63
+ deploymentPageUrl: result.deploymentPageUrl,
64
+ });
65
+ }
66
+ else {
67
+ setState({
68
+ status: "failed",
69
+ message: `Deployment ${result.status}.`,
70
+ deploymentPageUrl: result.deploymentPageUrl,
71
+ });
72
+ }
73
+ }
74
+ catch (err) {
75
+ setState({
76
+ status: "failed",
77
+ message: errMessage(err, "Deployment failed"),
78
+ deploymentPageUrl: pageUrl,
79
+ });
80
+ }
81
+ };
82
+ router.get("/__skybridge/deploy/status", async (_req, res) => {
83
+ try {
84
+ const whoami = await alpic.whoami();
85
+ if (whoami.method === "unauthenticated") {
86
+ res.json({ state: "signedOut" });
87
+ return;
88
+ }
89
+ const loaded = alpic.projects.loadConfig();
90
+ const cfg = loaded && (await alpic.projects.validateLink(loaded));
91
+ const staleConfig = loaded !== null && cfg === null;
92
+ if (!cfg) {
93
+ const teams = await alpic.api.teams.list.v1();
94
+ const team = teams[0];
95
+ if (!team) {
96
+ res.json({ state: "noTeam" });
97
+ return;
98
+ }
99
+ res.json({
100
+ state: "needsProject",
101
+ teams,
102
+ defaultTeamId: team.id,
103
+ staleConfig,
104
+ });
105
+ return;
106
+ }
107
+ let lastDeployGit = null;
108
+ let lastDeployStatus;
109
+ let lastDeployStartedAt;
110
+ let mcpServerUrl;
111
+ let deploymentPageUrl = null;
112
+ if (cfg.environmentId) {
113
+ try {
114
+ const latest = await alpic.deployments.getLatestForEnvironment(cfg.environmentId);
115
+ if (latest.sourceCommitId !== null) {
116
+ lastDeployGit = {
117
+ ref: latest.sourceRef,
118
+ commitMessage: latest.sourceCommitMessage,
119
+ author: latest.authorUsername,
120
+ };
121
+ }
122
+ lastDeployStatus = latest.status;
123
+ lastDeployStartedAt = latest.startedAt?.getTime();
124
+ deploymentPageUrl = latest.deploymentPageUrl;
125
+ if (latest.status === "deployed") {
126
+ const environment = await alpic.api.environments.get.v1({
127
+ environmentId: cfg.environmentId,
128
+ });
129
+ mcpServerUrl = environment.mcpServerUrl;
130
+ }
131
+ }
132
+ catch {
133
+ // no deployments yet — leave defaults
134
+ }
135
+ }
136
+ res.json({
137
+ state: "ready",
138
+ lastDeployGit,
139
+ lastDeployStatus,
140
+ lastDeployStartedAt,
141
+ mcpServerUrl,
142
+ deploymentPageUrl,
143
+ });
144
+ }
145
+ catch (err) {
146
+ res.status(502).json({
147
+ state: "error",
148
+ message: errMessage(err, "Alpic API unavailable"),
149
+ });
150
+ }
151
+ });
152
+ router.post("/__skybridge/deploy/project", async (req, res) => {
153
+ if (state.status === "deploying") {
154
+ res.status(409).json({ message: "A deployment is already in progress." });
155
+ return;
156
+ }
157
+ const name = typeof req.body?.name === "string" ? req.body.name.trim() : "";
158
+ const teamId = typeof req.body?.teamId === "string" ? req.body.teamId : "";
159
+ const teamName = typeof req.body?.teamName === "string" ? req.body.teamName : undefined;
160
+ if (!name || !teamId) {
161
+ res.status(400).json({ message: "name and teamId are required." });
162
+ return;
163
+ }
164
+ try {
165
+ const existing = await alpic.api.projects.list.v1({ teamId });
166
+ if (existing.some((p) => p.name === name)) {
167
+ res
168
+ .status(409)
169
+ .json({ message: `A project named "${name}" already exists.` });
170
+ return;
171
+ }
172
+ const cfg = await alpic.projects.createLinked({
173
+ name,
174
+ teamId,
175
+ teamName,
176
+ runtime: alpic.projects.detectRuntime() ?? "node24",
177
+ });
178
+ res.status(202).json({ ok: true });
179
+ void runDeploy(cfg.environmentId, cfg.teamId);
180
+ }
181
+ catch (err) {
182
+ res.status(502).json({
183
+ message: errMessage(err, "Failed to create project"),
184
+ });
185
+ }
186
+ });
187
+ router.post("/__skybridge/deploy/login", async (_req, res) => {
188
+ try {
189
+ await alpic.auth.login();
190
+ res.json({ ok: true });
191
+ }
192
+ catch (err) {
193
+ res.status(502).json({
194
+ message: errMessage(err, "Sign-in failed"),
195
+ });
196
+ }
197
+ });
198
+ router.post("/__skybridge/deploy", (_req, res) => {
199
+ if (state.status === "deploying") {
200
+ res.status(409).json({ message: "A deployment is already in progress." });
201
+ return;
202
+ }
203
+ const cfg = alpic.projects.loadConfig();
204
+ if (!cfg?.environmentId) {
205
+ res.status(409).json({ message: "No linked project to redeploy." });
206
+ return;
207
+ }
208
+ res.status(202).json({ ok: true });
209
+ void runDeploy(cfg.environmentId, cfg.teamId);
210
+ });
211
+ router.get("/__skybridge/deploy/events", (req, res) => {
212
+ res.setHeader("Content-Type", "text/event-stream");
213
+ res.setHeader("Cache-Control", "no-cache, no-transform");
214
+ res.setHeader("Connection", "keep-alive");
215
+ res.flushHeaders?.();
216
+ write(res, state);
217
+ subscribers.add(res);
218
+ req.on("close", () => {
219
+ subscribers.delete(res);
220
+ });
221
+ });
222
+ return router;
223
+ }
224
+ //# 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-TTHQkxmc.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DHYCQwPI.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skybridge/devtools",
3
- "version": "0.0.0-next.ddc1afb",
3
+ "version": "0.0.0-next.e2587af",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,6 +16,7 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
+ "@alpic-ai/sdk": "^1.146.1",
19
20
  "@t3-oss/env-core": "^0.13.11",
20
21
  "cors": "^2.8.6",
21
22
  "express": "^5.2.1",
@@ -67,17 +68,19 @@
67
68
  "tw-animate-css": "^1.4.0",
68
69
  "typescript": "~6.0.2",
69
70
  "vite": "^8.0.3",
71
+ "vitest": "^4.1.4",
70
72
  "zustand": "^5.0.12",
71
- "skybridge": "0.0.0-next.ddc1afb"
73
+ "skybridge": "0.0.0-next.e2587af"
72
74
  },
73
75
  "scripts": {
74
76
  "dev": "vite",
75
77
  "build": "tsc -b && vite build && pnpm run build:server",
76
78
  "build:server": "tsc -p tsconfig.server.json",
77
- "test": "pnpm run test:format && pnpm run test:types",
79
+ "test": "pnpm run test:format && pnpm run test:types && pnpm run test:unit",
78
80
  "format": "biome check --write --error-on-warnings",
79
81
  "test:format": "biome ci",
80
82
  "test:types": "tsc --noEmit -p e2e/tsconfig.json",
83
+ "test:unit": "vitest run",
81
84
  "preview": "vite preview",
82
85
  "e2e:fixture": "tsx ./e2e/fixtures/server.ts",
83
86
  "test:e2e": "playwright test --config e2e/playwright.config.ts",