@teamscala/service-boot 0.23.513 → 0.23.515

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
@@ -6,32 +6,32 @@
6
6
  },
7
7
  "dependencies": {
8
8
  "@orpc/server": "1.15.1",
9
- "@teamscala/agreement-generation": "1.0.17",
10
- "@teamscala/assessment": "0.0.22",
11
- "@teamscala/auth": "1.102.11",
12
- "@teamscala/cache": "1.0.79",
13
- "@teamscala/chat-completion": "0.0.469",
14
- "@teamscala/db": "1.21.43752",
15
- "@teamscala/db-validation": "0.1.344",
16
- "@teamscala/document-signing": "1.0.5",
17
- "@teamscala/email-client": "0.1.4",
18
- "@teamscala/encryption": "0.3.98",
19
- "@teamscala/event-log": "0.1.27",
20
- "@teamscala/file-lock": "0.0.2",
21
- "@teamscala/formatters": "0.2.95",
22
- "@teamscala/generic-registry": "1.0.12",
23
- "@teamscala/hono-boundary": "0.0.1",
24
- "@teamscala/http": "2.1.105",
25
- "@teamscala/logger": "1.1.203",
26
- "@teamscala/mcp-multi-session": "1.3.147",
27
- "@teamscala/object-storage": "1.2.201",
28
- "@teamscala/orpc": "2.6.118",
29
- "@teamscala/os": "1.15.264",
30
- "@teamscala/publish-registry": "0.1.3",
31
- "@teamscala/resolver-engine": "1.1.208",
32
- "@teamscala/timing": "1.0.51",
33
- "@teamscala/tool-executor": "4.1.166",
34
- "@teamscala/watchdog": "1.0.53",
9
+ "@teamscala/agreement-generation": "*",
10
+ "@teamscala/assessment": "*",
11
+ "@teamscala/auth": "*",
12
+ "@teamscala/cache": "*",
13
+ "@teamscala/chat-completion": "*",
14
+ "@teamscala/db": "*",
15
+ "@teamscala/db-validation": "*",
16
+ "@teamscala/document-signing": "*",
17
+ "@teamscala/email-client": "*",
18
+ "@teamscala/encryption": "*",
19
+ "@teamscala/event-log": "*",
20
+ "@teamscala/file-lock": "*",
21
+ "@teamscala/formatters": "*",
22
+ "@teamscala/generic-registry": "*",
23
+ "@teamscala/hono-boundary": "*",
24
+ "@teamscala/http": "*",
25
+ "@teamscala/logger": "*",
26
+ "@teamscala/mcp-multi-session": "*",
27
+ "@teamscala/object-storage": "*",
28
+ "@teamscala/orpc": "*",
29
+ "@teamscala/os": "*",
30
+ "@teamscala/publish-registry": "*",
31
+ "@teamscala/resolver-engine": "*",
32
+ "@teamscala/timing": "*",
33
+ "@teamscala/tool-executor": "*",
34
+ "@teamscala/watchdog": "*",
35
35
  "hono": "4.13.8",
36
36
  "pg-boss": "12.33.1",
37
37
  "tailwindcss": "4.3.3",
@@ -1187,5 +1187,5 @@
1187
1187
  "repository": "https://github.com/teamgbg/service-boot",
1188
1188
  "sideEffects": false,
1189
1189
  "type": "module",
1190
- "version": "0.23.513"
1190
+ "version": "0.23.515"
1191
1191
  }
@@ -6,26 +6,33 @@
6
6
  // carries them verbatim, this file is the emission, and hand edits here are
7
7
  // overwritten on the next run. The rationale each assertion carries moved
8
8
  // with it into the band.
9
-
10
9
  import { describe, expect, test } from "bun:test";
11
10
  import { toCapabilitySlug } from "./capability-slug.ts";
12
11
 
13
12
  describe("toCapabilitySlug", () => {
14
13
  test("strips the language+tier suffix from a dev deployable", () => {
15
- expect(toCapabilitySlug("scala-projects-bun-dev")).toBe("scala-projects");
16
- expect(toCapabilitySlug("scala-ai-bun-dev")).toBe("scala-ai");
14
+ expect(toCapabilitySlug("scala-projects-ts-dev")).toBe("scala-projects");
15
+ expect(toCapabilitySlug("scala-ai-ts-dev")).toBe("scala-ai");
17
16
  expect(toCapabilitySlug("scala-image-optimizer-rust-dev")).toBe(
18
17
  "scala-image-optimizer",
19
18
  );
20
19
  });
21
20
 
22
21
  test("strips the language+tier suffix from a prod deployable", () => {
23
- expect(toCapabilitySlug("scala-projects-bun-prod")).toBe("scala-projects");
22
+ expect(toCapabilitySlug("scala-projects-ts-prod")).toBe("scala-projects");
24
23
  expect(toCapabilitySlug("scala-messaging-service-rust-prod")).toBe(
25
24
  "scala-messaging-service",
26
25
  );
27
26
  });
28
27
 
28
+ test("strips the retired bun spelling to the same capability", () => {
29
+ // The fleet was renamed under -bun before the operator ruling of
30
+ // 2026-09-08 fixed the language segment at ts; rows or supervised
31
+ // names still carrying it converge rather than fail the join.
32
+ expect(toCapabilitySlug("scala-projects-bun-dev")).toBe("scala-projects");
33
+ expect(toCapabilitySlug("scala-ai-bun-prod")).toBe("scala-ai");
34
+ });
35
+
29
36
  test("returns an already-capability slug unchanged", () => {
30
37
  // The prod lane is still bare while the tier migration is in flight, so
31
38
  // the SAME function must be correct before and after the rename lands.
@@ -35,11 +42,11 @@ describe("toCapabilitySlug", () => {
35
42
 
36
43
  test("both lanes of one application normalize to the same identity", () => {
37
44
  // This is the property the page_route join depends on.
38
- expect(toCapabilitySlug("scala-projects-bun-dev")).toBe(
45
+ expect(toCapabilitySlug("scala-projects-ts-dev")).toBe(
39
46
  toCapabilitySlug("scala-projects"),
40
47
  );
41
- expect(toCapabilitySlug("scala-quiz-bun-dev")).toBe(
42
- toCapabilitySlug("scala-quiz-bun-prod"),
48
+ expect(toCapabilitySlug("scala-quiz-ts-dev")).toBe(
49
+ toCapabilitySlug("scala-quiz-ts-prod"),
43
50
  );
44
51
  });
45
52
 
@@ -6,10 +6,12 @@
6
6
  * Deployable slug -> capability slug.
7
7
  *
8
8
  * A DEPLOYABLE is named `<capability>-<language>-<tier>`
9
- * (`deployables-carry-language-and-tier`): `scala-projects-bun-dev` and
10
- * `scala-projects-bun-prod` are two DEPLOYMENTS of one APPLICATION. The
11
- * ecosystem generator emits that name into `SERVICE_SLUG` per lane, so one
12
- * service arrives here under a DIFFERENT identity in each lane.
9
+ * (`deployables-carry-language-and-tier`, as amended by the operator ruling of
10
+ * 2026-09-08: "so actually the apps are ts, not bun" — the language segment
11
+ * spells the LANGUAGE, so Bun-launched services are `ts`): `scala-projects-ts-dev`
12
+ * and `scala-projects-ts-prod` are two DEPLOYMENTS of one APPLICATION. The
13
+ * ecosystem generator derives that name per lane, so one service arrives here
14
+ * under a DIFFERENT identity in each lane.
13
15
  *
14
16
  * A `page_route` row describes the APPLICATION url space, which is the same
15
17
  * in both lanes, so it carries the CAPABILITY name and there is exactly one
@@ -26,13 +28,17 @@
26
28
  * The suffix grammar is a CLOSED SET defined by doctrine and emitted by the
27
29
  * generator, so this is a parse of a documented contract rather than a
28
30
  * pattern heuristic. A slug that does not end in one is already a capability
29
- * name and is returned unchanged -- which is why this is correct both BEFORE
30
- * the tier migration completes (prod is still bare `scala-projects`) and
31
- * after it (prod becomes `scala-projects-bun-prod`).
31
+ * name and is returned unchanged.
32
+ *
33
+ * `bun` REMAINS IN THE SET AS RETIRED SPELLING TOLERANCE, mirroring the
34
+ * generator side (`ecosystem/deployable_identity.rs capability_of` strips
35
+ * `-ts`, `-bun` and `-rust`): the fleet was renamed under `-bun` and rows or
36
+ * supervised names still carrying it must converge to the same capability
37
+ * rather than fail the join during the migration window.
32
38
  */
33
39
 
34
- /** Language segment of a deployable name. */
35
- const LANGUAGES = ["bun", "rust"] as const;
40
+ /** Language segment of a deployable name. `bun` is the retired spelling. */
41
+ const LANGUAGES = ["ts", "bun", "rust"] as const;
36
42
 
37
43
  /** Tier segment of a deployable name. */
38
44
  const TIERS = ["dev", "prod"] as const;
@@ -43,8 +49,9 @@ type Tier = (typeof TIERS)[number];
43
49
  /**
44
50
  * The capability half of a deployable slug.
45
51
  *
46
- * `scala-projects-bun-dev` -> `scala-projects`
47
- * `scala-projects-bun-prod` -> `scala-projects`
52
+ * `scala-projects-ts-dev` -> `scala-projects`
53
+ * `scala-projects-ts-prod` -> `scala-projects`
54
+ * `scala-projects-bun-dev` -> `scala-projects` (retired spelling)
48
55
  * `scala-projects` -> `scala-projects` (already a capability name)
49
56
  */
50
57
  export function toCapabilitySlug(slug: string): string {
@@ -278,6 +278,13 @@ export async function registerRegistryPageRoute(
278
278
  themeOverride,
279
279
  orgTitlePrefix,
280
280
  );
281
+ // The matched route params (extractUrlParams + host/path) ride the
282
+ // per-request pageData so the SSR resolve ctx can scope PUBLIC
283
+ // block data per request — data_source loaders read ctx.pathParams
284
+ // (query-data-source); without them a public table would return
285
+ // every person's rows. Attached AFTER the graph cache (per-request,
286
+ // never cached with the graph).
287
+ (pageData as Record<string, unknown>).pathParams = params;
281
288
  const panelSlug = new URL(request.url).searchParams.get("panel");
282
289
  await attachPanelPage(pageData as Record<string, unknown>, panelSlug);
283
290
  if (