unoverse 0.1.144 → 0.1.146

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.
@@ -212,7 +212,11 @@
212
212
  echo "HTTP $RESULT"
213
213
  [ "$RESULT" -ge 200 ] && [ "$RESULT" -lt 500 ]
214
214
  loop:
215
- - { name: "Canvas", sub: "", path: "/" }
215
+ # canvas.<domain>, NEVER the bare apex. Neither ground creates an apex record
216
+ # (aws/main.tf and digitalocean/main.tf publish api.<domain> and canvas.<domain>
217
+ # only), so `sub: ""` asked for a hostname that has no DNS at all and reported
218
+ # HTTP 000 FAILED on every healthy deploy.
219
+ - { name: "Canvas", sub: "canvas.", path: "/" }
216
220
  - { name: "API Server", sub: "api.", path: "/health" }
217
221
  register: domain_checks
218
222
  ignore_errors: yes
@@ -112,6 +112,19 @@ locals {
112
112
  # Where a person actually goes. Shared by the invitation email and the canvas_url output
113
113
  # so the address in the email can never drift from the address in the deploy summary.
114
114
  canvas_entry = var.domain != "" ? "https://canvas.${var.domain}" : "http://${aws_lb.public.dns_name}:3001"
115
+ # STUDIO IS A CALLBACK THIS GROUND OWNS, exactly like canvas_entry above.
116
+ #
117
+ # Studio signs in with `redirect_uri: window.location.origin` (packages/studio
118
+ # src/UniverseSession.tsx) and serves on a pinned 4108 (vite.config.ts, strictPort). On a
119
+ # BYO-OIDC ground the operator adds that to their own tenant; here the app client IS a
120
+ # resource of this module, so leaving it out means every developer who connects Studio to
121
+ # an AWS universe meets `redirect_mismatch` and has to discover a port number to put in a
122
+ # variable. The ground knows the address, so the ground allows it.
123
+ #
124
+ # Loopback only. It grants nothing on its own: the client is public, the flow is code with
125
+ # PKCE, and a code returned to 127.0.0.1 is redeemable only by the process that asked for
126
+ # it. The same reasoning already ships localhost:5173 in terraform.tfvars.example.
127
+ studio_entry = "http://localhost:4108"
115
128
  api_host = "api.${var.domain}"
116
129
  dns_auto = local.has_domain && var.route53_zone_id != ""
117
130
  }
@@ -592,8 +605,8 @@ resource "aws_cognito_user_pool_client" "spa" {
592
605
  # canvas_entry is the same expression the invitation email and the canvas_url output use,
593
606
  # so the address a person is sent to is by construction an address they may return to.
594
607
  # Anything else in the variable (localhost for dev, a second front end) is kept.
595
- callback_urls = distinct(concat([local.canvas_entry], var.oauth_callback_urls))
596
- logout_urls = distinct(concat([local.canvas_entry], var.oauth_callback_urls))
608
+ callback_urls = distinct(concat([local.canvas_entry, local.studio_entry], var.oauth_callback_urls))
609
+ logout_urls = distinct(concat([local.canvas_entry, local.studio_entry], var.oauth_callback_urls))
597
610
  supported_identity_providers = ["COGNITO"]
598
611
  }
599
612
 
@@ -30,9 +30,12 @@ docr_token = "dop_v1_..." # registry token (pulls platform images)
30
30
  openai_api_key = "sk-..." # memory server + OpenAI nodes
31
31
  # hyperbrowser_api_key = "" # optional — page intelligence
32
32
 
33
+ # EXTRA sign-in callbacks only. Your Canvas (canvas.<domain>, or the ALB address when
34
+ # there is no domain) and Studio (http://localhost:4108) are allowed automatically — the
35
+ # ground provisions the app client, so it knows those two addresses and adds them itself.
36
+ # List anything else here: a second front end, another dev port.
33
37
  oauth_callback_urls = [
34
- "https://yourdomain.com",
35
- "http://localhost:5173", # local Studio/Canvas dev against this universe
38
+ "http://localhost:5173", # Canvas dev server
36
39
  ]
37
40
 
38
41
  # RBAC roles (noun:verb — the grammar node manifests' requires.role matches).
@@ -963,7 +963,11 @@ EOF
963
963
  # Embed doorway is served AND compressed (identity-encoded JS was a live outage).
964
964
  _smoke "embed.js gzipped" sh -c "curl -sf -m 10 -H 'accept-encoding: gzip' -D - '$smoke_api/embed.js' -o /dev/null | grep -qi '^content-encoding: gzip'"
965
965
  # MCP lane accepts an initialize (every external connector dies here first).
966
- _smoke "MCP initialize" sh -c "curl -sf -m 10 -X POST '$smoke_api/mcp' -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{},\"clientInfo\":{\"name\":\"smoke\",\"version\":\"0\"}}}' -o /dev/null"
966
+ # 200 (auth off) or 401 (auth on) prove the lane is ALIVE, the same judgement the
967
+ # database canary below makes. This used `curl -sf`, which fails on any error status,
968
+ # so a universe that boots "JWT enforced on /mcp" — every Cognito/AWS deployment —
969
+ # reported FAIL on a correctly protected endpoint and turned a healthy deploy red.
970
+ _smoke "MCP initialize" sh -c "code=\$(curl -s -m 10 -o /dev/null -w '%{http_code}' -X POST '$smoke_api/mcp' -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{},\"clientInfo\":{\"name\":\"smoke\",\"version\":\"0\"}}}'); [ \"\$code\" = 200 ] || [ \"\$code\" = 401 ]"
967
971
  # Engine → Postgres canary: 200 (auth off) or 401 (auth on) prove the chain; a 500
968
972
  # is the DB-unreachable incident that hides behind an otherwise healthy stack.
969
973
  _smoke "engine reaches database" sh -c "code=\$(curl -s -m 10 -o /dev/null -w '%{http_code}' '$smoke_api/marketplace'); [ \"\$code\" = 200 ] || [ \"\$code\" = 401 ]"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unoverse",
3
- "version": "0.1.144",
3
+ "version": "0.1.146",
4
4
  "description": "The Unoverse front door — create a Studio project, a universe, or a client app, and launch Studio.",
5
5
  "license": "SEE LICENSE IN README.md",
6
6
  "type": "module",