unoverse 0.1.113 → 0.1.115

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.
@@ -169,6 +169,12 @@ services:
169
169
  # containers connect to the container IP); the loopback-only port mappings above and
170
170
  # the Docker network are the boundary here.
171
171
  - UNOVERSE_INTERNAL_BIND=0.0.0.0
172
+ # THE FLAG TRAVELS WITH THE ISSUER. .env could say AUTH_ENABLED=false and no
173
+ # container ever saw it: compose forwarded the issuer and audience and not the flag,
174
+ # so the server defaulted to enabled — correctly — and refused to boot on a local
175
+ # universe with no OIDC. The developer's own setting was invisible to the thing it
176
+ # configures.
177
+ - AUTH_ENABLED=${AUTH_ENABLED:-}
172
178
  - AUTH_ISSUER=${AUTH_ISSUER:-}
173
179
  - AUTH_AUDIENCE=${AUTH_AUDIENCE:-}
174
180
  # WHERE THE MARKETPLACE IS. The catalogue this universe can install from, served as
@@ -277,6 +283,12 @@ services:
277
283
  - REDIS_PASSWORD=${REDIS_PASSWORD:-}
278
284
  - REDIS_TLS=${REDIS_TLS:-}
279
285
  - REDIS_NAMESPACE=${REDIS_NAMESPACE:-}
286
+ # THE FLAG TRAVELS WITH THE ISSUER. .env could say AUTH_ENABLED=false and no
287
+ # container ever saw it: compose forwarded the issuer and audience and not the flag,
288
+ # so the server defaulted to enabled — correctly — and refused to boot on a local
289
+ # universe with no OIDC. The developer's own setting was invisible to the thing it
290
+ # configures.
291
+ - AUTH_ENABLED=${AUTH_ENABLED:-}
280
292
  - AUTH_ISSUER=${AUTH_ISSUER:-}
281
293
  - AUTH_AUDIENCE=${AUTH_AUDIENCE:-}
282
294
  - OPENAI_API_KEY=${OPENAI_API_KEY:-}
@@ -48,8 +48,11 @@ print_access_urls() {
48
48
  echo -e " ${DIM}Use the Unoverse MCP to build agents. Somewhere, Skynet is taking notes. 🤖${NC}"
49
49
  echo ""
50
50
  echo -e " ${CYAN}Canvas${NC} ${DIM}(build agents)${NC} ${UNDERLINE}http://localhost:3001${NC}"
51
- echo -e " ${CYAN}Studio${NC} ${DIM}(build assets)${NC} ${UNDERLINE}http://localhost:3002${NC}"
52
51
  echo -e " ${CYAN}API${NC} ${DIM}(REST + MCP)${NC} ${UNDERLINE}http://localhost:4105${NC}"
52
+ # NOT A URL, BECAUSE NOTHING IS LISTENING THERE. Studio left the platform image and is
53
+ # launched from npm by `unoverse studio`, so printing http://localhost:3002 after `start`
54
+ # offered an address that could only refuse the connection.
55
+ echo -e " ${CYAN}Studio${NC} ${DIM}(build assets)${NC} ${DIM}unoverse studio${NC}"
53
56
  echo ""
54
57
  echo -e " ${DIM}▶ Next:${NC} open this repo in ${BOLD}Claude Code${NC} and ask it to build an agent"
55
58
  }
@@ -151,10 +151,19 @@ cmd_start() {
151
151
  local running=0
152
152
  local total=0
153
153
  i=0
154
+ # A RESTARTING CONTAINER IS NOT A RUNNING ONE. `--filter status=running` counts a container
155
+ # that is crash-looping, because between crashes it genuinely is running — so `start`
156
+ # announced "All 5 services running" while unoverse and memory were dying on boot every few
157
+ # seconds, and the developer went looking at their browser instead of the logs.
158
+ #
159
+ # Counting restarts as failures also means the loop keeps waiting instead of breaking early
160
+ # on a lie, which gives a slow-but-healthy boot the time it needs.
161
+ local restarting=0
154
162
  while [ $attempts -lt 15 ]; do
155
163
  running=$(docker compose -f "$ROOT/docker-compose.yml" ps --format "{{.Name}}" --filter "status=running" 2>/dev/null | wc -l | tr -d ' ')
164
+ restarting=$(docker compose -f "$ROOT/docker-compose.yml" ps -a --format "{{.Status}}" 2>/dev/null | grep -ci "restarting" | tr -d ' ')
156
165
  total=$(docker compose -f "$ROOT/docker-compose.yml" ps --format "{{.Name}}" 2>/dev/null | wc -l | tr -d ' ')
157
- if [ "$running" -eq "$total" ] && [ "$total" -gt 0 ]; then
166
+ if [ "$running" -eq "$total" ] && [ "$total" -gt 0 ] && [ "$restarting" -eq 0 ]; then
158
167
  break
159
168
  fi
160
169
  local c="${spin:i%${#spin}:1}"
@@ -165,6 +174,24 @@ cmd_start() {
165
174
  done
166
175
 
167
176
  echo ""
177
+ # NAME WHAT IS CRASHING, AND WHY. A restart loop is the one failure whose cause is always
178
+ # in the logs and never on screen, so print the last line of each one rather than leaving
179
+ # the developer to find `docker compose logs` themselves.
180
+ if [ "${restarting:-0}" -gt 0 ]; then
181
+ printf "\r ${RED}✗${NC} $restarting service(s) crashing on boot \n"
182
+ echo ""
183
+ docker compose -f "$ROOT/docker-compose.yml" ps -a --format "{{.Name}}\t{{.Status}}" 2>/dev/null \
184
+ | grep -i restarting | awk -F'\t' '{print $1}' | while read -r svc; do
185
+ local_reason=$(docker compose -f "$ROOT/docker-compose.yml" logs --tail=40 "${svc##*-}" 2>/dev/null \
186
+ | grep -iE "^.*(Error|error:)" | tail -1 | sed -E 's/^[^|]*\| *//')
187
+ echo -e " ${RED}•${NC} ${BOLD}$svc${NC}"
188
+ [ -n "$local_reason" ] && echo -e " ${DIM}${local_reason}${NC}"
189
+ done
190
+ echo ""
191
+ info "Full output: ${BOLD}unoverse logs <service>${NC}"
192
+ echo ""
193
+ return 1
194
+ fi
168
195
  if [ "$running" -eq "$total" ] && [ "$total" -gt 0 ]; then
169
196
  printf "\r ${GREEN}✓${NC} ${DIM}Health checks passed${NC} \n"
170
197
  echo ""
@@ -245,6 +272,13 @@ cmd_build() {
245
272
  # DEFINITION changes never need this — they synthesize from rx/ at boot; a plain
246
273
  # restart suffices. This exists for the PACKAGE-source case.
247
274
  build_component_nodes() {
275
+ # MONOREPO ONLY. packages/marketplace exists in the platform checkout and nowhere else, so
276
+ # in a universe this printed a heading, failed a `cd` into a directory that has never been
277
+ # there, and told the developer to "re-sync/update the starter" — advice that could not
278
+ # help, for a step that should not have run. A universe gets its components as rows, from
279
+ # the marketplace or a Studio publish; there is nothing local to build.
280
+ [ -d "$ROOT/packages/marketplace" ] || return 0
281
+
248
282
  banner "Component Nodes (definition-backed)"
249
283
 
250
284
  echo " Building the marketplace package locally (bundle-defs + tsc → dist)..."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unoverse",
3
- "version": "0.1.113",
3
+ "version": "0.1.115",
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",