From 324de36577cb862a5f28846c32caf8dbee1afdd1 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Tue, 10 Mar 2026 22:01:39 -0700 Subject: [PATCH] Rename Factory to Foundry --- .dockerignore | 2 +- .env.development.example | 2 +- .gitignore | 6 +- CLAUDE.md | 4 +- README.md | 2 +- ...f-hosting.mdx => foundry-self-hosting.mdx} | 16 +-- docs/docs.json | 2 +- factory/compose.mock.yaml | 31 ----- .../src/factory-client-view-model.d.ts | 7 - {factory => foundry}/AGENTS.md | 0 {factory => foundry}/CLAUDE.md | 32 ++--- {factory => foundry}/CONTRIBUTING.md | 10 +- {factory => foundry}/Dockerfile | 10 +- {factory => foundry}/README.md | 2 +- {factory => foundry}/compose.dev.yaml | 70 +++++----- foundry/compose.mock.yaml | 31 +++++ {factory => foundry}/compose.preview.yaml | 16 +-- .../docker/backend.dev.Dockerfile | 2 +- .../docker/backend.preview.Dockerfile | 6 +- .../docker/frontend.dev.Dockerfile | 2 +- .../docker/frontend.preview.Dockerfile | 8 +- .../docker/nginx.preview.conf | 0 {factory => foundry}/e2e/wb-mmilw7yh.txt | 0 {factory => foundry}/e2e/wb-mmilzdwf.txt | 0 {factory => foundry}/memory/roadmap.md | 0 .../packages/backend/CLAUDE.md | 0 .../packages/backend/package.json | 4 +- .../_scripts/generate-actor-migrations.ts | 0 .../packages/backend/src/actors/context.ts | 2 +- .../packages/backend/src/actors/events.ts | 2 +- .../packages/backend/src/actors/handles.ts | 2 +- .../backend/src/actors/history/db/db.ts | 0 .../src/actors/history/db/drizzle.config.ts | 0 .../db/drizzle/0000_watery_bushwacker.sql | 0 .../db/drizzle/meta/0000_snapshot.json | 0 .../history/db/drizzle/meta/_journal.json | 0 .../src/actors/history/db/migrations.ts | 0 .../backend/src/actors/history/db/schema.ts | 0 .../backend/src/actors/history/index.ts | 2 +- .../packages/backend/src/actors/index.ts | 0 .../packages/backend/src/actors/keys.ts | 0 .../packages/backend/src/actors/logging.ts | 2 +- .../packages/backend/src/actors/polling.ts | 0 .../src/actors/repo-branch-sync/index.ts | 0 .../backend/src/actors/repo-pr-sync/index.ts | 0 .../backend/src/actors/repo/actions.ts | 6 +- .../packages/backend/src/actors/repo/db/db.ts | 0 .../src/actors/repo/db/drizzle.config.ts | 0 .../db/drizzle/0000_stormy_the_hunter.sql | 0 .../db/drizzle/0001_wild_carlie_cooper.sql | 0 .../repo/db/drizzle/0002_far_war_machine.sql | 0 .../repo/db/drizzle/0003_busy_legacy.sql | 0 .../repo/db/drizzle/meta/0000_snapshot.json | 0 .../repo/db/drizzle/meta/0001_snapshot.json | 0 .../repo/db/drizzle/meta/0002_snapshot.json | 0 .../actors/repo/db/drizzle/meta/_journal.json | 0 .../backend/src/actors/repo/db/migrations.ts | 0 .../backend/src/actors/repo/db/schema.ts | 0 .../packages/backend/src/actors/repo/index.ts | 0 .../backend/src/actors/repo/stack-model.ts | 0 .../src/actors/sandbox-instance/db/db.ts | 0 .../sandbox-instance/db/drizzle.config.ts | 0 .../db/drizzle/0000_broad_tyrannus.sql | 0 .../db/drizzle/0001_sandbox_sessions.sql | 0 .../db/drizzle/meta/0000_snapshot.json | 0 .../db/drizzle/meta/_journal.json | 0 .../actors/sandbox-instance/db/migrations.ts | 0 .../src/actors/sandbox-instance/db/schema.ts | 0 .../src/actors/sandbox-instance/index.ts | 2 +- .../src/actors/sandbox-instance/persist.ts | 0 .../src/actors/task-status-sync/index.ts | 2 +- .../packages/backend/src/actors/task/db/db.ts | 0 .../src/actors/task/db/drizzle.config.ts | 0 .../db/drizzle/0000_condemned_maria_hill.sql | 0 .../db/drizzle/0001_rapid_eddie_brock.sql | 0 .../db/drizzle/0002_lazy_moira_mactaggert.sql | 0 .../task/db/drizzle/0003_plucky_bran.sql | 0 .../task/db/drizzle/0004_focused_shuri.sql | 0 .../task/db/drizzle/0005_sandbox_actor_id.sql | 0 .../db/drizzle/0006_workbench_sessions.sql | 0 .../task/db/drizzle/meta/0000_snapshot.json | 0 .../task/db/drizzle/meta/0001_snapshot.json | 0 .../task/db/drizzle/meta/0002_snapshot.json | 0 .../actors/task/db/drizzle/meta/_journal.json | 0 .../backend/src/actors/task/db/migrations.ts | 0 .../backend/src/actors/task/db/schema.ts | 0 .../packages/backend/src/actors/task/index.ts | 2 +- .../backend/src/actors/task/workbench.ts | 0 .../src/actors/task/workflow/commands.ts | 0 .../src/actors/task/workflow/common.ts | 2 +- .../backend/src/actors/task/workflow/index.ts | 0 .../backend/src/actors/task/workflow/init.ts | 0 .../backend/src/actors/task/workflow/push.ts | 0 .../backend/src/actors/task/workflow/queue.ts | 0 .../src/actors/task/workflow/status-sync.ts | 0 .../backend/src/actors/workspace/actions.ts | 2 +- .../backend/src/actors/workspace/app-shell.ts | 84 +++++------ .../backend/src/actors/workspace/db/db.ts | 0 .../src/actors/workspace/db/drizzle.config.ts | 0 .../db/drizzle/0000_rare_iron_man.sql | 0 .../drizzle/0001_sleepy_lady_deathstrike.sql | 0 .../db/drizzle/0002_tiny_silver_surfer.sql | 0 .../db/drizzle/0009_github_sync_status.sql | 0 .../db/drizzle/meta/0000_snapshot.json | 0 .../db/drizzle/meta/0001_snapshot.json | 0 .../workspace/db/drizzle/meta/_journal.json | 0 .../src/actors/workspace/db/migrations.ts | 0 .../backend/src/actors/workspace/db/schema.ts | 0 .../backend/src/actors/workspace/index.ts | 0 .../packages/backend/src/config/backend.ts | 4 +- .../packages/backend/src/config/env.ts | 2 +- .../packages/backend/src/config/workspace.ts | 2 +- .../packages/backend/src/db/actor-sqlite.ts | 4 +- .../packages/backend/src/driver.ts | 0 .../packages/backend/src/index.ts | 16 +-- .../src/integrations/daytona/client.ts | 0 .../src/integrations/git-spice/index.ts | 0 .../src/integrations/git/index.test.ts | 6 +- .../backend/src/integrations/git/index.ts | 12 +- .../backend/src/integrations/github/index.ts | 0 .../src/integrations/graphite/index.ts | 0 .../src/integrations/sandbox-agent/client.ts | 4 +- .../backend/src/notifications/backends.ts | 0 .../backend/src/notifications/index.ts | 0 .../src/notifications/state-tracker.ts | 0 .../backend/src/providers/daytona/index.ts | 24 ++-- .../packages/backend/src/providers/index.ts | 4 +- .../backend/src/providers/local/index.ts | 2 +- .../src/providers/provider-api/index.ts | 2 +- .../backend/src/services/app-github.ts | 0 .../backend/src/services/app-shell-runtime.ts | 4 +- .../backend/src/services/app-stripe.ts | 12 +- .../backend/src/services/create-flow.ts | 0 .../backend/src/services/foundry-paths.ts | 8 +- .../packages/backend/src/services/queue.ts | 0 .../backend/src/services/repo-git-lock.ts | 0 .../backend/src/services/repo.test.ts | 0 .../packages/backend/src/services/repo.ts | 0 .../packages/backend/src/services/tmux.ts | 0 .../packages/backend/test/app-state.test.ts | 2 +- .../packages/backend/test/config-env.test.ts | 12 +- .../packages/backend/test/create-flow.test.ts | 0 .../backend/test/daytona-provider.test.ts | 8 +- .../packages/backend/test/git-spice.test.ts | 0 .../backend/test/git-validate-remote.test.ts | 2 +- .../backend/test/helpers/test-context.ts | 2 +- .../backend/test/helpers/test-driver.ts | 0 .../packages/backend/test/keys.test.ts | 0 .../backend/test/malformed-uri.test.ts | 0 .../packages/backend/test/providers.test.ts | 4 +- .../backend/test/repo-normalize.test.ts | 26 ++-- .../test/sandbox-instance-persist.test.ts | 0 .../packages/backend/test/setup.ts | 0 .../packages/backend/test/stack-model.test.ts | 0 .../backend/test/workbench-unread.test.ts | 0 .../backend/test/workspace-isolation.test.ts | 2 +- .../packages/backend/tmp-decode-actors.mjs | 2 +- .../packages/backend/tmp-dump-wfkeys.mjs | 2 +- .../packages/backend/tmp-inspect-deep.mjs | 2 +- .../packages/backend/tmp-inspect-stuck.mjs | 2 +- .../packages/backend/tmp-inspect-workflow.mjs | 2 +- .../packages/backend/tsconfig.json | 0 .../packages/backend/vitest.config.ts | 0 .../packages/client/package.json | 4 +- .../packages/client/src/app-client.ts | 40 +++--- .../packages/client/src/backend-client.ts | 74 +++++----- .../packages/client/src/backend.ts | 0 .../packages/client/src/index.ts | 0 .../packages/client/src/keys.ts | 0 .../packages/client/src/mock-app.ts | 72 +++++----- .../packages/client/src/mock/latency.ts | 0 .../client/src/mock/workbench-client.ts | 6 +- .../packages/client/src/remote/app-client.ts | 32 ++--- .../client/src/remote/workbench-client.ts | 2 +- .../packages/client/src/view-model.ts | 2 +- .../packages/client/src/workbench-client.ts | 2 +- .../packages/client/src/workbench-model.ts | 2 +- .../packages/client/src/workbench.ts | 0 .../test/e2e/full-integration-e2e.test.ts | 2 +- .../client/test/e2e/github-pr-e2e.test.ts | 2 +- .../client/test/e2e/workbench-e2e.test.ts | 2 +- .../test/e2e/workbench-load-e2e.test.ts | 2 +- .../packages/client/test/keys.test.ts | 0 .../packages/client/test/view-model.test.ts | 2 +- .../client/test/workbench-client.test.ts | 0 .../packages/client/tsconfig.json | 0 .../packages/frontend-errors/package.json | 2 +- .../packages/frontend-errors/src/client.ts | 10 +- .../packages/frontend-errors/src/index.ts | 0 .../packages/frontend-errors/src/router.ts | 4 +- .../packages/frontend-errors/src/script.ts | 10 +- .../packages/frontend-errors/src/types.ts | 0 .../packages/frontend-errors/src/vite.ts | 6 +- .../frontend-errors/test/router.test.ts | 4 +- .../packages/frontend-errors/tsconfig.json | 0 .../packages/frontend-errors/vitest.config.ts | 0 .../packages/frontend/index.html | 2 +- .../packages/frontend/package.json | 8 +- .../packages/frontend/src/app/router.tsx | 8 +- .../packages/frontend/src/app/theme.ts | 0 .../frontend/src/components/mock-layout.tsx | 8 +- .../components/mock-layout/diff-content.tsx | 0 .../mock-layout/history-minimap.tsx | 0 .../components/mock-layout/message-list.tsx | 0 .../components/mock-layout/model-picker.tsx | 0 .../mock-layout/prompt-composer.tsx | 0 .../components/mock-layout/right-sidebar.tsx | 0 .../src/components/mock-layout/sidebar.tsx | 0 .../src/components/mock-layout/skeleton.tsx | 0 .../src/components/mock-layout/tab-strip.tsx | 0 .../mock-layout/transcript-header.tsx | 0 .../src/components/mock-layout/ui.tsx | 0 .../components/mock-layout/view-model.test.ts | 2 +- .../src/components/mock-layout/view-model.ts | 2 +- .../src/components/mock-onboarding.tsx | 42 +++--- .../src/components/workspace-dashboard.tsx | 6 +- .../src/features/sessions/model.test.ts | 2 +- .../frontend/src/features/sessions/model.ts | 4 +- .../frontend/src/features/tasks/model.test.ts | 2 +- .../frontend/src/features/tasks/model.ts | 2 +- .../src/foundry-client-view-model.d.ts | 7 + .../packages/frontend/src/lib/backend.ts | 2 +- .../packages/frontend/src/lib/env.ts | 6 +- .../packages/frontend/src/lib/mock-app.ts | 34 ++--- .../frontend/src/lib/workbench-routing.ts | 2 +- .../src/lib/workbench-runtime.mock.ts | 2 +- .../src/lib/workbench-runtime.remote.ts | 2 +- .../frontend/src/lib/workbench.test.ts | 2 +- .../packages/frontend/src/lib/workbench.ts | 2 +- .../packages/frontend/src/main.tsx | 0 .../packages/frontend/src/styles.css | 0 .../packages/frontend/tsconfig.json | 0 .../packages/frontend/vite.config.ts | 6 +- .../packages/frontend/vitest.config.ts | 0 .../packages/shared/package.json | 2 +- .../packages/shared/src/app-shell.ts | 52 +++---- .../packages/shared/src/config.ts | 4 +- .../packages/shared/src/contracts.ts | 0 .../packages/shared/src/index.ts | 0 .../packages/shared/src/workbench.ts | 0 .../packages/shared/src/workspace.ts | 0 .../packages/shared/test/workspace.test.ts | 2 +- .../packages/shared/tsconfig.json | 0 {factory => foundry}/railway.toml | 0 .../research/friction/general.mdx | 6 +- .../research/friction/rivet.mdx | 8 +- .../research/friction/sandbox-agent.mdx | 0 .../research/friction/sandboxes.mdx | 0 {factory => foundry}/research/roadmap.md | 0 .../research/specs/frontend.md | 0 .../specs/rivetkit-opentui-migration-plan.md | 2 +- .../scripts/build-test-image.sh | 0 {factory => foundry}/tsconfig.base.json | 10 +- justfile | 130 +++++++++--------- pnpm-workspace.yaml | 4 +- research/friction/{factory.md => foundry.md} | 4 +- 256 files changed, 605 insertions(+), 603 deletions(-) rename docs/deploy/{factory-self-hosting.mdx => foundry-self-hosting.mdx} (90%) delete mode 100644 factory/compose.mock.yaml delete mode 100644 factory/packages/frontend/src/factory-client-view-model.d.ts rename {factory => foundry}/AGENTS.md (100%) rename {factory => foundry}/CLAUDE.md (93%) rename {factory => foundry}/CONTRIBUTING.md (82%) rename {factory => foundry}/Dockerfile (90%) rename {factory => foundry}/README.md (95%) rename {factory => foundry}/compose.dev.yaml (51%) create mode 100644 foundry/compose.mock.yaml rename {factory => foundry}/compose.preview.yaml (70%) rename {factory => foundry}/docker/backend.dev.Dockerfile (95%) rename {factory => foundry}/docker/backend.preview.Dockerfile (89%) rename {factory => foundry}/docker/frontend.dev.Dockerfile (85%) rename {factory => foundry}/docker/frontend.preview.Dockerfile (62%) rename {factory => foundry}/docker/nginx.preview.conf (100%) rename {factory => foundry}/e2e/wb-mmilw7yh.txt (100%) rename {factory => foundry}/e2e/wb-mmilzdwf.txt (100%) rename {factory => foundry}/memory/roadmap.md (100%) rename {factory => foundry}/packages/backend/CLAUDE.md (100%) rename {factory => foundry}/packages/backend/package.json (91%) rename {factory => foundry}/packages/backend/src/actors/_scripts/generate-actor-migrations.ts (100%) rename {factory => foundry}/packages/backend/src/actors/context.ts (96%) rename {factory => foundry}/packages/backend/src/actors/events.ts (96%) rename {factory => foundry}/packages/backend/src/actors/handles.ts (98%) rename {factory => foundry}/packages/backend/src/actors/history/db/db.ts (100%) rename {factory => foundry}/packages/backend/src/actors/history/db/drizzle.config.ts (100%) rename {factory => foundry}/packages/backend/src/actors/history/db/drizzle/0000_watery_bushwacker.sql (100%) rename {factory => foundry}/packages/backend/src/actors/history/db/drizzle/meta/0000_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/history/db/drizzle/meta/_journal.json (100%) rename {factory => foundry}/packages/backend/src/actors/history/db/migrations.ts (100%) rename {factory => foundry}/packages/backend/src/actors/history/db/schema.ts (100%) rename {factory => foundry}/packages/backend/src/actors/history/index.ts (97%) rename {factory => foundry}/packages/backend/src/actors/index.ts (100%) rename {factory => foundry}/packages/backend/src/actors/keys.ts (100%) rename {factory => foundry}/packages/backend/src/actors/logging.ts (93%) rename {factory => foundry}/packages/backend/src/actors/polling.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo-branch-sync/index.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo-pr-sync/index.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo/actions.ts (99%) rename {factory => foundry}/packages/backend/src/actors/repo/db/db.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle.config.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/0000_stormy_the_hunter.sql (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/0001_wild_carlie_cooper.sql (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/0002_far_war_machine.sql (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/0003_busy_legacy.sql (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/meta/0000_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/meta/0001_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/meta/0002_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/drizzle/meta/_journal.json (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/migrations.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo/db/schema.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo/index.ts (100%) rename {factory => foundry}/packages/backend/src/actors/repo/stack-model.ts (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/db.ts (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/drizzle.config.ts (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/drizzle/0000_broad_tyrannus.sql (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/drizzle/0001_sandbox_sessions.sql (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/0000_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/_journal.json (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/migrations.ts (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/db/schema.ts (100%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/index.ts (99%) rename {factory => foundry}/packages/backend/src/actors/sandbox-instance/persist.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task-status-sync/index.ts (98%) rename {factory => foundry}/packages/backend/src/actors/task/db/db.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle.config.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0000_condemned_maria_hill.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0001_rapid_eddie_brock.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0002_lazy_moira_mactaggert.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0003_plucky_bran.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0004_focused_shuri.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0005_sandbox_actor_id.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/0006_workbench_sessions.sql (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/meta/0000_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/meta/0001_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/meta/0002_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/drizzle/meta/_journal.json (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/migrations.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/db/schema.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/index.ts (99%) rename {factory => foundry}/packages/backend/src/actors/task/workbench.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/commands.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/common.ts (98%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/index.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/init.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/push.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/queue.ts (100%) rename {factory => foundry}/packages/backend/src/actors/task/workflow/status-sync.ts (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/actions.ts (99%) rename {factory => foundry}/packages/backend/src/actors/workspace/app-shell.ts (96%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/db.ts (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle.config.ts (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/0000_rare_iron_man.sql (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/0001_sleepy_lady_deathstrike.sql (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/0002_tiny_silver_surfer.sql (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/0009_github_sync_status.sql (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/meta/0000_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/meta/0001_snapshot.json (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/drizzle/meta/_journal.json (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/migrations.ts (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/db/schema.ts (100%) rename {factory => foundry}/packages/backend/src/actors/workspace/index.ts (100%) rename {factory => foundry}/packages/backend/src/config/backend.ts (87%) rename {factory => foundry}/packages/backend/src/config/env.ts (97%) rename {factory => foundry}/packages/backend/src/config/workspace.ts (85%) rename {factory => foundry}/packages/backend/src/db/actor-sqlite.ts (97%) rename {factory => foundry}/packages/backend/src/driver.ts (100%) rename {factory => foundry}/packages/backend/src/index.ts (96%) rename {factory => foundry}/packages/backend/src/integrations/daytona/client.ts (100%) rename {factory => foundry}/packages/backend/src/integrations/git-spice/index.ts (100%) rename {factory => foundry}/packages/backend/src/integrations/git/index.test.ts (91%) rename {factory => foundry}/packages/backend/src/integrations/git/index.ts (97%) rename {factory => foundry}/packages/backend/src/integrations/github/index.ts (100%) rename {factory => foundry}/packages/backend/src/integrations/graphite/index.ts (100%) rename {factory => foundry}/packages/backend/src/integrations/sandbox-agent/client.ts (98%) rename {factory => foundry}/packages/backend/src/notifications/backends.ts (100%) rename {factory => foundry}/packages/backend/src/notifications/index.ts (100%) rename {factory => foundry}/packages/backend/src/notifications/state-tracker.ts (100%) rename {factory => foundry}/packages/backend/src/providers/daytona/index.ts (95%) rename {factory => foundry}/packages/backend/src/providers/index.ts (94%) rename {factory => foundry}/packages/backend/src/providers/local/index.ts (99%) rename {factory => foundry}/packages/backend/src/providers/provider-api/index.ts (97%) rename {factory => foundry}/packages/backend/src/services/app-github.ts (100%) rename {factory => foundry}/packages/backend/src/services/app-shell-runtime.ts (95%) rename {factory => foundry}/packages/backend/src/services/app-stripe.ts (96%) rename {factory => foundry}/packages/backend/src/services/create-flow.ts (100%) rename factory/packages/backend/src/services/factory-paths.ts => foundry/packages/backend/src/services/foundry-paths.ts (67%) rename {factory => foundry}/packages/backend/src/services/queue.ts (100%) rename {factory => foundry}/packages/backend/src/services/repo-git-lock.ts (100%) rename {factory => foundry}/packages/backend/src/services/repo.test.ts (100%) rename {factory => foundry}/packages/backend/src/services/repo.ts (100%) rename {factory => foundry}/packages/backend/src/services/tmux.ts (100%) rename {factory => foundry}/packages/backend/test/app-state.test.ts (99%) rename {factory => foundry}/packages/backend/test/config-env.test.ts (90%) rename {factory => foundry}/packages/backend/test/create-flow.test.ts (100%) rename {factory => foundry}/packages/backend/test/daytona-provider.test.ts (97%) rename {factory => foundry}/packages/backend/test/git-spice.test.ts (100%) rename {factory => foundry}/packages/backend/test/git-validate-remote.test.ts (98%) rename {factory => foundry}/packages/backend/test/helpers/test-context.ts (95%) rename {factory => foundry}/packages/backend/test/helpers/test-driver.ts (100%) rename {factory => foundry}/packages/backend/test/keys.test.ts (100%) rename {factory => foundry}/packages/backend/test/malformed-uri.test.ts (100%) rename {factory => foundry}/packages/backend/test/providers.test.ts (90%) rename {factory => foundry}/packages/backend/test/repo-normalize.test.ts (64%) rename {factory => foundry}/packages/backend/test/sandbox-instance-persist.test.ts (100%) rename {factory => foundry}/packages/backend/test/setup.ts (100%) rename {factory => foundry}/packages/backend/test/stack-model.test.ts (100%) rename {factory => foundry}/packages/backend/test/workbench-unread.test.ts (100%) rename {factory => foundry}/packages/backend/test/workspace-isolation.test.ts (97%) rename {factory => foundry}/packages/backend/tmp-decode-actors.mjs (95%) rename {factory => foundry}/packages/backend/tmp-dump-wfkeys.mjs (88%) rename {factory => foundry}/packages/backend/tmp-inspect-deep.mjs (98%) rename {factory => foundry}/packages/backend/tmp-inspect-stuck.mjs (95%) rename {factory => foundry}/packages/backend/tmp-inspect-workflow.mjs (95%) rename {factory => foundry}/packages/backend/tsconfig.json (100%) rename {factory => foundry}/packages/backend/vitest.config.ts (100%) rename {factory => foundry}/packages/client/package.json (93%) rename {factory => foundry}/packages/client/src/app-client.ts (56%) rename {factory => foundry}/packages/client/src/backend-client.ts (94%) rename {factory => foundry}/packages/client/src/backend.ts (100%) rename {factory => foundry}/packages/client/src/index.ts (100%) rename {factory => foundry}/packages/client/src/keys.ts (100%) rename {factory => foundry}/packages/client/src/mock-app.ts (89%) rename {factory => foundry}/packages/client/src/mock/latency.ts (100%) rename {factory => foundry}/packages/client/src/mock/workbench-client.ts (98%) rename {factory => foundry}/packages/client/src/remote/app-client.ts (82%) rename {factory => foundry}/packages/client/src/remote/workbench-client.ts (99%) rename {factory => foundry}/packages/client/src/view-model.ts (97%) rename {factory => foundry}/packages/client/src/workbench-client.ts (98%) rename {factory => foundry}/packages/client/src/workbench-model.ts (99%) rename {factory => foundry}/packages/client/src/workbench.ts (100%) rename {factory => foundry}/packages/client/test/e2e/full-integration-e2e.test.ts (99%) rename {factory => foundry}/packages/client/test/e2e/github-pr-e2e.test.ts (99%) rename {factory => foundry}/packages/client/test/e2e/workbench-e2e.test.ts (99%) rename {factory => foundry}/packages/client/test/e2e/workbench-load-e2e.test.ts (99%) rename {factory => foundry}/packages/client/test/keys.test.ts (100%) rename {factory => foundry}/packages/client/test/view-model.test.ts (97%) rename {factory => foundry}/packages/client/test/workbench-client.test.ts (100%) rename {factory => foundry}/packages/client/tsconfig.json (100%) rename {factory => foundry}/packages/frontend-errors/package.json (93%) rename {factory => foundry}/packages/frontend-errors/src/client.ts (73%) rename {factory => foundry}/packages/frontend-errors/src/index.ts (100%) rename {factory => foundry}/packages/frontend-errors/src/router.ts (98%) rename {factory => foundry}/packages/frontend-errors/src/script.ts (96%) rename {factory => foundry}/packages/frontend-errors/src/types.ts (100%) rename {factory => foundry}/packages/frontend-errors/src/vite.ts (93%) rename {factory => foundry}/packages/frontend-errors/test/router.test.ts (94%) rename {factory => foundry}/packages/frontend-errors/tsconfig.json (100%) rename {factory => foundry}/packages/frontend-errors/vitest.config.ts (100%) rename {factory => foundry}/packages/frontend/index.html (92%) rename {factory => foundry}/packages/frontend/package.json (77%) rename {factory => foundry}/packages/frontend/src/app/router.tsx (98%) rename {factory => foundry}/packages/frontend/src/app/theme.ts (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout.tsx (99%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/diff-content.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/history-minimap.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/message-list.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/model-picker.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/prompt-composer.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/right-sidebar.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/sidebar.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/skeleton.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/tab-strip.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/transcript-header.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/ui.tsx (100%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/view-model.test.ts (98%) rename {factory => foundry}/packages/frontend/src/components/mock-layout/view-model.ts (99%) rename {factory => foundry}/packages/frontend/src/components/mock-onboarding.tsx (97%) rename {factory => foundry}/packages/frontend/src/components/workspace-dashboard.tsx (99%) rename {factory => foundry}/packages/frontend/src/features/sessions/model.test.ts (98%) rename {factory => foundry}/packages/frontend/src/features/sessions/model.ts (97%) rename {factory => foundry}/packages/frontend/src/features/tasks/model.test.ts (97%) rename {factory => foundry}/packages/frontend/src/features/tasks/model.ts (95%) create mode 100644 foundry/packages/frontend/src/foundry-client-view-model.d.ts rename {factory => foundry}/packages/frontend/src/lib/backend.ts (73%) rename {factory => foundry}/packages/frontend/src/lib/env.ts (79%) rename {factory => foundry}/packages/frontend/src/lib/mock-app.ts (69%) rename {factory => foundry}/packages/frontend/src/lib/workbench-routing.ts (85%) rename {factory => foundry}/packages/frontend/src/lib/workbench-runtime.mock.ts (82%) rename {factory => foundry}/packages/frontend/src/lib/workbench-runtime.remote.ts (86%) rename {factory => foundry}/packages/frontend/src/lib/workbench.test.ts (93%) rename {factory => foundry}/packages/frontend/src/lib/workbench.ts (90%) rename {factory => foundry}/packages/frontend/src/main.tsx (100%) rename {factory => foundry}/packages/frontend/src/styles.css (100%) rename {factory => foundry}/packages/frontend/tsconfig.json (100%) rename {factory => foundry}/packages/frontend/vite.config.ts (90%) rename {factory => foundry}/packages/frontend/vitest.config.ts (100%) rename {factory => foundry}/packages/shared/package.json (88%) rename {factory => foundry}/packages/shared/src/app-shell.ts (52%) rename {factory => foundry}/packages/shared/src/config.ts (92%) rename {factory => foundry}/packages/shared/src/contracts.ts (100%) rename {factory => foundry}/packages/shared/src/index.ts (100%) rename {factory => foundry}/packages/shared/src/workbench.ts (100%) rename {factory => foundry}/packages/shared/src/workspace.ts (100%) rename {factory => foundry}/packages/shared/test/workspace.test.ts (94%) rename {factory => foundry}/packages/shared/tsconfig.json (100%) rename {factory => foundry}/railway.toml (100%) rename {factory => foundry}/research/friction/general.mdx (98%) rename {factory => foundry}/research/friction/rivet.mdx (99%) rename {factory => foundry}/research/friction/sandbox-agent.mdx (100%) rename {factory => foundry}/research/friction/sandboxes.mdx (100%) rename {factory => foundry}/research/roadmap.md (100%) rename {factory => foundry}/research/specs/frontend.md (100%) rename {factory => foundry}/research/specs/rivetkit-opentui-migration-plan.md (99%) rename {factory => foundry}/scripts/build-test-image.sh (100%) rename {factory => foundry}/tsconfig.base.json (62%) rename research/friction/{factory.md => foundry.md} (75%) diff --git a/.dockerignore b/.dockerignore index 5625bc9..69eba9b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -17,7 +17,7 @@ coverage/ # Environment .env .env.* -.sandbox-agent-factory/ +.sandbox-agent-foundry/ # IDE .idea/ diff --git a/.env.development.example b/.env.development.example index 4c501f3..24bbef1 100644 --- a/.env.development.example +++ b/.env.development.example @@ -3,7 +3,7 @@ APP_URL=http://localhost:4173 BETTER_AUTH_URL=http://localhost:4173 -BETTER_AUTH_SECRET=sandbox-agent-factory-development-only-change-me +BETTER_AUTH_SECRET=sandbox-agent-foundry-development-only-change-me GITHUB_REDIRECT_URI=http://localhost:4173/api/rivet/app/auth/github/callback # Fill these in when enabling live GitHub OAuth. diff --git a/.gitignore b/.gitignore index f227d51..57396bc 100644 --- a/.gitignore +++ b/.gitignore @@ -49,12 +49,14 @@ Cargo.lock .claude/ .opencode/ .context/ -factory/.context/ +foundry/.context/ +**/.sandbox-agent-factory/ +**/.sandbox-agent-foundry/ # Example temp files .tmp-upload/ *.db -.sandbox-agent-factory/ +.sandbox-agent-foundry/ .openhandoff/ # CLI binaries (downloaded during npm publish) diff --git a/CLAUDE.md b/CLAUDE.md index c2a06e3..8eeb0c4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -102,7 +102,7 @@ - `research/acp/todo.md` - `research/friction/rivetkit.md` - `research/friction/sandbox-agent-sdk.md` -- `research/friction/factory.md` +- `research/friction/foundry.md` ## Change Tracking @@ -114,7 +114,7 @@ - `research/acp/friction.md` — ACP protocol, migration, and spec issues. - `research/friction/rivetkit.md` — RivetKit runtime, actor model, queues, keys, workflows. - `research/friction/sandbox-agent-sdk.md` — Sandbox Agent SDK/API, TypeScript clients, ACP HTTP client. - - `research/friction/factory.md` — Factory product development, frontend, backend, client. + - `research/friction/foundry.md` — Foundry product development, frontend, backend, client. - Friction log entry format (all logs use the same template): ``` - Date: diff --git a/README.md b/README.md index 1bed6cd..ed0c562 100644 --- a/README.md +++ b/README.md @@ -157,7 +157,7 @@ sandbox-agent server --no-token --host 127.0.0.1 --port 2468 [Quickstart](https://sandboxagent.dev/docs/quickstart) — [Deployment guides](https://sandboxagent.dev/docs/deploy) -Factory self-hosting setup for auth, GitHub, and billing: [docs/deploy/factory-self-hosting.mdx](docs/deploy/factory-self-hosting.mdx) +Foundry self-hosting setup for auth, GitHub, and billing: [docs/deploy/foundry-self-hosting.mdx](docs/deploy/foundry-self-hosting.mdx) ### CLI diff --git a/docs/deploy/factory-self-hosting.mdx b/docs/deploy/foundry-self-hosting.mdx similarity index 90% rename from docs/deploy/factory-self-hosting.mdx rename to docs/deploy/foundry-self-hosting.mdx index 08a83f6..0f8d1cc 100644 --- a/docs/deploy/factory-self-hosting.mdx +++ b/docs/deploy/foundry-self-hosting.mdx @@ -1,15 +1,15 @@ --- -title: "Factory Self-Hosting" -description: "Environment, credentials, and deployment setup for Sandbox Agent Factory auth, GitHub, and billing." +title: "Foundry Self-Hosting" +description: "Environment, credentials, and deployment setup for Sandbox Agent Foundry auth, GitHub, and billing." --- -This guide documents the deployment contract for the Factory product surface: app auth, GitHub onboarding, repository import, and billing. +This guide documents the deployment contract for the Foundry product surface: app auth, GitHub onboarding, repository import, and billing. It also covers the local-development bootstrap that uses `.env.development` only when `NODE_ENV=development`. ## Local Development -For backend local development, the Factory backend now supports a development-only dotenv bootstrap: +For backend local development, the Foundry backend now supports a development-only dotenv bootstrap: - It loads `.env.development.local` and `.env.development` - It does this **only** when `NODE_ENV=development` @@ -26,7 +26,7 @@ cp .env.development.example .env.development Run the backend with: ```bash -just factory-backend-start +just foundry-backend-start ``` That recipe sets `NODE_ENV=development`, which enables the dotenv loader. @@ -37,7 +37,7 @@ These values can be safely defaulted for local development: - `APP_URL=http://localhost:4173` - `BETTER_AUTH_URL=http://localhost:4173` -- `BETTER_AUTH_SECRET=sandbox-agent-factory-development-only-change-me` +- `BETTER_AUTH_SECRET=sandbox-agent-foundry-development-only-change-me` - `GITHUB_REDIRECT_URI=http://localhost:4173/api/rivet/app/auth/github/callback` These should be treated as development-only values. @@ -71,7 +71,7 @@ Use GitHub OAuth for: ## GitHub App -If your Factory deployment uses GitHub App-backed organization install and repo import, also configure: +If your Foundry deployment uses GitHub App-backed organization install and repo import, also configure: | Variable | Required | Notes | |---|---:|---| @@ -139,7 +139,7 @@ Stripe should own: ## Mock Invariant -Factory’s mock client path should continue to work end to end even when the real auth/GitHub/Stripe path exists. +Foundry’s mock client path should continue to work end to end even when the real auth/GitHub/Stripe path exists. That includes: diff --git a/docs/docs.json b/docs/docs.json index 1d6e833..39f6613 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -57,7 +57,7 @@ "icon": "server", "pages": [ "deploy/local", - "deploy/factory-self-hosting", + "deploy/foundry-self-hosting", "deploy/computesdk", "deploy/e2b", "deploy/daytona", diff --git a/factory/compose.mock.yaml b/factory/compose.mock.yaml deleted file mode 100644 index eca2bd6..0000000 --- a/factory/compose.mock.yaml +++ /dev/null @@ -1,31 +0,0 @@ -name: sandbox-agent-factory-mock - -services: - frontend: - build: - context: .. - dockerfile: factory/docker/frontend.dev.Dockerfile - working_dir: /app - environment: - HOME: "/tmp" - FACTORY_FRONTEND_CLIENT_MODE: "mock" - ports: - - "4174:4173" - volumes: - - "..:/app" - - "./.sandbox-agent-factory:/app/factory/.sandbox-agent-factory" - # Use Linux-native workspace dependencies inside the container instead of host node_modules. - - "sandbox-agent-factory-mock_node_modules:/app/node_modules" - - "sandbox-agent-factory-mock_client_node_modules:/app/factory/packages/client/node_modules" - - "sandbox-agent-factory-mock_frontend_errors_node_modules:/app/factory/packages/frontend-errors/node_modules" - - "sandbox-agent-factory-mock_frontend_node_modules:/app/factory/packages/frontend/node_modules" - - "sandbox-agent-factory-mock_shared_node_modules:/app/factory/packages/shared/node_modules" - - "sandbox-agent-factory-mock_pnpm_store:/tmp/.local/share/pnpm/store" - -volumes: - sandbox-agent-factory-mock_node_modules: {} - sandbox-agent-factory-mock_client_node_modules: {} - sandbox-agent-factory-mock_frontend_errors_node_modules: {} - sandbox-agent-factory-mock_frontend_node_modules: {} - sandbox-agent-factory-mock_shared_node_modules: {} - sandbox-agent-factory-mock_pnpm_store: {} diff --git a/factory/packages/frontend/src/factory-client-view-model.d.ts b/factory/packages/frontend/src/factory-client-view-model.d.ts deleted file mode 100644 index e09c64b..0000000 --- a/factory/packages/frontend/src/factory-client-view-model.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare module "@sandbox-agent/factory-client/view-model" { - export { - HANDOFF_STATUS_GROUPS, - groupTaskStatus, - } from "@sandbox-agent/factory-client"; - export type { TaskStatusGroup } from "@sandbox-agent/factory-client"; -} diff --git a/factory/AGENTS.md b/foundry/AGENTS.md similarity index 100% rename from factory/AGENTS.md rename to foundry/AGENTS.md diff --git a/factory/CLAUDE.md b/foundry/CLAUDE.md similarity index 93% rename from factory/CLAUDE.md rename to foundry/CLAUDE.md index 147730c..8fd397d 100644 --- a/factory/CLAUDE.md +++ b/foundry/CLAUDE.md @@ -30,19 +30,19 @@ Use `pnpm` workspaces and Turborepo. **Always use Docker Compose to run dev servers.** Do not start the backend, frontend, or any other long-running service directly via `bun`, `pnpm dev`, Vite, or tmux. All dev services must run through the Compose stack so that networking, environment variables, and service dependencies are consistent. -- Start the full dev stack (real backend): `just factory-dev` -- Stop the dev stack: `just factory-dev-down` -- Tail dev logs: `just factory-dev-logs` -- Start the mock dev stack (frontend-only, no backend): `just factory-dev-mock` -- Stop the mock stack: `just factory-dev-mock-down` -- Tail mock logs: `just factory-dev-mock-logs` -- Start the production-build preview stack: `just factory-preview` -- Stop the preview stack: `just factory-preview-down` -- Tail preview logs: `just factory-preview-logs` +- Start the full dev stack (real backend): `just foundry-dev` +- Stop the dev stack: `just foundry-dev-down` +- Tail dev logs: `just foundry-dev-logs` +- Start the mock dev stack (frontend-only, no backend): `just foundry-dev-mock` +- Stop the mock stack: `just foundry-dev-mock-down` +- Tail mock logs: `just foundry-dev-mock-logs` +- Start the production-build preview stack: `just foundry-preview` +- Stop the preview stack: `just foundry-preview-down` +- Tail preview logs: `just foundry-preview-logs` The real dev server runs on port 4173 (frontend) + 7741 (backend). The mock dev server runs on port 4174 (frontend only). Both can run simultaneously. -When making code changes, restart or recreate the relevant Compose services so the running app reflects the latest code (e.g. `docker compose -f factory/compose.dev.yaml up -d --build backend`). +When making code changes, restart or recreate the relevant Compose services so the running app reflects the latest code (e.g. `docker compose -f foundry/compose.dev.yaml up -d --build backend`). ## Mock vs Real Backend — UI Change Policy @@ -60,7 +60,7 @@ When making code changes, restart or recreate the relevant Compose services so t - Install deps: `pnpm install` - Full active-workspace validation: `pnpm -w typecheck`, `pnpm -w build`, `pnpm -w test` -- Start the frontend against the mock workbench client (no backend needed): `FACTORY_FRONTEND_CLIENT_MODE=mock pnpm --filter @sandbox-agent/factory-frontend dev` +- Start the frontend against the mock workbench client (no backend needed): `FOUNDRY_FRONTEND_CLIENT_MODE=mock pnpm --filter @sandbox-agent/foundry-frontend dev` ## Loading & Skeleton UI Policy @@ -152,14 +152,14 @@ For all Rivet/RivetKit implementation: ## Workspace + Actor Rules - Everything is scoped to a workspace. -- All durable Factory data must live inside actors. +- All durable Foundry data must live inside actors. - App-shell/auth/session/org/billing data is actor-owned data too; do not introduce backend-global stores for it. -- Do not add standalone SQLite files, JSON stores, in-memory singleton stores, or any other non-actor persistence for Factory product state. +- Do not add standalone SQLite files, JSON stores, in-memory singleton stores, or any other non-actor persistence for Foundry product state. - If data needs durable persistence, store it in actor `c.state` or the owning actor's SQLite DB via `c.db`. - Workspace resolution order: `--workspace` flag -> config default -> `"default"`. - `ControlPlaneActor` is replaced by `WorkspaceActor` (workspace coordinator). - Every actor key must be prefixed with workspace namespace (`["ws", workspaceId, ...]`). -- Product surfaces must use `@sandbox-agent/factory-client` (`packages/client`) for backend access; `rivetkit/client` imports are only allowed inside `packages/client`. +- Product surfaces must use `@sandbox-agent/foundry-client` (`packages/client`) for backend access; `rivetkit/client` imports are only allowed inside `packages/client`. - Do not add custom backend REST endpoints (no `/v1/*` shim layer). - We own the sandbox-agent project; treat sandbox-agent defects as first-party bugs and fix them instead of working around them. - Keep strict single-writer ownership: each table/row has exactly one actor writer. @@ -171,7 +171,7 @@ For all Rivet/RivetKit implementation: - Use create semantics only on explicit provisioning/create paths where creating a new actor instance is intended. - `getOrCreate` is a last resort for create paths when an explicit create API is unavailable; never use it in read/command paths. - For long-lived cross-actor links (for example sandbox/session runtime access), persist actor identity (`actorId`) and keep a fallback lookup path by actor id. -- Docker dev: `compose.dev.yaml` mounts a named volume at `/root/.local/share/sandbox-agent-factory/repos` to persist backend-managed git clones across restarts. Code must still work if this volume is not present (create directories as needed). +- Docker dev: `compose.dev.yaml` mounts a named volume at `/root/.local/share/sandbox-agent-foundry/repos` to persist backend-managed git clones across restarts. Code must still work if this volume is not present (create directories as needed). - RivetKit actor `c.state` is durable, but in Docker it is stored under `/root/.local/share/rivetkit`. If that path is not persisted, actor state-derived indexes (for example, in `project` actor state) can be lost after container recreation even when other data still exists. - Workflow history divergence policy: - Production: never auto-delete actor state to resolve `HistoryDivergedError`; ship explicit workflow migrations (`ctx.removed(...)`, step compatibility). @@ -194,7 +194,7 @@ For all Rivet/RivetKit implementation: ## Config -- Keep config path at `~/.config/sandbox-agent-factory/config.toml`. +- Keep config path at `~/.config/sandbox-agent-foundry/config.toml`. - Evolve properties in place; do not move config location. ## Project Guidance diff --git a/factory/CONTRIBUTING.md b/foundry/CONTRIBUTING.md similarity index 82% rename from factory/CONTRIBUTING.md rename to foundry/CONTRIBUTING.md index c20299e..64cd5cf 100644 --- a/factory/CONTRIBUTING.md +++ b/foundry/CONTRIBUTING.md @@ -5,8 +5,8 @@ 1. Clone: ```bash -git clone https://github.com/rivet-dev/sandbox-agent-factory.git -cd sandbox-agent-factory +git clone https://github.com/rivet-dev/sandbox-agent-foundry.git +cd sandbox-agent-foundry ``` 2. Install dependencies: @@ -35,7 +35,7 @@ Build local RivetKit before backend changes that depend on Rivet internals: cd ../rivet pnpm build -F rivetkit -cd /path/to/sandbox-agent-factory +cd /path/to/sandbox-agent-foundry just sync-rivetkit ``` @@ -54,11 +54,11 @@ pnpm -w test Start the dev backend (hot reload via `bun --watch`) and Vite frontend via Docker Compose: ```bash -just factory-dev +just foundry-dev ``` Stop it: ```bash -just factory-dev-down +just foundry-dev-down ``` diff --git a/factory/Dockerfile b/foundry/Dockerfile similarity index 90% rename from factory/Dockerfile rename to foundry/Dockerfile index 8d5dfe9..c485319 100644 --- a/factory/Dockerfile +++ b/foundry/Dockerfile @@ -22,15 +22,15 @@ COPY packages/rivetkit-vendor/sqlite-vfs-win32-x64/package.json packages/rivetki COPY packages/rivetkit-vendor/runner/package.json packages/rivetkit-vendor/runner/package.json COPY packages/rivetkit-vendor/runner-protocol/package.json packages/rivetkit-vendor/runner-protocol/package.json COPY packages/rivetkit-vendor/virtual-websocket/package.json packages/rivetkit-vendor/virtual-websocket/package.json -RUN pnpm fetch --frozen-lockfile --filter @sandbox-agent/factory-backend... +RUN pnpm fetch --frozen-lockfile --filter @sandbox-agent/foundry-backend... FROM base AS build COPY --from=deps /pnpm/store /pnpm/store COPY . . -RUN pnpm install --frozen-lockfile --prefer-offline --filter @sandbox-agent/factory-backend... -RUN pnpm --filter @sandbox-agent/factory-shared build -RUN pnpm --filter @sandbox-agent/factory-backend build -RUN pnpm --filter @sandbox-agent/factory-backend deploy --prod --legacy /out +RUN pnpm install --frozen-lockfile --prefer-offline --filter @sandbox-agent/foundry-backend... +RUN pnpm --filter @sandbox-agent/foundry-shared build +RUN pnpm --filter @sandbox-agent/foundry-backend build +RUN pnpm --filter @sandbox-agent/foundry-backend deploy --prod --legacy /out FROM oven/bun:1.2 AS runtime ENV NODE_ENV=production diff --git a/factory/README.md b/foundry/README.md similarity index 95% rename from factory/README.md rename to foundry/README.md index 700b7af..84c3132 100644 --- a/factory/README.md +++ b/foundry/README.md @@ -1,4 +1,4 @@ -# Sandbox Agent Factory +# Sandbox Agent Foundry TypeScript workspace task system powered by RivetKit actors and SQLite/Drizzle state. diff --git a/factory/compose.dev.yaml b/foundry/compose.dev.yaml similarity index 51% rename from factory/compose.dev.yaml rename to foundry/compose.dev.yaml index 5ed3b22..df68333 100644 --- a/factory/compose.dev.yaml +++ b/foundry/compose.dev.yaml @@ -1,17 +1,17 @@ -name: sandbox-agent-factory +name: sandbox-agent-foundry services: backend: build: context: .. - dockerfile: factory/docker/backend.dev.Dockerfile - image: sandbox-agent-factory-backend-dev + dockerfile: foundry/docker/backend.dev.Dockerfile + image: sandbox-agent-foundry-backend-dev working_dir: /app environment: HF_BACKEND_HOST: "0.0.0.0" HF_BACKEND_PORT: "7741" HF_RIVET_MANAGER_PORT: "8750" - RIVETKIT_STORAGE_PATH: "/root/.local/share/sandbox-agent-factory/rivetkit" + RIVETKIT_STORAGE_PATH: "/root/.local/share/sandbox-agent-foundry/rivetkit" # Pass through credentials needed for agent execution + PR creation in dev/e2e. # Do not hardcode secrets; set these in your environment when starting compose. ANTHROPIC_API_KEY: "${ANTHROPIC_API_KEY:-}" @@ -35,21 +35,21 @@ services: # Reuse the host Codex auth profile for local sandbox-agent Codex sessions in dev. - "${HOME}/.codex:/root/.codex" # Keep backend dependency installs Linux-native instead of using host node_modules. - - "sandbox-agent-factory_backend_root_node_modules:/app/node_modules" - - "sandbox-agent-factory_backend_backend_node_modules:/app/factory/packages/backend/node_modules" - - "sandbox-agent-factory_backend_shared_node_modules:/app/factory/packages/shared/node_modules" - - "sandbox-agent-factory_backend_persist_rivet_node_modules:/app/sdks/persist-rivet/node_modules" - - "sandbox-agent-factory_backend_typescript_node_modules:/app/sdks/typescript/node_modules" - - "sandbox-agent-factory_backend_pnpm_store:/root/.local/share/pnpm/store" + - "sandbox-agent-foundry_backend_root_node_modules:/app/node_modules" + - "sandbox-agent-foundry_backend_backend_node_modules:/app/foundry/packages/backend/node_modules" + - "sandbox-agent-foundry_backend_shared_node_modules:/app/foundry/packages/shared/node_modules" + - "sandbox-agent-foundry_backend_persist_rivet_node_modules:/app/sdks/persist-rivet/node_modules" + - "sandbox-agent-foundry_backend_typescript_node_modules:/app/sdks/typescript/node_modules" + - "sandbox-agent-foundry_backend_pnpm_store:/root/.local/share/pnpm/store" # Persist backend-managed local git clones across container restarts. - - "sandbox-agent-factory_git_repos:/root/.local/share/sandbox-agent-factory/repos" + - "sandbox-agent-foundry_git_repos:/root/.local/share/sandbox-agent-foundry/repos" # Persist RivetKit local storage across container restarts. - - "sandbox-agent-factory_rivetkit_storage:/root/.local/share/sandbox-agent-factory/rivetkit" + - "sandbox-agent-foundry_rivetkit_storage:/root/.local/share/sandbox-agent-foundry/rivetkit" frontend: build: context: .. - dockerfile: factory/docker/frontend.dev.Dockerfile + dockerfile: foundry/docker/frontend.dev.Dockerfile working_dir: /app depends_on: - backend @@ -60,28 +60,28 @@ services: - "4173:4173" volumes: - "..:/app" - # Ensure logs in .sandbox-agent-factory/ persist on the host even if we change source mounts later. - - "./.sandbox-agent-factory:/app/factory/.sandbox-agent-factory" + # Ensure logs in .sandbox-agent-foundry/ persist on the host even if we change source mounts later. + - "./.sandbox-agent-foundry:/app/foundry/.sandbox-agent-foundry" # Use Linux-native workspace dependencies inside the container instead of host node_modules. - - "sandbox-agent-factory_node_modules:/app/node_modules" - - "sandbox-agent-factory_client_node_modules:/app/factory/packages/client/node_modules" - - "sandbox-agent-factory_frontend_errors_node_modules:/app/factory/packages/frontend-errors/node_modules" - - "sandbox-agent-factory_frontend_node_modules:/app/factory/packages/frontend/node_modules" - - "sandbox-agent-factory_shared_node_modules:/app/factory/packages/shared/node_modules" - - "sandbox-agent-factory_pnpm_store:/tmp/.local/share/pnpm/store" + - "sandbox-agent-foundry_node_modules:/app/node_modules" + - "sandbox-agent-foundry_client_node_modules:/app/foundry/packages/client/node_modules" + - "sandbox-agent-foundry_frontend_errors_node_modules:/app/foundry/packages/frontend-errors/node_modules" + - "sandbox-agent-foundry_frontend_node_modules:/app/foundry/packages/frontend/node_modules" + - "sandbox-agent-foundry_shared_node_modules:/app/foundry/packages/shared/node_modules" + - "sandbox-agent-foundry_pnpm_store:/tmp/.local/share/pnpm/store" volumes: - sandbox-agent-factory_backend_root_node_modules: {} - sandbox-agent-factory_backend_backend_node_modules: {} - sandbox-agent-factory_backend_shared_node_modules: {} - sandbox-agent-factory_backend_persist_rivet_node_modules: {} - sandbox-agent-factory_backend_typescript_node_modules: {} - sandbox-agent-factory_backend_pnpm_store: {} - sandbox-agent-factory_git_repos: {} - sandbox-agent-factory_rivetkit_storage: {} - sandbox-agent-factory_node_modules: {} - sandbox-agent-factory_client_node_modules: {} - sandbox-agent-factory_frontend_errors_node_modules: {} - sandbox-agent-factory_frontend_node_modules: {} - sandbox-agent-factory_shared_node_modules: {} - sandbox-agent-factory_pnpm_store: {} + sandbox-agent-foundry_backend_root_node_modules: {} + sandbox-agent-foundry_backend_backend_node_modules: {} + sandbox-agent-foundry_backend_shared_node_modules: {} + sandbox-agent-foundry_backend_persist_rivet_node_modules: {} + sandbox-agent-foundry_backend_typescript_node_modules: {} + sandbox-agent-foundry_backend_pnpm_store: {} + sandbox-agent-foundry_git_repos: {} + sandbox-agent-foundry_rivetkit_storage: {} + sandbox-agent-foundry_node_modules: {} + sandbox-agent-foundry_client_node_modules: {} + sandbox-agent-foundry_frontend_errors_node_modules: {} + sandbox-agent-foundry_frontend_node_modules: {} + sandbox-agent-foundry_shared_node_modules: {} + sandbox-agent-foundry_pnpm_store: {} diff --git a/foundry/compose.mock.yaml b/foundry/compose.mock.yaml new file mode 100644 index 0000000..ecee2e1 --- /dev/null +++ b/foundry/compose.mock.yaml @@ -0,0 +1,31 @@ +name: sandbox-agent-foundry-mock + +services: + frontend: + build: + context: .. + dockerfile: foundry/docker/frontend.dev.Dockerfile + working_dir: /app + environment: + HOME: "/tmp" + FOUNDRY_FRONTEND_CLIENT_MODE: "mock" + ports: + - "4174:4173" + volumes: + - "..:/app" + - "./.sandbox-agent-foundry:/app/foundry/.sandbox-agent-foundry" + # Use Linux-native workspace dependencies inside the container instead of host node_modules. + - "sandbox-agent-foundry-mock_node_modules:/app/node_modules" + - "sandbox-agent-foundry-mock_client_node_modules:/app/foundry/packages/client/node_modules" + - "sandbox-agent-foundry-mock_frontend_errors_node_modules:/app/foundry/packages/frontend-errors/node_modules" + - "sandbox-agent-foundry-mock_frontend_node_modules:/app/foundry/packages/frontend/node_modules" + - "sandbox-agent-foundry-mock_shared_node_modules:/app/foundry/packages/shared/node_modules" + - "sandbox-agent-foundry-mock_pnpm_store:/tmp/.local/share/pnpm/store" + +volumes: + sandbox-agent-foundry-mock_node_modules: {} + sandbox-agent-foundry-mock_client_node_modules: {} + sandbox-agent-foundry-mock_frontend_errors_node_modules: {} + sandbox-agent-foundry-mock_frontend_node_modules: {} + sandbox-agent-foundry-mock_shared_node_modules: {} + sandbox-agent-foundry-mock_pnpm_store: {} diff --git a/factory/compose.preview.yaml b/foundry/compose.preview.yaml similarity index 70% rename from factory/compose.preview.yaml rename to foundry/compose.preview.yaml index 01bbe93..e35c396 100644 --- a/factory/compose.preview.yaml +++ b/foundry/compose.preview.yaml @@ -1,16 +1,16 @@ -name: sandbox-agent-factory-preview +name: sandbox-agent-foundry-preview services: backend: build: context: .. dockerfile: quebec/docker/backend.preview.Dockerfile - image: sandbox-agent-factory-backend-preview + image: sandbox-agent-foundry-backend-preview environment: HF_BACKEND_HOST: "0.0.0.0" HF_BACKEND_PORT: "7841" HF_RIVET_MANAGER_PORT: "8850" - RIVETKIT_STORAGE_PATH: "/root/.local/share/sandbox-agent-factory/rivetkit" + RIVETKIT_STORAGE_PATH: "/root/.local/share/sandbox-agent-foundry/rivetkit" ANTHROPIC_API_KEY: "${ANTHROPIC_API_KEY:-}" CLAUDE_API_KEY: "${CLAUDE_API_KEY:-${ANTHROPIC_API_KEY:-}}" OPENAI_API_KEY: "${OPENAI_API_KEY:-}" @@ -26,19 +26,19 @@ services: - "8850:8850" volumes: - "${HOME}/.codex:/root/.codex" - - "sandbox-agent-factory_preview_git_repos:/root/.local/share/sandbox-agent-factory/repos" - - "sandbox-agent-factory_preview_rivetkit_storage:/root/.local/share/sandbox-agent-factory/rivetkit" + - "sandbox-agent-foundry_preview_git_repos:/root/.local/share/sandbox-agent-foundry/repos" + - "sandbox-agent-foundry_preview_rivetkit_storage:/root/.local/share/sandbox-agent-foundry/rivetkit" frontend: build: context: .. dockerfile: quebec/docker/frontend.preview.Dockerfile - image: sandbox-agent-factory-frontend-preview + image: sandbox-agent-foundry-frontend-preview depends_on: - backend ports: - "4273:4273" volumes: - sandbox-agent-factory_preview_git_repos: {} - sandbox-agent-factory_preview_rivetkit_storage: {} + sandbox-agent-foundry_preview_git_repos: {} + sandbox-agent-foundry_preview_rivetkit_storage: {} diff --git a/factory/docker/backend.dev.Dockerfile b/foundry/docker/backend.dev.Dockerfile similarity index 95% rename from factory/docker/backend.dev.Dockerfile rename to foundry/docker/backend.dev.Dockerfile index fb84e70..3a0697d 100644 --- a/factory/docker/backend.dev.Dockerfile +++ b/foundry/docker/backend.dev.Dockerfile @@ -39,4 +39,4 @@ ENV SANDBOX_AGENT_BIN="/root/.local/bin/sandbox-agent" WORKDIR /app -CMD ["bash", "-lc", "git config --global --add safe.directory /app >/dev/null 2>&1 || true; pnpm install --force --frozen-lockfile --filter @sandbox-agent/factory-backend... && exec bun factory/packages/backend/src/index.ts start --host 0.0.0.0 --port 7741"] +CMD ["bash", "-lc", "git config --global --add safe.directory /app >/dev/null 2>&1 || true; pnpm install --force --frozen-lockfile --filter @sandbox-agent/foundry-backend... && exec bun foundry/packages/backend/src/index.ts start --host 0.0.0.0 --port 7741"] diff --git a/factory/docker/backend.preview.Dockerfile b/foundry/docker/backend.preview.Dockerfile similarity index 89% rename from factory/docker/backend.preview.Dockerfile rename to foundry/docker/backend.preview.Dockerfile index abee2a0..89042ef 100644 --- a/factory/docker/backend.preview.Dockerfile +++ b/foundry/docker/backend.preview.Dockerfile @@ -41,8 +41,8 @@ WORKDIR /workspace/quebec COPY quebec /workspace/quebec RUN pnpm install --frozen-lockfile -RUN pnpm --filter @sandbox-agent/factory-shared build -RUN pnpm --filter @sandbox-agent/factory-client build -RUN pnpm --filter @sandbox-agent/factory-backend build +RUN pnpm --filter @sandbox-agent/foundry-shared build +RUN pnpm --filter @sandbox-agent/foundry-client build +RUN pnpm --filter @sandbox-agent/foundry-backend build CMD ["bash", "-lc", "git config --global --add safe.directory /workspace/quebec >/dev/null 2>&1 || true; exec bun packages/backend/dist/index.js start --host 0.0.0.0 --port 7841"] diff --git a/factory/docker/frontend.dev.Dockerfile b/foundry/docker/frontend.dev.Dockerfile similarity index 85% rename from factory/docker/frontend.dev.Dockerfile rename to foundry/docker/frontend.dev.Dockerfile index eb52d2e..3b0d8e4 100644 --- a/factory/docker/frontend.dev.Dockerfile +++ b/foundry/docker/frontend.dev.Dockerfile @@ -8,4 +8,4 @@ RUN npm install -g pnpm@10.28.2 WORKDIR /app -CMD ["bash", "-lc", "pnpm install --force --frozen-lockfile --filter @sandbox-agent/factory-frontend... && cd factory/packages/frontend && exec pnpm vite --host 0.0.0.0 --port 4173"] +CMD ["bash", "-lc", "pnpm install --force --frozen-lockfile --filter @sandbox-agent/foundry-frontend... && cd foundry/packages/frontend && exec pnpm vite --host 0.0.0.0 --port 4173"] diff --git a/factory/docker/frontend.preview.Dockerfile b/foundry/docker/frontend.preview.Dockerfile similarity index 62% rename from factory/docker/frontend.preview.Dockerfile rename to foundry/docker/frontend.preview.Dockerfile index c9ea7f0..d8d338f 100644 --- a/factory/docker/frontend.preview.Dockerfile +++ b/foundry/docker/frontend.preview.Dockerfile @@ -9,10 +9,10 @@ WORKDIR /workspace/quebec COPY quebec /workspace/quebec RUN pnpm install --frozen-lockfile -RUN pnpm --filter @sandbox-agent/factory-shared build -RUN pnpm --filter @sandbox-agent/factory-client build -RUN pnpm --filter @sandbox-agent/factory-frontend-errors build -RUN pnpm --filter @sandbox-agent/factory-frontend build +RUN pnpm --filter @sandbox-agent/foundry-shared build +RUN pnpm --filter @sandbox-agent/foundry-client build +RUN pnpm --filter @sandbox-agent/foundry-frontend-errors build +RUN pnpm --filter @sandbox-agent/foundry-frontend build FROM nginx:1.27-alpine diff --git a/factory/docker/nginx.preview.conf b/foundry/docker/nginx.preview.conf similarity index 100% rename from factory/docker/nginx.preview.conf rename to foundry/docker/nginx.preview.conf diff --git a/factory/e2e/wb-mmilw7yh.txt b/foundry/e2e/wb-mmilw7yh.txt similarity index 100% rename from factory/e2e/wb-mmilw7yh.txt rename to foundry/e2e/wb-mmilw7yh.txt diff --git a/factory/e2e/wb-mmilzdwf.txt b/foundry/e2e/wb-mmilzdwf.txt similarity index 100% rename from factory/e2e/wb-mmilzdwf.txt rename to foundry/e2e/wb-mmilzdwf.txt diff --git a/factory/memory/roadmap.md b/foundry/memory/roadmap.md similarity index 100% rename from factory/memory/roadmap.md rename to foundry/memory/roadmap.md diff --git a/factory/packages/backend/CLAUDE.md b/foundry/packages/backend/CLAUDE.md similarity index 100% rename from factory/packages/backend/CLAUDE.md rename to foundry/packages/backend/CLAUDE.md diff --git a/factory/packages/backend/package.json b/foundry/packages/backend/package.json similarity index 91% rename from factory/packages/backend/package.json rename to foundry/packages/backend/package.json index e4a85f8..23207e1 100644 --- a/factory/packages/backend/package.json +++ b/foundry/packages/backend/package.json @@ -1,5 +1,5 @@ { - "name": "@sandbox-agent/factory-backend", + "name": "@sandbox-agent/foundry-backend", "version": "0.1.0", "private": true, "type": "module", @@ -17,7 +17,7 @@ "@hono/node-server": "^1.19.7", "@hono/node-ws": "^1.3.0", "@iarna/toml": "^2.2.5", - "@sandbox-agent/factory-shared": "workspace:*", + "@sandbox-agent/foundry-shared": "workspace:*", "@sandbox-agent/persist-rivet": "workspace:*", "drizzle-orm": "^0.44.5", "hono": "^4.11.9", diff --git a/factory/packages/backend/src/actors/_scripts/generate-actor-migrations.ts b/foundry/packages/backend/src/actors/_scripts/generate-actor-migrations.ts similarity index 100% rename from factory/packages/backend/src/actors/_scripts/generate-actor-migrations.ts rename to foundry/packages/backend/src/actors/_scripts/generate-actor-migrations.ts diff --git a/factory/packages/backend/src/actors/context.ts b/foundry/packages/backend/src/actors/context.ts similarity index 96% rename from factory/packages/backend/src/actors/context.ts rename to foundry/packages/backend/src/actors/context.ts index 34821b2..de6d404 100644 --- a/factory/packages/backend/src/actors/context.ts +++ b/foundry/packages/backend/src/actors/context.ts @@ -1,4 +1,4 @@ -import type { AppConfig } from "@sandbox-agent/factory-shared"; +import type { AppConfig } from "@sandbox-agent/foundry-shared"; import type { BackendDriver } from "../driver.js"; import type { NotificationService } from "../notifications/index.js"; import type { ProviderRegistry } from "../providers/index.js"; diff --git a/factory/packages/backend/src/actors/events.ts b/foundry/packages/backend/src/actors/events.ts similarity index 96% rename from factory/packages/backend/src/actors/events.ts rename to foundry/packages/backend/src/actors/events.ts index 9722665..ade97ff 100644 --- a/factory/packages/backend/src/actors/events.ts +++ b/foundry/packages/backend/src/actors/events.ts @@ -1,4 +1,4 @@ -import type { TaskStatus, ProviderId } from "@sandbox-agent/factory-shared"; +import type { TaskStatus, ProviderId } from "@sandbox-agent/foundry-shared"; export interface TaskCreatedEvent { workspaceId: string; diff --git a/factory/packages/backend/src/actors/handles.ts b/foundry/packages/backend/src/actors/handles.ts similarity index 98% rename from factory/packages/backend/src/actors/handles.ts rename to foundry/packages/backend/src/actors/handles.ts index acfaee7..af1683c 100644 --- a/factory/packages/backend/src/actors/handles.ts +++ b/foundry/packages/backend/src/actors/handles.ts @@ -8,7 +8,7 @@ import { taskStatusSyncKey, workspaceKey, } from "./keys.js"; -import type { ProviderId } from "@sandbox-agent/factory-shared"; +import type { ProviderId } from "@sandbox-agent/foundry-shared"; export function actorClient(c: any) { return c.client(); diff --git a/factory/packages/backend/src/actors/history/db/db.ts b/foundry/packages/backend/src/actors/history/db/db.ts similarity index 100% rename from factory/packages/backend/src/actors/history/db/db.ts rename to foundry/packages/backend/src/actors/history/db/db.ts diff --git a/factory/packages/backend/src/actors/history/db/drizzle.config.ts b/foundry/packages/backend/src/actors/history/db/drizzle.config.ts similarity index 100% rename from factory/packages/backend/src/actors/history/db/drizzle.config.ts rename to foundry/packages/backend/src/actors/history/db/drizzle.config.ts diff --git a/factory/packages/backend/src/actors/history/db/drizzle/0000_watery_bushwacker.sql b/foundry/packages/backend/src/actors/history/db/drizzle/0000_watery_bushwacker.sql similarity index 100% rename from factory/packages/backend/src/actors/history/db/drizzle/0000_watery_bushwacker.sql rename to foundry/packages/backend/src/actors/history/db/drizzle/0000_watery_bushwacker.sql diff --git a/factory/packages/backend/src/actors/history/db/drizzle/meta/0000_snapshot.json b/foundry/packages/backend/src/actors/history/db/drizzle/meta/0000_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/history/db/drizzle/meta/0000_snapshot.json rename to foundry/packages/backend/src/actors/history/db/drizzle/meta/0000_snapshot.json diff --git a/factory/packages/backend/src/actors/history/db/drizzle/meta/_journal.json b/foundry/packages/backend/src/actors/history/db/drizzle/meta/_journal.json similarity index 100% rename from factory/packages/backend/src/actors/history/db/drizzle/meta/_journal.json rename to foundry/packages/backend/src/actors/history/db/drizzle/meta/_journal.json diff --git a/factory/packages/backend/src/actors/history/db/migrations.ts b/foundry/packages/backend/src/actors/history/db/migrations.ts similarity index 100% rename from factory/packages/backend/src/actors/history/db/migrations.ts rename to foundry/packages/backend/src/actors/history/db/migrations.ts diff --git a/factory/packages/backend/src/actors/history/db/schema.ts b/foundry/packages/backend/src/actors/history/db/schema.ts similarity index 100% rename from factory/packages/backend/src/actors/history/db/schema.ts rename to foundry/packages/backend/src/actors/history/db/schema.ts diff --git a/factory/packages/backend/src/actors/history/index.ts b/foundry/packages/backend/src/actors/history/index.ts similarity index 97% rename from factory/packages/backend/src/actors/history/index.ts rename to foundry/packages/backend/src/actors/history/index.ts index 316d22d..62b02dc 100644 --- a/factory/packages/backend/src/actors/history/index.ts +++ b/foundry/packages/backend/src/actors/history/index.ts @@ -2,7 +2,7 @@ import { and, desc, eq } from "drizzle-orm"; import { actor, queue } from "rivetkit"; import { Loop, workflow } from "rivetkit/workflow"; -import type { HistoryEvent } from "@sandbox-agent/factory-shared"; +import type { HistoryEvent } from "@sandbox-agent/foundry-shared"; import { selfHistory } from "../handles.js"; import { historyDb } from "./db/db.js"; import { events } from "./db/schema.js"; diff --git a/factory/packages/backend/src/actors/index.ts b/foundry/packages/backend/src/actors/index.ts similarity index 100% rename from factory/packages/backend/src/actors/index.ts rename to foundry/packages/backend/src/actors/index.ts diff --git a/factory/packages/backend/src/actors/keys.ts b/foundry/packages/backend/src/actors/keys.ts similarity index 100% rename from factory/packages/backend/src/actors/keys.ts rename to foundry/packages/backend/src/actors/keys.ts diff --git a/factory/packages/backend/src/actors/logging.ts b/foundry/packages/backend/src/actors/logging.ts similarity index 93% rename from factory/packages/backend/src/actors/logging.ts rename to foundry/packages/backend/src/actors/logging.ts index 8f43f72..554da45 100644 --- a/factory/packages/backend/src/actors/logging.ts +++ b/foundry/packages/backend/src/actors/logging.ts @@ -27,5 +27,5 @@ export function logActorWarning( ...(context ?? {}) }; // eslint-disable-next-line no-console - console.warn("[factory][actor:warn]", payload); + console.warn("[foundry][actor:warn]", payload); } diff --git a/factory/packages/backend/src/actors/polling.ts b/foundry/packages/backend/src/actors/polling.ts similarity index 100% rename from factory/packages/backend/src/actors/polling.ts rename to foundry/packages/backend/src/actors/polling.ts diff --git a/factory/packages/backend/src/actors/repo-branch-sync/index.ts b/foundry/packages/backend/src/actors/repo-branch-sync/index.ts similarity index 100% rename from factory/packages/backend/src/actors/repo-branch-sync/index.ts rename to foundry/packages/backend/src/actors/repo-branch-sync/index.ts diff --git a/factory/packages/backend/src/actors/repo-pr-sync/index.ts b/foundry/packages/backend/src/actors/repo-pr-sync/index.ts similarity index 100% rename from factory/packages/backend/src/actors/repo-pr-sync/index.ts rename to foundry/packages/backend/src/actors/repo-pr-sync/index.ts diff --git a/factory/packages/backend/src/actors/repo/actions.ts b/foundry/packages/backend/src/actors/repo/actions.ts similarity index 99% rename from factory/packages/backend/src/actors/repo/actions.ts rename to foundry/packages/backend/src/actors/repo/actions.ts index 5945bd7..d3b02b5 100644 --- a/factory/packages/backend/src/actors/repo/actions.ts +++ b/foundry/packages/backend/src/actors/repo/actions.ts @@ -10,7 +10,7 @@ import type { RepoOverview, RepoStackAction, RepoStackActionResult -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { getActorRuntimeContext } from "../context.js"; import { getTask, @@ -21,7 +21,7 @@ import { selfRepo } from "../handles.js"; import { isActorNotFoundError, logActorWarning, resolveErrorMessage } from "../logging.js"; -import { factoryRepoClonePath } from "../../services/factory-paths.js"; +import { foundryRepoClonePath } from "../../services/foundry-paths.js"; import { expectQueueResponse } from "../../services/queue.js"; import { withRepoGitLock } from "../../services/repo-git-lock.js"; import { branches, taskIndex, prCache, repoMeta } from "./db/schema.js"; @@ -132,7 +132,7 @@ export function repoWorkflowQueueName(name: RepoQueueName): RepoQueueName { async function ensureLocalClone(c: any, remoteUrl: string): Promise { const { config, driver } = getActorRuntimeContext(); - const localPath = factoryRepoClonePath(config, c.state.workspaceId, c.state.repoId); + const localPath = foundryRepoClonePath(config, c.state.workspaceId, c.state.repoId); await driver.git.ensureCloned(remoteUrl, localPath); c.state.localPath = localPath; return localPath; diff --git a/factory/packages/backend/src/actors/repo/db/db.ts b/foundry/packages/backend/src/actors/repo/db/db.ts similarity index 100% rename from factory/packages/backend/src/actors/repo/db/db.ts rename to foundry/packages/backend/src/actors/repo/db/db.ts diff --git a/factory/packages/backend/src/actors/repo/db/drizzle.config.ts b/foundry/packages/backend/src/actors/repo/db/drizzle.config.ts similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle.config.ts rename to foundry/packages/backend/src/actors/repo/db/drizzle.config.ts diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/0000_stormy_the_hunter.sql b/foundry/packages/backend/src/actors/repo/db/drizzle/0000_stormy_the_hunter.sql similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/0000_stormy_the_hunter.sql rename to foundry/packages/backend/src/actors/repo/db/drizzle/0000_stormy_the_hunter.sql diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/0001_wild_carlie_cooper.sql b/foundry/packages/backend/src/actors/repo/db/drizzle/0001_wild_carlie_cooper.sql similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/0001_wild_carlie_cooper.sql rename to foundry/packages/backend/src/actors/repo/db/drizzle/0001_wild_carlie_cooper.sql diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/0002_far_war_machine.sql b/foundry/packages/backend/src/actors/repo/db/drizzle/0002_far_war_machine.sql similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/0002_far_war_machine.sql rename to foundry/packages/backend/src/actors/repo/db/drizzle/0002_far_war_machine.sql diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/0003_busy_legacy.sql b/foundry/packages/backend/src/actors/repo/db/drizzle/0003_busy_legacy.sql similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/0003_busy_legacy.sql rename to foundry/packages/backend/src/actors/repo/db/drizzle/0003_busy_legacy.sql diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/meta/0000_snapshot.json b/foundry/packages/backend/src/actors/repo/db/drizzle/meta/0000_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/meta/0000_snapshot.json rename to foundry/packages/backend/src/actors/repo/db/drizzle/meta/0000_snapshot.json diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/meta/0001_snapshot.json b/foundry/packages/backend/src/actors/repo/db/drizzle/meta/0001_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/meta/0001_snapshot.json rename to foundry/packages/backend/src/actors/repo/db/drizzle/meta/0001_snapshot.json diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/meta/0002_snapshot.json b/foundry/packages/backend/src/actors/repo/db/drizzle/meta/0002_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/meta/0002_snapshot.json rename to foundry/packages/backend/src/actors/repo/db/drizzle/meta/0002_snapshot.json diff --git a/factory/packages/backend/src/actors/repo/db/drizzle/meta/_journal.json b/foundry/packages/backend/src/actors/repo/db/drizzle/meta/_journal.json similarity index 100% rename from factory/packages/backend/src/actors/repo/db/drizzle/meta/_journal.json rename to foundry/packages/backend/src/actors/repo/db/drizzle/meta/_journal.json diff --git a/factory/packages/backend/src/actors/repo/db/migrations.ts b/foundry/packages/backend/src/actors/repo/db/migrations.ts similarity index 100% rename from factory/packages/backend/src/actors/repo/db/migrations.ts rename to foundry/packages/backend/src/actors/repo/db/migrations.ts diff --git a/factory/packages/backend/src/actors/repo/db/schema.ts b/foundry/packages/backend/src/actors/repo/db/schema.ts similarity index 100% rename from factory/packages/backend/src/actors/repo/db/schema.ts rename to foundry/packages/backend/src/actors/repo/db/schema.ts diff --git a/factory/packages/backend/src/actors/repo/index.ts b/foundry/packages/backend/src/actors/repo/index.ts similarity index 100% rename from factory/packages/backend/src/actors/repo/index.ts rename to foundry/packages/backend/src/actors/repo/index.ts diff --git a/factory/packages/backend/src/actors/repo/stack-model.ts b/foundry/packages/backend/src/actors/repo/stack-model.ts similarity index 100% rename from factory/packages/backend/src/actors/repo/stack-model.ts rename to foundry/packages/backend/src/actors/repo/stack-model.ts diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/db.ts b/foundry/packages/backend/src/actors/sandbox-instance/db/db.ts similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/db.ts rename to foundry/packages/backend/src/actors/sandbox-instance/db/db.ts diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/drizzle.config.ts b/foundry/packages/backend/src/actors/sandbox-instance/db/drizzle.config.ts similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/drizzle.config.ts rename to foundry/packages/backend/src/actors/sandbox-instance/db/drizzle.config.ts diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/drizzle/0000_broad_tyrannus.sql b/foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/0000_broad_tyrannus.sql similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/drizzle/0000_broad_tyrannus.sql rename to foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/0000_broad_tyrannus.sql diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/drizzle/0001_sandbox_sessions.sql b/foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/0001_sandbox_sessions.sql similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/drizzle/0001_sandbox_sessions.sql rename to foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/0001_sandbox_sessions.sql diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/0000_snapshot.json b/foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/0000_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/0000_snapshot.json rename to foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/0000_snapshot.json diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/_journal.json b/foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/_journal.json similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/_journal.json rename to foundry/packages/backend/src/actors/sandbox-instance/db/drizzle/meta/_journal.json diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/migrations.ts b/foundry/packages/backend/src/actors/sandbox-instance/db/migrations.ts similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/migrations.ts rename to foundry/packages/backend/src/actors/sandbox-instance/db/migrations.ts diff --git a/factory/packages/backend/src/actors/sandbox-instance/db/schema.ts b/foundry/packages/backend/src/actors/sandbox-instance/db/schema.ts similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/db/schema.ts rename to foundry/packages/backend/src/actors/sandbox-instance/db/schema.ts diff --git a/factory/packages/backend/src/actors/sandbox-instance/index.ts b/foundry/packages/backend/src/actors/sandbox-instance/index.ts similarity index 99% rename from factory/packages/backend/src/actors/sandbox-instance/index.ts rename to foundry/packages/backend/src/actors/sandbox-instance/index.ts index 5a53647..3bb10c7 100644 --- a/factory/packages/backend/src/actors/sandbox-instance/index.ts +++ b/foundry/packages/backend/src/actors/sandbox-instance/index.ts @@ -2,7 +2,7 @@ import { setTimeout as delay } from "node:timers/promises"; import { eq } from "drizzle-orm"; import { actor, queue } from "rivetkit"; import { Loop, workflow } from "rivetkit/workflow"; -import type { ProviderId } from "@sandbox-agent/factory-shared"; +import type { ProviderId } from "@sandbox-agent/foundry-shared"; import type { SessionEvent, SessionRecord } from "sandbox-agent"; import { sandboxInstanceDb } from "./db/db.js"; import { sandboxInstance as sandboxInstanceTable } from "./db/schema.js"; diff --git a/factory/packages/backend/src/actors/sandbox-instance/persist.ts b/foundry/packages/backend/src/actors/sandbox-instance/persist.ts similarity index 100% rename from factory/packages/backend/src/actors/sandbox-instance/persist.ts rename to foundry/packages/backend/src/actors/sandbox-instance/persist.ts diff --git a/factory/packages/backend/src/actors/task-status-sync/index.ts b/foundry/packages/backend/src/actors/task-status-sync/index.ts similarity index 98% rename from factory/packages/backend/src/actors/task-status-sync/index.ts rename to foundry/packages/backend/src/actors/task-status-sync/index.ts index 3ceec50..d4d3fa8 100644 --- a/factory/packages/backend/src/actors/task-status-sync/index.ts +++ b/foundry/packages/backend/src/actors/task-status-sync/index.ts @@ -1,6 +1,6 @@ import { actor, queue } from "rivetkit"; import { workflow } from "rivetkit/workflow"; -import type { ProviderId } from "@sandbox-agent/factory-shared"; +import type { ProviderId } from "@sandbox-agent/foundry-shared"; import { getTask, getSandboxInstance, selfTaskStatusSync } from "../handles.js"; import { logActorWarning, resolveErrorMessage, resolveErrorStack } from "../logging.js"; import { type PollingControlState, runWorkflowPollingLoop } from "../polling.js"; diff --git a/factory/packages/backend/src/actors/task/db/db.ts b/foundry/packages/backend/src/actors/task/db/db.ts similarity index 100% rename from factory/packages/backend/src/actors/task/db/db.ts rename to foundry/packages/backend/src/actors/task/db/db.ts diff --git a/factory/packages/backend/src/actors/task/db/drizzle.config.ts b/foundry/packages/backend/src/actors/task/db/drizzle.config.ts similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle.config.ts rename to foundry/packages/backend/src/actors/task/db/drizzle.config.ts diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0000_condemned_maria_hill.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0000_condemned_maria_hill.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0000_condemned_maria_hill.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0000_condemned_maria_hill.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0001_rapid_eddie_brock.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0001_rapid_eddie_brock.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0001_rapid_eddie_brock.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0001_rapid_eddie_brock.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0002_lazy_moira_mactaggert.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0002_lazy_moira_mactaggert.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0002_lazy_moira_mactaggert.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0002_lazy_moira_mactaggert.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0003_plucky_bran.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0003_plucky_bran.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0003_plucky_bran.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0003_plucky_bran.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0004_focused_shuri.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0004_focused_shuri.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0004_focused_shuri.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0004_focused_shuri.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0005_sandbox_actor_id.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0005_sandbox_actor_id.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0005_sandbox_actor_id.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0005_sandbox_actor_id.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/0006_workbench_sessions.sql b/foundry/packages/backend/src/actors/task/db/drizzle/0006_workbench_sessions.sql similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/0006_workbench_sessions.sql rename to foundry/packages/backend/src/actors/task/db/drizzle/0006_workbench_sessions.sql diff --git a/factory/packages/backend/src/actors/task/db/drizzle/meta/0000_snapshot.json b/foundry/packages/backend/src/actors/task/db/drizzle/meta/0000_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/meta/0000_snapshot.json rename to foundry/packages/backend/src/actors/task/db/drizzle/meta/0000_snapshot.json diff --git a/factory/packages/backend/src/actors/task/db/drizzle/meta/0001_snapshot.json b/foundry/packages/backend/src/actors/task/db/drizzle/meta/0001_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/meta/0001_snapshot.json rename to foundry/packages/backend/src/actors/task/db/drizzle/meta/0001_snapshot.json diff --git a/factory/packages/backend/src/actors/task/db/drizzle/meta/0002_snapshot.json b/foundry/packages/backend/src/actors/task/db/drizzle/meta/0002_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/meta/0002_snapshot.json rename to foundry/packages/backend/src/actors/task/db/drizzle/meta/0002_snapshot.json diff --git a/factory/packages/backend/src/actors/task/db/drizzle/meta/_journal.json b/foundry/packages/backend/src/actors/task/db/drizzle/meta/_journal.json similarity index 100% rename from factory/packages/backend/src/actors/task/db/drizzle/meta/_journal.json rename to foundry/packages/backend/src/actors/task/db/drizzle/meta/_journal.json diff --git a/factory/packages/backend/src/actors/task/db/migrations.ts b/foundry/packages/backend/src/actors/task/db/migrations.ts similarity index 100% rename from factory/packages/backend/src/actors/task/db/migrations.ts rename to foundry/packages/backend/src/actors/task/db/migrations.ts diff --git a/factory/packages/backend/src/actors/task/db/schema.ts b/foundry/packages/backend/src/actors/task/db/schema.ts similarity index 100% rename from factory/packages/backend/src/actors/task/db/schema.ts rename to foundry/packages/backend/src/actors/task/db/schema.ts diff --git a/factory/packages/backend/src/actors/task/index.ts b/foundry/packages/backend/src/actors/task/index.ts similarity index 99% rename from factory/packages/backend/src/actors/task/index.ts rename to foundry/packages/backend/src/actors/task/index.ts index e1518c2..0aaced3 100644 --- a/factory/packages/backend/src/actors/task/index.ts +++ b/foundry/packages/backend/src/actors/task/index.ts @@ -10,7 +10,7 @@ import type { TaskWorkbenchSendMessageInput, TaskWorkbenchUpdateDraftInput, ProviderId -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { expectQueueResponse } from "../../services/queue.js"; import { selfTask } from "../handles.js"; import { taskDb } from "./db/db.js"; diff --git a/factory/packages/backend/src/actors/task/workbench.ts b/foundry/packages/backend/src/actors/task/workbench.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workbench.ts rename to foundry/packages/backend/src/actors/task/workbench.ts diff --git a/factory/packages/backend/src/actors/task/workflow/commands.ts b/foundry/packages/backend/src/actors/task/workflow/commands.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workflow/commands.ts rename to foundry/packages/backend/src/actors/task/workflow/commands.ts diff --git a/factory/packages/backend/src/actors/task/workflow/common.ts b/foundry/packages/backend/src/actors/task/workflow/common.ts similarity index 98% rename from factory/packages/backend/src/actors/task/workflow/common.ts rename to foundry/packages/backend/src/actors/task/workflow/common.ts index 8e5450a..159f022 100644 --- a/factory/packages/backend/src/actors/task/workflow/common.ts +++ b/foundry/packages/backend/src/actors/task/workflow/common.ts @@ -1,6 +1,6 @@ // @ts-nocheck import { eq } from "drizzle-orm"; -import type { TaskRecord, TaskStatus } from "@sandbox-agent/factory-shared"; +import type { TaskRecord, TaskStatus } from "@sandbox-agent/foundry-shared"; import { getOrCreateWorkspace } from "../../handles.js"; import { task as taskTable, taskRuntime, taskSandboxes } from "../db/schema.js"; import { historyKey } from "../../keys.js"; diff --git a/factory/packages/backend/src/actors/task/workflow/index.ts b/foundry/packages/backend/src/actors/task/workflow/index.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workflow/index.ts rename to foundry/packages/backend/src/actors/task/workflow/index.ts diff --git a/factory/packages/backend/src/actors/task/workflow/init.ts b/foundry/packages/backend/src/actors/task/workflow/init.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workflow/init.ts rename to foundry/packages/backend/src/actors/task/workflow/init.ts diff --git a/factory/packages/backend/src/actors/task/workflow/push.ts b/foundry/packages/backend/src/actors/task/workflow/push.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workflow/push.ts rename to foundry/packages/backend/src/actors/task/workflow/push.ts diff --git a/factory/packages/backend/src/actors/task/workflow/queue.ts b/foundry/packages/backend/src/actors/task/workflow/queue.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workflow/queue.ts rename to foundry/packages/backend/src/actors/task/workflow/queue.ts diff --git a/factory/packages/backend/src/actors/task/workflow/status-sync.ts b/foundry/packages/backend/src/actors/task/workflow/status-sync.ts similarity index 100% rename from factory/packages/backend/src/actors/task/workflow/status-sync.ts rename to foundry/packages/backend/src/actors/task/workflow/status-sync.ts diff --git a/factory/packages/backend/src/actors/workspace/actions.ts b/foundry/packages/backend/src/actors/workspace/actions.ts similarity index 99% rename from factory/packages/backend/src/actors/workspace/actions.ts rename to foundry/packages/backend/src/actors/workspace/actions.ts index 1a78ddd..5f81265 100644 --- a/factory/packages/backend/src/actors/workspace/actions.ts +++ b/foundry/packages/backend/src/actors/workspace/actions.ts @@ -31,7 +31,7 @@ import type { TaskWorkbenchCreateTaskInput, TaskWorkbenchSnapshot, WorkspaceUseInput -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { getActorRuntimeContext } from "../context.js"; import { getTask, getOrCreateHistory, getOrCreateRepo, selfWorkspace } from "../handles.js"; import { logActorWarning, resolveErrorMessage } from "../logging.js"; diff --git a/factory/packages/backend/src/actors/workspace/app-shell.ts b/foundry/packages/backend/src/actors/workspace/app-shell.ts similarity index 96% rename from factory/packages/backend/src/actors/workspace/app-shell.ts rename to foundry/packages/backend/src/actors/workspace/app-shell.ts index c5b9bc2..8f35e68 100644 --- a/factory/packages/backend/src/actors/workspace/app-shell.ts +++ b/foundry/packages/backend/src/actors/workspace/app-shell.ts @@ -2,14 +2,14 @@ import { desc, eq } from "drizzle-orm"; import { randomUUID } from "node:crypto"; import type { - FactoryAppSnapshot, - FactoryBillingPlanId, - FactoryBillingState, - FactoryOrganization, - FactoryOrganizationMember, - FactoryUser, - UpdateFactoryOrganizationProfileInput, -} from "@sandbox-agent/factory-shared"; + FoundryAppSnapshot, + FoundryBillingPlanId, + FoundryBillingState, + FoundryOrganization, + FoundryOrganizationMember, + FoundryUser, + UpdateFoundryOrganizationProfileInput, +} from "@sandbox-agent/foundry-shared"; import { getActorRuntimeContext } from "../context.js"; import { getOrCreateWorkspace } from "../handles.js"; import { GitHubAppError } from "../../services/app-github.js"; @@ -53,7 +53,7 @@ function personalWorkspaceId(login: string): string { return `personal-${slugify(login)}`; } -function organizationWorkspaceId(kind: FactoryOrganization["kind"], login: string): string { +function organizationWorkspaceId(kind: FoundryOrganization["kind"], login: string): string { return kind === "personal" ? personalWorkspaceId(login) : slugify(login); } @@ -95,7 +95,7 @@ function decodeOauthState(value: string): { sessionId: string; nonce: string } { }; } -function seatsIncludedForPlan(planId: FactoryBillingPlanId): number { +function seatsIncludedForPlan(planId: FoundryBillingPlanId): number { switch (planId) { case "free": return 1; @@ -107,7 +107,7 @@ function seatsIncludedForPlan(planId: FactoryBillingPlanId): number { function stripeStatusToBillingStatus( stripeStatus: string, cancelAtPeriodEnd: boolean, -): FactoryBillingState["status"] { +): FoundryBillingState["status"] { if (cancelAtPeriodEnd) { return "scheduled_cancel"; } @@ -124,7 +124,7 @@ function formatUnixDate(value: number): string { return new Date(value * 1000).toISOString().slice(0, 10); } -function legacyRepoImportStatusToGithubSyncStatus(value: string | null | undefined): FactoryOrganization["github"]["syncStatus"] { +function legacyRepoImportStatusToGithubSyncStatus(value: string | null | undefined): FoundryOrganization["github"]["syncStatus"] { switch (value) { case "ready": return "synced"; @@ -230,12 +230,12 @@ async function getOrganizationState(workspace: any) { return await workspace.getOrganizationShellState({}); } -async function buildAppSnapshot(c: any, sessionId: string): Promise { +async function buildAppSnapshot(c: any, sessionId: string): Promise { assertAppWorkspace(c); const session = await requireAppSessionRow(c, sessionId); const eligibleOrganizationIds = parseEligibleOrganizationIds(session.eligibleOrganizationIdsJson); - const organizations: FactoryOrganization[] = []; + const organizations: FoundryOrganization[] = []; for (const organizationId of eligibleOrganizationIds) { try { const workspace = await getOrCreateWorkspace(c, organizationId); @@ -249,7 +249,7 @@ async function buildAppSnapshot(c: any, sessionId: string): Promise { +async function listOrganizationMembers(c: any): Promise { assertOrganizationWorkspace(c); const rows = await c.db .select() @@ -499,7 +499,7 @@ async function listOrganizationSeatAssignments(c: any): Promise { return rows.map((row) => row.email); } -async function listOrganizationInvoices(c: any): Promise { +async function listOrganizationInvoices(c: any): Promise { assertOrganizationWorkspace(c); const rows = await c.db .select() @@ -591,7 +591,7 @@ async function applySubscriptionState( trialEnd: number | null; defaultPaymentMethodLabel: string; }, - fallbackPlanId: FactoryBillingPlanId, + fallbackPlanId: FoundryBillingPlanId, ): Promise { await workspace.applyOrganizationStripeSubscription({ subscription, @@ -605,7 +605,7 @@ export const workspaceAppActions = { return { sessionId }; }, - async getAppSnapshot(c: any, input: { sessionId: string }): Promise { + async getAppSnapshot(c: any, input: { sessionId: string }): Promise { return await buildAppSnapshot(c, input.sessionId); }, @@ -651,7 +651,7 @@ export const workspaceAppActions = { return await syncGithubSessionFromToken(c, sessionId, input.accessToken); }, - async signOutApp(c: any, input: { sessionId: string }): Promise { + async signOutApp(c: any, input: { sessionId: string }): Promise { assertAppWorkspace(c); const sessionId = await ensureAppSession(c, input.sessionId); await updateAppSession(c, sessionId, { @@ -670,7 +670,7 @@ export const workspaceAppActions = { return await buildAppSnapshot(c, sessionId); }, - async selectAppOrganization(c: any, input: { sessionId: string; organizationId: string }): Promise { + async selectAppOrganization(c: any, input: { sessionId: string; organizationId: string }): Promise { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); requireEligibleOrganization(session, input.organizationId); @@ -688,8 +688,8 @@ export const workspaceAppActions = { async updateAppOrganizationProfile( c: any, - input: { sessionId: string; organizationId: string } & UpdateFactoryOrganizationProfileInput, - ): Promise { + input: { sessionId: string; organizationId: string } & UpdateFoundryOrganizationProfileInput, + ): Promise { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); requireEligibleOrganization(session, input.organizationId); @@ -702,7 +702,7 @@ export const workspaceAppActions = { return await buildAppSnapshot(c, input.sessionId); }, - async triggerAppRepoImport(c: any, input: { sessionId: string; organizationId: string }): Promise { + async triggerAppRepoImport(c: any, input: { sessionId: string; organizationId: string }): Promise { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); requireEligibleOrganization(session, input.organizationId); @@ -753,7 +753,7 @@ export const workspaceAppActions = { const organization = await getOrganizationState(workspace); if (organization.snapshot.kind !== "organization") { return { - url: `${appShell.appUrl}/workspaces/${input.organizationId}?factorySession=${encodeURIComponent(input.sessionId)}`, + url: `${appShell.appUrl}/workspaces/${input.organizationId}?foundrySession=${encodeURIComponent(input.sessionId)}`, }; } return { @@ -763,7 +763,7 @@ export const workspaceAppActions = { async createAppCheckoutSession( c: any, - input: { sessionId: string; organizationId: string; planId: FactoryBillingPlanId }, + input: { sessionId: string; organizationId: string; planId: FoundryBillingPlanId }, ): Promise<{ url: string }> { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); @@ -775,7 +775,7 @@ export const workspaceAppActions = { if (input.planId === "free") { await workspace.applyOrganizationFreePlan({ clearSubscription: false }); return { - url: `${appShell.appUrl}/organizations/${input.organizationId}/billing?factorySession=${encodeURIComponent(input.sessionId)}`, + url: `${appShell.appUrl}/organizations/${input.organizationId}/billing?foundrySession=${encodeURIComponent(input.sessionId)}`, }; } @@ -804,8 +804,8 @@ export const workspaceAppActions = { planId: input.planId, successUrl: `${appShell.appUrl}/api/rivet/app/billing/checkout/complete?organizationId=${encodeURIComponent( input.organizationId, - )}&factorySession=${encodeURIComponent(input.sessionId)}&session_id={CHECKOUT_SESSION_ID}`, - cancelUrl: `${appShell.appUrl}/organizations/${input.organizationId}/billing?factorySession=${encodeURIComponent(input.sessionId)}`, + )}&foundrySession=${encodeURIComponent(input.sessionId)}&session_id={CHECKOUT_SESSION_ID}`, + cancelUrl: `${appShell.appUrl}/organizations/${input.organizationId}/billing?foundrySession=${encodeURIComponent(input.sessionId)}`, }).then((checkout) => checkout.url), }; }, @@ -837,7 +837,7 @@ export const workspaceAppActions = { } return { - redirectTo: `${appShell.appUrl}/organizations/${input.organizationId}/billing?factorySession=${encodeURIComponent(input.sessionId)}`, + redirectTo: `${appShell.appUrl}/organizations/${input.organizationId}/billing?foundrySession=${encodeURIComponent(input.sessionId)}`, }; }, @@ -856,12 +856,12 @@ export const workspaceAppActions = { } const portal = await appShell.stripe.createPortalSession({ customerId: organization.stripeCustomerId, - returnUrl: `${appShell.appUrl}/organizations/${input.organizationId}/billing?factorySession=${encodeURIComponent(input.sessionId)}`, + returnUrl: `${appShell.appUrl}/organizations/${input.organizationId}/billing?foundrySession=${encodeURIComponent(input.sessionId)}`, }); return { url: portal.url }; }, - async cancelAppScheduledRenewal(c: any, input: { sessionId: string; organizationId: string }): Promise { + async cancelAppScheduledRenewal(c: any, input: { sessionId: string; organizationId: string }): Promise { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); requireEligibleOrganization(session, input.organizationId); @@ -880,7 +880,7 @@ export const workspaceAppActions = { return await buildAppSnapshot(c, input.sessionId); }, - async resumeAppSubscription(c: any, input: { sessionId: string; organizationId: string }): Promise { + async resumeAppSubscription(c: any, input: { sessionId: string; organizationId: string }): Promise { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); requireEligibleOrganization(session, input.organizationId); @@ -899,7 +899,7 @@ export const workspaceAppActions = { return await buildAppSnapshot(c, input.sessionId); }, - async recordAppSeatUsage(c: any, input: { sessionId: string; workspaceId: string }): Promise { + async recordAppSeatUsage(c: any, input: { sessionId: string; workspaceId: string }): Promise { assertAppWorkspace(c); const session = await requireSignedInSession(c, input.sessionId); requireEligibleOrganization(session, input.workspaceId); @@ -997,7 +997,7 @@ export const workspaceAppActions = { return { ok: true }; } - const kind: FactoryOrganization["kind"] = accountType === "User" ? "personal" : "organization"; + const kind: FoundryOrganization["kind"] = accountType === "User" ? "personal" : "organization"; const organizationId = organizationWorkspaceId(kind, accountLogin); if (event === "installation" && (body.action === "created" || body.action === "deleted" || body.action === "suspend" || body.action === "unsuspend")) { @@ -1049,7 +1049,7 @@ export const workspaceAppActions = { githubAccountId: string; githubLogin: string; githubAccountType: string; - kind: FactoryOrganization["kind"]; + kind: FoundryOrganization["kind"]; displayName: string; installationId: number | null; appConfigured: boolean; @@ -1176,7 +1176,7 @@ export const workspaceAppActions = { async updateOrganizationShellProfile( c: any, - input: Pick, + input: Pick, ): Promise { assertOrganizationWorkspace(c); const existing = await requireOrganizationProfileRow(c); @@ -1209,7 +1209,7 @@ export const workspaceAppActions = { c: any, input: { repositories: Array<{ fullName: string; cloneUrl: string; private: boolean }>; - installationStatus: FactoryOrganization["github"]["installationStatus"]; + installationStatus: FoundryOrganization["github"]["installationStatus"]; lastSyncLabel: string; }, ): Promise { @@ -1249,7 +1249,7 @@ export const workspaceAppActions = { async markOrganizationSyncFailed( c: any, - input: { message: string; installationStatus: FactoryOrganization["github"]["installationStatus"] }, + input: { message: string; installationStatus: FoundryOrganization["github"]["installationStatus"] }, ): Promise { assertOrganizationWorkspace(c); await c.db @@ -1289,7 +1289,7 @@ export const workspaceAppActions = { trialEnd: number | null; defaultPaymentMethodLabel: string; }; - fallbackPlanId: FactoryBillingPlanId; + fallbackPlanId: FoundryBillingPlanId; }, ): Promise { assertOrganizationWorkspace(c); @@ -1347,7 +1347,7 @@ export const workspaceAppActions = { .run(); }, - async setOrganizationBillingStatus(c: any, input: { status: FactoryBillingState["status"] }): Promise { + async setOrganizationBillingStatus(c: any, input: { status: FoundryBillingState["status"] }): Promise { assertOrganizationWorkspace(c); await c.db .update(organizationProfile) diff --git a/factory/packages/backend/src/actors/workspace/db/db.ts b/foundry/packages/backend/src/actors/workspace/db/db.ts similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/db.ts rename to foundry/packages/backend/src/actors/workspace/db/db.ts diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle.config.ts b/foundry/packages/backend/src/actors/workspace/db/drizzle.config.ts similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle.config.ts rename to foundry/packages/backend/src/actors/workspace/db/drizzle.config.ts diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/0000_rare_iron_man.sql b/foundry/packages/backend/src/actors/workspace/db/drizzle/0000_rare_iron_man.sql similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/0000_rare_iron_man.sql rename to foundry/packages/backend/src/actors/workspace/db/drizzle/0000_rare_iron_man.sql diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/0001_sleepy_lady_deathstrike.sql b/foundry/packages/backend/src/actors/workspace/db/drizzle/0001_sleepy_lady_deathstrike.sql similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/0001_sleepy_lady_deathstrike.sql rename to foundry/packages/backend/src/actors/workspace/db/drizzle/0001_sleepy_lady_deathstrike.sql diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/0002_tiny_silver_surfer.sql b/foundry/packages/backend/src/actors/workspace/db/drizzle/0002_tiny_silver_surfer.sql similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/0002_tiny_silver_surfer.sql rename to foundry/packages/backend/src/actors/workspace/db/drizzle/0002_tiny_silver_surfer.sql diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/0009_github_sync_status.sql b/foundry/packages/backend/src/actors/workspace/db/drizzle/0009_github_sync_status.sql similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/0009_github_sync_status.sql rename to foundry/packages/backend/src/actors/workspace/db/drizzle/0009_github_sync_status.sql diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/meta/0000_snapshot.json b/foundry/packages/backend/src/actors/workspace/db/drizzle/meta/0000_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/meta/0000_snapshot.json rename to foundry/packages/backend/src/actors/workspace/db/drizzle/meta/0000_snapshot.json diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/meta/0001_snapshot.json b/foundry/packages/backend/src/actors/workspace/db/drizzle/meta/0001_snapshot.json similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/meta/0001_snapshot.json rename to foundry/packages/backend/src/actors/workspace/db/drizzle/meta/0001_snapshot.json diff --git a/factory/packages/backend/src/actors/workspace/db/drizzle/meta/_journal.json b/foundry/packages/backend/src/actors/workspace/db/drizzle/meta/_journal.json similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/drizzle/meta/_journal.json rename to foundry/packages/backend/src/actors/workspace/db/drizzle/meta/_journal.json diff --git a/factory/packages/backend/src/actors/workspace/db/migrations.ts b/foundry/packages/backend/src/actors/workspace/db/migrations.ts similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/migrations.ts rename to foundry/packages/backend/src/actors/workspace/db/migrations.ts diff --git a/factory/packages/backend/src/actors/workspace/db/schema.ts b/foundry/packages/backend/src/actors/workspace/db/schema.ts similarity index 100% rename from factory/packages/backend/src/actors/workspace/db/schema.ts rename to foundry/packages/backend/src/actors/workspace/db/schema.ts diff --git a/factory/packages/backend/src/actors/workspace/index.ts b/foundry/packages/backend/src/actors/workspace/index.ts similarity index 100% rename from factory/packages/backend/src/actors/workspace/index.ts rename to foundry/packages/backend/src/actors/workspace/index.ts diff --git a/factory/packages/backend/src/config/backend.ts b/foundry/packages/backend/src/config/backend.ts similarity index 87% rename from factory/packages/backend/src/config/backend.ts rename to foundry/packages/backend/src/config/backend.ts index 4c1bd18..b213ca8 100644 --- a/factory/packages/backend/src/config/backend.ts +++ b/foundry/packages/backend/src/config/backend.ts @@ -2,9 +2,9 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; import { dirname } from "node:path"; import { homedir } from "node:os"; import * as toml from "@iarna/toml"; -import { ConfigSchema, type AppConfig } from "@sandbox-agent/factory-shared"; +import { ConfigSchema, type AppConfig } from "@sandbox-agent/foundry-shared"; -export const CONFIG_PATH = `${homedir()}/.config/sandbox-agent-factory/config.toml`; +export const CONFIG_PATH = `${homedir()}/.config/sandbox-agent-foundry/config.toml`; export function loadConfig(path = CONFIG_PATH): AppConfig { if (!existsSync(path)) { diff --git a/factory/packages/backend/src/config/env.ts b/foundry/packages/backend/src/config/env.ts similarity index 97% rename from factory/packages/backend/src/config/env.ts rename to foundry/packages/backend/src/config/env.ts index 1e55ca8..3875a59 100644 --- a/factory/packages/backend/src/config/env.ts +++ b/foundry/packages/backend/src/config/env.ts @@ -2,7 +2,7 @@ import { existsSync, readFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; const DEVELOPMENT_ENV_FILES = [".env.development.local", ".env.development"] as const; -const LOCAL_DEV_BETTER_AUTH_SECRET = "sandbox-agent-factory-development-only-change-me"; +const LOCAL_DEV_BETTER_AUTH_SECRET = "sandbox-agent-foundry-development-only-change-me"; const LOCAL_DEV_APP_URL = "http://localhost:4173"; function decodeQuotedEnvValue(value: string): string { diff --git a/factory/packages/backend/src/config/workspace.ts b/foundry/packages/backend/src/config/workspace.ts similarity index 85% rename from factory/packages/backend/src/config/workspace.ts rename to foundry/packages/backend/src/config/workspace.ts index 4937bdc..2225200 100644 --- a/factory/packages/backend/src/config/workspace.ts +++ b/foundry/packages/backend/src/config/workspace.ts @@ -1,4 +1,4 @@ -import type { AppConfig } from "@sandbox-agent/factory-shared"; +import type { AppConfig } from "@sandbox-agent/foundry-shared"; export function defaultWorkspace(config: AppConfig): string { const ws = config.workspace.default.trim(); diff --git a/factory/packages/backend/src/db/actor-sqlite.ts b/foundry/packages/backend/src/db/actor-sqlite.ts similarity index 97% rename from factory/packages/backend/src/db/actor-sqlite.ts rename to foundry/packages/backend/src/db/actor-sqlite.ts index 0d955c7..8a165bc 100644 --- a/factory/packages/backend/src/db/actor-sqlite.ts +++ b/foundry/packages/backend/src/db/actor-sqlite.ts @@ -36,7 +36,7 @@ export interface ActorSqliteDbOptions> { /** * Override base directory for per-actor SQLite files. * - * Default: `/.sandbox-agent-factory/backend/sqlite` + * Default: `/.sandbox-agent-foundry/backend/sqlite` */ baseDir?: string; } @@ -60,7 +60,7 @@ export function actorSqliteDb>( }) as unknown as DatabaseProvider; } - const baseDir = options.baseDir ?? join(process.cwd(), ".sandbox-agent-factory", "backend", "sqlite"); + const baseDir = options.baseDir ?? join(process.cwd(), ".sandbox-agent-foundry", "backend", "sqlite"); return { createClient: async (ctx) => { // Keep Bun-only module out of Vitest/Vite's static import graph. diff --git a/factory/packages/backend/src/driver.ts b/foundry/packages/backend/src/driver.ts similarity index 100% rename from factory/packages/backend/src/driver.ts rename to foundry/packages/backend/src/driver.ts diff --git a/factory/packages/backend/src/index.ts b/foundry/packages/backend/src/index.ts similarity index 96% rename from factory/packages/backend/src/index.ts rename to foundry/packages/backend/src/index.ts index fb4a1f3..b72e2ca 100644 --- a/factory/packages/backend/src/index.ts +++ b/foundry/packages/backend/src/index.ts @@ -9,7 +9,7 @@ import { createBackends, createNotificationService } from "./notifications/index import { createDefaultDriver } from "./driver.js"; import { createProviderRegistry } from "./providers/index.js"; import { createClient } from "rivetkit/client"; -import type { FactoryBillingPlanId } from "@sandbox-agent/factory-shared"; +import type { FoundryBillingPlanId } from "@sandbox-agent/foundry-shared"; import { createDefaultAppShellServices } from "./services/app-shell-runtime.js"; import { APP_SHELL_WORKSPACE_ID } from "./actors/workspace/app-shell.js"; @@ -82,9 +82,9 @@ export async function startBackend(options: BackendStartOptions = {}): Promise => { - const requested = c.req.header("x-factory-session"); + const requested = c.req.header("x-foundry-session"); const { sessionId } = await (await appWorkspace()).ensureAppSession({ requestedSessionId: requested ?? null, }); - c.header("x-factory-session", sessionId); + c.header("x-foundry-session", sessionId); return sessionId; }; @@ -137,7 +137,7 @@ export async function startBackend(options: BackendStartOptions = {}): Promise { const sessionId = await resolveSessionId(c); const body = await c.req.json().catch(() => ({})); - const planId = body?.planId === "free" || body?.planId === "team" ? (body.planId as FactoryBillingPlanId) : "team"; + const planId = body?.planId === "free" || body?.planId === "team" ? (body.planId as FoundryBillingPlanId) : "team"; return c.json( await (await appWorkspace()).createAppCheckoutSession({ sessionId, @@ -205,7 +205,7 @@ export async function startBackend(options: BackendStartOptions = {}): Promise { const organizationId = c.req.query("organizationId"); - const sessionId = c.req.query("factorySession"); + const sessionId = c.req.query("foundrySession"); const checkoutSessionId = c.req.query("session_id"); if (!organizationId || !sessionId || !checkoutSessionId) { return c.text("Missing Stripe checkout completion parameters", 400); diff --git a/factory/packages/backend/src/integrations/daytona/client.ts b/foundry/packages/backend/src/integrations/daytona/client.ts similarity index 100% rename from factory/packages/backend/src/integrations/daytona/client.ts rename to foundry/packages/backend/src/integrations/daytona/client.ts diff --git a/factory/packages/backend/src/integrations/git-spice/index.ts b/foundry/packages/backend/src/integrations/git-spice/index.ts similarity index 100% rename from factory/packages/backend/src/integrations/git-spice/index.ts rename to foundry/packages/backend/src/integrations/git-spice/index.ts diff --git a/factory/packages/backend/src/integrations/git/index.test.ts b/foundry/packages/backend/src/integrations/git/index.test.ts similarity index 91% rename from factory/packages/backend/src/integrations/git/index.test.ts rename to foundry/packages/backend/src/integrations/git/index.test.ts index 19b0eca..ee64120 100644 --- a/factory/packages/backend/src/integrations/git/index.test.ts +++ b/foundry/packages/backend/src/integrations/git/index.test.ts @@ -21,19 +21,19 @@ describe("mock github remotes", () => { it("validates and clones onboarding repos through a local bare mirror", async () => { const suffix = randomUUID().slice(0, 8); const remoteUrl = `mockgithub://vitest-${suffix}/demo-repo`; - const clonePath = join(tmpdir(), `factory-clone-${suffix}`); + const clonePath = join(tmpdir(), `foundry-clone-${suffix}`); const barePath = resolve( homedir(), ".local", "share", - "sandbox-agent-factory", + "sandbox-agent-foundry", "mock-remotes", `vitest-${suffix}`, "demo-repo.git", ); cleanupPaths.add(clonePath); - cleanupPaths.add(resolve(homedir(), ".local", "share", "sandbox-agent-factory", "mock-remotes", `vitest-${suffix}`)); + cleanupPaths.add(resolve(homedir(), ".local", "share", "sandbox-agent-foundry", "mock-remotes", `vitest-${suffix}`)); await validateRemote(remoteUrl); await ensureCloned(remoteUrl, clonePath); diff --git a/factory/packages/backend/src/integrations/git/index.ts b/foundry/packages/backend/src/integrations/git/index.ts similarity index 97% rename from factory/packages/backend/src/integrations/git/index.ts rename to foundry/packages/backend/src/integrations/git/index.ts index 4c6ba04..2b0fd47 100644 --- a/factory/packages/backend/src/integrations/git/index.ts +++ b/foundry/packages/backend/src/integrations/git/index.ts @@ -30,7 +30,7 @@ function ensureAskpassScript(): string { return cachedAskpassPath; } - const dir = mkdtempSync(resolve(tmpdir(), "factory-git-askpass-")); + const dir = mkdtempSync(resolve(tmpdir(), "foundry-git-askpass-")); const path = resolve(dir, "askpass.sh"); // Git invokes $GIT_ASKPASS with the prompt string as argv[1]. Provide both username and password. @@ -95,7 +95,7 @@ function resolveMockRemote(remoteUrl: string): MockRemoteDescriptor | null { return null; } - const barePath = resolve(homedir(), ".local", "share", "sandbox-agent-factory", "mock-remotes", owner, `${repo}.git`); + const barePath = resolve(homedir(), ".local", "share", "sandbox-agent-foundry", "mock-remotes", owner, `${repo}.git`); return { owner, repo, @@ -119,7 +119,7 @@ async function ensureMockRemote(remoteUrl: string): Promise/dev/null || echo main)"; fi`, - `git config user.email "factory@local" >/dev/null 2>&1 || true`, - `git config user.name "Sandbox Agent Factory" >/dev/null 2>&1 || true`, + `git config user.email "foundry@local" >/dev/null 2>&1 || true`, + `git config user.name "Sandbox Agent Foundry" >/dev/null 2>&1 || true`, ].join("; ") )}` ].join(" "), @@ -294,12 +294,12 @@ export class DaytonaProvider implements SandboxProvider { client.getSandbox(req.sandboxId) ); const labels = info.labels ?? {}; - const workspaceId = labels["factory.workspace"] ?? req.workspaceId; - const repoId = labels["factory.repo_id"] ?? ""; - const taskId = labels["factory.task"] ?? ""; + const workspaceId = labels["foundry.workspace"] ?? req.workspaceId; + const repoId = labels["foundry.repo_id"] ?? ""; + const taskId = labels["foundry.task"] ?? ""; const cwd = repoId && taskId - ? `/home/daytona/sandbox-agent-factory/${workspaceId}/${repoId}/${taskId}/repo` + ? `/home/daytona/sandbox-agent-foundry/${workspaceId}/${repoId}/${taskId}/repo` : null; return { diff --git a/factory/packages/backend/src/providers/index.ts b/foundry/packages/backend/src/providers/index.ts similarity index 94% rename from factory/packages/backend/src/providers/index.ts rename to foundry/packages/backend/src/providers/index.ts index ad0f725..8a82fde 100644 --- a/factory/packages/backend/src/providers/index.ts +++ b/foundry/packages/backend/src/providers/index.ts @@ -1,5 +1,5 @@ -import type { ProviderId } from "@sandbox-agent/factory-shared"; -import type { AppConfig } from "@sandbox-agent/factory-shared"; +import type { ProviderId } from "@sandbox-agent/foundry-shared"; +import type { AppConfig } from "@sandbox-agent/foundry-shared"; import type { BackendDriver } from "../driver.js"; import { DaytonaProvider } from "./daytona/index.js"; import { LocalProvider } from "./local/index.js"; diff --git a/factory/packages/backend/src/providers/local/index.ts b/foundry/packages/backend/src/providers/local/index.ts similarity index 99% rename from factory/packages/backend/src/providers/local/index.ts rename to foundry/packages/backend/src/providers/local/index.ts index 9662049..74bd789 100644 --- a/factory/packages/backend/src/providers/local/index.ts +++ b/foundry/packages/backend/src/providers/local/index.ts @@ -77,7 +77,7 @@ export class LocalProvider implements SandboxProvider { private rootDir(): string { return expandHome( - this.config.rootDir?.trim() || "~/.local/share/sandbox-agent-factory/local-sandboxes", + this.config.rootDir?.trim() || "~/.local/share/sandbox-agent-foundry/local-sandboxes", ); } diff --git a/factory/packages/backend/src/providers/provider-api/index.ts b/foundry/packages/backend/src/providers/provider-api/index.ts similarity index 97% rename from factory/packages/backend/src/providers/provider-api/index.ts rename to foundry/packages/backend/src/providers/provider-api/index.ts index ee5a383..c772b46 100644 --- a/factory/packages/backend/src/providers/provider-api/index.ts +++ b/foundry/packages/backend/src/providers/provider-api/index.ts @@ -1,4 +1,4 @@ -import type { ProviderId } from "@sandbox-agent/factory-shared"; +import type { ProviderId } from "@sandbox-agent/foundry-shared"; export interface ProviderCapabilities { remote: boolean; diff --git a/factory/packages/backend/src/services/app-github.ts b/foundry/packages/backend/src/services/app-github.ts similarity index 100% rename from factory/packages/backend/src/services/app-github.ts rename to foundry/packages/backend/src/services/app-github.ts diff --git a/factory/packages/backend/src/services/app-shell-runtime.ts b/foundry/packages/backend/src/services/app-shell-runtime.ts similarity index 95% rename from factory/packages/backend/src/services/app-shell-runtime.ts rename to foundry/packages/backend/src/services/app-shell-runtime.ts index 40fd89f..6416663 100644 --- a/factory/packages/backend/src/services/app-shell-runtime.ts +++ b/foundry/packages/backend/src/services/app-shell-runtime.ts @@ -1,6 +1,6 @@ import { GitHubAppClient, type GitHubInstallationRecord, type GitHubOAuthSession, type GitHubOrgIdentity, type GitHubRepositoryRecord, type GitHubViewerIdentity, type GitHubWebhookEvent } from "./app-github.js"; import { StripeAppClient, type StripeCheckoutCompletion, type StripeCheckoutSession, type StripePortalSession, type StripeSubscriptionSnapshot, type StripeWebhookEvent } from "./app-stripe.js"; -import type { FactoryBillingPlanId } from "@sandbox-agent/factory-shared"; +import type { FoundryBillingPlanId } from "@sandbox-agent/foundry-shared"; export type AppShellGithubClient = Pick< GitHubAppClient, @@ -64,5 +64,5 @@ export type { StripePortalSession, StripeSubscriptionSnapshot, StripeWebhookEvent, - FactoryBillingPlanId, + FoundryBillingPlanId, }; diff --git a/factory/packages/backend/src/services/app-stripe.ts b/foundry/packages/backend/src/services/app-stripe.ts similarity index 96% rename from factory/packages/backend/src/services/app-stripe.ts rename to foundry/packages/backend/src/services/app-stripe.ts index 936c64d..15dcb09 100644 --- a/factory/packages/backend/src/services/app-stripe.ts +++ b/foundry/packages/backend/src/services/app-stripe.ts @@ -1,5 +1,5 @@ import { createHmac, timingSafeEqual } from "node:crypto"; -import type { FactoryBillingPlanId } from "@sandbox-agent/factory-shared"; +import type { FoundryBillingPlanId } from "@sandbox-agent/foundry-shared"; export class StripeAppError extends Error { readonly status: number; @@ -34,7 +34,7 @@ export interface StripeSubscriptionSnapshot { export interface StripeCheckoutCompletion { customerId: string | null; subscriptionId: string | null; - planId: FactoryBillingPlanId | null; + planId: FoundryBillingPlanId | null; paymentMethodLabel: string; } @@ -74,7 +74,7 @@ export class StripeAppClient { organizationId: string; customerId: string; customerEmail: string | null; - planId: Exclude; + planId: Exclude; successUrl: string; cancelUrl: string; }): Promise { @@ -185,14 +185,14 @@ export class StripeAppClient { return JSON.parse(payload) as StripeWebhookEvent; } - planIdForPriceId(priceId: string): FactoryBillingPlanId | null { + planIdForPriceId(priceId: string): FoundryBillingPlanId | null { if (priceId === this.teamPriceId) { return "team"; } return null; } - priceIdForPlan(planId: Exclude): string { + priceIdForPlan(planId: Exclude): string { const priceId = this.teamPriceId; if (!priceId) { throw new StripeAppError(`Stripe price ID is not configured for ${planId}`, 500); @@ -255,7 +255,7 @@ export class StripeAppClient { } } -function planIdFromMetadata(metadata: unknown): FactoryBillingPlanId | null { +function planIdFromMetadata(metadata: unknown): FoundryBillingPlanId | null { if (!metadata || typeof metadata !== "object") { return null; } diff --git a/factory/packages/backend/src/services/create-flow.ts b/foundry/packages/backend/src/services/create-flow.ts similarity index 100% rename from factory/packages/backend/src/services/create-flow.ts rename to foundry/packages/backend/src/services/create-flow.ts diff --git a/factory/packages/backend/src/services/factory-paths.ts b/foundry/packages/backend/src/services/foundry-paths.ts similarity index 67% rename from factory/packages/backend/src/services/factory-paths.ts rename to foundry/packages/backend/src/services/foundry-paths.ts index 25d41ef..017fbc3 100644 --- a/factory/packages/backend/src/services/factory-paths.ts +++ b/foundry/packages/backend/src/services/foundry-paths.ts @@ -1,4 +1,4 @@ -import type { AppConfig } from "@sandbox-agent/factory-shared"; +import type { AppConfig } from "@sandbox-agent/foundry-shared"; import { homedir } from "node:os"; import { dirname, join, resolve } from "node:path"; @@ -9,17 +9,17 @@ function expandPath(input: string): string { return input; } -export function factoryDataDir(config: AppConfig): string { +export function foundryDataDir(config: AppConfig): string { // Keep data collocated with the backend DB by default. const dbPath = expandPath(config.backend.dbPath); return resolve(dirname(dbPath)); } -export function factoryRepoClonePath( +export function foundryRepoClonePath( config: AppConfig, workspaceId: string, repoId: string ): string { - return resolve(join(factoryDataDir(config), "repos", workspaceId, repoId)); + return resolve(join(foundryDataDir(config), "repos", workspaceId, repoId)); } diff --git a/factory/packages/backend/src/services/queue.ts b/foundry/packages/backend/src/services/queue.ts similarity index 100% rename from factory/packages/backend/src/services/queue.ts rename to foundry/packages/backend/src/services/queue.ts diff --git a/factory/packages/backend/src/services/repo-git-lock.ts b/foundry/packages/backend/src/services/repo-git-lock.ts similarity index 100% rename from factory/packages/backend/src/services/repo-git-lock.ts rename to foundry/packages/backend/src/services/repo-git-lock.ts diff --git a/factory/packages/backend/src/services/repo.test.ts b/foundry/packages/backend/src/services/repo.test.ts similarity index 100% rename from factory/packages/backend/src/services/repo.test.ts rename to foundry/packages/backend/src/services/repo.test.ts diff --git a/factory/packages/backend/src/services/repo.ts b/foundry/packages/backend/src/services/repo.ts similarity index 100% rename from factory/packages/backend/src/services/repo.ts rename to foundry/packages/backend/src/services/repo.ts diff --git a/factory/packages/backend/src/services/tmux.ts b/foundry/packages/backend/src/services/tmux.ts similarity index 100% rename from factory/packages/backend/src/services/tmux.ts rename to foundry/packages/backend/src/services/tmux.ts diff --git a/factory/packages/backend/test/app-state.test.ts b/foundry/packages/backend/test/app-state.test.ts similarity index 99% rename from factory/packages/backend/test/app-state.test.ts rename to foundry/packages/backend/test/app-state.test.ts index ffe207a..a1de24a 100644 --- a/factory/packages/backend/test/app-state.test.ts +++ b/foundry/packages/backend/test/app-state.test.ts @@ -123,7 +123,7 @@ describe("app shell actors", () => { code: "oauth-code", state, }); - expect(callback.redirectTo).toContain("factorySession="); + expect(callback.redirectTo).toContain("foundrySession="); const snapshot = await app.selectAppOrganization({ sessionId, diff --git a/factory/packages/backend/test/config-env.test.ts b/foundry/packages/backend/test/config-env.test.ts similarity index 90% rename from factory/packages/backend/test/config-env.test.ts rename to foundry/packages/backend/test/config-env.test.ts index 8633ffd..2d83bf5 100644 --- a/factory/packages/backend/test/config-env.test.ts +++ b/foundry/packages/backend/test/config-env.test.ts @@ -34,7 +34,7 @@ describe("development env loading", () => { }); test("loads .env.development only in development", () => { - const dir = mkdtempSync(join(tmpdir(), "factory-env-")); + const dir = mkdtempSync(join(tmpdir(), "foundry-env-")); writeFileSync(join(dir, ".env.development"), "APP_URL=http://localhost:4999\n", "utf8"); process.env.NODE_ENV = "development"; @@ -47,8 +47,8 @@ describe("development env loading", () => { }); test("walks parent directories to find repo-level development env files", () => { - const dir = mkdtempSync(join(tmpdir(), "factory-env-")); - const nested = join(dir, "factory", "packages", "backend"); + const dir = mkdtempSync(join(tmpdir(), "foundry-env-")); + const nested = join(dir, "foundry", "packages", "backend"); mkdirSync(nested, { recursive: true }); writeFileSync(join(dir, ".env.development.local"), "APP_URL=http://localhost:4888\n", "utf8"); @@ -62,7 +62,7 @@ describe("development env loading", () => { }); test("skips dotenv files outside development", () => { - const dir = mkdtempSync(join(tmpdir(), "factory-env-")); + const dir = mkdtempSync(join(tmpdir(), "foundry-env-")); writeFileSync(join(dir, ".env.development"), "APP_URL=http://localhost:4999\n", "utf8"); process.env.NODE_ENV = "production"; @@ -85,12 +85,12 @@ describe("development env loading", () => { expect(process.env.APP_URL).toBe("http://localhost:4173"); expect(process.env.BETTER_AUTH_URL).toBe("http://localhost:4173"); - expect(process.env.BETTER_AUTH_SECRET).toBe("sandbox-agent-factory-development-only-change-me"); + expect(process.env.BETTER_AUTH_SECRET).toBe("sandbox-agent-foundry-development-only-change-me"); expect(process.env.GITHUB_REDIRECT_URI).toBe("http://localhost:4173/api/rivet/app/auth/github/callback"); }); test("decodes escaped newlines for quoted env values", () => { - const dir = mkdtempSync(join(tmpdir(), "factory-env-")); + const dir = mkdtempSync(join(tmpdir(), "foundry-env-")); writeFileSync( join(dir, ".env.development"), 'GITHUB_APP_PRIVATE_KEY="line-1\\nline-2\\n"\n', diff --git a/factory/packages/backend/test/create-flow.test.ts b/foundry/packages/backend/test/create-flow.test.ts similarity index 100% rename from factory/packages/backend/test/create-flow.test.ts rename to foundry/packages/backend/test/create-flow.test.ts diff --git a/factory/packages/backend/test/daytona-provider.test.ts b/foundry/packages/backend/test/daytona-provider.test.ts similarity index 97% rename from factory/packages/backend/test/daytona-provider.test.ts rename to foundry/packages/backend/test/daytona-provider.test.ts index 21fc014..66cd94b 100644 --- a/factory/packages/backend/test/daytona-provider.test.ts +++ b/foundry/packages/backend/test/daytona-provider.test.ts @@ -12,7 +12,7 @@ class RecordingDaytonaClient implements DaytonaClientLike { return { id: "sandbox-1", state: "started", - snapshot: "snapshot-factory", + snapshot: "snapshot-foundry", labels: {}, }; } @@ -21,7 +21,7 @@ class RecordingDaytonaClient implements DaytonaClientLike { return { id: sandboxId, state: "started", - snapshot: "snapshot-factory", + snapshot: "snapshot-foundry", labels: {}, }; } @@ -92,9 +92,9 @@ describe("daytona provider snapshot image behavior", () => { expect(commands).toContain("GIT_TERMINAL_PROMPT=0"); expect(commands).toContain("GIT_ASKPASS=/bin/echo"); - expect(handle.metadata.snapshot).toBe("snapshot-factory"); + expect(handle.metadata.snapshot).toBe("snapshot-foundry"); expect(handle.metadata.image).toBe("ubuntu:24.04"); - expect(handle.metadata.cwd).toBe("/home/daytona/sandbox-agent-factory/default/repo-1/task-1/repo"); + expect(handle.metadata.cwd).toBe("/home/daytona/sandbox-agent-foundry/default/repo-1/task-1/repo"); expect(client.executedCommands.length).toBeGreaterThan(0); }); diff --git a/factory/packages/backend/test/git-spice.test.ts b/foundry/packages/backend/test/git-spice.test.ts similarity index 100% rename from factory/packages/backend/test/git-spice.test.ts rename to foundry/packages/backend/test/git-spice.test.ts diff --git a/factory/packages/backend/test/git-validate-remote.test.ts b/foundry/packages/backend/test/git-validate-remote.test.ts similarity index 98% rename from factory/packages/backend/test/git-validate-remote.test.ts rename to foundry/packages/backend/test/git-validate-remote.test.ts index 4cea828..47849a2 100644 --- a/factory/packages/backend/test/git-validate-remote.test.ts +++ b/foundry/packages/backend/test/git-validate-remote.test.ts @@ -27,7 +27,7 @@ describe("validateRemote", () => { mkdirSync(brokenRepoDir, { recursive: true }); writeFileSync(resolve(brokenRepoDir, ".git"), "gitdir: /definitely/missing/worktree\n", "utf8"); await execFileAsync("git", ["init", remoteRepoDir]); - await execFileAsync("git", ["-C", remoteRepoDir, "config", "user.name", "Factory Test"]); + await execFileAsync("git", ["-C", remoteRepoDir, "config", "user.name", "Foundry Test"]); await execFileAsync("git", ["-C", remoteRepoDir, "config", "user.email", "test@example.com"]); writeFileSync(resolve(remoteRepoDir, "README.md"), "# test\n", "utf8"); await execFileAsync("git", ["-C", remoteRepoDir, "add", "README.md"]); diff --git a/factory/packages/backend/test/helpers/test-context.ts b/foundry/packages/backend/test/helpers/test-context.ts similarity index 95% rename from factory/packages/backend/test/helpers/test-context.ts rename to foundry/packages/backend/test/helpers/test-context.ts index cadc743..21ec933 100644 --- a/factory/packages/backend/test/helpers/test-context.ts +++ b/foundry/packages/backend/test/helpers/test-context.ts @@ -1,6 +1,6 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; -import { ConfigSchema, type AppConfig } from "@sandbox-agent/factory-shared"; +import { ConfigSchema, type AppConfig } from "@sandbox-agent/foundry-shared"; import type { BackendDriver } from "../../src/driver.js"; import { initActorRuntimeContext } from "../../src/actors/context.js"; import { createProviderRegistry } from "../../src/providers/index.js"; diff --git a/factory/packages/backend/test/helpers/test-driver.ts b/foundry/packages/backend/test/helpers/test-driver.ts similarity index 100% rename from factory/packages/backend/test/helpers/test-driver.ts rename to foundry/packages/backend/test/helpers/test-driver.ts diff --git a/factory/packages/backend/test/keys.test.ts b/foundry/packages/backend/test/keys.test.ts similarity index 100% rename from factory/packages/backend/test/keys.test.ts rename to foundry/packages/backend/test/keys.test.ts diff --git a/factory/packages/backend/test/malformed-uri.test.ts b/foundry/packages/backend/test/malformed-uri.test.ts similarity index 100% rename from factory/packages/backend/test/malformed-uri.test.ts rename to foundry/packages/backend/test/malformed-uri.test.ts diff --git a/factory/packages/backend/test/providers.test.ts b/foundry/packages/backend/test/providers.test.ts similarity index 90% rename from factory/packages/backend/test/providers.test.ts rename to foundry/packages/backend/test/providers.test.ts index 839cc61..9bafcce 100644 --- a/factory/packages/backend/test/providers.test.ts +++ b/foundry/packages/backend/test/providers.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { ConfigSchema, type AppConfig } from "@sandbox-agent/factory-shared"; +import { ConfigSchema, type AppConfig } from "@sandbox-agent/foundry-shared"; import { createProviderRegistry } from "../src/providers/index.js"; function makeConfig(): AppConfig { @@ -10,7 +10,7 @@ function makeConfig(): AppConfig { backend: { host: "127.0.0.1", port: 7741, - dbPath: "~/.local/share/sandbox-agent-factory/task.db", + dbPath: "~/.local/share/sandbox-agent-foundry/task.db", opencode_poll_interval: 2, github_poll_interval: 30, backup_interval_secs: 3600, diff --git a/factory/packages/backend/test/repo-normalize.test.ts b/foundry/packages/backend/test/repo-normalize.test.ts similarity index 64% rename from factory/packages/backend/test/repo-normalize.test.ts rename to foundry/packages/backend/test/repo-normalize.test.ts index 5314d95..b137eee 100644 --- a/factory/packages/backend/test/repo-normalize.test.ts +++ b/foundry/packages/backend/test/repo-normalize.test.ts @@ -3,41 +3,41 @@ import { normalizeRemoteUrl, repoIdFromRemote } from "../src/services/repo.js"; describe("normalizeRemoteUrl", () => { test("accepts GitHub shorthand owner/repo", () => { - expect(normalizeRemoteUrl("rivet-dev/sandbox-agent-factory")).toBe( - "https://github.com/rivet-dev/sandbox-agent-factory.git" + expect(normalizeRemoteUrl("rivet-dev/sandbox-agent-foundry")).toBe( + "https://github.com/rivet-dev/sandbox-agent-foundry.git" ); }); test("accepts github.com/owner/repo without scheme", () => { - expect(normalizeRemoteUrl("github.com/rivet-dev/sandbox-agent-factory")).toBe( - "https://github.com/rivet-dev/sandbox-agent-factory.git" + expect(normalizeRemoteUrl("github.com/rivet-dev/sandbox-agent-foundry")).toBe( + "https://github.com/rivet-dev/sandbox-agent-foundry.git" ); }); test("canonicalizes GitHub repo URLs without .git", () => { - expect(normalizeRemoteUrl("https://github.com/rivet-dev/sandbox-agent-factory")).toBe( - "https://github.com/rivet-dev/sandbox-agent-factory.git" + expect(normalizeRemoteUrl("https://github.com/rivet-dev/sandbox-agent-foundry")).toBe( + "https://github.com/rivet-dev/sandbox-agent-foundry.git" ); }); test("canonicalizes GitHub non-clone URLs (e.g. /tree/main)", () => { - expect(normalizeRemoteUrl("https://github.com/rivet-dev/sandbox-agent-factory/tree/main")).toBe( - "https://github.com/rivet-dev/sandbox-agent-factory.git" + expect(normalizeRemoteUrl("https://github.com/rivet-dev/sandbox-agent-foundry/tree/main")).toBe( + "https://github.com/rivet-dev/sandbox-agent-foundry.git" ); }); test("does not rewrite scp-style ssh remotes", () => { - expect(normalizeRemoteUrl("git@github.com:rivet-dev/sandbox-agent-factory.git")).toBe( - "git@github.com:rivet-dev/sandbox-agent-factory.git" + expect(normalizeRemoteUrl("git@github.com:rivet-dev/sandbox-agent-foundry.git")).toBe( + "git@github.com:rivet-dev/sandbox-agent-foundry.git" ); }); }); describe("repoIdFromRemote", () => { test("repoId is stable across equivalent GitHub inputs", () => { - const a = repoIdFromRemote("rivet-dev/sandbox-agent-factory"); - const b = repoIdFromRemote("https://github.com/rivet-dev/sandbox-agent-factory.git"); - const c = repoIdFromRemote("https://github.com/rivet-dev/sandbox-agent-factory/tree/main"); + const a = repoIdFromRemote("rivet-dev/sandbox-agent-foundry"); + const b = repoIdFromRemote("https://github.com/rivet-dev/sandbox-agent-foundry.git"); + const c = repoIdFromRemote("https://github.com/rivet-dev/sandbox-agent-foundry/tree/main"); expect(a).toBe(b); expect(b).toBe(c); }); diff --git a/factory/packages/backend/test/sandbox-instance-persist.test.ts b/foundry/packages/backend/test/sandbox-instance-persist.test.ts similarity index 100% rename from factory/packages/backend/test/sandbox-instance-persist.test.ts rename to foundry/packages/backend/test/sandbox-instance-persist.test.ts diff --git a/factory/packages/backend/test/setup.ts b/foundry/packages/backend/test/setup.ts similarity index 100% rename from factory/packages/backend/test/setup.ts rename to foundry/packages/backend/test/setup.ts diff --git a/factory/packages/backend/test/stack-model.test.ts b/foundry/packages/backend/test/stack-model.test.ts similarity index 100% rename from factory/packages/backend/test/stack-model.test.ts rename to foundry/packages/backend/test/stack-model.test.ts diff --git a/factory/packages/backend/test/workbench-unread.test.ts b/foundry/packages/backend/test/workbench-unread.test.ts similarity index 100% rename from factory/packages/backend/test/workbench-unread.test.ts rename to foundry/packages/backend/test/workbench-unread.test.ts diff --git a/factory/packages/backend/test/workspace-isolation.test.ts b/foundry/packages/backend/test/workspace-isolation.test.ts similarity index 97% rename from factory/packages/backend/test/workspace-isolation.test.ts rename to foundry/packages/backend/test/workspace-isolation.test.ts index 12eb925..87e9d1d 100644 --- a/factory/packages/backend/test/workspace-isolation.test.ts +++ b/foundry/packages/backend/test/workspace-isolation.test.ts @@ -17,7 +17,7 @@ function createRepo(): { repoPath: string } { const repoPath = mkdtempSync(join(tmpdir(), "hf-isolation-repo-")); execFileSync("git", ["init"], { cwd: repoPath }); execFileSync("git", ["config", "user.email", "test@example.com"], { cwd: repoPath }); - execFileSync("git", ["config", "user.name", "Factory Test"], { cwd: repoPath }); + execFileSync("git", ["config", "user.name", "Foundry Test"], { cwd: repoPath }); writeFileSync(join(repoPath, "README.md"), "hello\n", "utf8"); execFileSync("git", ["add", "README.md"], { cwd: repoPath }); execFileSync("git", ["commit", "-m", "init"], { cwd: repoPath }); diff --git a/factory/packages/backend/tmp-decode-actors.mjs b/foundry/packages/backend/tmp-decode-actors.mjs similarity index 95% rename from factory/packages/backend/tmp-decode-actors.mjs rename to foundry/packages/backend/tmp-decode-actors.mjs index 5f9c36c..7b5fbeb 100644 --- a/factory/packages/backend/tmp-decode-actors.mjs +++ b/foundry/packages/backend/tmp-decode-actors.mjs @@ -20,7 +20,7 @@ function locationToNames(entry, names) { } for (const t of targets) { - const db = new Database(`/root/.local/share/sandbox-agent-factory/rivetkit/databases/${t.actorId}.db`, { readonly: true }); + const db = new Database(`/root/.local/share/sandbox-agent-foundry/rivetkit/databases/${t.actorId}.db`, { readonly: true }); const token = new TextDecoder().decode(db.query("SELECT value FROM kv WHERE hex(key)=?").get("03").value); await new Promise((resolve, reject) => { diff --git a/factory/packages/backend/tmp-dump-wfkeys.mjs b/foundry/packages/backend/tmp-dump-wfkeys.mjs similarity index 88% rename from factory/packages/backend/tmp-dump-wfkeys.mjs rename to foundry/packages/backend/tmp-dump-wfkeys.mjs index b38b6bc..76dadd0 100644 --- a/factory/packages/backend/tmp-dump-wfkeys.mjs +++ b/foundry/packages/backend/tmp-dump-wfkeys.mjs @@ -1,6 +1,6 @@ import { Database } from "bun:sqlite"; -const db = new Database("/root/.local/share/sandbox-agent-factory/rivetkit/databases/2e443238457137bf.db", { readonly: true }); +const db = new Database("/root/.local/share/sandbox-agent-foundry/rivetkit/databases/2e443238457137bf.db", { readonly: true }); const rows = db.query("SELECT hex(key) as k, value as v FROM kv WHERE hex(key) LIKE ? ORDER BY key").all("07%"); const out = rows.map((r) => { const bytes = new Uint8Array(r.v); diff --git a/factory/packages/backend/tmp-inspect-deep.mjs b/foundry/packages/backend/tmp-inspect-deep.mjs similarity index 98% rename from factory/packages/backend/tmp-inspect-deep.mjs rename to foundry/packages/backend/tmp-inspect-deep.mjs index d2541b0..1ee2ee7 100644 --- a/factory/packages/backend/tmp-inspect-deep.mjs +++ b/foundry/packages/backend/tmp-inspect-deep.mjs @@ -9,7 +9,7 @@ import { decodeReadRangeWire } from "/rivet-handoff-fixes/rivetkit-typescript/pa import { readRangeWireToOtlp } from "/rivet-handoff-fixes/rivetkit-typescript/packages/traces/src/read-range.ts"; const actorId = "2e443238457137bf"; -const db = new Database(`/root/.local/share/sandbox-agent-factory/rivetkit/databases/${actorId}.db`, { readonly: true }); +const db = new Database(`/root/.local/share/sandbox-agent-foundry/rivetkit/databases/${actorId}.db`, { readonly: true }); const row = db.query("SELECT value FROM kv WHERE hex(key)=?").get("03"); const token = new TextDecoder().decode(row.value); diff --git a/factory/packages/backend/tmp-inspect-stuck.mjs b/foundry/packages/backend/tmp-inspect-stuck.mjs similarity index 95% rename from factory/packages/backend/tmp-inspect-stuck.mjs rename to foundry/packages/backend/tmp-inspect-stuck.mjs index e219436..20d7c37 100644 --- a/factory/packages/backend/tmp-inspect-stuck.mjs +++ b/foundry/packages/backend/tmp-inspect-stuck.mjs @@ -14,7 +14,7 @@ function decodeAscii(u8) { } for (const actorId of actorIds) { - const dbPath = `/root/.local/share/sandbox-agent-factory/rivetkit/databases/${actorId}.db`; + const dbPath = `/root/.local/share/sandbox-agent-foundry/rivetkit/databases/${actorId}.db`; const db = new Database(dbPath, { readonly: true }); const wfStateRow = db.query("SELECT value FROM kv WHERE hex(key)=?").get("0715041501"); diff --git a/factory/packages/backend/tmp-inspect-workflow.mjs b/foundry/packages/backend/tmp-inspect-workflow.mjs similarity index 95% rename from factory/packages/backend/tmp-inspect-workflow.mjs rename to foundry/packages/backend/tmp-inspect-workflow.mjs index af76bf8..991e0b1 100644 --- a/factory/packages/backend/tmp-inspect-workflow.mjs +++ b/foundry/packages/backend/tmp-inspect-workflow.mjs @@ -3,7 +3,7 @@ import { TO_CLIENT_VERSIONED, decodeWorkflowHistoryTransport } from "rivetkit/in import util from "node:util"; const actorId = "2e443238457137bf"; -const db = new Database(`/root/.local/share/sandbox-agent-factory/rivetkit/databases/${actorId}.db`, { readonly: true }); +const db = new Database(`/root/.local/share/sandbox-agent-foundry/rivetkit/databases/${actorId}.db`, { readonly: true }); const row = db.query("SELECT value FROM kv WHERE hex(key) = ?").get("03"); const token = new TextDecoder().decode(row.value); diff --git a/factory/packages/backend/tsconfig.json b/foundry/packages/backend/tsconfig.json similarity index 100% rename from factory/packages/backend/tsconfig.json rename to foundry/packages/backend/tsconfig.json diff --git a/factory/packages/backend/vitest.config.ts b/foundry/packages/backend/vitest.config.ts similarity index 100% rename from factory/packages/backend/vitest.config.ts rename to foundry/packages/backend/vitest.config.ts diff --git a/factory/packages/client/package.json b/foundry/packages/client/package.json similarity index 93% rename from factory/packages/client/package.json rename to foundry/packages/client/package.json index b824cf3..30983aa 100644 --- a/factory/packages/client/package.json +++ b/foundry/packages/client/package.json @@ -1,5 +1,5 @@ { - "name": "@sandbox-agent/factory-client", + "name": "@sandbox-agent/foundry-client", "version": "0.1.0", "private": true, "type": "module", @@ -45,7 +45,7 @@ "test:e2e:workbench-load": "HF_ENABLE_DAEMON_WORKBENCH_LOAD_E2E=1 vitest run test/e2e/workbench-load-e2e.test.ts" }, "dependencies": { - "@sandbox-agent/factory-shared": "workspace:*", + "@sandbox-agent/foundry-shared": "workspace:*", "rivetkit": "2.1.6" }, "devDependencies": { diff --git a/factory/packages/client/src/app-client.ts b/foundry/packages/client/src/app-client.ts similarity index 56% rename from factory/packages/client/src/app-client.ts rename to foundry/packages/client/src/app-client.ts index 09e5d8a..1649637 100644 --- a/factory/packages/client/src/app-client.ts +++ b/foundry/packages/client/src/app-client.ts @@ -1,23 +1,23 @@ import type { - FactoryAppSnapshot, - FactoryBillingPlanId, - FactoryOrganization, - FactoryUser, - UpdateFactoryOrganizationProfileInput, -} from "@sandbox-agent/factory-shared"; + FoundryAppSnapshot, + FoundryBillingPlanId, + FoundryOrganization, + FoundryUser, + UpdateFoundryOrganizationProfileInput, +} from "@sandbox-agent/foundry-shared"; import type { BackendClient } from "./backend-client.js"; -import { getMockFactoryAppClient } from "./mock-app.js"; -import { createRemoteFactoryAppClient } from "./remote/app-client.js"; +import { getMockFoundryAppClient } from "./mock-app.js"; +import { createRemoteFoundryAppClient } from "./remote/app-client.js"; -export interface FactoryAppClient { - getSnapshot(): FactoryAppSnapshot; +export interface FoundryAppClient { + getSnapshot(): FoundryAppSnapshot; subscribe(listener: () => void): () => void; signInWithGithub(userId?: string): Promise; signOut(): Promise; selectOrganization(organizationId: string): Promise; - updateOrganizationProfile(input: UpdateFactoryOrganizationProfileInput): Promise; + updateOrganizationProfile(input: UpdateFoundryOrganizationProfileInput): Promise; triggerGithubSync(organizationId: string): Promise; - completeHostedCheckout(organizationId: string, planId: FactoryBillingPlanId): Promise; + completeHostedCheckout(organizationId: string, planId: FoundryBillingPlanId): Promise; openBillingPortal(organizationId: string): Promise; cancelScheduledRenewal(organizationId: string): Promise; resumeSubscription(organizationId: string): Promise; @@ -25,37 +25,37 @@ export interface FactoryAppClient { recordSeatUsage(workspaceId: string): Promise; } -export interface CreateFactoryAppClientOptions { +export interface CreateFoundryAppClientOptions { mode: "mock" | "remote"; backend?: BackendClient; } -export function createFactoryAppClient(options: CreateFactoryAppClientOptions): FactoryAppClient { +export function createFoundryAppClient(options: CreateFoundryAppClientOptions): FoundryAppClient { if (options.mode === "mock") { - return getMockFactoryAppClient() as unknown as FactoryAppClient; + return getMockFoundryAppClient() as unknown as FoundryAppClient; } if (!options.backend) { throw new Error("Remote app client requires a backend client"); } - return createRemoteFactoryAppClient({ backend: options.backend }); + return createRemoteFoundryAppClient({ backend: options.backend }); } -export function currentFactoryUser(snapshot: FactoryAppSnapshot): FactoryUser | null { +export function currentFoundryUser(snapshot: FoundryAppSnapshot): FoundryUser | null { if (!snapshot.auth.currentUserId) { return null; } return snapshot.users.find((candidate) => candidate.id === snapshot.auth.currentUserId) ?? null; } -export function currentFactoryOrganization(snapshot: FactoryAppSnapshot): FactoryOrganization | null { +export function currentFoundryOrganization(snapshot: FoundryAppSnapshot): FoundryOrganization | null { if (!snapshot.activeOrganizationId) { return null; } return snapshot.organizations.find((candidate) => candidate.id === snapshot.activeOrganizationId) ?? null; } -export function eligibleFactoryOrganizations(snapshot: FactoryAppSnapshot): FactoryOrganization[] { - const user = currentFactoryUser(snapshot); +export function eligibleFoundryOrganizations(snapshot: FoundryAppSnapshot): FoundryOrganization[] { + const user = currentFoundryUser(snapshot); if (!user) { return []; } diff --git a/factory/packages/client/src/backend-client.ts b/foundry/packages/client/src/backend-client.ts similarity index 94% rename from factory/packages/client/src/backend-client.ts rename to foundry/packages/client/src/backend-client.ts index 996a088..5343e71 100644 --- a/factory/packages/client/src/backend-client.ts +++ b/foundry/packages/client/src/backend-client.ts @@ -3,8 +3,8 @@ import type { AgentType, AddRepoInput, AppConfig, - FactoryAppSnapshot, - FactoryBillingPlanId, + FoundryAppSnapshot, + FoundryBillingPlanId, CreateTaskInput, TaskRecord, TaskSummary, @@ -27,9 +27,9 @@ import type { RepoStackActionInput, RepoStackActionResult, RepoRecord, - UpdateFactoryOrganizationProfileInput, + UpdateFoundryOrganizationProfileInput, SwitchResult -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { sandboxInstanceKey, workspaceKey } from "./keys.js"; export type TaskAction = "push" | "sync" | "merge" | "archive" | "kill"; @@ -128,18 +128,18 @@ export interface BackendMetadata { } export interface BackendClient { - getAppSnapshot(): Promise; + getAppSnapshot(): Promise; signInWithGithub(): Promise; - signOutApp(): Promise; - selectAppOrganization(organizationId: string): Promise; - updateAppOrganizationProfile(input: UpdateFactoryOrganizationProfileInput): Promise; - triggerAppRepoImport(organizationId: string): Promise; + signOutApp(): Promise; + selectAppOrganization(organizationId: string): Promise; + updateAppOrganizationProfile(input: UpdateFoundryOrganizationProfileInput): Promise; + triggerAppRepoImport(organizationId: string): Promise; reconnectAppGithub(organizationId: string): Promise; - completeAppHostedCheckout(organizationId: string, planId: FactoryBillingPlanId): Promise; + completeAppHostedCheckout(organizationId: string, planId: FoundryBillingPlanId): Promise; openAppBillingPortal(organizationId: string): Promise; - cancelAppScheduledRenewal(organizationId: string): Promise; - resumeAppSubscription(organizationId: string): Promise; - recordAppSeatUsage(workspaceId: string): Promise; + cancelAppScheduledRenewal(organizationId: string): Promise; + resumeAppSubscription(organizationId: string): Promise; + recordAppSeatUsage(workspaceId: string): Promise; addRepo(workspaceId: string, remoteUrl: string): Promise; listRepos(workspaceId: string): Promise; createTask(input: CreateTaskInput): Promise; @@ -364,7 +364,7 @@ async function probeMetadataEndpoint( export function createBackendClient(options: BackendClientOptions): BackendClient { let clientPromise: Promise | null = null; let appSessionId = - typeof window !== "undefined" ? window.localStorage.getItem("sandbox-agent-factory:remote-app-session") : null; + typeof window !== "undefined" ? window.localStorage.getItem("sandbox-agent-foundry:remote-app-session") : null; const workbenchSubscriptions = new Map< string, { @@ -380,18 +380,18 @@ export function createBackendClient(options: BackendClientOptions): BackendClien return; } if (nextSessionId) { - window.localStorage.setItem("sandbox-agent-factory:remote-app-session", nextSessionId); + window.localStorage.setItem("sandbox-agent-foundry:remote-app-session", nextSessionId); } else { - window.localStorage.removeItem("sandbox-agent-factory:remote-app-session"); + window.localStorage.removeItem("sandbox-agent-foundry:remote-app-session"); } }; if (typeof window !== "undefined") { const url = new URL(window.location.href); - const sessionFromUrl = url.searchParams.get("factorySession"); + const sessionFromUrl = url.searchParams.get("foundrySession"); if (sessionFromUrl) { persistAppSessionId(sessionFromUrl); - url.searchParams.delete("factorySession"); + url.searchParams.delete("foundrySession"); window.history.replaceState({}, document.title, `${url.pathname}${url.search}${url.hash}`); } } @@ -399,7 +399,7 @@ export function createBackendClient(options: BackendClientOptions): BackendClien const appRequest = async (path: string, init?: RequestInit): Promise => { const headers = new Headers(init?.headers); if (appSessionId) { - headers.set("x-factory-session", appSessionId); + headers.set("x-foundry-session", appSessionId); } if (init?.body && !headers.has("Content-Type")) { headers.set("Content-Type", "application/json"); @@ -410,7 +410,7 @@ export function createBackendClient(options: BackendClientOptions): BackendClien headers, credentials: "include", }); - const nextSessionId = res.headers.get("x-factory-session"); + const nextSessionId = res.headers.get("x-foundry-session"); if (nextSessionId) { persistAppSessionId(nextSessionId); } @@ -621,8 +621,8 @@ export function createBackendClient(options: BackendClientOptions): BackendClien }; return { - async getAppSnapshot(): Promise { - return await appRequest("/app/snapshot"); + async getAppSnapshot(): Promise { + return await appRequest("/app/snapshot"); }, async signInWithGithub(): Promise { @@ -633,20 +633,20 @@ export function createBackendClient(options: BackendClientOptions): BackendClien await redirectTo("/app/auth/github/start"); }, - async signOutApp(): Promise { - const snapshot = await appRequest("/app/sign-out", { method: "POST" }); + async signOutApp(): Promise { + const snapshot = await appRequest("/app/sign-out", { method: "POST" }); persistAppSessionId(appSessionId); return snapshot; }, - async selectAppOrganization(organizationId: string): Promise { - return await appRequest(`/app/organizations/${organizationId}/select`, { + async selectAppOrganization(organizationId: string): Promise { + return await appRequest(`/app/organizations/${organizationId}/select`, { method: "POST", }); }, - async updateAppOrganizationProfile(input: UpdateFactoryOrganizationProfileInput): Promise { - return await appRequest(`/app/organizations/${input.organizationId}/profile`, { + async updateAppOrganizationProfile(input: UpdateFoundryOrganizationProfileInput): Promise { + return await appRequest(`/app/organizations/${input.organizationId}/profile`, { method: "PATCH", body: JSON.stringify({ displayName: input.displayName, @@ -656,8 +656,8 @@ export function createBackendClient(options: BackendClientOptions): BackendClien }); }, - async triggerAppRepoImport(organizationId: string): Promise { - return await appRequest(`/app/organizations/${organizationId}/import`, { + async triggerAppRepoImport(organizationId: string): Promise { + return await appRequest(`/app/organizations/${organizationId}/import`, { method: "POST", }); }, @@ -668,7 +668,7 @@ export function createBackendClient(options: BackendClientOptions): BackendClien }); }, - async completeAppHostedCheckout(organizationId: string, planId: FactoryBillingPlanId): Promise { + async completeAppHostedCheckout(organizationId: string, planId: FoundryBillingPlanId): Promise { await redirectTo(`/app/organizations/${organizationId}/billing/checkout`, { method: "POST", body: JSON.stringify({ planId }), @@ -681,20 +681,20 @@ export function createBackendClient(options: BackendClientOptions): BackendClien }); }, - async cancelAppScheduledRenewal(organizationId: string): Promise { - return await appRequest(`/app/organizations/${organizationId}/billing/cancel`, { + async cancelAppScheduledRenewal(organizationId: string): Promise { + return await appRequest(`/app/organizations/${organizationId}/billing/cancel`, { method: "POST", }); }, - async resumeAppSubscription(organizationId: string): Promise { - return await appRequest(`/app/organizations/${organizationId}/billing/resume`, { + async resumeAppSubscription(organizationId: string): Promise { + return await appRequest(`/app/organizations/${organizationId}/billing/resume`, { method: "POST", }); }, - async recordAppSeatUsage(workspaceId: string): Promise { - return await appRequest(`/app/workspaces/${workspaceId}/seat-usage`, { + async recordAppSeatUsage(workspaceId: string): Promise { + return await appRequest(`/app/workspaces/${workspaceId}/seat-usage`, { method: "POST", }); }, diff --git a/factory/packages/client/src/backend.ts b/foundry/packages/client/src/backend.ts similarity index 100% rename from factory/packages/client/src/backend.ts rename to foundry/packages/client/src/backend.ts diff --git a/factory/packages/client/src/index.ts b/foundry/packages/client/src/index.ts similarity index 100% rename from factory/packages/client/src/index.ts rename to foundry/packages/client/src/index.ts diff --git a/factory/packages/client/src/keys.ts b/foundry/packages/client/src/keys.ts similarity index 100% rename from factory/packages/client/src/keys.ts rename to foundry/packages/client/src/keys.ts diff --git a/factory/packages/client/src/mock-app.ts b/foundry/packages/client/src/mock-app.ts similarity index 89% rename from factory/packages/client/src/mock-app.ts rename to foundry/packages/client/src/mock-app.ts index 5a73589..d1f39b7 100644 --- a/factory/packages/client/src/mock-app.ts +++ b/foundry/packages/client/src/mock-app.ts @@ -6,7 +6,7 @@ export type MockGithubInstallationStatus = "connected" | "install_required" | "r export type MockGithubSyncStatus = "pending" | "syncing" | "synced" | "error"; export type MockOrganizationKind = "personal" | "organization"; -export interface MockFactoryUser { +export interface MockFoundryUser { id: string; name: string; email: string; @@ -15,7 +15,7 @@ export interface MockFactoryUser { eligibleOrganizationIds: string[]; } -export interface MockFactoryOrganizationMember { +export interface MockFoundryOrganizationMember { id: string; name: string; email: string; @@ -23,7 +23,7 @@ export interface MockFactoryOrganizationMember { state: "active" | "invited"; } -export interface MockFactoryInvoice { +export interface MockFoundryInvoice { id: string; label: string; issuedAt: string; @@ -31,7 +31,7 @@ export interface MockFactoryInvoice { status: "paid" | "open"; } -export interface MockFactoryBillingState { +export interface MockFoundryBillingState { planId: MockBillingPlanId; status: MockBillingStatus; seatsIncluded: number; @@ -39,10 +39,10 @@ export interface MockFactoryBillingState { renewalAt: string | null; stripeCustomerId: string; paymentMethodLabel: string; - invoices: MockFactoryInvoice[]; + invoices: MockFoundryInvoice[]; } -export interface MockFactoryGithubState { +export interface MockFoundryGithubState { connectedAccount: string; installationStatus: MockGithubInstallationStatus; syncStatus: MockGithubSyncStatus; @@ -51,7 +51,7 @@ export interface MockFactoryGithubState { lastSyncAt: number | null; } -export interface MockFactoryOrganizationSettings { +export interface MockFoundryOrganizationSettings { displayName: string; slug: string; primaryDomain: string; @@ -60,26 +60,26 @@ export interface MockFactoryOrganizationSettings { autoImportRepos: boolean; } -export interface MockFactoryOrganization { +export interface MockFoundryOrganization { id: string; workspaceId: string; kind: MockOrganizationKind; - settings: MockFactoryOrganizationSettings; - github: MockFactoryGithubState; - billing: MockFactoryBillingState; - members: MockFactoryOrganizationMember[]; + settings: MockFoundryOrganizationSettings; + github: MockFoundryGithubState; + billing: MockFoundryBillingState; + members: MockFoundryOrganizationMember[]; seatAssignments: string[]; repoCatalog: string[]; } -export interface MockFactoryAppSnapshot { +export interface MockFoundryAppSnapshot { auth: { status: "signed_out" | "signed_in"; currentUserId: string | null; }; activeOrganizationId: string | null; - users: MockFactoryUser[]; - organizations: MockFactoryOrganization[]; + users: MockFoundryUser[]; + organizations: MockFoundryOrganization[]; } export interface UpdateMockOrganizationProfileInput { @@ -89,8 +89,8 @@ export interface UpdateMockOrganizationProfileInput { primaryDomain: string; } -export interface MockFactoryAppClient { - getSnapshot(): MockFactoryAppSnapshot; +export interface MockFoundryAppClient { + getSnapshot(): MockFoundryAppSnapshot; subscribe(listener: () => void): () => void; signInWithGithub(userId: string): Promise; signOut(): Promise; @@ -105,7 +105,7 @@ export interface MockFactoryAppClient { recordSeatUsage(workspaceId: string): void; } -const STORAGE_KEY = "sandbox-agent-factory:mock-app:v1"; +const STORAGE_KEY = "sandbox-agent-foundry:mock-app:v1"; function isoDate(daysFromNow: number): string { const value = new Date(); @@ -128,7 +128,7 @@ function syncStatusFromLegacy(value: unknown): MockGithubSyncStatus { } } -function buildDefaultSnapshot(): MockFactoryAppSnapshot { +function buildDefaultSnapshot(): MockFoundryAppSnapshot { return { auth: { status: "signed_out", @@ -316,7 +316,7 @@ function buildDefaultSnapshot(): MockFactoryAppSnapshot { }; } -function parseStoredSnapshot(): MockFactoryAppSnapshot | null { +function parseStoredSnapshot(): MockFoundryAppSnapshot | null { if (typeof window === "undefined") { return null; } @@ -327,15 +327,15 @@ function parseStoredSnapshot(): MockFactoryAppSnapshot | null { } try { - const parsed = JSON.parse(raw) as MockFactoryAppSnapshot & { - organizations?: Array; + const parsed = JSON.parse(raw) as MockFoundryAppSnapshot & { + organizations?: Array; }; if (!parsed || typeof parsed !== "object") { return null; } return { ...parsed, - organizations: (parsed.organizations ?? []).map((organization: MockFactoryOrganization & { repoImportStatus?: string }) => ({ + organizations: (parsed.organizations ?? []).map((organization: MockFoundryOrganization & { repoImportStatus?: string }) => ({ ...organization, github: { ...organization.github, @@ -349,7 +349,7 @@ function parseStoredSnapshot(): MockFactoryAppSnapshot | null { } } -function saveSnapshot(snapshot: MockFactoryAppSnapshot): void { +function saveSnapshot(snapshot: MockFoundryAppSnapshot): void { if (typeof window === "undefined") { return; } @@ -366,12 +366,12 @@ function planSeatsIncluded(planId: MockBillingPlanId): number { } } -class MockFactoryAppStore implements MockFactoryAppClient { +class MockFoundryAppStore implements MockFoundryAppClient { private snapshot = parseStoredSnapshot() ?? buildDefaultSnapshot(); private listeners = new Set<() => void>(); private importTimers = new Map>(); - getSnapshot(): MockFactoryAppSnapshot { + getSnapshot(): MockFoundryAppSnapshot { return this.snapshot; } @@ -574,7 +574,7 @@ class MockFactoryAppStore implements MockFactoryAppClient { private updateOrganization( organizationId: string, - updater: (organization: MockFactoryOrganization) => MockFactoryOrganization, + updater: (organization: MockFoundryOrganization) => MockFoundryOrganization, ): void { this.updateSnapshot((current) => ({ ...current, @@ -584,7 +584,7 @@ class MockFactoryAppStore implements MockFactoryAppClient { })); } - private updateSnapshot(updater: (current: MockFactoryAppSnapshot) => MockFactoryAppSnapshot): void { + private updateSnapshot(updater: (current: MockFoundryAppSnapshot) => MockFoundryAppSnapshot): void { this.snapshot = updater(this.snapshot); saveSnapshot(this.snapshot); for (const listener of this.listeners) { @@ -592,7 +592,7 @@ class MockFactoryAppStore implements MockFactoryAppClient { } } - private requireOrganization(organizationId: string): MockFactoryOrganization { + private requireOrganization(organizationId: string): MockFoundryOrganization { const organization = this.snapshot.organizations.find((candidate) => candidate.id === organizationId); if (!organization) { throw new Error(`Unknown mock organization ${organizationId}`); @@ -601,31 +601,31 @@ class MockFactoryAppStore implements MockFactoryAppClient { } } -function currentMockUser(snapshot: MockFactoryAppSnapshot): MockFactoryUser | null { +function currentMockUser(snapshot: MockFoundryAppSnapshot): MockFoundryUser | null { if (!snapshot.auth.currentUserId) { return null; } return snapshot.users.find((candidate) => candidate.id === snapshot.auth.currentUserId) ?? null; } -const mockFactoryAppStore = new MockFactoryAppStore(); +const mockFoundryAppStore = new MockFoundryAppStore(); -export function getMockFactoryAppClient(): MockFactoryAppClient { - return mockFactoryAppStore; +export function getMockFoundryAppClient(): MockFoundryAppClient { + return mockFoundryAppStore; } -export function currentMockFactoryUser(snapshot: MockFactoryAppSnapshot): MockFactoryUser | null { +export function currentMockFoundryUser(snapshot: MockFoundryAppSnapshot): MockFoundryUser | null { return currentMockUser(snapshot); } -export function currentMockFactoryOrganization(snapshot: MockFactoryAppSnapshot): MockFactoryOrganization | null { +export function currentMockFoundryOrganization(snapshot: MockFoundryAppSnapshot): MockFoundryOrganization | null { if (!snapshot.activeOrganizationId) { return null; } return snapshot.organizations.find((candidate) => candidate.id === snapshot.activeOrganizationId) ?? null; } -export function eligibleMockOrganizations(snapshot: MockFactoryAppSnapshot): MockFactoryOrganization[] { +export function eligibleMockOrganizations(snapshot: MockFoundryAppSnapshot): MockFoundryOrganization[] { const user = currentMockUser(snapshot); if (!user) { return []; diff --git a/factory/packages/client/src/mock/latency.ts b/foundry/packages/client/src/mock/latency.ts similarity index 100% rename from factory/packages/client/src/mock/latency.ts rename to foundry/packages/client/src/mock/latency.ts diff --git a/factory/packages/client/src/mock/workbench-client.ts b/foundry/packages/client/src/mock/workbench-client.ts similarity index 98% rename from factory/packages/client/src/mock/workbench-client.ts rename to foundry/packages/client/src/mock/workbench-client.ts index 682a2ce..2980f13 100644 --- a/factory/packages/client/src/mock/workbench-client.ts +++ b/foundry/packages/client/src/mock/workbench-client.ts @@ -9,7 +9,7 @@ import { slugify, uid, } from "../workbench-model.js"; -import { getMockFactoryAppClient } from "../mock-app.js"; +import { getMockFoundryAppClient } from "../mock-app.js"; import { injectMockLatency } from "./latency.js"; import type { TaskWorkbenchAddTabResponse, @@ -28,7 +28,7 @@ import type { TaskWorkbenchSnapshot, WorkbenchTask as Task, WorkbenchTranscriptEvent as TranscriptEvent, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import type { TaskWorkbenchClient } from "../workbench-client.js"; function buildTranscriptEvent(params: { @@ -226,7 +226,7 @@ class MockWorkbenchStore implements TaskWorkbenchClient { this.assertTab(input.taskId, input.tabId); const startedAtMs = nowMs(); - getMockFactoryAppClient().recordSeatUsage(this.snapshot.workspaceId); + getMockFoundryAppClient().recordSeatUsage(this.snapshot.workspaceId); this.updateTask(input.taskId, (currentTask) => { const isFirstOnTask = currentTask.status === "new"; diff --git a/factory/packages/client/src/remote/app-client.ts b/foundry/packages/client/src/remote/app-client.ts similarity index 82% rename from factory/packages/client/src/remote/app-client.ts rename to foundry/packages/client/src/remote/app-client.ts index c0a5ab8..420aa6a 100644 --- a/factory/packages/client/src/remote/app-client.ts +++ b/foundry/packages/client/src/remote/app-client.ts @@ -1,18 +1,18 @@ import type { - FactoryAppSnapshot, - FactoryBillingPlanId, - UpdateFactoryOrganizationProfileInput, -} from "@sandbox-agent/factory-shared"; + FoundryAppSnapshot, + FoundryBillingPlanId, + UpdateFoundryOrganizationProfileInput, +} from "@sandbox-agent/foundry-shared"; import type { BackendClient } from "../backend-client.js"; -import type { FactoryAppClient } from "../app-client.js"; +import type { FoundryAppClient } from "../app-client.js"; -export interface RemoteFactoryAppClientOptions { +export interface RemoteFoundryAppClientOptions { backend: BackendClient; } -class RemoteFactoryAppStore implements FactoryAppClient { +class RemoteFoundryAppStore implements FoundryAppClient { private readonly backend: BackendClient; - private snapshot: FactoryAppSnapshot = { + private snapshot: FoundryAppSnapshot = { auth: { status: "signed_out", currentUserId: null }, activeOrganizationId: null, users: [], @@ -22,11 +22,11 @@ class RemoteFactoryAppStore implements FactoryAppClient { private refreshPromise: Promise | null = null; private syncPollTimeout: ReturnType | null = null; - constructor(options: RemoteFactoryAppClientOptions) { + constructor(options: RemoteFoundryAppClientOptions) { this.backend = options.backend; } - getSnapshot(): FactoryAppSnapshot { + getSnapshot(): FoundryAppSnapshot { return this.snapshot; } @@ -54,7 +54,7 @@ class RemoteFactoryAppStore implements FactoryAppClient { this.scheduleSyncPollingIfNeeded(); } - async updateOrganizationProfile(input: UpdateFactoryOrganizationProfileInput): Promise { + async updateOrganizationProfile(input: UpdateFoundryOrganizationProfileInput): Promise { this.snapshot = await this.backend.updateAppOrganizationProfile(input); this.notify(); } @@ -65,7 +65,7 @@ class RemoteFactoryAppStore implements FactoryAppClient { this.scheduleSyncPollingIfNeeded(); } - async completeHostedCheckout(organizationId: string, planId: FactoryBillingPlanId): Promise { + async completeHostedCheckout(organizationId: string, planId: FoundryBillingPlanId): Promise { await this.backend.completeAppHostedCheckout(organizationId, planId); } @@ -132,8 +132,8 @@ class RemoteFactoryAppStore implements FactoryAppClient { } } -export function createRemoteFactoryAppClient( - options: RemoteFactoryAppClientOptions, -): FactoryAppClient { - return new RemoteFactoryAppStore(options); +export function createRemoteFoundryAppClient( + options: RemoteFoundryAppClientOptions, +): FoundryAppClient { + return new RemoteFoundryAppStore(options); } diff --git a/factory/packages/client/src/remote/workbench-client.ts b/foundry/packages/client/src/remote/workbench-client.ts similarity index 99% rename from factory/packages/client/src/remote/workbench-client.ts rename to foundry/packages/client/src/remote/workbench-client.ts index 6b65b40..ae65437 100644 --- a/factory/packages/client/src/remote/workbench-client.ts +++ b/foundry/packages/client/src/remote/workbench-client.ts @@ -12,7 +12,7 @@ import type { TaskWorkbenchTabInput, TaskWorkbenchUpdateDraftInput, TaskWorkbenchSnapshot, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import type { BackendClient } from "../backend-client.js"; import { groupWorkbenchRepos } from "../workbench-model.js"; import type { TaskWorkbenchClient } from "../workbench-client.js"; diff --git a/factory/packages/client/src/view-model.ts b/foundry/packages/client/src/view-model.ts similarity index 97% rename from factory/packages/client/src/view-model.ts rename to foundry/packages/client/src/view-model.ts index b5c78a7..dbda5b4 100644 --- a/factory/packages/client/src/view-model.ts +++ b/foundry/packages/client/src/view-model.ts @@ -1,4 +1,4 @@ -import type { TaskRecord, TaskStatus } from "@sandbox-agent/factory-shared"; +import type { TaskRecord, TaskStatus } from "@sandbox-agent/foundry-shared"; export const HANDOFF_STATUS_GROUPS = [ "queued", diff --git a/factory/packages/client/src/workbench-client.ts b/foundry/packages/client/src/workbench-client.ts similarity index 98% rename from factory/packages/client/src/workbench-client.ts rename to foundry/packages/client/src/workbench-client.ts index f2a5fb5..82a3fae 100644 --- a/factory/packages/client/src/workbench-client.ts +++ b/foundry/packages/client/src/workbench-client.ts @@ -12,7 +12,7 @@ import type { TaskWorkbenchSnapshot, TaskWorkbenchTabInput, TaskWorkbenchUpdateDraftInput, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import type { BackendClient } from "./backend-client.js"; import { getMockWorkbenchClient } from "./mock/workbench-client.js"; import { createRemoteWorkbenchClient } from "./remote/workbench-client.js"; diff --git a/factory/packages/client/src/workbench-model.ts b/foundry/packages/client/src/workbench-model.ts similarity index 99% rename from factory/packages/client/src/workbench-model.ts rename to foundry/packages/client/src/workbench-model.ts index 8d9eeec..bb279ae 100644 --- a/factory/packages/client/src/workbench-model.ts +++ b/foundry/packages/client/src/workbench-model.ts @@ -12,7 +12,7 @@ import type { WorkbenchRepoSection, WorkbenchRepo, WorkbenchTranscriptEvent as TranscriptEvent, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; export const MODEL_GROUPS: ModelGroup[] = [ { diff --git a/factory/packages/client/src/workbench.ts b/foundry/packages/client/src/workbench.ts similarity index 100% rename from factory/packages/client/src/workbench.ts rename to foundry/packages/client/src/workbench.ts diff --git a/factory/packages/client/test/e2e/full-integration-e2e.test.ts b/foundry/packages/client/test/e2e/full-integration-e2e.test.ts similarity index 99% rename from factory/packages/client/test/e2e/full-integration-e2e.test.ts rename to foundry/packages/client/test/e2e/full-integration-e2e.test.ts index 3f5e52a..939a933 100644 --- a/factory/packages/client/test/e2e/full-integration-e2e.test.ts +++ b/foundry/packages/client/test/e2e/full-integration-e2e.test.ts @@ -1,6 +1,6 @@ import { randomUUID } from "node:crypto"; import { describe, expect, it } from "vitest"; -import type { HistoryEvent, RepoOverview } from "@sandbox-agent/factory-shared"; +import type { HistoryEvent, RepoOverview } from "@sandbox-agent/foundry-shared"; import { createBackendClient } from "../../src/backend-client.js"; const RUN_FULL_E2E = process.env.HF_ENABLE_DAEMON_FULL_E2E === "1"; diff --git a/factory/packages/client/test/e2e/github-pr-e2e.test.ts b/foundry/packages/client/test/e2e/github-pr-e2e.test.ts similarity index 99% rename from factory/packages/client/test/e2e/github-pr-e2e.test.ts rename to foundry/packages/client/test/e2e/github-pr-e2e.test.ts index 5c19058..b2002f3 100644 --- a/factory/packages/client/test/e2e/github-pr-e2e.test.ts +++ b/foundry/packages/client/test/e2e/github-pr-e2e.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { TaskRecord, HistoryEvent } from "@sandbox-agent/factory-shared"; +import type { TaskRecord, HistoryEvent } from "@sandbox-agent/foundry-shared"; import { createBackendClient } from "../../src/backend-client.js"; const RUN_E2E = process.env.HF_ENABLE_DAEMON_E2E === "1"; diff --git a/factory/packages/client/test/e2e/workbench-e2e.test.ts b/foundry/packages/client/test/e2e/workbench-e2e.test.ts similarity index 99% rename from factory/packages/client/test/e2e/workbench-e2e.test.ts rename to foundry/packages/client/test/e2e/workbench-e2e.test.ts index 0cf7ff3..b433f33 100644 --- a/factory/packages/client/test/e2e/workbench-e2e.test.ts +++ b/foundry/packages/client/test/e2e/workbench-e2e.test.ts @@ -9,7 +9,7 @@ import type { WorkbenchTask, WorkbenchModelId, WorkbenchTranscriptEvent, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { createBackendClient } from "../../src/backend-client.js"; const RUN_WORKBENCH_E2E = process.env.HF_ENABLE_DAEMON_WORKBENCH_E2E === "1"; diff --git a/factory/packages/client/test/e2e/workbench-load-e2e.test.ts b/foundry/packages/client/test/e2e/workbench-load-e2e.test.ts similarity index 99% rename from factory/packages/client/test/e2e/workbench-load-e2e.test.ts rename to foundry/packages/client/test/e2e/workbench-load-e2e.test.ts index c00e156..fef9e32 100644 --- a/factory/packages/client/test/e2e/workbench-load-e2e.test.ts +++ b/foundry/packages/client/test/e2e/workbench-load-e2e.test.ts @@ -5,7 +5,7 @@ import type { WorkbenchTask, WorkbenchModelId, WorkbenchTranscriptEvent, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { createBackendClient } from "../../src/backend-client.js"; const RUN_WORKBENCH_LOAD_E2E = process.env.HF_ENABLE_DAEMON_WORKBENCH_LOAD_E2E === "1"; diff --git a/factory/packages/client/test/keys.test.ts b/foundry/packages/client/test/keys.test.ts similarity index 100% rename from factory/packages/client/test/keys.test.ts rename to foundry/packages/client/test/keys.test.ts diff --git a/factory/packages/client/test/view-model.test.ts b/foundry/packages/client/test/view-model.test.ts similarity index 97% rename from factory/packages/client/test/view-model.test.ts rename to foundry/packages/client/test/view-model.test.ts index e0451b0..1bf7669 100644 --- a/factory/packages/client/test/view-model.test.ts +++ b/foundry/packages/client/test/view-model.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { TaskRecord } from "@sandbox-agent/factory-shared"; +import type { TaskRecord } from "@sandbox-agent/foundry-shared"; import { filterTasks, formatRelativeAge, diff --git a/factory/packages/client/test/workbench-client.test.ts b/foundry/packages/client/test/workbench-client.test.ts similarity index 100% rename from factory/packages/client/test/workbench-client.test.ts rename to foundry/packages/client/test/workbench-client.test.ts diff --git a/factory/packages/client/tsconfig.json b/foundry/packages/client/tsconfig.json similarity index 100% rename from factory/packages/client/tsconfig.json rename to foundry/packages/client/tsconfig.json diff --git a/factory/packages/frontend-errors/package.json b/foundry/packages/frontend-errors/package.json similarity index 93% rename from factory/packages/frontend-errors/package.json rename to foundry/packages/frontend-errors/package.json index 77caa47..2104dbb 100644 --- a/factory/packages/frontend-errors/package.json +++ b/foundry/packages/frontend-errors/package.json @@ -1,5 +1,5 @@ { - "name": "@sandbox-agent/factory-frontend-errors", + "name": "@sandbox-agent/foundry-frontend-errors", "version": "0.1.0", "private": true, "type": "module", diff --git a/factory/packages/frontend-errors/src/client.ts b/foundry/packages/frontend-errors/src/client.ts similarity index 73% rename from factory/packages/frontend-errors/src/client.ts rename to foundry/packages/frontend-errors/src/client.ts index 9981d80..53aa0e3 100644 --- a/factory/packages/frontend-errors/src/client.ts +++ b/foundry/packages/frontend-errors/src/client.ts @@ -6,8 +6,8 @@ interface FrontendErrorCollectorGlobal { declare global { interface Window { - __FACTORY_FRONTEND_ERROR_COLLECTOR__?: FrontendErrorCollectorGlobal; - __FACTORY_FRONTEND_ERROR_CONTEXT__?: FrontendErrorContext; + __FOUNDRY_FRONTEND_ERROR_COLLECTOR__?: FrontendErrorCollectorGlobal; + __FOUNDRY_FRONTEND_ERROR_CONTEXT__?: FrontendErrorContext; } } @@ -17,11 +17,11 @@ export function setFrontendErrorContext(context: FrontendErrorContext): void { } const nextContext = sanitizeContext(context); - window.__FACTORY_FRONTEND_ERROR_CONTEXT__ = { - ...(window.__FACTORY_FRONTEND_ERROR_CONTEXT__ ?? {}), + window.__FOUNDRY_FRONTEND_ERROR_CONTEXT__ = { + ...(window.__FOUNDRY_FRONTEND_ERROR_CONTEXT__ ?? {}), ...nextContext, }; - window.__FACTORY_FRONTEND_ERROR_COLLECTOR__?.setContext(nextContext); + window.__FOUNDRY_FRONTEND_ERROR_COLLECTOR__?.setContext(nextContext); } function sanitizeContext(input: FrontendErrorContext): FrontendErrorContext { diff --git a/factory/packages/frontend-errors/src/index.ts b/foundry/packages/frontend-errors/src/index.ts similarity index 100% rename from factory/packages/frontend-errors/src/index.ts rename to foundry/packages/frontend-errors/src/index.ts diff --git a/factory/packages/frontend-errors/src/router.ts b/foundry/packages/frontend-errors/src/router.ts similarity index 98% rename from factory/packages/frontend-errors/src/router.ts rename to foundry/packages/frontend-errors/src/router.ts index f3b9d4d..2bfd319 100644 --- a/factory/packages/frontend-errors/src/router.ts +++ b/foundry/packages/frontend-errors/src/router.ts @@ -4,8 +4,8 @@ import { dirname, join, resolve } from "node:path"; import { Hono } from "hono"; import type { FrontendErrorContext, FrontendErrorKind, FrontendErrorLogEvent } from "./types.js"; -const DEFAULT_RELATIVE_LOG_PATH = ".sandbox-agent-factory/logs/frontend-errors.ndjson"; -const DEFAULT_REPORTER = "sandbox-agent-factory"; +const DEFAULT_RELATIVE_LOG_PATH = ".sandbox-agent-foundry/logs/frontend-errors.ndjson"; +const DEFAULT_REPORTER = "sandbox-agent-foundry"; const MAX_FIELD_LENGTH = 12_000; export interface FrontendErrorCollectorRouterOptions { diff --git a/factory/packages/frontend-errors/src/script.ts b/foundry/packages/frontend-errors/src/script.ts similarity index 96% rename from factory/packages/frontend-errors/src/script.ts rename to foundry/packages/frontend-errors/src/script.ts index 025cc39..fe7e332 100644 --- a/factory/packages/frontend-errors/src/script.ts +++ b/foundry/packages/frontend-errors/src/script.ts @@ -1,6 +1,6 @@ import type { FrontendErrorCollectorScriptOptions } from "./types.js"; -const DEFAULT_REPORTER = "sandbox-agent-factory"; +const DEFAULT_REPORTER = "sandbox-agent-foundry"; export function createFrontendErrorCollectorScript( options: FrontendErrorCollectorScriptOptions @@ -17,13 +17,13 @@ export function createFrontendErrorCollectorScript( return; } - if (window.__FACTORY_FRONTEND_ERROR_COLLECTOR__) { + if (window.__FOUNDRY_FRONTEND_ERROR_COLLECTOR__) { return; } var config = ${JSON.stringify(config)}; - var sharedContext = window.__FACTORY_FRONTEND_ERROR_CONTEXT__ || {}; - window.__FACTORY_FRONTEND_ERROR_CONTEXT__ = sharedContext; + var sharedContext = window.__FOUNDRY_FRONTEND_ERROR_CONTEXT__ || {}; + window.__FOUNDRY_FRONTEND_ERROR_CONTEXT__ = sharedContext; function now() { return Date.now(); @@ -124,7 +124,7 @@ export function createFrontendErrorCollectorScript( }); } - window.__FACTORY_FRONTEND_ERROR_COLLECTOR__ = { + window.__FOUNDRY_FRONTEND_ERROR_COLLECTOR__ = { setContext: function (nextContext) { if (!nextContext || typeof nextContext !== "object") { return; diff --git a/factory/packages/frontend-errors/src/types.ts b/foundry/packages/frontend-errors/src/types.ts similarity index 100% rename from factory/packages/frontend-errors/src/types.ts rename to foundry/packages/frontend-errors/src/types.ts diff --git a/factory/packages/frontend-errors/src/vite.ts b/foundry/packages/frontend-errors/src/vite.ts similarity index 93% rename from factory/packages/frontend-errors/src/vite.ts rename to foundry/packages/frontend-errors/src/vite.ts index 312d65c..1de33d3 100644 --- a/factory/packages/frontend-errors/src/vite.ts +++ b/foundry/packages/frontend-errors/src/vite.ts @@ -4,7 +4,7 @@ import type { Plugin } from "vite"; import { createFrontendErrorCollectorRouter, defaultFrontendErrorLogPath } from "./router.js"; import { createFrontendErrorCollectorScript } from "./script.js"; -const DEFAULT_MOUNT_PATH = "/__factory/frontend-errors"; +const DEFAULT_MOUNT_PATH = "/__foundry/frontend-errors"; const DEFAULT_EVENT_PATH = "/events"; export interface FrontendErrorCollectorVitePluginOptions { @@ -20,7 +20,7 @@ export function frontendErrorCollectorVitePlugin( ): Plugin { const mountPath = normalizePath(options.mountPath ?? DEFAULT_MOUNT_PATH); const logFilePath = options.logFilePath ?? defaultFrontendErrorLogPath(process.cwd()); - const reporter = options.reporter ?? "factory-vite"; + const reporter = options.reporter ?? "foundry-vite"; const endpoint = `${mountPath}${DEFAULT_EVENT_PATH}`; const router = createFrontendErrorCollectorRouter({ @@ -31,7 +31,7 @@ export function frontendErrorCollectorVitePlugin( const listener = getRequestListener(mountApp.fetch); return { - name: "factory:frontend-error-collector", + name: "foundry:frontend-error-collector", apply: "serve", transformIndexHtml(html) { return { diff --git a/factory/packages/frontend-errors/test/router.test.ts b/foundry/packages/frontend-errors/test/router.test.ts similarity index 94% rename from factory/packages/frontend-errors/test/router.test.ts rename to foundry/packages/frontend-errors/test/router.test.ts index 235a585..70aa164 100644 --- a/factory/packages/frontend-errors/test/router.test.ts +++ b/foundry/packages/frontend-errors/test/router.test.ts @@ -47,9 +47,9 @@ describe("frontend error collector router", () => { describe("frontend error collector script", () => { test("embeds configured endpoint", () => { const script = createFrontendErrorCollectorScript({ - endpoint: "/__factory/frontend-errors/events", + endpoint: "/__foundry/frontend-errors/events", }); - expect(script).toContain("/__factory/frontend-errors/events"); + expect(script).toContain("/__foundry/frontend-errors/events"); expect(script).toContain("window.addEventListener(\"error\""); }); }); diff --git a/factory/packages/frontend-errors/tsconfig.json b/foundry/packages/frontend-errors/tsconfig.json similarity index 100% rename from factory/packages/frontend-errors/tsconfig.json rename to foundry/packages/frontend-errors/tsconfig.json diff --git a/factory/packages/frontend-errors/vitest.config.ts b/foundry/packages/frontend-errors/vitest.config.ts similarity index 100% rename from factory/packages/frontend-errors/vitest.config.ts rename to foundry/packages/frontend-errors/vitest.config.ts diff --git a/factory/packages/frontend/index.html b/foundry/packages/frontend/index.html similarity index 92% rename from factory/packages/frontend/index.html rename to foundry/packages/frontend/index.html index 6506468..c3c81ce 100644 --- a/factory/packages/frontend/index.html +++ b/foundry/packages/frontend/index.html @@ -10,7 +10,7 @@ - Sandbox Agent Factory + Sandbox Agent Foundry
diff --git a/factory/packages/frontend/package.json b/foundry/packages/frontend/package.json similarity index 77% rename from factory/packages/frontend/package.json rename to foundry/packages/frontend/package.json index 09c1871..ce06902 100644 --- a/factory/packages/frontend/package.json +++ b/foundry/packages/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "@sandbox-agent/factory-frontend", + "name": "@sandbox-agent/foundry-frontend", "version": "0.1.0", "private": true, "type": "module", @@ -10,9 +10,9 @@ "test": "vitest run" }, "dependencies": { - "@sandbox-agent/factory-client": "workspace:*", - "@sandbox-agent/factory-frontend-errors": "workspace:*", - "@sandbox-agent/factory-shared": "workspace:*", + "@sandbox-agent/foundry-client": "workspace:*", + "@sandbox-agent/foundry-frontend-errors": "workspace:*", + "@sandbox-agent/foundry-shared": "workspace:*", "@tanstack/react-query": "^5.85.5", "@tanstack/react-router": "^1.132.23", "baseui": "^16.1.1", diff --git a/factory/packages/frontend/src/app/router.tsx b/foundry/packages/frontend/src/app/router.tsx similarity index 98% rename from factory/packages/frontend/src/app/router.tsx rename to foundry/packages/frontend/src/app/router.tsx index b73100e..136d31c 100644 --- a/factory/packages/frontend/src/app/router.tsx +++ b/foundry/packages/frontend/src/app/router.tsx @@ -1,6 +1,6 @@ import { useEffect, useSyncExternalStore } from "react"; -import { setFrontendErrorContext } from "@sandbox-agent/factory-frontend-errors/client"; -import { type MockBillingPlanId } from "@sandbox-agent/factory-client"; +import { setFrontendErrorContext } from "@sandbox-agent/foundry-frontend-errors/client"; +import { type MockBillingPlanId } from "@sandbox-agent/foundry-client"; import { Navigate, Outlet, @@ -478,9 +478,9 @@ function AppBootstrapPending() {
Restoring session
-
Loading Factory state
+
Loading Foundry state
- Applying the returned app session and loading your organizations before routing deeper into Factory. + Applying the returned app session and loading your organizations before routing deeper into Foundry.
diff --git a/factory/packages/frontend/src/app/theme.ts b/foundry/packages/frontend/src/app/theme.ts similarity index 100% rename from factory/packages/frontend/src/app/theme.ts rename to foundry/packages/frontend/src/app/theme.ts diff --git a/factory/packages/frontend/src/components/mock-layout.tsx b/foundry/packages/frontend/src/components/mock-layout.tsx similarity index 99% rename from factory/packages/frontend/src/components/mock-layout.tsx rename to foundry/packages/frontend/src/components/mock-layout.tsx index 27f8666..c53e040 100644 --- a/factory/packages/frontend/src/components/mock-layout.tsx +++ b/foundry/packages/frontend/src/components/mock-layout.tsx @@ -1,6 +1,6 @@ import { memo, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react"; -import type { TaskWorkbenchClient } from "@sandbox-agent/factory-client"; -import type { FactoryGithubState } from "@sandbox-agent/factory-shared"; +import type { TaskWorkbenchClient } from "@sandbox-agent/foundry-client"; +import type { FoundryGithubState } from "@sandbox-agent/foundry-shared"; import { useNavigate } from "@tanstack/react-router"; import { DiffContent } from "./mock-layout/diff-content"; @@ -561,7 +561,7 @@ interface MockLayoutProps { selectedSessionId?: string | null; sidebarTitle?: string; sidebarSubtitle?: string; - organizationGithub?: FactoryGithubState; + organizationGithub?: FoundryGithubState; onRetryGithubSync?: () => void; onReconnectGithub?: () => void; sidebarActions?: Array<{ @@ -575,7 +575,7 @@ function WorkspaceStatusBanner({ onRetry, onReconnect, }: { - github?: FactoryGithubState; + github?: FoundryGithubState; onRetry?: () => void; onReconnect?: () => void; }) { diff --git a/factory/packages/frontend/src/components/mock-layout/diff-content.tsx b/foundry/packages/frontend/src/components/mock-layout/diff-content.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/diff-content.tsx rename to foundry/packages/frontend/src/components/mock-layout/diff-content.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/history-minimap.tsx b/foundry/packages/frontend/src/components/mock-layout/history-minimap.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/history-minimap.tsx rename to foundry/packages/frontend/src/components/mock-layout/history-minimap.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/message-list.tsx b/foundry/packages/frontend/src/components/mock-layout/message-list.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/message-list.tsx rename to foundry/packages/frontend/src/components/mock-layout/message-list.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/model-picker.tsx b/foundry/packages/frontend/src/components/mock-layout/model-picker.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/model-picker.tsx rename to foundry/packages/frontend/src/components/mock-layout/model-picker.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/prompt-composer.tsx b/foundry/packages/frontend/src/components/mock-layout/prompt-composer.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/prompt-composer.tsx rename to foundry/packages/frontend/src/components/mock-layout/prompt-composer.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/right-sidebar.tsx b/foundry/packages/frontend/src/components/mock-layout/right-sidebar.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/right-sidebar.tsx rename to foundry/packages/frontend/src/components/mock-layout/right-sidebar.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/sidebar.tsx b/foundry/packages/frontend/src/components/mock-layout/sidebar.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/sidebar.tsx rename to foundry/packages/frontend/src/components/mock-layout/sidebar.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/skeleton.tsx b/foundry/packages/frontend/src/components/mock-layout/skeleton.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/skeleton.tsx rename to foundry/packages/frontend/src/components/mock-layout/skeleton.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/tab-strip.tsx b/foundry/packages/frontend/src/components/mock-layout/tab-strip.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/tab-strip.tsx rename to foundry/packages/frontend/src/components/mock-layout/tab-strip.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/transcript-header.tsx b/foundry/packages/frontend/src/components/mock-layout/transcript-header.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/transcript-header.tsx rename to foundry/packages/frontend/src/components/mock-layout/transcript-header.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/ui.tsx b/foundry/packages/frontend/src/components/mock-layout/ui.tsx similarity index 100% rename from factory/packages/frontend/src/components/mock-layout/ui.tsx rename to foundry/packages/frontend/src/components/mock-layout/ui.tsx diff --git a/factory/packages/frontend/src/components/mock-layout/view-model.test.ts b/foundry/packages/frontend/src/components/mock-layout/view-model.test.ts similarity index 98% rename from factory/packages/frontend/src/components/mock-layout/view-model.test.ts rename to foundry/packages/frontend/src/components/mock-layout/view-model.test.ts index d3556e5..f3362dc 100644 --- a/factory/packages/frontend/src/components/mock-layout/view-model.test.ts +++ b/foundry/packages/frontend/src/components/mock-layout/view-model.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { WorkbenchAgentTab } from "@sandbox-agent/factory-shared"; +import type { WorkbenchAgentTab } from "@sandbox-agent/foundry-shared"; import { buildDisplayMessages } from "./view-model"; function makeTab(transcript: WorkbenchAgentTab["transcript"]): WorkbenchAgentTab { diff --git a/factory/packages/frontend/src/components/mock-layout/view-model.ts b/foundry/packages/frontend/src/components/mock-layout/view-model.ts similarity index 99% rename from factory/packages/frontend/src/components/mock-layout/view-model.ts rename to foundry/packages/frontend/src/components/mock-layout/view-model.ts index 6e44b8f..14b5357 100644 --- a/factory/packages/frontend/src/components/mock-layout/view-model.ts +++ b/foundry/packages/frontend/src/components/mock-layout/view-model.ts @@ -12,7 +12,7 @@ import type { WorkbenchParsedDiffLine as ParsedDiffLine, WorkbenchRepoSection as WorkbenchRepoSection, WorkbenchTranscriptEvent as TranscriptEvent, -} from "@sandbox-agent/factory-shared"; +} from "@sandbox-agent/foundry-shared"; import { extractEventText } from "../../features/sessions/model"; export type Task = WorkbenchTask; diff --git a/factory/packages/frontend/src/components/mock-onboarding.tsx b/foundry/packages/frontend/src/components/mock-onboarding.tsx similarity index 97% rename from factory/packages/frontend/src/components/mock-onboarding.tsx rename to foundry/packages/frontend/src/components/mock-onboarding.tsx index c90a86e..c152d2d 100644 --- a/factory/packages/frontend/src/components/mock-onboarding.tsx +++ b/foundry/packages/frontend/src/components/mock-onboarding.tsx @@ -1,10 +1,10 @@ import { useEffect, useMemo, useState } from "react"; import { - type FactoryBillingPlanId, - type FactoryOrganization, - type FactoryOrganizationMember, - type FactoryUser, -} from "@sandbox-agent/factory-shared"; + type FoundryBillingPlanId, + type FoundryOrganization, + type FoundryOrganizationMember, + type FoundryUser, +} from "@sandbox-agent/foundry-shared"; import { useNavigate } from "@tanstack/react-router"; import { ArrowLeft, BadgeCheck, Building2, CreditCard, Github, ShieldCheck, Users } from "lucide-react"; import { @@ -22,7 +22,7 @@ const dateFormatter = new Intl.DateTimeFormat("en-US", { }); const planCatalog: Record< - FactoryBillingPlanId, + FoundryBillingPlanId, { label: string; price: string; @@ -145,30 +145,30 @@ function formatDate(value: string | null): string { return dateFormatter.format(new Date(value)); } -function workspacePath(organization: FactoryOrganization): string { +function workspacePath(organization: FoundryOrganization): string { return `/workspaces/${organization.workspaceId}`; } -function settingsPath(organization: FactoryOrganization): string { +function settingsPath(organization: FoundryOrganization): string { return `/organizations/${organization.id}/settings`; } -function billingPath(organization: FactoryOrganization): string { +function billingPath(organization: FoundryOrganization): string { return `/organizations/${organization.id}/billing`; } -function checkoutPath(organization: FactoryOrganization, planId: FactoryBillingPlanId): string { +function checkoutPath(organization: FoundryOrganization, planId: FoundryBillingPlanId): string { return `/organizations/${organization.id}/checkout/${planId}`; } -function statusBadge(organization: FactoryOrganization) { +function statusBadge(organization: FoundryOrganization) { if (organization.kind === "personal") { return Personal workspace; } return GitHub organization; } -function githubBadge(organization: FactoryOrganization) { +function githubBadge(organization: FoundryOrganization) { if (organization.github.installationStatus === "connected") { return GitHub connected; } @@ -187,7 +187,7 @@ function PageShell({ actions, onSignOut, }: { - user: FactoryUser | null; + user: FoundryUser | null; title: string; eyebrow: string; description: string; @@ -262,7 +262,7 @@ function StatCard({ label, value, caption }: { label: string; value: string; cap ); } -function MemberRow({ member }: { member: FactoryOrganizationMember }) { +function MemberRow({ member }: { member: FoundryOrganizationMember }) { return (
0; - const effectivePlanId: FactoryBillingPlanId = hasStripeCustomer ? organization.billing.planId : "free"; + const effectivePlanId: FoundryBillingPlanId = hasStripeCustomer ? organization.billing.planId : "free"; const effectiveSeatsIncluded = hasStripeCustomer ? organization.billing.seatsIncluded : 1; const openWorkspace = () => { void (async () => { @@ -739,7 +739,7 @@ export function MockOrganizationBillingPage({ organization }: { organization: Fa
- {(Object.entries(planCatalog) as Array<[FactoryBillingPlanId, (typeof planCatalog)[FactoryBillingPlanId]]>).map(([planId, plan]) => { + {(Object.entries(planCatalog) as Array<[FoundryBillingPlanId, (typeof planCatalog)[FoundryBillingPlanId]]>).map(([planId, plan]) => { const isCurrent = effectivePlanId === planId; return (
@@ -865,8 +865,8 @@ export function MockHostedCheckoutPage({ organization, planId, }: { - organization: FactoryOrganization; - planId: FactoryBillingPlanId; + organization: FoundryOrganization; + planId: FoundryBillingPlanId; }) { const client = useMockAppClient(); const snapshot = useMockAppSnapshot(); diff --git a/factory/packages/frontend/src/components/workspace-dashboard.tsx b/foundry/packages/frontend/src/components/workspace-dashboard.tsx similarity index 99% rename from factory/packages/frontend/src/components/workspace-dashboard.tsx rename to foundry/packages/frontend/src/components/workspace-dashboard.tsx index 4c722b2..70a94bb 100644 --- a/factory/packages/frontend/src/components/workspace-dashboard.tsx +++ b/foundry/packages/frontend/src/components/workspace-dashboard.tsx @@ -1,7 +1,7 @@ import { useEffect, useMemo, useState, type ReactNode } from "react"; -import type { AgentType, TaskRecord, TaskSummary, RepoBranchRecord, RepoOverview, RepoStackAction } from "@sandbox-agent/factory-shared"; -import type { SandboxSessionEventRecord } from "@sandbox-agent/factory-client"; -import { groupTaskStatus } from "@sandbox-agent/factory-client/view-model"; +import type { AgentType, TaskRecord, TaskSummary, RepoBranchRecord, RepoOverview, RepoStackAction } from "@sandbox-agent/foundry-shared"; +import type { SandboxSessionEventRecord } from "@sandbox-agent/foundry-client"; +import { groupTaskStatus } from "@sandbox-agent/foundry-client/view-model"; import { useMutation, useQuery } from "@tanstack/react-query"; import { Link, useNavigate } from "@tanstack/react-router"; import { Button } from "baseui/button"; diff --git a/factory/packages/frontend/src/features/sessions/model.test.ts b/foundry/packages/frontend/src/features/sessions/model.test.ts similarity index 98% rename from factory/packages/frontend/src/features/sessions/model.test.ts rename to foundry/packages/frontend/src/features/sessions/model.test.ts index e685826..990e529 100644 --- a/factory/packages/frontend/src/features/sessions/model.test.ts +++ b/foundry/packages/frontend/src/features/sessions/model.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { SandboxSessionRecord } from "@sandbox-agent/factory-client"; +import type { SandboxSessionRecord } from "@sandbox-agent/foundry-client"; import { buildTranscript, extractEventText, resolveSessionSelection } from "./model"; describe("extractEventText", () => { diff --git a/factory/packages/frontend/src/features/sessions/model.ts b/foundry/packages/frontend/src/features/sessions/model.ts similarity index 97% rename from factory/packages/frontend/src/features/sessions/model.ts rename to foundry/packages/frontend/src/features/sessions/model.ts index 01f3d4d..88218a9 100644 --- a/factory/packages/frontend/src/features/sessions/model.ts +++ b/foundry/packages/frontend/src/features/sessions/model.ts @@ -1,5 +1,5 @@ -import type { SandboxSessionEventRecord } from "@sandbox-agent/factory-client"; -import type { SandboxSessionRecord } from "@sandbox-agent/factory-client"; +import type { SandboxSessionEventRecord } from "@sandbox-agent/foundry-client"; +import type { SandboxSessionRecord } from "@sandbox-agent/foundry-client"; function fromPromptArray(value: unknown): string | null { if (!Array.isArray(value)) { diff --git a/factory/packages/frontend/src/features/tasks/model.test.ts b/foundry/packages/frontend/src/features/tasks/model.test.ts similarity index 97% rename from factory/packages/frontend/src/features/tasks/model.test.ts rename to foundry/packages/frontend/src/features/tasks/model.test.ts index dc53418..c9fff90 100644 --- a/factory/packages/frontend/src/features/tasks/model.test.ts +++ b/foundry/packages/frontend/src/features/tasks/model.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { TaskRecord } from "@sandbox-agent/factory-shared"; +import type { TaskRecord } from "@sandbox-agent/foundry-shared"; import { formatDiffStat, groupTasksByRepo } from "./model"; const base: TaskRecord = { diff --git a/factory/packages/frontend/src/features/tasks/model.ts b/foundry/packages/frontend/src/features/tasks/model.ts similarity index 95% rename from factory/packages/frontend/src/features/tasks/model.ts rename to foundry/packages/frontend/src/features/tasks/model.ts index fbebea2..1667505 100644 --- a/factory/packages/frontend/src/features/tasks/model.ts +++ b/foundry/packages/frontend/src/features/tasks/model.ts @@ -1,4 +1,4 @@ -import type { TaskRecord } from "@sandbox-agent/factory-shared"; +import type { TaskRecord } from "@sandbox-agent/foundry-shared"; export interface RepoGroup { repoId: string; diff --git a/foundry/packages/frontend/src/foundry-client-view-model.d.ts b/foundry/packages/frontend/src/foundry-client-view-model.d.ts new file mode 100644 index 0000000..43c3e4c --- /dev/null +++ b/foundry/packages/frontend/src/foundry-client-view-model.d.ts @@ -0,0 +1,7 @@ +declare module "@sandbox-agent/foundry-client/view-model" { + export { + HANDOFF_STATUS_GROUPS, + groupTaskStatus, + } from "@sandbox-agent/foundry-client"; + export type { TaskStatusGroup } from "@sandbox-agent/foundry-client"; +} diff --git a/factory/packages/frontend/src/lib/backend.ts b/foundry/packages/frontend/src/lib/backend.ts similarity index 73% rename from factory/packages/frontend/src/lib/backend.ts rename to foundry/packages/frontend/src/lib/backend.ts index c788e4f..8f5ebcd 100644 --- a/factory/packages/frontend/src/lib/backend.ts +++ b/foundry/packages/frontend/src/lib/backend.ts @@ -1,4 +1,4 @@ -import { createBackendClient } from "@sandbox-agent/factory-client/backend"; +import { createBackendClient } from "@sandbox-agent/foundry-client/backend"; import { backendEndpoint, defaultWorkspaceId } from "./env"; export const backendClient = createBackendClient({ diff --git a/factory/packages/frontend/src/lib/env.ts b/foundry/packages/frontend/src/lib/env.ts similarity index 79% rename from factory/packages/frontend/src/lib/env.ts rename to foundry/packages/frontend/src/lib/env.ts index 500ef9c..0a9331c 100644 --- a/factory/packages/frontend/src/lib/env.ts +++ b/foundry/packages/frontend/src/lib/env.ts @@ -6,7 +6,7 @@ function resolveDefaultBackendEndpoint(): string { } type FrontendImportMetaEnv = ImportMetaEnv & { - FACTORY_FRONTEND_CLIENT_MODE?: string; + FOUNDRY_FRONTEND_CLIENT_MODE?: string; }; const frontendEnv = import.meta.env as FrontendImportMetaEnv; @@ -17,7 +17,7 @@ export const backendEndpoint = export const defaultWorkspaceId = import.meta.env.VITE_HF_WORKSPACE?.trim() || "default"; function resolveFrontendClientMode(): "mock" | "remote" { - const raw = frontendEnv.FACTORY_FRONTEND_CLIENT_MODE?.trim().toLowerCase(); + const raw = frontendEnv.FOUNDRY_FRONTEND_CLIENT_MODE?.trim().toLowerCase(); if (raw === "mock") { return "mock"; } @@ -25,7 +25,7 @@ function resolveFrontendClientMode(): "mock" | "remote" { return "remote"; } throw new Error( - `Unsupported FACTORY_FRONTEND_CLIENT_MODE value "${frontendEnv.FACTORY_FRONTEND_CLIENT_MODE}". Expected "mock" or "remote".`, + `Unsupported FOUNDRY_FRONTEND_CLIENT_MODE value "${frontendEnv.FOUNDRY_FRONTEND_CLIENT_MODE}". Expected "mock" or "remote".`, ); } diff --git a/factory/packages/frontend/src/lib/mock-app.ts b/foundry/packages/frontend/src/lib/mock-app.ts similarity index 69% rename from factory/packages/frontend/src/lib/mock-app.ts rename to foundry/packages/frontend/src/lib/mock-app.ts index 72f558c..1c9537d 100644 --- a/factory/packages/frontend/src/lib/mock-app.ts +++ b/foundry/packages/frontend/src/lib/mock-app.ts @@ -1,23 +1,23 @@ import { useSyncExternalStore } from "react"; import { - createFactoryAppClient, - currentFactoryOrganization, - currentFactoryUser, - eligibleFactoryOrganizations, - type FactoryAppClient, -} from "@sandbox-agent/factory-client"; -import type { FactoryAppSnapshot, FactoryOrganization } from "@sandbox-agent/factory-shared"; + createFoundryAppClient, + currentFoundryOrganization, + currentFoundryUser, + eligibleFoundryOrganizations, + type FoundryAppClient, +} from "@sandbox-agent/foundry-client"; +import type { FoundryAppSnapshot, FoundryOrganization } from "@sandbox-agent/foundry-shared"; import { backendClient } from "./backend"; import { frontendClientMode } from "./env"; -const REMOTE_APP_SESSION_STORAGE_KEY = "sandbox-agent-factory:remote-app-session"; +const REMOTE_APP_SESSION_STORAGE_KEY = "sandbox-agent-foundry:remote-app-session"; -const appClient: FactoryAppClient = createFactoryAppClient({ +const appClient: FoundryAppClient = createFoundryAppClient({ mode: frontendClientMode, backend: frontendClientMode === "remote" ? backendClient : undefined, }); -export function useMockAppSnapshot(): FactoryAppSnapshot { +export function useMockAppSnapshot(): FoundryAppSnapshot { return useSyncExternalStore( appClient.subscribe.bind(appClient), appClient.getSnapshot.bind(appClient), @@ -25,13 +25,13 @@ export function useMockAppSnapshot(): FactoryAppSnapshot { ); } -export function useMockAppClient(): FactoryAppClient { +export function useMockAppClient(): FoundryAppClient { return appClient; } -export const activeMockUser = currentFactoryUser; -export const activeMockOrganization = currentFactoryOrganization; -export const eligibleOrganizations = eligibleFactoryOrganizations; +export const activeMockUser = currentFoundryUser; +export const activeMockOrganization = currentFoundryOrganization; +export const eligibleOrganizations = eligibleFoundryOrganizations; // Track whether the remote client has delivered its first real snapshot. // Before the first fetch completes the snapshot is the default empty signed_out state, @@ -48,7 +48,7 @@ appClient.subscribe = (listener: () => void): (() => void) => { return origSubscribe(wrappedListener); }; -export function isAppSnapshotBootstrapping(snapshot: FactoryAppSnapshot): boolean { +export function isAppSnapshotBootstrapping(snapshot: FoundryAppSnapshot): boolean { if (frontendClientMode !== "remote" || typeof window === "undefined") { return false; } @@ -72,8 +72,8 @@ export function isAppSnapshotBootstrapping(snapshot: FactoryAppSnapshot): boolea } export function getMockOrganizationById( - snapshot: FactoryAppSnapshot, + snapshot: FoundryAppSnapshot, organizationId: string, -): FactoryOrganization | null { +): FoundryOrganization | null { return snapshot.organizations.find((organization) => organization.id === organizationId) ?? null; } diff --git a/factory/packages/frontend/src/lib/workbench-routing.ts b/foundry/packages/frontend/src/lib/workbench-routing.ts similarity index 85% rename from factory/packages/frontend/src/lib/workbench-routing.ts rename to foundry/packages/frontend/src/lib/workbench-routing.ts index 3239636..35a7c39 100644 --- a/factory/packages/frontend/src/lib/workbench-routing.ts +++ b/foundry/packages/frontend/src/lib/workbench-routing.ts @@ -1,4 +1,4 @@ -import type { TaskWorkbenchSnapshot } from "@sandbox-agent/factory-shared"; +import type { TaskWorkbenchSnapshot } from "@sandbox-agent/foundry-shared"; export function resolveRepoRouteTaskId( snapshot: TaskWorkbenchSnapshot, diff --git a/factory/packages/frontend/src/lib/workbench-runtime.mock.ts b/foundry/packages/frontend/src/lib/workbench-runtime.mock.ts similarity index 82% rename from factory/packages/frontend/src/lib/workbench-runtime.mock.ts rename to foundry/packages/frontend/src/lib/workbench-runtime.mock.ts index 263c67f..3691644 100644 --- a/factory/packages/frontend/src/lib/workbench-runtime.mock.ts +++ b/foundry/packages/frontend/src/lib/workbench-runtime.mock.ts @@ -1,7 +1,7 @@ import { createTaskWorkbenchClient, type TaskWorkbenchClient, -} from "@sandbox-agent/factory-client/workbench"; +} from "@sandbox-agent/foundry-client/workbench"; export function createWorkbenchRuntimeClient(workspaceId: string): TaskWorkbenchClient { return createTaskWorkbenchClient({ diff --git a/factory/packages/frontend/src/lib/workbench-runtime.remote.ts b/foundry/packages/frontend/src/lib/workbench-runtime.remote.ts similarity index 86% rename from factory/packages/frontend/src/lib/workbench-runtime.remote.ts rename to foundry/packages/frontend/src/lib/workbench-runtime.remote.ts index 624d176..9c91208 100644 --- a/factory/packages/frontend/src/lib/workbench-runtime.remote.ts +++ b/foundry/packages/frontend/src/lib/workbench-runtime.remote.ts @@ -1,7 +1,7 @@ import { createTaskWorkbenchClient, type TaskWorkbenchClient, -} from "@sandbox-agent/factory-client/workbench"; +} from "@sandbox-agent/foundry-client/workbench"; import { backendClient } from "./backend"; export function createWorkbenchRuntimeClient(workspaceId: string): TaskWorkbenchClient { diff --git a/factory/packages/frontend/src/lib/workbench.test.ts b/foundry/packages/frontend/src/lib/workbench.test.ts similarity index 93% rename from factory/packages/frontend/src/lib/workbench.test.ts rename to foundry/packages/frontend/src/lib/workbench.test.ts index 59fa155..08787d1 100644 --- a/factory/packages/frontend/src/lib/workbench.test.ts +++ b/foundry/packages/frontend/src/lib/workbench.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import type { TaskWorkbenchSnapshot } from "@sandbox-agent/factory-shared"; +import type { TaskWorkbenchSnapshot } from "@sandbox-agent/foundry-shared"; import { resolveRepoRouteTaskId } from "./workbench-routing"; const snapshot: TaskWorkbenchSnapshot = { diff --git a/factory/packages/frontend/src/lib/workbench.ts b/foundry/packages/frontend/src/lib/workbench.ts similarity index 90% rename from factory/packages/frontend/src/lib/workbench.ts rename to foundry/packages/frontend/src/lib/workbench.ts index dadb342..e51f9a4 100644 --- a/factory/packages/frontend/src/lib/workbench.ts +++ b/foundry/packages/frontend/src/lib/workbench.ts @@ -1,4 +1,4 @@ -import type { TaskWorkbenchClient } from "@sandbox-agent/factory-client/workbench"; +import type { TaskWorkbenchClient } from "@sandbox-agent/foundry-client/workbench"; import { createWorkbenchRuntimeClient } from "@workbench-runtime"; import { frontendClientMode } from "./env"; export { resolveRepoRouteTaskId } from "./workbench-routing"; diff --git a/factory/packages/frontend/src/main.tsx b/foundry/packages/frontend/src/main.tsx similarity index 100% rename from factory/packages/frontend/src/main.tsx rename to foundry/packages/frontend/src/main.tsx diff --git a/factory/packages/frontend/src/styles.css b/foundry/packages/frontend/src/styles.css similarity index 100% rename from factory/packages/frontend/src/styles.css rename to foundry/packages/frontend/src/styles.css diff --git a/factory/packages/frontend/tsconfig.json b/foundry/packages/frontend/tsconfig.json similarity index 100% rename from factory/packages/frontend/tsconfig.json rename to foundry/packages/frontend/tsconfig.json diff --git a/factory/packages/frontend/vite.config.ts b/foundry/packages/frontend/vite.config.ts similarity index 90% rename from factory/packages/frontend/vite.config.ts rename to foundry/packages/frontend/vite.config.ts index e0b5fe0..427ea2e 100644 --- a/factory/packages/frontend/vite.config.ts +++ b/foundry/packages/frontend/vite.config.ts @@ -3,18 +3,18 @@ import { dirname } from "node:path"; import { fileURLToPath, URL } from "node:url"; import { defineConfig, searchForWorkspaceRoot } from "vite"; import react from "@vitejs/plugin-react"; -import { frontendErrorCollectorVitePlugin } from "@sandbox-agent/factory-frontend-errors/vite"; +import { frontendErrorCollectorVitePlugin } from "@sandbox-agent/foundry-frontend-errors/vite"; const backendProxyTarget = process.env.HF_BACKEND_HTTP?.trim() || "http://127.0.0.1:7741"; const cacheDir = process.env.HF_VITE_CACHE_DIR?.trim() || undefined; -const frontendClientMode = process.env.FACTORY_FRONTEND_CLIENT_MODE?.trim() || "remote"; +const frontendClientMode = process.env.FOUNDRY_FRONTEND_CLIENT_MODE?.trim() || "remote"; const rivetkitClientEntry = realpathSync( fileURLToPath(new URL("../client/node_modules/rivetkit/dist/browser/client.js", import.meta.url)), ); const rivetkitPackageRoot = dirname(dirname(dirname(rivetkitClientEntry))); export default defineConfig({ define: { - "import.meta.env.FACTORY_FRONTEND_CLIENT_MODE": JSON.stringify( + "import.meta.env.FOUNDRY_FRONTEND_CLIENT_MODE": JSON.stringify( frontendClientMode, ), }, diff --git a/factory/packages/frontend/vitest.config.ts b/foundry/packages/frontend/vitest.config.ts similarity index 100% rename from factory/packages/frontend/vitest.config.ts rename to foundry/packages/frontend/vitest.config.ts diff --git a/factory/packages/shared/package.json b/foundry/packages/shared/package.json similarity index 88% rename from factory/packages/shared/package.json rename to foundry/packages/shared/package.json index 0bfce7d..1b4f3ee 100644 --- a/factory/packages/shared/package.json +++ b/foundry/packages/shared/package.json @@ -1,5 +1,5 @@ { - "name": "@sandbox-agent/factory-shared", + "name": "@sandbox-agent/foundry-shared", "version": "0.1.0", "private": true, "type": "module", diff --git a/factory/packages/shared/src/app-shell.ts b/foundry/packages/shared/src/app-shell.ts similarity index 52% rename from factory/packages/shared/src/app-shell.ts rename to foundry/packages/shared/src/app-shell.ts index ed87c29..0d1c190 100644 --- a/factory/packages/shared/src/app-shell.ts +++ b/foundry/packages/shared/src/app-shell.ts @@ -1,10 +1,10 @@ -export type FactoryBillingPlanId = "free" | "team"; -export type FactoryBillingStatus = "active" | "trialing" | "past_due" | "scheduled_cancel"; -export type FactoryGithubInstallationStatus = "connected" | "install_required" | "reconnect_required"; -export type FactoryGithubSyncStatus = "pending" | "syncing" | "synced" | "error"; -export type FactoryOrganizationKind = "personal" | "organization"; +export type FoundryBillingPlanId = "free" | "team"; +export type FoundryBillingStatus = "active" | "trialing" | "past_due" | "scheduled_cancel"; +export type FoundryGithubInstallationStatus = "connected" | "install_required" | "reconnect_required"; +export type FoundryGithubSyncStatus = "pending" | "syncing" | "synced" | "error"; +export type FoundryOrganizationKind = "personal" | "organization"; -export interface FactoryUser { +export interface FoundryUser { id: string; name: string; email: string; @@ -13,7 +13,7 @@ export interface FactoryUser { eligibleOrganizationIds: string[]; } -export interface FactoryOrganizationMember { +export interface FoundryOrganizationMember { id: string; name: string; email: string; @@ -21,7 +21,7 @@ export interface FactoryOrganizationMember { state: "active" | "invited"; } -export interface FactoryInvoice { +export interface FoundryInvoice { id: string; label: string; issuedAt: string; @@ -29,27 +29,27 @@ export interface FactoryInvoice { status: "paid" | "open"; } -export interface FactoryBillingState { - planId: FactoryBillingPlanId; - status: FactoryBillingStatus; +export interface FoundryBillingState { + planId: FoundryBillingPlanId; + status: FoundryBillingStatus; seatsIncluded: number; trialEndsAt: string | null; renewalAt: string | null; stripeCustomerId: string; paymentMethodLabel: string; - invoices: FactoryInvoice[]; + invoices: FoundryInvoice[]; } -export interface FactoryGithubState { +export interface FoundryGithubState { connectedAccount: string; - installationStatus: FactoryGithubInstallationStatus; - syncStatus: FactoryGithubSyncStatus; + installationStatus: FoundryGithubInstallationStatus; + syncStatus: FoundryGithubSyncStatus; importedRepoCount: number; lastSyncLabel: string; lastSyncAt: number | null; } -export interface FactoryOrganizationSettings { +export interface FoundryOrganizationSettings { displayName: string; slug: string; primaryDomain: string; @@ -58,29 +58,29 @@ export interface FactoryOrganizationSettings { autoImportRepos: boolean; } -export interface FactoryOrganization { +export interface FoundryOrganization { id: string; workspaceId: string; - kind: FactoryOrganizationKind; - settings: FactoryOrganizationSettings; - github: FactoryGithubState; - billing: FactoryBillingState; - members: FactoryOrganizationMember[]; + kind: FoundryOrganizationKind; + settings: FoundryOrganizationSettings; + github: FoundryGithubState; + billing: FoundryBillingState; + members: FoundryOrganizationMember[]; seatAssignments: string[]; repoCatalog: string[]; } -export interface FactoryAppSnapshot { +export interface FoundryAppSnapshot { auth: { status: "signed_out" | "signed_in"; currentUserId: string | null; }; activeOrganizationId: string | null; - users: FactoryUser[]; - organizations: FactoryOrganization[]; + users: FoundryUser[]; + organizations: FoundryOrganization[]; } -export interface UpdateFactoryOrganizationProfileInput { +export interface UpdateFoundryOrganizationProfileInput { organizationId: string; displayName: string; slug: string; diff --git a/factory/packages/shared/src/config.ts b/foundry/packages/shared/src/config.ts similarity index 92% rename from factory/packages/shared/src/config.ts rename to foundry/packages/shared/src/config.ts index 05d5f57..239e0a8 100644 --- a/factory/packages/shared/src/config.ts +++ b/foundry/packages/shared/src/config.ts @@ -24,7 +24,7 @@ export const ConfigSchema = z.object({ backend: z.object({ host: z.string().default("127.0.0.1"), port: z.number().int().min(1).max(65535).default(7741), - dbPath: z.string().default("~/.local/share/sandbox-agent-factory/task.db"), + dbPath: z.string().default("~/.local/share/sandbox-agent-foundry/task.db"), opencode_poll_interval: z.number().default(2), github_poll_interval: z.number().default(30), backup_interval_secs: z.number().default(3600), @@ -32,7 +32,7 @@ export const ConfigSchema = z.object({ }).default({ host: "127.0.0.1", port: 7741, - dbPath: "~/.local/share/sandbox-agent-factory/task.db", + dbPath: "~/.local/share/sandbox-agent-foundry/task.db", opencode_poll_interval: 2, github_poll_interval: 30, backup_interval_secs: 3600, diff --git a/factory/packages/shared/src/contracts.ts b/foundry/packages/shared/src/contracts.ts similarity index 100% rename from factory/packages/shared/src/contracts.ts rename to foundry/packages/shared/src/contracts.ts diff --git a/factory/packages/shared/src/index.ts b/foundry/packages/shared/src/index.ts similarity index 100% rename from factory/packages/shared/src/index.ts rename to foundry/packages/shared/src/index.ts diff --git a/factory/packages/shared/src/workbench.ts b/foundry/packages/shared/src/workbench.ts similarity index 100% rename from factory/packages/shared/src/workbench.ts rename to foundry/packages/shared/src/workbench.ts diff --git a/factory/packages/shared/src/workspace.ts b/foundry/packages/shared/src/workspace.ts similarity index 100% rename from factory/packages/shared/src/workspace.ts rename to foundry/packages/shared/src/workspace.ts diff --git a/factory/packages/shared/test/workspace.test.ts b/foundry/packages/shared/test/workspace.test.ts similarity index 94% rename from factory/packages/shared/test/workspace.test.ts rename to foundry/packages/shared/test/workspace.test.ts index c2247f6..957679f 100644 --- a/factory/packages/shared/test/workspace.test.ts +++ b/foundry/packages/shared/test/workspace.test.ts @@ -8,7 +8,7 @@ const cfg: AppConfig = ConfigSchema.parse({ backend: { host: "127.0.0.1", port: 7741, - dbPath: "~/.local/share/sandbox-agent-factory/handoff.db", + dbPath: "~/.local/share/sandbox-agent-foundry/handoff.db", opencode_poll_interval: 2, github_poll_interval: 30, backup_interval_secs: 3600, diff --git a/factory/packages/shared/tsconfig.json b/foundry/packages/shared/tsconfig.json similarity index 100% rename from factory/packages/shared/tsconfig.json rename to foundry/packages/shared/tsconfig.json diff --git a/factory/railway.toml b/foundry/railway.toml similarity index 100% rename from factory/railway.toml rename to foundry/railway.toml diff --git a/factory/research/friction/general.mdx b/foundry/research/friction/general.mdx similarity index 98% rename from factory/research/friction/general.mdx rename to foundry/research/friction/general.mdx index 9585c72..1fcf955 100644 --- a/factory/research/friction/general.mdx +++ b/foundry/research/friction/general.mdx @@ -101,7 +101,7 @@ Fixing Daytona `hf create` failures where `handoff.attach` would exhaust retries ### Friction / Issue -Sandbox Agent Factory was using RivetKit's KV-backed durable SQLite VFS via `rivetkit/db/drizzle`, which opens the SQLite DB keyed by `ctx.actorId`. Since actor instances can be rescheduled (new `actorId`) between requests, DB writes from initialization were not visible to later actions (e.g. `attach`), causing “Handoff not found” and action timeouts. +Sandbox Agent Foundry was using RivetKit's KV-backed durable SQLite VFS via `rivetkit/db/drizzle`, which opens the SQLite DB keyed by `ctx.actorId`. Since actor instances can be rescheduled (new `actorId`) between requests, DB writes from initialization were not visible to later actions (e.g. `attach`), causing “Handoff not found” and action timeouts. Separately, importing `bun:sqlite` directly broke: @@ -194,7 +194,7 @@ Backend integration tests depend on native `better-sqlite3` bindings, which were ### Attempted Fix / Workaround -1. Attempted `pnpm --filter @sandbox-agent/factory-backend rebuild better-sqlite3`. +1. Attempted `pnpm --filter @sandbox-agent/foundry-backend rebuild better-sqlite3`. 2. Added runtime capability detection in DB-backed backend tests. 3. Marked DB-backed tests with `it.skipIf(!hasBetterSqliteBinding)` so tests run when native bindings exist and skip cleanly otherwise. @@ -280,7 +280,7 @@ Running backend tests with the integration flag enabled triggered unrelated acto ### Attempted Fix / Workaround -1. Switched to package-targeted test runs for deterministic coverage (`@sandbox-agent/factory-backend` + `@sandbox-agent/factory-frontend`). +1. Switched to package-targeted test runs for deterministic coverage (`@sandbox-agent/foundry-backend` + `@sandbox-agent/foundry-frontend`). 2. Relied on required workspace validation (`pnpm -w typecheck`, `pnpm -w build`, `pnpm -w test`) plus targeted stack test files. 3. Stopped the runaway integration run and recorded this friction for follow-up. diff --git a/factory/research/friction/rivet.mdx b/foundry/research/friction/rivet.mdx similarity index 99% rename from factory/research/friction/rivet.mdx rename to foundry/research/friction/rivet.mdx index 73763fa..962cc38 100644 --- a/factory/research/friction/rivet.mdx +++ b/foundry/research/friction/rivet.mdx @@ -140,7 +140,7 @@ Captured the guidance here so future actor work doesn’t mix the two models arb ### What I Was Working On -Standardizing SQLite + Drizzle setup for RivetKit actors (migration-per-actor) to match the `rivet/examples/sandbox` pattern while keeping the Sandbox Agent Factory repo TypeScript-only. +Standardizing SQLite + Drizzle setup for RivetKit actors (migration-per-actor) to match the `rivet/examples/sandbox` pattern while keeping the Sandbox Agent Foundry repo TypeScript-only. ### Friction / Issue @@ -174,7 +174,7 @@ Adopt these concrete repo conventions: - Per-actor migration tracking tables: - Even if all actors share one SQLite file, each actor must use its own migration table, e.g. - - `__factory_migrations_` + - `__foundry_migrations_` - `migrationNamespace` should be stable and sanitized to `[a-z0-9_]`. - Provider wiring pattern inside an actor: @@ -195,7 +195,7 @@ Captured the exact folder layout + script workflow so future actor DB work can f ### What I Was Working On -Diagnosing `StepExhaustedError` surfacing as `unknown error` during step replay (affecting Sandbox Agent Factory Daytona `hf create`). +Diagnosing `StepExhaustedError` surfacing as `unknown error` during step replay (affecting Sandbox Agent Foundry Daytona `hf create`). ### Friction / Issue @@ -203,7 +203,7 @@ The workflow engine treated “step completed” as `stepData.output !== undefin ### Attempted Fix / Workaround -- None in Sandbox Agent Factory; this is a workflow-engine correctness bug. +- None in Sandbox Agent Foundry; this is a workflow-engine correctness bug. ### Outcome diff --git a/factory/research/friction/sandbox-agent.mdx b/foundry/research/friction/sandbox-agent.mdx similarity index 100% rename from factory/research/friction/sandbox-agent.mdx rename to foundry/research/friction/sandbox-agent.mdx diff --git a/factory/research/friction/sandboxes.mdx b/foundry/research/friction/sandboxes.mdx similarity index 100% rename from factory/research/friction/sandboxes.mdx rename to foundry/research/friction/sandboxes.mdx diff --git a/factory/research/roadmap.md b/foundry/research/roadmap.md similarity index 100% rename from factory/research/roadmap.md rename to foundry/research/roadmap.md diff --git a/factory/research/specs/frontend.md b/foundry/research/specs/frontend.md similarity index 100% rename from factory/research/specs/frontend.md rename to foundry/research/specs/frontend.md diff --git a/factory/research/specs/rivetkit-opentui-migration-plan.md b/foundry/research/specs/rivetkit-opentui-migration-plan.md similarity index 99% rename from factory/research/specs/rivetkit-opentui-migration-plan.md rename to foundry/research/specs/rivetkit-opentui-migration-plan.md index db24067..51447b0 100644 --- a/factory/research/specs/rivetkit-opentui-migration-plan.md +++ b/foundry/research/specs/rivetkit-opentui-migration-plan.md @@ -16,7 +16,7 @@ Date: 2026-02-08 9. Every actor key is prefixed by workspace. 10. `--workspace` is optional; commands resolve workspace via flag -> config default -> `default`. 11. RivetKit local dependency wiring is `link:`-based. -12. Keep the existing config file path (`~/.config/sandbox-agent-factory/config.toml`) and evolve keys in place. +12. Keep the existing config file path (`~/.config/sandbox-agent-foundry/config.toml`) and evolve keys in place. 13. `.agents` and skill files are in scope for migration updates. 14. Parent orchestration actors (`workspace`, `project`, `handoff`) use command-only loops with no timeout. 15. Periodic syncing/polling runs in dedicated child actors, each with a single timeout cadence. diff --git a/factory/scripts/build-test-image.sh b/foundry/scripts/build-test-image.sh similarity index 100% rename from factory/scripts/build-test-image.sh rename to foundry/scripts/build-test-image.sh diff --git a/factory/tsconfig.base.json b/foundry/tsconfig.base.json similarity index 62% rename from factory/tsconfig.base.json rename to foundry/tsconfig.base.json index d0a8e93..9812077 100644 --- a/factory/tsconfig.base.json +++ b/foundry/tsconfig.base.json @@ -13,11 +13,11 @@ "declaration": true, "sourceMap": true, "paths": { - "@sandbox-agent/factory-client": ["packages/client/src/index.ts"], - "@sandbox-agent/factory-shared": ["packages/shared/src/index.ts"], - "@sandbox-agent/factory-backend": ["packages/backend/src/index.ts"], - "@sandbox-agent/factory-frontend-errors": ["packages/frontend-errors/src/index.ts"], - "@sandbox-agent/factory-frontend-errors/*": ["packages/frontend-errors/src/*"] + "@sandbox-agent/foundry-client": ["packages/client/src/index.ts"], + "@sandbox-agent/foundry-shared": ["packages/shared/src/index.ts"], + "@sandbox-agent/foundry-backend": ["packages/backend/src/index.ts"], + "@sandbox-agent/foundry-frontend-errors": ["packages/frontend-errors/src/index.ts"], + "@sandbox-agent/foundry-frontend-errors/*": ["packages/frontend-errors/src/*"] }, "noUncheckedIndexedAccess": true, "noImplicitOverride": true diff --git a/justfile b/justfile index 4e841da..e691332 100644 --- a/justfile +++ b/justfile @@ -93,110 +93,110 @@ install-release: cargo install --path gigacode # ============================================================================= -# Factory +# Foundry # ============================================================================= -[group('factory')] -factory-deps: +[group('foundry')] +foundry-deps: pnpm install -[group('factory')] -factory-install: +[group('foundry')] +foundry-install: pnpm install pnpm -w build -[group('factory')] -factory-typecheck: +[group('foundry')] +foundry-typecheck: pnpm -w typecheck -[group('factory')] -factory-build: +[group('foundry')] +foundry-build: pnpm -w build -[group('factory')] -factory-test: +[group('foundry')] +foundry-test: pnpm -w test -[group('factory')] -factory-check: +[group('foundry')] +foundry-check: pnpm -w typecheck pnpm -w build pnpm -w test -[group('factory')] -factory-dev: +[group('foundry')] +foundry-dev: pnpm install - mkdir -p factory/.sandbox-agent-factory/logs - HF_DOCKER_UID="$(id -u)" HF_DOCKER_GID="$(id -g)" docker compose -f factory/compose.dev.yaml up --build --force-recreate -d + mkdir -p foundry/.sandbox-agent-foundry/logs + HF_DOCKER_UID="$(id -u)" HF_DOCKER_GID="$(id -g)" docker compose -f foundry/compose.dev.yaml up --build --force-recreate -d -[group('factory')] -factory-preview: +[group('foundry')] +foundry-preview: pnpm install - mkdir -p factory/.sandbox-agent-factory/logs - HF_DOCKER_UID="$(id -u)" HF_DOCKER_GID="$(id -g)" docker compose -f factory/compose.preview.yaml up --build --force-recreate -d + mkdir -p foundry/.sandbox-agent-foundry/logs + HF_DOCKER_UID="$(id -u)" HF_DOCKER_GID="$(id -g)" docker compose -f foundry/compose.preview.yaml up --build --force-recreate -d -[group('factory')] -factory-frontend-dev host='127.0.0.1' port='4173' backend='http://127.0.0.1:7741/api/rivet': +[group('foundry')] +foundry-frontend-dev host='127.0.0.1' port='4173' backend='http://127.0.0.1:7741/api/rivet': pnpm install - VITE_HF_BACKEND_ENDPOINT="{{backend}}" pnpm --filter @sandbox-agent/factory-frontend dev -- --host {{host}} --port {{port}} + VITE_HF_BACKEND_ENDPOINT="{{backend}}" pnpm --filter @sandbox-agent/foundry-frontend dev -- --host {{host}} --port {{port}} -[group('factory')] -factory-dev-mock: +[group('foundry')] +foundry-dev-mock: pnpm install - mkdir -p factory/.sandbox-agent-factory/logs - docker compose -f factory/compose.mock.yaml up --build --force-recreate -d + mkdir -p foundry/.sandbox-agent-foundry/logs + docker compose -f foundry/compose.mock.yaml up --build --force-recreate -d -[group('factory')] -factory-dev-mock-down: - docker compose -f factory/compose.mock.yaml down +[group('foundry')] +foundry-dev-mock-down: + docker compose -f foundry/compose.mock.yaml down -[group('factory')] -factory-dev-mock-logs: - docker compose -f factory/compose.mock.yaml logs -f --tail=200 +[group('foundry')] +foundry-dev-mock-logs: + docker compose -f foundry/compose.mock.yaml logs -f --tail=200 -[group('factory')] -factory-dev-turbo: - pnpm exec turbo run dev --parallel --filter=@sandbox-agent/factory-* +[group('foundry')] +foundry-dev-turbo: + pnpm exec turbo run dev --parallel --filter=@sandbox-agent/foundry-* -[group('factory')] -factory-dev-down: - docker compose -f factory/compose.dev.yaml down +[group('foundry')] +foundry-dev-down: + docker compose -f foundry/compose.dev.yaml down -[group('factory')] -factory-dev-logs: - docker compose -f factory/compose.dev.yaml logs -f --tail=200 +[group('foundry')] +foundry-dev-logs: + docker compose -f foundry/compose.dev.yaml logs -f --tail=200 -[group('factory')] -factory-preview-down: - docker compose -f factory/compose.preview.yaml down +[group('foundry')] +foundry-preview-down: + docker compose -f foundry/compose.preview.yaml down -[group('factory')] -factory-preview-logs: - docker compose -f factory/compose.preview.yaml logs -f --tail=200 +[group('foundry')] +foundry-preview-logs: + docker compose -f foundry/compose.preview.yaml logs -f --tail=200 -[group('factory')] -factory-format: - prettier --write factory +[group('foundry')] +foundry-format: + prettier --write foundry -[group('factory')] -factory-backend-start host='127.0.0.1' port='7741': +[group('foundry')] +foundry-backend-start host='127.0.0.1' port='7741': pnpm install - pnpm --filter @sandbox-agent/factory-backend build - NODE_ENV=development pnpm --filter @sandbox-agent/factory-backend start -- --host {{host}} --port {{port}} + pnpm --filter @sandbox-agent/foundry-backend build + NODE_ENV=development pnpm --filter @sandbox-agent/foundry-backend start -- --host {{host}} --port {{port}} -[group('factory')] -factory-hf *ARGS: +[group('foundry')] +foundry-hf *ARGS: @echo "CLI package is disabled in this repo; use frontend workflows instead." >&2 @exit 1 -[group('factory')] -factory-docker-build tag='sandbox-agent-factory:local': - docker build -f factory/Dockerfile -t {{tag}} . +[group('foundry')] +foundry-docker-build tag='sandbox-agent-foundry:local': + docker build -f foundry/Dockerfile -t {{tag}} . -[group('factory')] -factory-railway-up: +[group('foundry')] +foundry-railway-up: npx -y @railway/cli up --detach -[group('factory')] -factory-railway-status: +[group('foundry')] +foundry-railway-status: npx -y @railway/cli status --json diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b6dbf60..229465a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,7 @@ packages: - "frontend/packages/*" - - "factory/packages/*" - - "!factory/packages/cli" + - "foundry/packages/*" + - "!foundry/packages/cli" - "sdks/*" - "sdks/cli" - "sdks/cli/platforms/*" diff --git a/research/friction/factory.md b/research/friction/foundry.md similarity index 75% rename from research/friction/factory.md rename to research/friction/foundry.md index 07759fe..fa7442f 100644 --- a/research/friction/factory.md +++ b/research/friction/foundry.md @@ -1,6 +1,6 @@ -# Factory Friction Log +# Foundry Friction Log -Track friction with Factory product development, frontend, backend, client, and cross-cutting concerns. +Track friction with Foundry product development, frontend, backend, client, and cross-cutting concerns. ## Entry template