robodev 0.48.0 → 0.49.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "robodev",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "description": "CLI for Robodev Starbase — create, auth, link, deploy, load, and run a project locally with robodev dev",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -26,8 +26,8 @@
26
26
  "embedded-postgres": "17.10.0-beta.17",
27
27
  "fastify": "^5.12.1",
28
28
  "tsx": "^4.20.5",
29
- "@robodev-ai/runtime": "0.8.0",
30
- "@robodev-ai/sdk": "0.14.0"
29
+ "@robodev-ai/sdk": "0.15.0",
30
+ "@robodev-ai/runtime": "0.9.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^24.3.0",
@@ -62,6 +62,10 @@ test("shouldCountRequestHistogram counts Auth and matched file routes only", ()
62
62
  assert.equal(shouldCountRequestHistogram("/_robodev/scalar", fileRuntime, "GET"), false);
63
63
  assert.equal(shouldCountRequestHistogram("/_robodev/ready", fileRuntime, "GET"), false);
64
64
  assert.equal(shouldCountRequestHistogram("/openapi.json", fileRuntime, "GET"), false);
65
+ assert.equal(
66
+ shouldCountRequestHistogram("/robodev-enterprise-spec.json", fileRuntime, "GET"),
67
+ false,
68
+ );
65
69
  assert.equal(shouldCountRequestHistogram("/docs", fileRuntime, "GET"), false);
66
70
  assert.equal(shouldCountRequestHistogram("/swagger", fileRuntime, "GET"), false);
67
71
  assert.equal(isHistogramExcludedPath("/scalar"), true);
@@ -278,6 +282,17 @@ test("inspect HTML has nav labels and polls state.json", () => {
278
282
  assert.doesNotMatch(html, /fetch\("\/_robodev\/logs\.json"\)/);
279
283
  assert.doesNotMatch(html, /@xyflow|React\.createElement|react-dom/);
280
284
  assert.match(html, /setInterval\(poll, 1000\)/);
285
+ assert.match(html, /state\.overview\.links\.enterprise/);
286
+ assert.match(html, /label: "Enterprise spec"/);
287
+ });
288
+
289
+ test("dashboard state includes enterprise spec link after openapi", async () => {
290
+ const state = await buildDashboardState({
291
+ inspect: createDevInspect(),
292
+ runtime: { routes: [], jobs: [] },
293
+ });
294
+ assert.equal(state.overview.links.openapi, "/openapi.json");
295
+ assert.equal(state.overview.links.enterprise, "/robodev-enterprise-spec.json");
281
296
  });
282
297
 
283
298
  test("storageActivityMatchesKey uses exact key except list prefixes", () => {
@@ -40,6 +40,7 @@ const HISTOGRAM_EXCLUDED_PATHS = new Set([
40
40
  "/_robodev/scalar",
41
41
  "/scalar",
42
42
  "/openapi.json",
43
+ "/robodev-enterprise-spec.json",
43
44
  "/_robodev/ready",
44
45
  ]);
45
46
 
@@ -213,7 +214,7 @@ export type DashboardState = {
213
214
  google: DashboardGoogle;
214
215
  requestHistogram: RequestHistogramBucket[];
215
216
  jobHistogram: JobHistogramBucket[];
216
- links: { swagger: string; scalar: string; openapi: string };
217
+ links: { swagger: string; scalar: string; openapi: string; enterprise: string };
217
218
  };
218
219
  routes: Array<{ method: string; path: string; file: string }>;
219
220
  calls: Array<{ at: number; method: string; path: string; status: number; durationMs: number }>;
@@ -596,7 +597,12 @@ export async function buildDashboardState(input: {
596
597
  google,
597
598
  requestHistogram: input.inspect.requestHistogram(),
598
599
  jobHistogram: input.inspect.jobHistogram(),
599
- links: { swagger: "/_robodev/docs", scalar: "/_robodev/scalar", openapi: "/openapi.json" },
600
+ links: {
601
+ swagger: "/_robodev/docs",
602
+ scalar: "/_robodev/scalar",
603
+ openapi: "/openapi.json",
604
+ enterprise: "/robodev-enterprise-spec.json",
605
+ },
600
606
  },
601
607
  routes,
602
608
  calls,
@@ -1067,7 +1073,8 @@ export function inspectHtml(): string {
1067
1073
  var items = [
1068
1074
  { href: state.overview.links.swagger, label: "Swagger" },
1069
1075
  { href: state.overview.links.scalar, label: "Scalar" },
1070
- { href: state.overview.links.openapi, label: "openapi.json" }
1076
+ { href: state.overview.links.openapi, label: "openapi.json" },
1077
+ { href: state.overview.links.enterprise, label: "Enterprise spec" }
1071
1078
  ];
1072
1079
  for (var i = 0; i < items.length; i++) {
1073
1080
  var a = document.createElement("a");
package/src/dev-server.ts CHANGED
@@ -11,9 +11,11 @@ import {
11
11
  browseRows,
12
12
  browseSchema,
13
13
  buildOpenApi,
14
+ buildEnterpriseSpec,
14
15
  handleLocalAuth,
15
16
  isLocalAuthPath,
16
17
  isReservedStoragePath,
18
+ ENTERPRISE_SPEC_PATH,
17
19
  matchProjectRoute,
18
20
  matchSocketRoute,
19
21
  parseLogicalKey,
@@ -624,6 +626,10 @@ export async function startDevServer(
624
626
  await reply.send(runtime.openapi);
625
627
  return;
626
628
  }
629
+ if (pathname === ENTERPRISE_SPEC_PATH) {
630
+ await reply.send(buildEnterpriseSpec(runtime.openapi));
631
+ return;
632
+ }
627
633
 
628
634
  if (isLocalAuthPath(pathname)) {
629
635
  const result = await handleLocalAuth(
@@ -9,10 +9,10 @@
9
9
  "rules:gen": "rulesync generate"
10
10
  },
11
11
  "dependencies": {
12
- "@robodev-ai/sdk": "^0.14.0"
12
+ "@robodev-ai/sdk": "^0.15.0"
13
13
  },
14
14
  "devDependencies": {
15
- "robodev": "^0.48.0",
15
+ "robodev": "^0.49.0",
16
16
  "rulesync": "^8.18.0",
17
17
  "typescript": "^5.9.2"
18
18
  }
@@ -8,10 +8,10 @@
8
8
  "deploy": "robodev deploy"
9
9
  },
10
10
  "dependencies": {
11
- "@robodev-ai/sdk": "^0.14.0"
11
+ "@robodev-ai/sdk": "^0.15.0"
12
12
  },
13
13
  "devDependencies": {
14
- "robodev": "^0.48.0",
14
+ "robodev": "^0.49.0",
15
15
  "typescript": "^5.9.2"
16
16
  }
17
17
  }
@@ -10,13 +10,13 @@
10
10
  "build": "vite build"
11
11
  },
12
12
  "dependencies": {
13
- "@robodev-ai/sdk": "^0.14.0",
13
+ "@robodev-ai/sdk": "^0.15.0",
14
14
  "@robodev-ai/client": "^0.5.0",
15
15
  "react": "^18.3.1",
16
16
  "react-dom": "^18.3.1"
17
17
  },
18
18
  "devDependencies": {
19
- "robodev": "^0.48.0",
19
+ "robodev": "^0.49.0",
20
20
  "typescript": "^5.9.2",
21
21
  "vite": "^6.0.0"
22
22
  }
@@ -9,10 +9,10 @@
9
9
  "rules:gen": "rulesync generate"
10
10
  },
11
11
  "dependencies": {
12
- "@robodev-ai/sdk": "^0.14.0"
12
+ "@robodev-ai/sdk": "^0.15.0"
13
13
  },
14
14
  "devDependencies": {
15
- "robodev": "^0.48.0",
15
+ "robodev": "^0.49.0",
16
16
  "rulesync": "^8.18.0",
17
17
  "typescript": "^5.9.2"
18
18
  }
@@ -9,10 +9,10 @@
9
9
  "rules:gen": "rulesync generate"
10
10
  },
11
11
  "dependencies": {
12
- "@robodev-ai/sdk": "^0.14.0"
12
+ "@robodev-ai/sdk": "^0.15.0"
13
13
  },
14
14
  "devDependencies": {
15
- "robodev": "^0.48.0",
15
+ "robodev": "^0.49.0",
16
16
  "rulesync": "^8.18.0",
17
17
  "typescript": "^5.9.2"
18
18
  }
@@ -11,7 +11,7 @@
11
11
  "generate:api": "orval"
12
12
  },
13
13
  "dependencies": {
14
- "@robodev-ai/sdk": "^0.14.0",
14
+ "@robodev-ai/sdk": "^0.15.0",
15
15
  "@robodev-ai/client": "^0.5.0",
16
16
  "react": "^18.3.1",
17
17
  "react-dom": "^18.3.1",
@@ -21,7 +21,7 @@
21
21
  "@types/react": "^18.3.12",
22
22
  "@types/react-dom": "^18.3.1",
23
23
  "orval": "^7.11.2",
24
- "robodev": "^0.48.0",
24
+ "robodev": "^0.49.0",
25
25
  "typescript": "^5.9.2",
26
26
  "vite": "^6.0.0"
27
27
  }
@@ -9,10 +9,10 @@
9
9
  "rules:gen": "rulesync generate"
10
10
  },
11
11
  "dependencies": {
12
- "@robodev-ai/sdk": "^0.14.0"
12
+ "@robodev-ai/sdk": "^0.15.0"
13
13
  },
14
14
  "devDependencies": {
15
- "robodev": "^0.48.0",
15
+ "robodev": "^0.49.0",
16
16
  "rulesync": "^8.18.0",
17
17
  "typescript": "^5.9.2"
18
18
  }