Skip to content

chore: public-release prep — observability stack + UI re-skin + customer-name scrub#11

Merged
shreyas-lyzr merged 17 commits into
mainfrom
chore/oss-cleanup-public
May 31, 2026
Merged

chore: public-release prep — observability stack + UI re-skin + customer-name scrub#11
shreyas-lyzr merged 17 commits into
mainfrom
chore/oss-cleanup-public

Conversation

@shreyas-lyzr
Copy link
Copy Markdown
Contributor

Summary

Bundle everything needed before flipping this repo public:

  1. Phase A — observability stack (cherry-pick onto PR Library-mode telemetry: Mongo-backed agent registry + SDK hooks + Bedrock + dashboard + matrix tests #9 base)
  2. Phase B — UI re-skin on shadcn primitives (cookie-session login, AgentCard, workspace layout)
  3. chore (this commit) — customer-name scrub + .gitignore hardening

Goal: a clean tree where any visitor sees a vendor-neutral agent framework, not customer engagement debris.

What changed in the cleanup commit (48a409b)

Removed (tracked):

  • PLAN.md (1060-line internal "rev 4" plan; not for a public audience)

Removed (working-tree only — already gitignored):

  • text, test.html, private.md, examples/lyzr-proxy-bwrap.ts, .DS_Store

Customer-name scrub across packages/ + examples/ + scripts/ + agentos/:

  • "Lyzr SRS" / "Lyzr Trace" / "Lyzr Studio" / "Lyzr ADK" / "Lyzr Compute" in comments → vendor-neutral phrasing
  • "Nordstrom" in substrate-matrix.test.ts → removed
  • `clawagent.sh` URLs in vite.config.ts and App.tsx → generic "AgentOS" + 127.0.0.1 dev default
  • `github.com/shreyas-lyzr/` source URLs → `github.com/open-gitagent/example-` placeholders
  • hardcoded `agent-dev.test.studio.lyzr.ai` default URL in proxy CLI + computeragent-server proxy bootstrap → removed (now requires explicit `UPSTREAM_BASE`)

Vendor-neutral env renames (per discussed approach):

Before After
LYZR_PROXY_ENABLED PROXY_ENABLED
LYZR_PROXY_PORT PROXY_PORT
LYZR_UPSTREAM_BASE UPSTREAM_BASE
LYZR_UPSTREAM_TOKEN UPSTREAM_TOKEN
LYZR_UPSTREAM_PATH UPSTREAM_PATH
LYZR_UPSTREAM_MODEL UPSTREAM_MODEL

JS-local var names (`lyzrBase`/`lyzrToken`/`lyzrModel`, `lyzrProxyHandle`) renamed in step. `"lyzr-via-proxy"` placeholder string → `"via-proxy"`.

.gitignore tightening:
Reorganized + added: `PLAN.md`, `.DS_Store`, `.env.` with `.env.example` exception, `scratch/`, `tmp/`, `*.tmp`.

Verification

  • ✅ `pnpm -r build` clean across all 22 packages
  • ✅ `grep -rniE 'lyzr|nordstrom|clawagent|shreyas-lyzr'` returns 0 hits in source files (excluding gitignored `private.md` / `PLAN.md` / `docs.md`, none of which make the public surface)

Test plan

  • Smoke: `pnpm install && pnpm -r build && pnpm -r typecheck`
  • `pnpm --filter agentos build` (SPA still builds)
  • Live: bring up the dashboard locally, log in, register a test agent, run one chat turn end-to-end
  • Eyeball the agent rail sidebar (the bottom-of-rail label is now "AgentOS" instead of "agentos.clawagent.sh")
  • Review the PROXY_* env renames don't break any deployment scripts you have outside this repo (the deploy/ TF lives in the sister enterprise repo and uses the same env names — those will need a matching update if you grep for LYZR_*)

Aftermath

After merging:

  1. Flip the repo to public (Settings → General → Danger Zone → Change visibility)
  2. Optional: revoke the `shreyas-lyzr` reference in any external integrations (docs sites, README badges)

The user-facing question: when ComputerAgent is just npm-installed into a
customer's existing worker (Temporal pod, CLI batch, serverless fn), how do
we make every run visible in the AgentOS dashboard with no extra
orchestration? Answer: an AgentTelemetry interface the SDK fires on
construct + each chat + dispose, plus a first-class Mongo implementation.

SDK (@computeragent/sdk):
- New AgentTelemetry interface (sdk/src/telemetry.ts): optional onAgentConstructed,
  onChatStart, onChatEnd, onClose hooks. Pure data contract — no Mongo.
- ComputerAgent constructor accepts opts.telemetry, fires onAgentConstructed.
- chat() fires onChatStart synchronously and attaches a .then to the handle
  for onChatEnd (success + error paths). Telemetry .then runs alongside the
  caller's await — ChatHandle.then() is memoized via result().
- dispose() fires onClose. All calls fire-and-forget (safeFireTelemetry):
  telemetry exceptions never propagate to the agent run.
- Re-exports AgentTelemetry + Info types from index.ts.

New package @computeragent/agent-registry-mongo:
- AgentRegistry — Mongo wrapper for agent_registry (one doc per agent,
  idempotent upsert by name). register/unregister/get/list/close.
- AgentLogStore — promoted from examples/agent-log-store.ts; now keyed by
  agentName not bot, with usage/durationMs/error fields. append/list/count.
- MongoTelemetry — the headline class. Implements AgentTelemetry by writing
  to both collections. Single constructor takes {url, database, agent: {
  name, label?, harness?, source?, model?, registeredBy? }}. Optional shared
  MongoClient + onError callback.
- README with the additive customer flow.

Verified: pnpm sdk build clean, pnpm agent-registry-mongo build clean,
all 45 existing SDK tests still pass.

This is the foundation that makes "swap computer agent as a package on
their K8s and we can still track it" actually true.
… + seed

Completes the dashboard side of "library-mode tracking": the agents
collection in Mongo (written by the SDK's MongoTelemetry hook) is read by
the dashboard and unioned with the server's hardcoded in-memory list.

examples/agentos-api.ts:
- New `agent_registry` collection accessor.
- GET /agentos/api/agents now unions in-memory + registry rows; in-memory
  wins on name collision so server-hosted agents (Slack bots, framework-
  translator, etc) keep authoritative wiring. Each row carries `origin`
  ("in-memory" | "registry"), `registeredBy`, and `lastSeen` so the
  dashboard can label library-mode entries.
- POST /agentos/api/agents/register — upsert by name (idempotent).
- PATCH /agentos/api/agents/:name — update label/harness/source/model
  (rejects names that exist in the in-memory list).
- DELETE /agentos/api/agents/:name — remove from registry only.

agentos/src/components/RegisterAgentForm.tsx:
- Inline "+ Register agent" widget in the agent rail. Name + source are
  required; harness defaults to claude-agent-sdk. POSTs /agents/register
  and refreshes the agent list on success.

agentos/src/App.tsx + api.ts:
- New `origin`/`registeredBy`/`lastSeen` fields on the Agent type and
  registerAgent/unregisterAgent/patchAgent methods on the api client.
- Renders a small "lib" badge next to registry-origin agents.
- Mounts <RegisterAgentForm> below the agent list.

scripts/seed-agent-registry.ts:
- One-shot, idempotent. Reads the hardcoded SEED_AGENTS list and upserts
  each into agent_registry via @computeragent/agent-registry-mongo.
- Run once when migrating an existing deployment; safe to re-run.

Verified: pnpm sdk + agent-registry-mongo + recursive typecheck all clean,
existing SDK tests still pass, agentos SPA Vite build clean (35 modules,
180 kB / 56 kB gzip).
… identity (2b)

Phase 2a — packages/engine-claude-agent-sdk/src/engine.ts:
inheritEssentialHostEnv() now also propagates the AWS Bedrock + IRSA chain
to the spawned harness subprocess: CLAUDE_CODE_USE_BEDROCK, AWS_REGION,
AWS_DEFAULT_REGION, AWS_BEDROCK_MODEL_ID, AWS_ROLE_ARN,
AWS_WEB_IDENTITY_TOKEN_FILE, AWS_PROFILE, AWS_SHARED_CREDENTIALS_FILE,
AWS_CONFIG_FILE. Function is now exported for testability. 3 new tests
(engine.test.ts) pin the allowlist + verify no empty-string leaks; suite
goes from 7 → 10 tests, all green.

Phase 2b — git URL as canonical agent identity in the dashboard:

examples/agentos-api.ts
- Import IdentitySource from @computeragent/protocol; new normalizeSource()
  narrows the registry's `source: unknown` into either {source: IdentitySource,
  sourceUrl: string} (clickable repo URL) or {source: string, sourceUrl: string}
  (legacy in-memory agents).
- GET /agentos/api/agents now returns both fields per agent.
- NEW GET /agentos/api/agents/by-source?url= — looks up agents (in-memory +
  registry) sharing a source URL; used to detect "same git repo, two workers
  registered separately".

agentos/src/api.ts
- Widen Agent.source to IdentitySource | string + add sourceUrl: string | null.
- New displaySource() helper returns {kind, primary, secondary, href?} —
  parses github/gitlab/bitbucket URLs into owner/repo, falls back gracefully.

agentos/src/components/SourceBadge.tsx (NEW)
- Renders a kind-glyph (github octocat for git, folder for local, ⟪⟫ for
  inline) + owner/repo headline + host subtitle. For git sources, wraps in
  <a href> opening the repo in a new tab. e.stopPropagation so clicking the
  link doesn't trigger the parent agent-row click.

agentos/src/App.tsx
- Replace the 11px gray source line with <SourceBadge agent={a} />.
- agentNameFromSource() now receives sourceUrl (always a string) instead of
  the widened source field.

Verified: pnpm -r typecheck clean; engine-claude-agent-sdk 10 tests pass;
agentos Vite build clean (36 modules, 183 kB / 58 kB gzip; +1 module +3 kB
for SourceBadge).
…e matrix

Two new SDK test files + a shared GAP fixture, ~500 LOC.

packages/sdk/src/telemetry-hook.test.ts (7 tests, runs offline in CI):
  Verifies AgentTelemetry lifecycle hooks fire correctly using a recording
  mock telemetry impl + MockEngine + in-process Hono harness:
   - onAgentConstructed fires with source/harness/model.
   - onChatStart → onChatEnd context threading on success path.
   - onChatEnd ok=false + error on failure path.
   - onClose fires on dispose().
   - A throwing telemetry (sync + async) does NOT break the chat
     (safeFireTelemetry regression guard).
   - Agent without telemetry option still works (no-op branch coverage).

packages/sdk/src/substrate-matrix.test.ts (10 tests, 8 env-gated):
  claude-agent-sdk × {Local, Bwrap, E2B} × {inline, local, git} matrix that
  actually calls Anthropic. Whole suite is ANTHROPIC_API_KEY-gated via
  describe.skipIf so CI offline is a no-op. Per-row guards:
   - Bwrap rows: skipIf(!Linux || !bwrap-on-PATH).
   - E2B rows:   skipIf(!E2B_API_KEY).
   - Git rows:   skipIf(!SDK_MATRIX_GIT_FIXTURE_URL).
  Each row boots the substrate, makes a real claude-agent-sdk chat (with a
  terse SOUL so the spend stays ~30 tokens / row), asserts non-zero output
  tokens, and disposes. Two fixture-shape tests run always to catch
  test-fixtures/ deletions.

packages/sdk/test-fixtures/minimal-agent/{agent.yaml, SOUL.md}:
  Tiny GAP repo reused by all "local source" matrix rows (and matched by
  the inline source variant for source-type parity).

packages/sdk/package.json:
  Add runtime-local / runtime-bwrap / runtime-e2b / engine-claude-agent-sdk
  / identity-gitagentprotocol to devDependencies so the matrix can import
  them dynamically (still workspace deps; never pulled by users).

Verified: pnpm sdk typecheck clean; full SDK test suite 7 files / 62 tests
(54 passed + 8 matrix rows auto-skipped offline). pnpm -r typecheck clean.
Adds the test coverage that was missing from Phases 1 / 2b / 2c shipping
without it. Total: 67 new tests across 4 files, 1163 LOC.

- packages/agent-registry-mongo/src/registry.test.ts (9 tests):
  upsert shape, idempotent registeredAt, list ordering, get null,
  unregister idempotency, close idempotency, shared MongoClient.

- packages/agent-registry-mongo/src/audit-log.test.ts (8 tests):
  append shape, QUERY_MAX/REPLY_MAX truncation with … suffix,
  newest-first + limit clamping [1, 500], filter combos (source/ok/before),
  count() vs list() equivalence.

- packages/agent-registry-mongo/src/telemetry.test.ts (12 tests):
  onAgentConstructed upserts via SDK info; falls back to ctor-supplied
  agent fields; onChatStart returns ctx; onChatEnd appends success +
  failure rows with usage breakouts; durationMs derives from ctx when
  SDK omits it; configurable source tag; onError fires on Mongo failure
  without throwing; shared client lifecycle.

- examples/agentos-api.test.ts (18 tests):
  drives createAgentOSApp via app.fetch(Request). POST /register
  (400 on missing name, upsert shape, idempotent registeredAt),
  PATCH (409 on in-memory, 404 on unknown, field update), DELETE
  (409/404/200), GET /by-source (400/in-memory match/registry match/dual
  match/empty 200), GET /agents (union, origin tagging, in-memory wins).

- agentos/src/api.test.ts (20 tests):
  pure-function tests for displaySource() — null/undefined sentinels,
  local + inline structured, git URL parsing (https, ssh git@, with ref,
  ref URL-encoded), recognized hosts (github/gitlab/bitbucket),
  scheme-less + bare owner/repo, legacy string source, fallbacks.

Live-Mongo paths use the same `describeMongo = url ? describe : describe.skip`
gate the session-store-mongo tests already use; unique DB per run keeps
parallel runs isolated. Offline (no MONGO_URL): 4 always-on tests pass,
57 env-gated skip cleanly. Workspace-wide pnpm -r test stays green.

Wires vitest into examples/ and agentos/ (test script + ^2.0.0 devDep) so
the suite is invokable per-package.
Phase 2c (commit 2545e9e) added @computeragent/runtime-bwrap (+ runtime-local,
runtime-e2b, engine-claude-agent-sdk, identity-gitagentprotocol) to sdk's
devDependencies so the substrate-matrix tests could exercise them. But
runtime-bwrap already depends on sdk → cycle.

pnpm tolerates the cycle locally with a warning, ordering the builds in a way
that happens to work. CI parallelizes the cyclic packages and both fail with
TS2307 (can't resolve types of the not-yet-built sibling).

The matrix tests already use dynamic `await import(...)` inside makeSubstrate,
so the static devDeps were never load-bearing. The .test.ts file is excluded
from sdk's tsconfig (build + typecheck) — runtime resolution at test time
goes through workspace hoisting. Drop the cycle-creating devDeps.

Verified: pnpm -r build, pnpm -r typecheck, pnpm -r test all green; cyclic
workspace dependency warning gone; 349 passing / 57 skipped offline.
…bump to 0.2.1

The npm scope @computeragent/* is taken by another org (403). shreyaskapale
owns @open-gitagent/* (matches the GitHub org). Rename the 5 publishable
packages and update all 280 import sites across the workspace.

Renamed (now published at 0.2.1 on npm):
- @open-gitagent/protocol
- @open-gitagent/sdk
- @open-gitagent/session-store-mongo
- @open-gitagent/runtime-local
- @open-gitagent/agent-registry-mongo

Plus the umbrella `computeragent@0.2.1` (unscoped) which is now installable
end-to-end: npm install computeragent gives you ComputerAgent + LocalSubstrate
+ all transitive workspace deps.

Workspace-only packages (harness-server, engines, identity, runtime-bwrap/e2b/vzvm,
cli, testing, llm-proxy-openai, state-store-s3, task-store-mongo, session-store-sqlite,
examples) stay as @computeragent/* — they're consumed via workspace:* and
aren't being published this round.

Verified: pnpm install + pnpm -r build + pnpm -r typecheck + pnpm -r test all
green (349 passing / 57 skipped offline). Phase 0 spike re-run against the
published packages: 10/10 concurrent activities pass on a kind cluster.
Previously /agents/:name/chat-sandbox and /agents/:name/run looked up the
target only in the in-memory list (opts.agents). Agents registered via the
dashboard or via MongoTelemetry returned 404 UNKNOWN_AGENT — even though
the dashboard listed them and showed their logs.

Adds a resolveAgent() helper that tries in-memory first, then reads from
agent_registry. Registry agents have no envs/gitToken persisted; the
server's own env (forwarded by inheritEssentialHostEnv) supplies
ANTHROPIC_API_KEY etc, so the harness boots normally.

Smoke verified against the deployed enterprise.clawagent.sh: registering
a new agent + clicking chat now returns HTTP 200 with a valid sandboxId.
…rk end-to-end

E2E-tested against prod (enterprise.clawagent.sh):
  16/18 checks pass; 2 "failures" are SSE-parser bugs in the test harness, not
  product bugs (transcript-has-Rohan PASSED on the same run that flagged
  multi-turn-memory).

Backend (examples/agentos-api.ts):
- sandboxCapable now depends on harness only, not origin. Registry agents
  with harness=claude-agent-sdk/gitagent now boot warm sandboxes instead of
  falling through to one-shot /run.
- resolveAgent() helper makes chat-sandbox + /run fall back to the Mongo
  agent_registry when the name isn't in the in-memory list.
- chat_pins collection: maps agent → current dashboard sessionId. chat-sandbox
  reuses the pin on subsequent boots so conversation memory persists across
  browser refreshes + sandbox restarts. DELETE /agents/:name/chat-pin clears
  it (used by "New chat").
- slack_threads now also gets a row written for every web chat-sandbox boot
  with channel="web", so /sessions and /agents sessionCount surface web chats
  uniformly with Slack chats.
- /sessions/:id handles two harness storage shapes: gitagent (sessions._id =
  sessionId) and claude-agent-sdk (sessions._id = UUID, sessionId embedded in
  projectKey via $regex).
- Entry extraction normalizes both schemas: gitagent {text} and
  claude-agent-sdk {message:{role, content:string|[{type:"text",text}]}}.
  Filters out queue-operation meta events.

Frontend (agentos/src):
- App.tsx: sidebar w-72 → w-80 for more name room; TypeBadge gets
  whitespace-nowrap + max-w-[7.5rem] + shrink-0 so harness chips don't wrap
  to two lines; name span gets min-w-0 flex-1 for proper truncation.
- SourceBadge: stops wrapping the whole agent card in <a href>. Source URL
  is now plain text inside the card (which is itself a <button>); a tiny
  external-link chip renders to the right with stopPropagation, so clicking
  the card opens chat instead of navigating to GitHub.
- ChatTab: CONTINUE_PROMPT softened to "Please continue." (was a build-flow
  paragraph that was wrong for casual chat agents). Continue-button copy
  generalized.
- WorkspaceTab: New-chat button now DELETEs the server-side chat pin so the
  next boot mints a fresh session.
Brings the @computeragent/observability + observability-api packages
from feat/agentos-observability-stack into our feat/agent-telemetry-mongo
work. Backend-only — UI shadcn migration deferred to Phase B.

Added packages:
- @computeragent/observability — OtelAuditSink emits gen_ai.* spans + metrics
  + logs via OTLP/HTTP. Includes content-capture, content-accumulator,
  span-map, usage-aggregator, claude-agent-sdk event mapper. 55 tests pass.
- @computeragent/observability-api — Express read API on :7801 over
  ClickHouse. Routes /v1/health, /traces[/:id][/search], /dashboard,
  /fields[/-values]. Auto-bootstraps materialized views.

Protocol additions:
- ca_turn_started, ca_permission_decision events for OTel span boundaries.
- policy.ts — security/runtime/safety policy schemas (SRS).

Harness-server changes (from obs branch):
- AuditSink hook fires every HarnessEvent (synchronously, swallows errors).
- Permission/session hooks for OTel span boundaries.
- srs-policy-decider for the new policy stack.

examples/computeragent-server.ts:
- Wires OtelAuditSink into the harness AuditSink slot. Sink errors are
  caught + dropped; observability never impacts agent runs.

packages/cli/src/output.ts:
- Added cases for ca_turn_started + ca_permission_decision so the switch
  is exhaustive again.

Scope rename reconciled: the observability branch was written against
the old @computeragent/* names (still used for unpublished workspace
packages). All references to the 5 renamed packages (protocol, sdk,
runtime-local, session-store-mongo, agent-registry-mongo) updated to
@open-gitagent/* across observability sources, observability-api,
protocol, harness-server, examples/computeragent-server.ts.

Verification:
- pnpm install: 75 new packages added (OTel exporters, ClickHouse client,
  Express, cors, semantic-conventions, etc.)
- pnpm -r build: clean
- pnpm -r typecheck: clean
- pnpm -r test: 349 passing, 57 env-gated skipped, 0 fail
  (incl. 55 brand-new observability tests + 29 agent-registry-mongo
   + 145 harness-server + 54 sdk all green — no regressions)
Brings the observability branch's shadcn/ui migration into our PR #9 branch.
The agentos SPA now uses Radix + shadcn primitives + lucide-react + recharts.

Cherry-picked from feat/agentos-observability-stack:
- agentos/{package.json,pnpm-lock,tsconfig.json,vite.config.ts,tailwind.config,postcss.config,src/index.css,src/main.tsx}
- agentos/src/lib/cn.ts
- agentos/src/components/ui/* — 22 shadcn primitives (Button, Card, Badge, Dialog, Tabs, ScrollArea, etc.)
- agentos/src/components/composite/* — page chrome (PageHeader, KpiCard, FilterBar, DataTable, StatusDot, EmptyState)
- agentos/src/components/observability/* — TraceList, TraceDetail, QueryBuilder, Dashboard, ObservabilityTab, DateRangePicker
- agentos/src/components/{PolicyTab,PoliciesPage,HomePage,ChatTab,WorkspaceTab,SchedulesTab,LogsTab}.tsx — shadcn rewrites
- agentos/src/{api.ts, obs-api.ts, obs-fields.ts} — Express obs-api client + field metadata

Merged from our PR #9 (re-applied):
- agentos/src/api.ts: re-added IdentitySource type, sourceUrl field on Agent,
  displaySource() helper, RegisterAgentInput + registerAgent/unregisterAgent/patchAgent
  methods. Kept all of their policy + obs methods.
- agentos/src/App.tsx: agentNameFromSource now uses sourceUrl (our schema),
  agent rail row shows sourceUrl instead of raw source (which is now
  IdentitySource | string and would crash if rendered directly).
- agentos/src/components/{SourceBadge,RegisterAgentForm}.tsx kept from our branch.
- agentos/src/api.test.ts kept from our branch.

Build status:
- pnpm --filter agentos build: clean (2535 modules, 860KB JS / 263KB gz)
- pnpm -r test: passes (sdk has 1 known-flaky session-resume race, passes
  on retry)

Remaining Phase B polish (not blocking):
- Re-skin SourceBadge/RegisterAgentForm/AgentCard on shadcn Card/Badge/Dialog primitives
- Re-add the grouped Hosted/Library rail sections
- Re-apply our CONTINUE_PROMPT = "Please continue." (currently has obs branch's wordy version)
- Re-apply WorkspaceTab.newChat → DELETE /agentos/api/agents/:name/chat-pin
…_auth

Replaces the browser-native basic_auth OS prompt with a polished in-app
login page. Backend gets a 7-day HMAC-signed httpOnly session cookie;
machine API consumers (curl) keep working via Basic header fallback.

Backend (examples/agentos-api.ts):
- POST /agentos/api/login — validates {user, pass} against API_AUTH_USER/
  API_AUTH_PASS env vars, sets `agentos_session` cookie with HMAC sig
  (secret from AGENTOS_SESSION_SECRET env, fallback to per-process random).
- POST /agentos/api/logout — clears the cookie.
- GET  /agentos/api/me — returns {user, source: "cookie"|"basic"} or 401.
- requireAuth Hono middleware applied to all /agentos/api/* except the
  three above. Accepts cookie OR genuine Basic header (constant-time
  compare on both). Sets c.var.user on success.

Frontend (agentos/src):
- components/LoginPage.tsx — shadcn Card + Input + Button + Label form.
  Subtle ambient glow, branded header, helpful error states.
- components/AuthGate.tsx — wraps App, calls /api/me on mount, shows
  LoginPage if 401, App if authenticated. Spinner during the check.
- main.tsx — wraps <App /> in <AuthGate>.

Live deployment (enterprise.clawagent.sh):
- Patched examples/computeragent-server.ts on prod to delegate auth on
  /agentos/api/* to the sub-app's own requireAuth (so /agentos/api/login
  and /api/me work without the harness's basic_auth gate).
- Patched /etc/caddy/Caddyfile to remove the vhost-level basic_auth and
  the header_up Authorization injection on /api/*. Caddy now serves the
  SPA + proxies /api/* unauthenticated; the backend self-authenticates.

E2E verified live (10/10 checks pass):
  - SPA loads with no WWW-Authenticate header (OS prompt gone)
  - /api/me unauthenticated → 401, drives the LoginPage
  - /api/agents unauthenticated → 401 (no leak)
  - Bad creds → 401 with INVALID_CREDENTIALS code
  - Good creds → 200 + Set-Cookie agentos_session=...; HttpOnly
  - /api/agents with cookie → 200, full agent list
  - /api/me with cookie → 200, source: "cookie"
  - Logout clears cookie, /api/me → 401
  - Back-compat: curl -u clawagent:... still works (source: "basic")

Rollbacks staged on the EC2 box:
  /home/ubuntu/agentos-api.ts.bak-* — pre-auth backend
  /home/ubuntu/computeragent-server.ts.bak-* — pre-whitelist server
  /etc/caddy/Caddyfile.bak-prelogin-* — pre-edit Caddy config
  /var/www/enterprise.bak-prelogin-* — pre-login SPA
The Policies tab in the obs-branch UI calls /api/policies + /opa-policies
+ /agents/:name/policy. In the upstream design these proxy to an external
SRS (Security/Runtime/Safety) service; we don't run SRS in this
deployment so the UI was showing "/policies → 404".

Add minimal stubs so the UI gets empty list responses + can render its
clean EmptyState components:

  GET    /policies                  → {policies: []}      200
  GET    /policies/:id              → {error: NOT_FOUND}  404
  POST   /policies                  → {error: SRS_NOT_CONFIGURED} 503
  PUT    /policies/:id              → 503
  DELETE /policies/:id              → 503
  GET    /agents/:name/policy       → {binding: null}     200
  PUT    /agents/:name/policy       → {binding: null}     200
  GET    /opa-policies              → {policies: []}      200
  GET    /opa-policies/:id          → 404
  POST/PUT/DELETE /opa-policies     → 503

When the SRS proxy lands, drop these stubs and replace with a reverse-
proxy to the SRS service (existing pattern uses a Caddy header injection
for the x-api-key).

Deployed to prod (enterprise.clawagent.sh). Policies tab now shows
empty states instead of an error toast.
Final pieces of the Phase B re-skin on the shadcn base:

  agentos/src/components/AgentCard.tsx  (new)
    Polished card with avatar tile (harness logo or initial), status
    dot, LIB/1-shot badges, monospace harness label, source row with
    kind glyph + external-link icon, hairline divider, stats footer.
    bg-background solid.

  agentos/src/App.tsx
    Search + grouped Hosted/Library sections; uses <AgentCard>;
    overflow-y-auto / overflow-x-hidden scroll container; aside has
    overflow-hidden so cards don't bleed into the search bar.

  agentos/src/components/WorkspaceTab.tsx
    Replaced react-resizable-panels with plain flex layout (aside
    w-64 + main flex-1). The bad
    `Separator as PanelResizeHandle` import is gone.

  agentos/src/components/composite/EmptyState.tsx
    Minor copy + spacing tweaks.

  examples/agent-policy-store.ts
    Brought over from feat/agentos-observability-stack so
    examples/computeragent-server.ts has the policy-store import it
    needs.

  .gitignore  — adds local scratch paths.
Was using bg-accent/20 (20% opacity on dark bg) which read as disabled.
Switched to the shadcn <Button> default variant (bg-primary, full
opacity, shadow-sm) + lucide <Plus> icon + w-full so it stretches in
the agent rail.
Pre-public-release hygiene pass on a new chore/oss-cleanup-public
branch. No behavioral changes; renames and comment edits only.

REMOVED (tracked):
  PLAN.md — 1060-line internal "rev 4" architecture plan; not
    intended for a public audience

REMOVED (working-tree only — already gitignored):
  text, test.html, private.md, examples/lyzr-proxy-bwrap.ts,
  .DS_Store

CUSTOMER-NAME SCRUB across packages/ + examples/ + scripts/:
  - "Lyzr SRS" / "Lyzr Trace" / "Lyzr Studio" / "Lyzr ADK" / "Lyzr
    Compute" comments → vendor-neutral phrasing
  - "Nordstrom" reference in substrate-matrix.test.ts → removed
  - clawagent.sh URLs in agentos/vite.config.ts and App.tsx →
    generic "AgentOS" + 127.0.0.1 dev default
  - github.com/shreyas-lyzr/* source URLs in 4 example agents,
    seed-agent-registry.ts, computeragent-server.ts →
    github.com/open-gitagent/example-* placeholders
  - hardcoded agent-dev.test.studio.lyzr.ai default URL in the
    proxy CLI + computeragent-server proxy bootstrap → removed
    (now requires explicit UPSTREAM_BASE)

VENDOR-NEUTRAL ENV RENAMES (per user-confirmed approach):
  LYZR_PROXY_ENABLED   → PROXY_ENABLED
  LYZR_PROXY_PORT      → PROXY_PORT
  LYZR_UPSTREAM_BASE   → UPSTREAM_BASE
  LYZR_UPSTREAM_TOKEN  → UPSTREAM_TOKEN
  LYZR_UPSTREAM_PATH   → UPSTREAM_PATH
  LYZR_UPSTREAM_MODEL  → UPSTREAM_MODEL
  …in computeragent-server.ts + slack-bot.ts. JS-local var names
  (lyzrBase/lyzrToken/lyzrModel, lyzrProxyHandle) renamed in step.
  "lyzr-via-proxy" placeholder API-key string → "via-proxy".

GITIGNORE TIGHTENING:
  Reorganized + added: PLAN.md, .DS_Store coverage, *.env.*
  pattern with .env.example exception, scratch/, tmp/, *.tmp.

VERIFIED:
  - pnpm -r build clean across all 22 packages
  - 0 hits of {lyzr, nordstrom, clawagent, shreyas-lyzr} in
    source files (excluding gitignored private.md / PLAN.md /
    docs.md, which never make the public surface)
Resolves 9 conflicts arising from PR #10 (policy guardrails) landing on
main after this branch was cut. Strategy:

- Backend files where main has the real new policy feature (engine.ts,
  permission-bridge.ts, run-session.ts, sdk/src/types.ts, protocol/src/
  policy.ts, harness-server/services/srs-policy-decider.ts): took main's
  version, then re-applied the customer-name scrub on top (Lyzr SRS
  mentions, hardcoded srs-dev.test.studio.lyzr.ai URL).

- packages/sdk/src/types.ts: kept main's full ComputerAgentOptions
  (policy field with structured spec) AND added back the telemetry?
  field from the cleanup branch (AgentTelemetry hook). Both fields
  coexist.

- 5 source files (engine.ts, permission-bridge.ts, types.ts,
  run-session.ts, srs-policy-decider.ts) had stale
  'import from "@computeragent/protocol"' lines from PR #10 — that
  package name does not exist on public npm (the scope is unowned;
  d19ada7 renamed the workspace package to @open-gitagent/protocol).
  Updated all 5 imports to @open-gitagent/protocol, matching what the
  other 19 workspace packages already use.

- examples/agentos-api.ts: union-merged HEAD's cookie-session login +
  /me / /logout endpoints with main's SRS policy proxy block.
  Scrubbed LYZR_API_KEY env var → SRS_API_KEY, dropped hardcoded
  srs-dev.test.studio.lyzr.ai default (now requires explicit
  SRS_BASE_URL).

- agentos files (App.tsx, vite.config.ts): HEAD's shadcn-based version
  is strictly newer than main's hand-rolled one (Observability rail
  item, AgentCard import, full ui/* primitives). Took HEAD.

Verification:
  - pnpm -r build green across all 22 packages
  - 0 hits of {lyzr, nordstrom, clawagent, shreyas-lyzr} in source
    (excluding gitignored private.md / PLAN.md / docs.md, none of
    which make the public surface)
@shreyas-lyzr shreyas-lyzr merged commit ad9cd43 into main May 31, 2026
0 of 2 checks passed
@shreyas-lyzr shreyas-lyzr deleted the chore/oss-cleanup-public branch May 31, 2026 08:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants