Commit Graph
693 Commits
Author SHA1 Message Date
SirKentutandciregenz 936f33033a [pierre] fix: self-heal half-installed vite warm cache
An npm install killed mid-warm leaves node_modules/ populated but no .bin/, so _ensure_warm_cache (which only checked the dir exists) trusted the half-tree forever and every app symlinked to it died with `vite: command not found`. Gate the cache on .bin/vite existing, and harden the app's frontend/run.sh skip-install guard the same way.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
(cherry picked from commit 998e8605c6)
2026-06-22 02:47:17 -07:00
ciregenz 6d645e1781 [eric] outputs: tests for content-addressed version store 2026-06-22 02:41:18 -07:00
ciregenz be41094c80 [eric] outputs: version-history routes + mount + delete cleanup 2026-06-22 02:41:18 -07:00
ciregenz 8d1c3f2b8c [eric] outputs: content-addressed app version store (blobs + manifests) 2026-06-22 02:41:18 -07:00
ciregenz cce8f62ba2 [eric] free-trial: bounded re-check after 9router start so a lagging provider list can't shadow a sub 2026-06-22 00:33:30 -07:00
ciregenz 064361536a [eric] free-trial: arm waits for 9router so a backgrounded sub isn't shadowed to haiku 2026-06-22 00:09:17 -07:00
ciregenz 45e285916c [eric] merge eric/skills-settings into eric/app-publishing 2026-06-21 22:03:13 -07:00
ciregenz 1d7fadca77 [eric] tokens: pill shows new (uncached) tokens not cached re-reads; context bar keeps full size 2026-06-21 21:40:33 -07:00
ciregenz 2e2fff0869 [eric] settings: broadcast settings:changed on agent write so the UI reflects it instantly (no focus wait) 2026-06-20 03:22:03 -07:00
ciregenz ee5b5c2cea [eric] publish: split 379-line monolith into scan/build/cloud modules + memoize scan by source hash 2026-06-20 03:06:44 -07:00
ciregenz f611703886 [eric] outputs: remove two dead pass no-ops 2026-06-19 21:20:46 -07:00
ciregenz 6a8197c05b [eric] publish: never bundle secret-shaped files (.env, private keys) into a public app 2026-06-19 21:20:46 -07:00
ciregenz 7a9eb214e9 [eric] publish: neutralize vite-plugin-terminal during build so older workspaces build clean 2026-06-19 20:19:44 -07:00
ciregenz c722641fec [eric] settings: PATCH diff-merge save closes renderer-vs-agent lost update; per-loop write lock 2026-06-19 18:38:02 -07:00
ciregenz 5043f5ad99 [eric] skills: prove skill injection is provider-agnostic by construction (no provider arg, universal Read tool) 2026-06-19 18:14:58 -07:00
ciregenz 7cdc7690fe [eric] settings-agent/skills: prove live stdio guard on a real session, install->usable pipeline, and select->send threading 2026-06-19 18:08:52 -07:00
ciregenz 1cf843d965 [eric] settings-agent: shared secret-scanner (backend/common) + fail-safe value-shape redaction + second-wall credential restore + unified settings write lock 2026-06-19 18:04:43 -07:00
ciregenz ef1c7a28e2 [eric] publish: don't embed the install token in preview app JS; stub OUTPUT_* (run only when published) 2026-06-19 17:47:25 -07:00
ciregenz ab30c08733 [eric] publish: switch hosting apex to openswarm.host (bought) from openswarm.dev 2026-06-19 16:45:30 -07:00
ciregenz abcd334b34 [eric] publish: OUTPUT_COMPUTE/OUTPUT_LLM runtime in preview + /outputs/llm endpoint + skill doc 2026-06-19 04:57:06 -07:00
ciregenz 21a0694914 [eric] publish: send output_id + override to cloud so republish reuses the slug 2026-06-19 04:15:02 -07:00
ciregenz 6e3ccd1824 [eric] skills: harden skills.sh resolver, optional GitHub token (60->5000/hr), real default-branch fallback when main/master miss, deterministic skill-path tie-break 2026-06-19 04:08:53 -07:00
ciregenz 5902352ef9 [eric] skills: unify storage so every user/imported skill is a folder (one write path); flat stays read-compat and is superseded on write 2026-06-19 04:07:09 -07:00
ciregenz f866a3717c [eric] skills/settings-agent: scan community SKILL.md+files for secrets & reframe install risk (agent-instructions, not just scripts); extract apply_settings_update so the tool stops calling the PUT route as a fn 2026-06-19 04:03:58 -07:00
ciregenz 72433fced0 [eric] skills: atomic skill-index write + corrupt-read resilience (preserve aside, never brick), mirroring the settings store 2026-06-19 03:37:23 -07:00
ciregenz 371b72ddd1 [eric] settings-agent/skills: fix concurrent-write lost update (serialize), registry install slug clobber (dedup), dialog stale-response races, partial-write + skills.sh boundary hardening 2026-06-19 03:32:16 -07:00
ciregenz 722a9e896a [eric] publish: desktop build/scan/bundle + publish/preflight/unpublish endpoints 2026-06-19 03:28:27 -07:00
ciregenz d714dfaee1 [eric] skills: folder skills round-trip through .swarm/zip import (supporting files preserved via the entity files() channel, not flattened) 2026-06-19 03:17:44 -07:00
ciregenz a0af8476c2 [eric] settings-agent: thread selected_setting_ids -> focused context block so users can point the agent at specific Settings rows (targeting aid, not a gate) 2026-06-19 03:01:05 -07:00
ciregenz 3c950b01f8 [eric] skills: skills.sh wild-registry source (live search) + GitHub-trees install resolver w/ script disclosure, inert install, path-traversal guard 2026-06-19 02:57:58 -07:00
ciregenz d908209a85 [eric] skills: multi-file folder skills (SKILL.md + supporting files) w/ legacy flat compat; inject folder path for on-demand provider-agnostic reads 2026-06-19 02:50:33 -07:00
ciregenz 1a4cccf3cd [eric] settings-agent: always-on SettingsRead/SettingsWrite MCP server + guarded /api/settings-meta endpoint, wired into every run 2026-06-19 02:47:38 -07:00
ciregenz f094de5fbd [eric] settings-agent: typed powering-credential resolver + schema-derived redactor + exhaustive no-suicide invariant test 2026-06-19 02:42:56 -07:00
ciregenz b7450f885a [eric] merge winv2: win startup speedups + skill-registry seed, release 1.3.87 2026-06-19 00:57:57 -07:00
ciregenz 4ae97e5de0 [eric] throttle: emit rate_limited on exhausted backoff + muted auto-clearing pill (no error card)
(cherry picked from commit 03a9233b860683ae0f9d15b9e9efda32763c7d41)
2026-06-19 00:25:55 -07:00
ciregenz f0cb676afb [eric] permissions: read-only MCP actions auto-allow by default; writes still ask
(cherry picked from commit 03f3ce05be2c555990e7e6486859c48f0cd3c94c)
2026-06-19 00:25:54 -07:00
ciregenz 40c863e9cf [eric] integrations: add GitHub MCP (remote http server + one-click OAuth)
(cherry picked from commit 901e3bf98244d3e599db5f3f05f4dc2ce943888e)
2026-06-19 00:25:54 -07:00
ciregenz db6c5c4d9d [eric] agents: idempotent id-keyed message commit so a stop racing the SDK envelope can't append a duplicate reply 2026-06-18 18:44:25 -07:00
ciregenz c1503eae97 [eric] agents: make Stop instant: commit the partial + free the task before the slow SDK teardown, and ignore a superseded task's late teardown 2026-06-18 18:24:54 -07:00
ciregenz a716b43df1 [eric] agents: after a mid-stream stop, rebuild history from session.messages so resume/follow-ups see the partial reply 2026-06-18 04:36:23 -07:00
ciregenz 9a622c48e2 [eric] agents: keep the partial reply when a stream is stopped mid-flight 2026-06-18 04:00:47 -07:00
ciregenz 8b63e3d7c6 [eric] settings: add reset-to-defaults endpoint (preferences to defaults, keep connections + sign-in) 2026-06-17 23:31:26 -07:00
Eric ec0f9600bc [eric] backend: remove cold-start diagnostics, keep the fix + slim lifespan timer
- the is_running() fast-fail fix (v1.3.91) verified cold backend-http-ready
  23.5s -> 3.86s and warm 5.0s -> 3.32s on the signed build, no 9Router regression
- strip the [perf] bg entry logs from mcp/skill/settings/service/9router now that
  the stall is diagnosed; keep Apps.py per-lifespan timing but only print a
  lifespan over 50ms plus the total (cheap regression tripwire)
- document the root cause + fix + before/after in docs/perf/winv2/README.md
2026-06-17 19:28:23 -07:00
Eric 24df3e8fac [eric] backend: fast-fail is_running() to kill the ~18s cold-start event-loop freeze
- faulthandler on the signed cold build caught the asyncio loop frozen in
  socket.create_connection inside is_running() (process.py): a synchronous
  httpx.get to "localhost:20128" called ~5x on the boot path before 9Router is up
- on Windows a dead-port connect to "localhost" stalls ~7s each (tries ::1 first,
  loopback refusal is slow), freezing the loop ~18s so uvicorn could not answer
  the health probe -> cold backend-http-ready was ~23s
- fix: probe 127.0.0.1 with a 0.3s TCP timeout first (measured 306ms vs ~7s), only
  HTTP-confirm when the port is open; 9Router binds 0.0.0.0 so reachability is
  unchanged. drop the faulthandler diagnostic from main.py
2026-06-17 19:06:10 -07:00
Eric 035ef26c0f [eric] backend: faulthandler stack-dump + settings boot log to catch the cold loop stall
- v1.3.89 cold proved two stacked stalls: ~5s in is_running() (sync httpx) and a
  bigger ~13s BEFORE any background task runs, a silent event-loop freeze
- add faulthandler.dump_traceback_later(7s, repeat) to a temp file so a dump lands
  inside the 13s window and names the exact synchronous call the loop is stuck in
- add an entry log to settings._boot_router_then_sync (first startup bg task)
- diagnostic only; reverted once the stall is pinned
2026-06-17 18:40:01 -07:00
ciregenz c577382943 [eric] oauth: complete Claude callback server-to-server, not a cross-port browser 302 (fixes browser-dependent 'Connecting' hang from #84) 2026-06-17 18:24:33 -07:00
Eric 90aa66f6ce [eric] backend: timestamp each startup background task to pin the cold-start loop stall
- instrumented cold v1.3.88 proved the lifespans are 141ms even cold; the ~18s
  cold gap is a backgrounded create_task blocking the event loop AFTER lifespan
  startup but BEFORE uvicorn reports ready (what the health probe waits on)
- add [perf] entry/segment logs to the post-startup background tasks: mcp refresh,
  skill refresh, 9router ensure (+ prelude bisection), and svc._post/_post_or_spool
- logging only, no behavior change; next cold log names the exact blocking call
2026-06-17 18:11:46 -07:00
ciregenz 6b8750efaf [eric] 9router: rotate the unbounded request-details log + cap node heap, fixes the idle OOM crash 2026-06-17 16:20:59 -07:00
Eric b6652b6722 [eric] backend: add per-lifespan boot timing to pin cold-start stalls
- debug(sub_app.name) is a no-op in packaged builds, so the packaged backend.log
  had zero per-SubApp markers and a cold stall could only be guessed at
- wrap each enter_async_context with time.perf_counter + a flushed [perf] print,
  plus a lifespans-total line, so a cold launch names the exact slow lifespan
- logging only, no functional change; loop logic validated warm
2026-06-17 03:22:10 -07:00
ciregenz 18be72cf9c [eric] phase3b: 'fresh runs in ~Xh' on the spent nudge + one-tap continue-on-your-model after exhaustion 2026-06-17 01:14:40 -07:00