Welcome to Rakazo
+Welcome to evOo
Choose which server this app should use.
diff --git a/.env.example b/.env.example index 2a11540..7e0a40f 100644 --- a/.env.example +++ b/.env.example @@ -206,10 +206,10 @@ RAKAZO_COMPOSE_FILE= # RAKAZO_UPDATE_SERVICES=supervisor RAKAZO_UPDATE_SERVICES= # Published images (defaults match this repository). Tag `local` is built from the checkout. -RAKAZO_IMAGE=ghcr.io/elie222/rakazo/app +RAKAZO_IMAGE=ghcr.io/cynarai/evoo-local/app RAKAZO_IMAGE_TAG=local RAKAZO_IMAGE_TAG_PREVIOUS= -RAKAZO_UPDATER_IMAGE=ghcr.io/elie222/rakazo/updater +RAKAZO_UPDATER_IMAGE=ghcr.io/cynarai/evoo-local/updater RAKAZO_UPDATER_IMAGE_TAG=local # Required only when starting the opt-in `updater` Compose profile; the sidecar refuses to start # without it. Use a dedicated random value, not BETTER_AUTH_SECRET, diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index a6705d9..f722a95 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -1,5 +1,5 @@ name: Bug report -description: Something is broken in Rakazo +description: Something is broken in evOo title: "[Bug]: " labels: - bug @@ -7,7 +7,7 @@ body: - type: markdown attributes: value: | - For **security vulnerabilities**, email [security@rakazo.com](mailto:security@rakazo.com) — do not use this form. See [SECURITY.md](https://github.com/elie222/rakazo/blob/main/SECURITY.md). + For **security vulnerabilities**, open a [private security advisory](https://github.com/cynarAI/evOo-local/security/advisories/new) do not use this form. See [SECURITY.md](https://github.com/cynarAI/evOo-local/blob/main/SECURITY.md). - type: checkboxes id: not-security @@ -55,7 +55,7 @@ body: - type: input id: version attributes: - label: Rakazo version or commit + label: evOo version or commit placeholder: v0.1.0 or abc1234 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 06b518f..f8b55f2 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,11 +1,5 @@ blank_issues_enabled: false contact_links: - name: Security vulnerabilities - url: https://github.com/elie222/rakazo/blob/main/SECURITY.md - about: Report security issues to security@rakazo.com — do not open a public issue. - - name: User support - url: mailto:support@rakazo.com - about: Questions about using Rakazo or self-hosting help. - - name: Maintainer - url: mailto:elie@rakazo.com - about: Reach the maintainer directly. + url: https://github.com/cynarAI/evOo-local/security/advisories/new + about: Report security issues privately. Do not open a public issue. diff --git a/.github/ISSUE_TEMPLATE/self-host.yml b/.github/ISSUE_TEMPLATE/self-host.yml index 6aa2052..1cc45f1 100644 --- a/.github/ISSUE_TEMPLATE/self-host.yml +++ b/.github/ISSUE_TEMPLATE/self-host.yml @@ -1,5 +1,5 @@ name: Self-host setup -description: Cannot start Rakazo, run compose, migrate, or build the sandbox +description: Cannot start evOo, run compose, migrate, or build the sandbox title: "[Self-host]: " labels: - self-host @@ -7,9 +7,9 @@ body: - type: markdown attributes: value: | - For **security vulnerabilities**, email [security@rakazo.com](mailto:security@rakazo.com). See [SECURITY.md](https://github.com/elie222/rakazo/blob/main/SECURITY.md). + For **security vulnerabilities**, open a [private security advisory](https://github.com/cynarAI/evOo-local/security/advisories/new). See [SECURITY.md](https://github.com/cynarAI/evOo-local/blob/main/SECURITY.md). - Setup steps are in [README.md](https://github.com/elie222/rakazo/blob/main/README.md). Do not paste `.env` contents or API keys. + Setup steps are in [README.md](https://github.com/cynarAI/evOo-local/blob/main/README.md). Do not paste `.env` contents or API keys. - type: dropdown id: step @@ -46,7 +46,7 @@ body: - type: input id: version attributes: - label: Rakazo version or commit + label: evOo version or commit placeholder: main @ abc1234 validations: required: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c016722..b9f1807 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -423,46 +423,3 @@ jobs: fi eas update --platform all --channel production --environment production --message "$GITHUB_SHA" --non-interactive - deploy-production: - if: >- - github.event_name == 'push' && - github.ref == 'refs/heads/main' && - vars.PRODUCTION_DEPLOY_ENABLED == 'true' - needs: [lint, check, build, test, test-integration, test-e2e] - runs-on: [self-hosted, evoo-ci, Linux] - timeout-minutes: 30 - concurrency: - group: production - cancel-in-progress: false - environment: - name: production - url: https://app.rakazo.com - steps: - - name: Configure production SSH identity - env: - SSH_PRIVATE_KEY: ${{ secrets.PRODUCTION_SSH_PRIVATE_KEY }} - SSH_KNOWN_HOSTS: ${{ secrets.PRODUCTION_SSH_KNOWN_HOSTS }} - run: | - test -n "$SSH_PRIVATE_KEY" - test -n "$SSH_KNOWN_HOSTS" - install -d -m 700 "$HOME/.ssh" - printf '%s\n' "$SSH_PRIVATE_KEY" > "$HOME/.ssh/rakazo-production" - printf '%s\n' "$SSH_KNOWN_HOSTS" > "$HOME/.ssh/known_hosts" - chmod 600 "$HOME/.ssh/rakazo-production" "$HOME/.ssh/known_hosts" - ssh-keygen -y -f "$HOME/.ssh/rakazo-production" >/dev/null - - - name: Deploy successful main revision - env: - SSH_HOST: ${{ secrets.PRODUCTION_SSH_HOST }} - SSH_USER: ${{ secrets.PRODUCTION_SSH_USER }} - run: | - test -n "$SSH_HOST" - test -n "$SSH_USER" - ssh -F /dev/null \ - -i "$HOME/.ssh/rakazo-production" \ - -o BatchMode=yes \ - -o ConnectTimeout=15 \ - -o IdentitiesOnly=yes \ - -o StrictHostKeyChecking=yes \ - -o UserKnownHostsFile="$HOME/.ssh/known_hosts" \ - "$SSH_USER@$SSH_HOST" deploy-main diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index bac3e64..ff30a4e 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -172,8 +172,8 @@ jobs: xcrun stapler validate "$app" spctl --assess --type execute --verbose=2 "$app" grep -Fqx "provider: github" "$app/Contents/Resources/app-update.yml" - grep -Fqx "owner: elie222" "$app/Contents/Resources/app-update.yml" - grep -Fqx "repo: rakazo" "$app/Contents/Resources/app-update.yml" + grep -Fqx "owner: cynarAI" "$app/Contents/Resources/app-update.yml" + grep -Fqx "repo: evOo-local" "$app/Contents/Resources/app-update.yml" - name: Require Windows signing credentials if: runner.os == 'Windows' @@ -214,7 +214,7 @@ jobs: throw "Windows update config is not bound to the signing publisher." } $feed = Get-Content -Raw $config - foreach ($expected in @("provider: github", "owner: elie222", "repo: rakazo")) { + foreach ($expected in @("provider: github", "owner: cynarAI", "repo: evOo-local")) { if ($feed -notmatch "(?m)^$([regex]::Escape($expected))\r?$") { throw "Windows update config missing '$expected'." } @@ -239,8 +239,8 @@ jobs: test -n "$config" test -f "$config" grep -Fqx "provider: github" "$config" - grep -Fqx "owner: elie222" "$config" - grep -Fqx "repo: rakazo" "$config" + grep -Fqx "owner: cynarAI" "$config" + grep -Fqx "repo: evOo-local" "$config" test -f apps/desktop/out/latest-linux.yml grep -Fqx "version: $RELEASE_VERSION" apps/desktop/out/latest-linux.yml diff --git a/apps/api/src/server-update.test.ts b/apps/api/src/server-update.test.ts index 6b238ef..6d9794f 100644 --- a/apps/api/src/server-update.test.ts +++ b/apps/api/src/server-update.test.ts @@ -90,7 +90,7 @@ describe("server update install kind", () => { if (href.endsWith("/state")) { return new Response( JSON.stringify({ - image: "ghcr.io/elie222/rakazo/app", + image: "ghcr.io/cynarai/evoo-local/app", currentTag: "sha-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", previousTag: "sha-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", running: false, @@ -98,7 +98,7 @@ describe("server update install kind", () => { present: true, commit: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", branch: "main", - remoteUrl: "https://github.com/elie222/rakazo", + remoteUrl: "https://github.com/cynarAI/evOo-local", dirty: false, dirtyPaths: [], }, @@ -134,7 +134,7 @@ describe("server update install kind", () => { fromTag: "sha-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", toTag: "sha-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", strategy: "pull", - repoUrl: "https://github.com/elie222/rakazo", + repoUrl: "https://github.com/cynarAI/evOo-local", branch: "main", restart: "not-required", restartAdvice: "Recreate failed; prior image restored, env pin not restored.", @@ -149,7 +149,7 @@ describe("server update install kind", () => { if (href.endsWith("/state")) { return new Response( JSON.stringify({ - image: "ghcr.io/elie222/rakazo/app", + image: "ghcr.io/cynarai/evoo-local/app", currentTag: "sha-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", previousTag: "sha-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", running: false, @@ -158,7 +158,7 @@ describe("server update install kind", () => { present: true, commit: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", branch: "main", - remoteUrl: "https://github.com/elie222/rakazo", + remoteUrl: "https://github.com/cynarAI/evOo-local", dirty: false, dirtyPaths: [], }, diff --git a/apps/api/src/team-chat-bridge.ts b/apps/api/src/team-chat-bridge.ts index 0c6e00f..dc21e89 100644 --- a/apps/api/src/team-chat-bridge.ts +++ b/apps/api/src/team-chat-bridge.ts @@ -713,7 +713,7 @@ export class TeamChatBridge { const blocks = Array.isArray(response?.blocks) ? (response.blocks as MessageBlock[]) : []; const content = run.status === "failed" - ? `${target.name} could not complete the delegated request. Open Rakazo for details.` + ? `${target.name} could not complete the delegated request. Open evOo for details.` : teamChatResponseText(blocks, target.name); if (!content) continue; await this.deps.send({ @@ -1160,7 +1160,7 @@ export class TeamChatBridge { await this.sendOnce(message.id, { conversationId: message.externalConversation.conversationId, replyThreadId: message.replyThreadId, - content: `${this.target?.name ?? "The agent"} could not complete that request. Open Rakazo for details.`, + content: `${this.target?.name ?? "The agent"} could not complete that request. Open evOo for details.`, idempotencyKey: `external-message:${message.id}:failure`, }); } diff --git a/apps/desktop/e2e/local-stack.spec.ts b/apps/desktop/e2e/local-stack.spec.ts index d80c0a6..db58319 100644 --- a/apps/desktop/e2e/local-stack.spec.ts +++ b/apps/desktop/e2e/local-stack.spec.ts @@ -177,7 +177,7 @@ test("This computer installs and starts the stack, then opens the app", async () const appWindowPromise = app.waitForEvent("window"); await setup.getByRole("button", { name: "Continue" }).click(); - await expect(setup.locator("#stack-phase")).toHaveText("Downloading Rakazo…"); + await expect(setup.locator("#stack-phase")).toHaveText("Downloading evOo…"); await expect(setup.getByRole("button", { name: "Continue" })).toBeDisabled(); // Docker output stays behind the details toggle; the phase, the bar, and the size show by default. await expect(setup.locator("#stack-detail")).toHaveText("412 MB downloaded"); @@ -249,7 +249,7 @@ test("switching to Existing instance while the stack starts keeps that choice", const setup = await app.firstWindow(); await setup.getByRole("button", { name: "Continue" }).click(); - await expect(setup.locator("#stack-phase")).toHaveText("Downloading Rakazo…"); + await expect(setup.locator("#stack-phase")).toHaveText("Downloading evOo…"); // Fake docker sleeps during pull; leave This computer before ready so followStack must not save. await setup.getByRole("radio", { name: /Existing instance/ }).check(); diff --git a/apps/desktop/e2e/setup.spec.ts b/apps/desktop/e2e/setup.spec.ts index 1a6bf91..bdd9535 100644 --- a/apps/desktop/e2e/setup.spec.ts +++ b/apps/desktop/e2e/setup.spec.ts @@ -83,7 +83,7 @@ test("first run asks whether to use a local or existing instance", async () => { } const setup = await app.firstWindow(); - await expect(setup.getByRole("heading", { name: "Welcome to Rakazo" })).toBeVisible(); + await expect(setup.getByRole("heading", { name: "Welcome to evOo" })).toBeVisible(); await expect(setup.getByText("Choose which server this app should use.")).toBeVisible(); await expect(setup.getByText("This computer")).toBeVisible(); await expect(setup.getByText("Existing instance")).toBeVisible(); @@ -139,7 +139,7 @@ test("connecting to an existing instance verifies, saves, and opens it", async ( await setup.locator("#server-url").fill(serverUrl); await setup.getByRole("button", { name: "Check connection" }).click(); - await expect(setup.locator("#status")).toHaveText(`Rakazo answered at ${serverUrl}.`); + await expect(setup.locator("#status")).toHaveText(`evOo answered at ${serverUrl}.`); await expect(setup.locator("#status")).toHaveAttribute("data-tone", "ok"); await setup.screenshot({ @@ -437,7 +437,7 @@ test("a malformed address is rejected before anything is written", async () => { }).toPass(); }); -test("a generic web page is not accepted as a Rakazo server", async () => { +test("a generic web page is not accepted as an evOo server", async () => { const plain = createServer((_request, response) => { response.writeHead(200, { "content-type": "text/html; charset=utf-8" }); response.end("
not Rakazo
"); @@ -454,7 +454,7 @@ test("a generic web page is not accepted as a Rakazo server", async () => { await setup.getByRole("button", { name: "Continue" }).click(); await expect(setup.locator("#status")).toHaveText( - "That address did not respond like a Rakazo server.", + "That address did not respond like an evOo server.", ); await expect(async () => { await expect(readFile(path.join(userData, "setup.json"), "utf8")).rejects.toThrow(); @@ -507,7 +507,7 @@ test("an unreachable saved server falls back to setup with a recovery message", app = await launch(); const setup = await app.firstWindow(); - await expect(setup.getByRole("heading", { name: "Welcome to Rakazo" })).toBeVisible(); + await expect(setup.getByRole("heading", { name: "Welcome to evOo" })).toBeVisible(); await expect(setup.getByRole("radio", { name: /Existing instance/ })).toBeChecked(); await expect(setup.locator("#server-url")).toHaveValue(closedUrl); await expect(setup.locator("#status")).toContainText("Could not reconnect to the saved server."); @@ -529,7 +529,7 @@ test("the native application menu can reopen setup without exposing setup IPC to }); const setup = await setupPromise; - await expect(setup.getByRole("heading", { name: "Welcome to Rakazo" })).toBeVisible(); + await expect(setup.getByRole("heading", { name: "Welcome to evOo" })).toBeVisible(); await expect(setup.locator("#status")).toBeEmpty(); // Closing setup without saving restores the connected instance. diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 575a833..a980a55 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -80,8 +80,8 @@ "publish": [ { "provider": "github", - "owner": "elie222", - "repo": "rakazo" + "owner": "cynarAI", + "repo": "evOo-local" } ] } diff --git a/apps/desktop/src/local-stack.test.ts b/apps/desktop/src/local-stack.test.ts index e413cb3..eea3493 100644 --- a/apps/desktop/src/local-stack.test.ts +++ b/apps/desktop/src/local-stack.test.ts @@ -79,7 +79,7 @@ describe("renderStackEnv", () => { expect(lines.some((line) => line.startsWith("RAKAZO_IMAGE_TAG="))).toBe(false); expect(lines.some((line) => line.startsWith("RAKAZO_COMPUTER_IMAGE_TAG="))).toBe(false); // Everything else, including the image names and empty optional keys, stays verbatim. - expect(lines).toContain("RAKAZO_IMAGE=ghcr.io/elie222/rakazo/app"); + expect(lines).toContain("RAKAZO_IMAGE=ghcr.io/cynarai/evoo-local/app"); expect(lines).toContain("SANDBOX_PROVIDER=docker"); expect(lines).toContain("OPENROUTER_API_KEY="); expect(rendered.endsWith("\n")).toBe(template.endsWith("\n")); diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index 052ab36..f7654aa 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -711,7 +711,7 @@ function installApplicationMenu() { }; const changeServer: Electron.MenuItemConstructorOptions = { id: "change-rakazo-server", - label: "Change Rakazo Server…", + label: "Change evOo Server…", accelerator: "CmdOrCtrl+Shift+K", click: () => showSetupWindow(), }; @@ -789,7 +789,7 @@ async function probeServer(rawUrl: string, signal?: AbortSignal): PromiseChoose which server this app should use.