From c2ac83e0c8fc321251db645145ec304491b81c0f Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:26:00 +0700 Subject: [PATCH 01/60] fix(fork): disable upstream updater and signing artifacts --- src-tauri/tauri.conf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index d8766d6b04..23d4bb2944 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -56,7 +56,7 @@ "icons/icon.icns", "icons/icon.ico" ], - "createUpdaterArtifacts": true + "createUpdaterArtifacts": false }, "plugins": { "fs": { @@ -68,7 +68,7 @@ } }, "updater": { - "active": true, + "active": false, "endpoints": [ "https://github.com/org2AI/ORG2/releases/latest/download/latest.json" ], From e1abcc26da499e4c7b1a2a33663d94d9d1c23fa8 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:26:04 +0700 Subject: [PATCH 02/60] fix(fork): fail closed for custom update commands until independent releases --- src-tauri/src/app_update.rs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/app_update.rs b/src-tauri/src/app_update.rs index 973c248a77..22b538d0b1 100644 --- a/src-tauri/src/app_update.rs +++ b/src-tauri/src/app_update.rs @@ -29,6 +29,18 @@ use uuid::Uuid; /// Stable channel: GitHub's `releases/latest` alias, which excludes /// prereleases. Must stay in sync with `plugins.updater.endpoints` in /// `tauri.conf.json`. +/// The fork must not check or install org2AI's signed upstream binaries. +/// Keep false until own manifest URLs, keys, IDs, app paths and migration are ready. +const FORK_UPDATER_READY: bool = false; + +fn require_fork_updater_ready() -> Result<(), String> { + if FORK_UPDATER_READY { + Ok(()) + } else { + Err("Updates are disabled in this independent fork until its own signed release channel is configured".to_string()) + } +} + const STABLE_MANIFEST_URL: &str = "https://github.com/org2AI/ORG2/releases/latest/download/latest.json"; @@ -76,6 +88,9 @@ fn compiled_build_kind() -> AppBuildKind { } fn install_strategy(kind: AppBuildKind) -> AppUpdateInstallStrategy { + if !FORK_UPDATER_READY { + return AppUpdateInstallStrategy::Unavailable; + } match kind { AppBuildKind::Release => AppUpdateInstallStrategy::InPlace, AppBuildKind::Local if cfg!(target_os = "macos") => { @@ -157,6 +172,7 @@ pub async fn check_app_update( channel: UpdateChannel, timeout_ms: Option, ) -> Result, String> { + require_fork_updater_ready()?; let endpoint = Url::parse(channel.manifest_url()).map_err(|err| err.to_string())?; let mut builder = webview @@ -394,17 +410,16 @@ mod tests { } #[test] - fn release_builds_update_in_place_and_local_builds_never_guess() { + fn independent_fork_disables_all_upstream_update_strategies() { assert_eq!( install_strategy(AppBuildKind::Release), - AppUpdateInstallStrategy::InPlace + AppUpdateInstallStrategy::Unavailable ); - let expected_local = if cfg!(target_os = "macos") { - AppUpdateInstallStrategy::SeparateMacosApplication - } else { + assert_eq!( + install_strategy(AppBuildKind::Local), AppUpdateInstallStrategy::Unavailable - }; - assert_eq!(install_strategy(AppBuildKind::Local), expected_local); + ); + assert!(require_fork_updater_ready().is_err()); } #[test] From 7c4c1e641e5312ca44c6ed3baa41801dcae9a99d Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:26:09 +0700 Subject: [PATCH 03/60] docs(fork): identify fork and warn about upstream-only downloads --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index aa51f6ea90..82c5ea4c33 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,14 @@ +> **Independent community fork — TheerasakPing/ORG2** +> +> This repository is a fork of [org2AI/ORG2](https://github.com/org2AI/ORG2). +> The download links below still point to the **upstream publisher**, not builds from this fork. +> The fork's application updater is intentionally disabled pending independent signing and release infrastructure. +> **Do not install experimental fork builds alongside upstream ORG2** until the app identity, +> deep links and `~/.orgii` state/storage are isolated and migration-tested. +> See [FORK.md](FORK.md) and [the fork roadmap](docs/fork/ROADMAP.md). + +--- +

ORG-2

The system of record for how agents build software.
Run your coding agents — replay any session, review as a team, and trace every line back to the decision behind it.

From 8019d5e45cdf94a87f95eca0438fa9fe577fb4d5 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:27:16 +0700 Subject: [PATCH 04/60] docs(fork): define independent product engineering rules --- FORK.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 FORK.md diff --git a/FORK.md b/FORK.md new file mode 100644 index 0000000000..a697fb6511 --- /dev/null +++ b/FORK.md @@ -0,0 +1,52 @@ +# Independent Fork Engineering Guide + +This repository is the independent development fork maintained at **TheerasakPing/ORG2**. +Upstream: https://github.com/org2AI/ORG2 (tracked on branch `develop`). +The product name **ORG2** remains an upstream-derived placeholder until branding, state isolation, and release infrastructure are approved and implemented. + +## Current safety status + +- **Fork exists** with its own GitHub ownership and history. +- **Not independently distributable yet.** Do not install test builds side by side with upstream ORG2. +- The base Tauri updater has `plugins.updater.active=false` and `bundle.createUpdaterArtifacts=false`. +- The custom Rust `check_app_update` command is also fail-closed while `FORK_UPDATER_READY=false`. This prevents silently installing upstream's release packages through a separate code path. +- Upstream signing identities, update manifests, download links, app bundle identifiers, deep links, and `~/.orgii` user data paths **have not been migrated**. +- The upstream `release.yaml` workflow references upstream credentials and infrastructure. Do not tag/publish production releases until a separate fork release workflow has been validated. + +## Fork strategy + +1. Maintain `develop` as the integration branch and use feature branches and PRs for every production change. +2. Keep attribution and the existing `LICENSE` intact. This project is under **AGPL-3.0-or-later**; derivative distribution and network use must comply with its source-availability and notice obligations. Do not imply that the original upstream developers endorse the fork. +3. Track upstream separately using `git remote add upstream https://github.com/org2AI/ORG2.git` in local clones. Import security and correctness fixes deliberately, preferably through reviewed merge commits; never overwrite fork-owned release, updater, storage, or identity settings. +4. Keep reusable code in focused modules, maintain regression tests, and avoid changing production invariants merely to hide UI defects. +5. Prioritize macOS Apple Silicon, Windows 11 x64, and Linux x64 parity in CI, packaging, and runtime acceptance tests. + +## Before enabling independent installation + +- Choose final product name, domains, app ID and deep-link schemes. Update main and platform-specific Tauri configurations together. +- Partition every mutable state root (SQLite, settings, account tokens, sidecars, caches, session data, logs, WebSocket local ports, single-instance control). Provide explicit opt-in migration from upstream with backup and rollback. +- Replace upstream update endpoints in both `src-tauri/tauri.conf.json` and `src-tauri/src/app_update.rs`, as well as any frontend release/download links; generate **fork-owned updater signing keys**. +- Replace upstream Apple signing identity, Windows signing configuration, GitHub environments, release URLs and permissions. Never reuse another publisher's private key. +- Add and pass fresh-install, side-by-side-install, upgrade, rollback, and uninstall-with-data-retention tests on each platform. +- Only after those gates pass: set `FORK_UPDATER_READY=true`, re-enable updater artifacts, and configure the fork's signed release channels. + +## Development and verification + +```bash +pnpm install --frozen-lockfile +pnpm run download:sidecars +pnpm run tauri:dev +node scripts/fork/check-safety.mjs +pnpm typecheck +pnpm test +cd src-tauri +cargo clippy --workspace --all-targets -- -D warnings +cargo test --workspace --no-fail-fast +``` + +CI file `.github/workflows/fork-safety.yml` checks the release-safety posture independent of Rust/Node dependencies. The above commands are validation targets, **not claims that tests have passed on this fork**. + +## Contribution and upstream notice + +The original ORG2 source, licensing and attribution remain the foundation of this fork. +See [roadmap](docs/fork/ROADMAP.md). Any shipped modifications should record their author, purpose, test evidence and user-facing migration impact. From e29aa8c77ab58b3327358d061acaddf6d8651c1f Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:27:19 +0700 Subject: [PATCH 05/60] docs(fork): prioritize cross-platform ownership and agent reliability --- docs/fork/ROADMAP.md | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 docs/fork/ROADMAP.md diff --git a/docs/fork/ROADMAP.md b/docs/fork/ROADMAP.md new file mode 100644 index 0000000000..42ee039965 --- /dev/null +++ b/docs/fork/ROADMAP.md @@ -0,0 +1,62 @@ +# Independent ORG2 Fork — Engineering Roadmap + +**Status:** Planning and initial release-safety changes, not a production release. +**Repository:** https://github.com/TheerasakPing/ORG2 +**Upstream:** https://github.com/org2AI/ORG2 + +## P0 — Safe ownership and packaging (must pass before installers) + +- [ ] Select a final brand and domain; inventory ORG2 trademarks and upstream-only UI links. +- [ ] Change app name/identifier and macOS/Windows/Linux metadata without clobbering upstream installs. +- [ ] Introduce a configurable app-data root; isolate SQLite databases, workspace memory, key storage, sidecars, logs, IPC ports and deep-link protocols. +- [x] Disable base updater and custom Rust upstream update route for unreleased fork. +- [ ] Replace update URLs, public signing key, CI release dependencies and signing identities with fork-owned infrastructure. +- [ ] Run same-machine concurrent-install and migration/rollback tests. +- [ ] Publish fork-built packages only after independent signing and end-to-end smoke tests. + +**Acceptance:** a fresh fork installation cannot update from upstream, overwrite upstream binaries, or read/write upstream profiles unless the user explicitly approves migration. + +## P1 — Reliability and security + +- [ ] Replace PID/write-and-read workspace auto-dream lock with a real cross-process atomic lock and race tests. +- [ ] Add sandbox profiles for untrusted agent shell commands; separate read/write paths, environment secrets, network and process limits. +- [ ] Introduce versioned, transactional SQLite migrations with verification and recovery procedures. +- [ ] Classify transient vs permanent LLM reflection failures; TTL/backoff rather than permanent blacklist for transient errors. +- [ ] Add session crash/restart, cancel/resume, provider-retry-after-tool and background-process teardown fault injection. + +**Acceptance:** no double-owned memory consolidation; session/tool cancellation leaves no orphaned jobs; migration failures cannot leave an app silently running on a partially upgraded schema. + +## P2 — Unified agent experience + +- [ ] Define a shared session identity/event provenance contract for native Rust Harness and external CLI sessions. +- [ ] Preserve multi-agent task/call provenance across replay, forks, and resume. +- [ ] Build a unified runtime dashboard: tokens, costs, tool latency, retry reason, memory queue, session CPU/RAM, pending approvals. +- [ ] Add permissions preview and audit receipts for CLI, MCP, desktop and browser execution. +- [ ] Improve agent-team orchestration with role capabilities, checkpoints, budgets and human approval rules. + +**Acceptance:** imported and native sessions produce equivalent timeline events; each tool effect has an auditable identity; users can reproduce errors from structured diagnostics. + +## P3 — Product features and automation + +- [ ] Task templates, scheduling and unattended execution with max-cost and max-runtime limits. +- [ ] Agent workflows that plan, implement, test, review and prepare PRs under explicit branch protection. +- [ ] Memory provenance inspector with conflict handling, expiration and per-workspace privacy controls. +- [ ] Portable session export/import and cross-device encrypted synchronization (opt-in). +- [ ] Consistent UX and full localization; accessibility and performance budgets. + +## CI acceptance matrix + +| Platform | Build | Unit | Native integration | Install/upgrade | UI E2E | +| --- | --- | --- | --- | --- | --- | +| macOS Apple Silicon | Required | Required | Required | Required | Required | +| Windows 11 x64 | Required | Required | Required | Required | Required | +| Linux x64 | Required | Required | Required | Required | Required | + +Do not mark these checks complete based on source inspection; attach real logs, artifact hashes and CI run URLs. + +## Upstream sync policy + +- Prefer upstream security/fix updates before product-feature merges. +- Keep fork-specific release and identity configuration isolated in owned changes. +- For each upstream merge, rerun the fork-safety gate and release-install acceptance tests. +- Preserve `LICENSE`, copyright notices and upstream commit attribution. From e0b806b5560d0f27d56ee2e70dda157a32408503 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:27:23 +0700 Subject: [PATCH 06/60] test(fork): guard against accidental upstream auto-update reactivation --- scripts/fork/check-safety.mjs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 scripts/fork/check-safety.mjs diff --git a/scripts/fork/check-safety.mjs b/scripts/fork/check-safety.mjs new file mode 100644 index 0000000000..63db0b1f25 --- /dev/null +++ b/scripts/fork/check-safety.mjs @@ -0,0 +1,24 @@ +#!/usr/bin/env node +// Fork-specific guard. No dependencies or network access. +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '../..'); +const read = (path) => readFileSync(resolve(root, path), 'utf8'); + +const config = JSON.parse(read('src-tauri/tauri.conf.json')); +const rust = read('src-tauri/src/app_update.rs'); +const readme = read('README.md'); + +assert.equal(config.plugins?.updater?.active, false, + 'Fork must not activate Tauri updater until signed fork-only channels exist'); +assert.equal(config.bundle?.createUpdaterArtifacts, false, + 'Fork must not create unsigned or upstream-key updater artifacts'); +assert.match(rust, /const FORK_UPDATER_READY:\s*bool\s*=\s*false\s*;/, + 'Rust custom updater must stay fail-closed until independent publishing'); +assert.match(rust, /pub async fn check_app_update\([\s\S]*?require_fork_updater_ready\(\)\?;/, + 'Custom check_app_update path must enforce fork update guard'); +assert.match(readme, /Independent community fork/); +process.stdout.write('Fork release-safety checks passed. Independent installation is not yet validated.\n'); From 399335b3ed5cfbf498a4b7df0e84b31ca655c824 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:27:27 +0700 Subject: [PATCH 07/60] ci(fork): check upstream update isolation on every PR --- .github/workflows/fork-safety.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/fork-safety.yml diff --git a/.github/workflows/fork-safety.yml b/.github/workflows/fork-safety.yml new file mode 100644 index 0000000000..44fee35758 --- /dev/null +++ b/.github/workflows/fork-safety.yml @@ -0,0 +1,20 @@ +name: Fork release safety + +on: + pull_request: + push: + branches: [develop] + workflow_dispatch: + +permissions: + contents: read + +jobs: + fork-release-safety: + name: Upstream updater protection + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - name: Verify fork updater is fail-closed + run: node scripts/fork/check-safety.mjs From 922741ea005c303873e6b8fa379236e6ca02d53d Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:28:32 +0700 Subject: [PATCH 08/60] ci(fork): prevent upstream release workflow from publishing in fork --- .github/workflows/release.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e5c9ad4343..c10e1a5260 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -60,6 +60,8 @@ permissions: jobs: build-and-release: name: Build & Release (macOS aarch64) + # The upstream signing/release pipeline must never publish from a derivative fork. + if: ${{ github.repository == 'org2AI/ORG2' }} runs-on: macos-latest env: HAS_APPLE_CERT: ${{ secrets.APPLE_CERTIFICATE != '' }} @@ -248,6 +250,8 @@ jobs: # ── Windows x64 build ───────────────────────────────────────────────── build-windows: name: Build & Release (Windows x64) + # The upstream signing/release pipeline must never publish from a derivative fork. + if: ${{ github.repository == 'org2AI/ORG2' }} runs-on: windows-latest needs: build-and-release # This makes GitHub's OIDC subject stable across all release tags: @@ -469,6 +473,8 @@ jobs: # ── Linux x64 build ─────────────────────────────────────────────────── build-linux: name: Build & Release (Linux x64) + # The upstream signing/release pipeline must never publish from a derivative fork. + if: ${{ github.repository == 'org2AI/ORG2' }} runs-on: ubuntu-22.04 needs: build-windows steps: From 30ad10f565b4cc8aea284af37981cbc17daea1ab Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:28:36 +0700 Subject: [PATCH 09/60] test(fork): enforce upstream release CI guard --- scripts/fork/check-safety.mjs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/fork/check-safety.mjs b/scripts/fork/check-safety.mjs index 63db0b1f25..3cddb352a4 100644 --- a/scripts/fork/check-safety.mjs +++ b/scripts/fork/check-safety.mjs @@ -21,4 +21,12 @@ assert.match(rust, /const FORK_UPDATER_READY:\s*bool\s*=\s*false\s*;/, assert.match(rust, /pub async fn check_app_update\([\s\S]*?require_fork_updater_ready\(\)\?;/, 'Custom check_app_update path must enforce fork update guard'); assert.match(readme, /Independent community fork/); +const upstreamRelease = read('.github/workflows/release.yaml'); +for (const job of ['build-and-release', 'build-windows', 'build-linux']) { + const anchor = upstreamRelease.indexOf(' ' + job + ':\\n'); + assert.notEqual(anchor, -1, 'Missing release job: ' + job); + const next = upstreamRelease.slice(anchor, anchor + 390); + assert.match(next, /if: \\${{ github\\.repository == 'org2AI\\/ORG2' }}/, + 'Inherited upstream release job must be disabled in fork: ' + job); +} process.stdout.write('Fork release-safety checks passed. Independent installation is not yet validated.\n'); From 1a90fe093f686a28a44f10bbe820f04199d51128 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:28:41 +0700 Subject: [PATCH 10/60] docs(fork): record inherited release workflow gate --- FORK.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FORK.md b/FORK.md index a697fb6511..a9a77f5745 100644 --- a/FORK.md +++ b/FORK.md @@ -11,7 +11,7 @@ The product name **ORG2** remains an upstream-derived placeholder until branding - The base Tauri updater has `plugins.updater.active=false` and `bundle.createUpdaterArtifacts=false`. - The custom Rust `check_app_update` command is also fail-closed while `FORK_UPDATER_READY=false`. This prevents silently installing upstream's release packages through a separate code path. - Upstream signing identities, update manifests, download links, app bundle identifiers, deep links, and `~/.orgii` user data paths **have not been migrated**. -- The upstream `release.yaml` workflow references upstream credentials and infrastructure. Do not tag/publish production releases until a separate fork release workflow has been validated. +- The inherited `release.yaml` workflow is guarded to run **only** in `org2AI/ORG2`, not this fork. Do not tag/publish production releases until a separate fork release workflow has been validated. ## Fork strategy From 5bc9eca542c10aea395ca1243bfc60b43d24ca45 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:29:17 +0700 Subject: [PATCH 11/60] fix(fork): make safety release-job assertions literal and robust --- scripts/fork/check-safety.mjs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/fork/check-safety.mjs b/scripts/fork/check-safety.mjs index 3cddb352a4..64213dbd3e 100644 --- a/scripts/fork/check-safety.mjs +++ b/scripts/fork/check-safety.mjs @@ -22,11 +22,12 @@ assert.match(rust, /pub async fn check_app_update\([\s\S]*?require_fork_updater_ 'Custom check_app_update path must enforce fork update guard'); assert.match(readme, /Independent community fork/); const upstreamRelease = read('.github/workflows/release.yaml'); +const releaseLines = upstreamRelease.split('\n'); for (const job of ['build-and-release', 'build-windows', 'build-linux']) { - const anchor = upstreamRelease.indexOf(' ' + job + ':\\n'); + const anchor = releaseLines.findIndex((line) => line === ' ' + job + ':'); assert.notEqual(anchor, -1, 'Missing release job: ' + job); - const next = upstreamRelease.slice(anchor, anchor + 390); - assert.match(next, /if: \\${{ github\\.repository == 'org2AI\\/ORG2' }}/, + const block = releaseLines.slice(anchor, anchor + 8).join('\n'); + assert.ok(block.includes("if: ${{ github.repository == 'org2AI/ORG2' }}"), 'Inherited upstream release job must be disabled in fork: ' + job); } process.stdout.write('Fork release-safety checks passed. Independent installation is not yet validated.\n'); From 92ea494830d0c5bd4c129e1018846ac7a6871a3d Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 12:31:50 +0700 Subject: [PATCH 12/60] docs(fork): record issue-tracking fallback while GitHub Issues are disabled --- docs/fork/ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/fork/ROADMAP.md b/docs/fork/ROADMAP.md index 42ee039965..3a4058d0a6 100644 --- a/docs/fork/ROADMAP.md +++ b/docs/fork/ROADMAP.md @@ -3,6 +3,7 @@ **Status:** Planning and initial release-safety changes, not a production release. **Repository:** https://github.com/TheerasakPing/ORG2 **Upstream:** https://github.com/org2AI/ORG2 +**Tracking:** GitHub Issues are currently disabled on this fork; this file is the active task checklist until Issues are enabled. ## P0 — Safe ownership and packaging (must pass before installers) From b6df071b6ec074c6dbeabf90cef86f30bdd5d214 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 13:20:51 +0700 Subject: [PATCH 13/60] fix(ci): maintain search concurrency bound without deprecated atomics --- .../search/src/code/commands/text_search.rs | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src-tauri/crates/search/src/code/commands/text_search.rs b/src-tauri/crates/search/src/code/commands/text_search.rs index 4bad8bc62b..e78dfaeb31 100644 --- a/src-tauri/crates/search/src/code/commands/text_search.rs +++ b/src-tauri/crates/search/src/code/commands/text_search.rs @@ -23,12 +23,23 @@ struct SearchBudget { struct Permit; impl Permit { fn acquire() -> Result { - WORKERS - .fetch_update(Ordering::AcqRel, Ordering::Acquire, |n| { - (n < 4).then_some(n + 1) - }) - .map(|_| Self) - .map_err(|_| "Search workers are busy; retry after pending searches finish".into()) + // Preserve the project's MSRV across toolchains that have deprecated + // fetch_update, without sacrificing the four-worker admission limit. + let mut workers = WORKERS.load(Ordering::Acquire); + loop { + if workers >= 4 { + return Err("Search workers are busy; retry after pending searches finish".into()); + } + match WORKERS.compare_exchange_weak( + workers, + workers + 1, + Ordering::AcqRel, + Ordering::Acquire, + ) { + Ok(_) => return Ok(Self), + Err(actual) => workers = actual, + } + } } } impl Drop for Permit { From 09de96eea42489a672b778302e3f5dc2ed8dbc77 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 13:35:50 +0700 Subject: [PATCH 14/60] fix(ci): propagate verified-compatible PTY and SyncAdapter lint corrections --- .../crates/terminal/src/agent_tool/mod.rs | 55 +++++++++++++++++-- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/src-tauri/crates/terminal/src/agent_tool/mod.rs b/src-tauri/crates/terminal/src/agent_tool/mod.rs index d39af4142b..5a0717cba1 100644 --- a/src-tauri/crates/terminal/src/agent_tool/mod.rs +++ b/src-tauri/crates/terminal/src/agent_tool/mod.rs @@ -37,6 +37,55 @@ use crate::pty_commands::pty::{encode_pty_output_frame, PtySession, PtySessionId use crate::pty_commands::shell_integration; use crate::pty_commands::shells::ShellKind; +#[cfg(test)] +mod atomic_sub_tests { + use super::saturating_atomic_sub; + use std::sync::atomic::{AtomicUsize, Ordering}; + + #[test] + fn subtract_is_saturating_and_returns_previous_counter() { + let counter = AtomicUsize::new(100); + assert_eq!(saturating_atomic_sub(&counter, 40), 100); + assert_eq!(counter.load(Ordering::Relaxed), 60); + assert_eq!(saturating_atomic_sub(&counter, 1_000), 60); + assert_eq!(counter.load(Ordering::Relaxed), 0); + } + + #[test] + fn simultaneous_subtractions_never_underflow() { + use std::sync::Arc; + let counter = Arc::new(AtomicUsize::new(100)); + let mut joins = Vec::new(); + for _ in 0..16 { + let counter = counter.clone(); + joins.push(std::thread::spawn(move || { + saturating_atomic_sub(&counter, 30); + })); + } + for join in joins { + join.join().expect("atomic decrement thread"); + } + assert_eq!(counter.load(Ordering::Relaxed), 0); + } +} + +/// Atomically subtract acknowledged/dropped output bytes without underflow. +/// A CAS loop keeps this compatible with the project's declared Rust MSRV. +pub(crate) fn saturating_atomic_sub(counter: &AtomicUsize, bytes: usize) -> usize { + let mut before = counter.load(Ordering::Relaxed); + loop { + match counter.compare_exchange_weak( + before, + before.saturating_sub(bytes), + Ordering::Relaxed, + Ordering::Relaxed, + ) { + Ok(previous) => return previous, + Err(actual) => before = actual, + } + } +} + // ============================================ // Constants // ============================================ @@ -781,11 +830,7 @@ pub async fn create_session(params: CreateSessionParams) -> Result Date: Sat, 17 Oct 2026 13:35:55 +0700 Subject: [PATCH 15/60] fix(ci): propagate verified-compatible PTY and SyncAdapter lint corrections --- src-tauri/crates/project-management/src/sync/adapter.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-tauri/crates/project-management/src/sync/adapter.rs b/src-tauri/crates/project-management/src/sync/adapter.rs index 5281386ba6..c0d7932670 100644 --- a/src-tauri/crates/project-management/src/sync/adapter.rs +++ b/src-tauri/crates/project-management/src/sync/adapter.rs @@ -262,6 +262,10 @@ pub struct SyncStatusReport { /// Every adapter is a unit-struct implementing this trait. Registration /// goes through [`super::adapters::registry`] at boot so commands can /// look up adapters by ID without hard-coding any. +// async_trait materializes async methods as boxed Future-returning functions. +// Current Clippy sees the macro's #[must_use] on those already must-use Futures. +// Scope the compatibility waiver to this trait only, not the entire crate. +#[allow(clippy::double_must_use)] #[async_trait] pub trait SyncAdapter: Send + Sync { /// Stable identifier (snake_case). Used as the registry key and From 04ba8ed9aac468555093a8f19695c762a61e9854 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 13:35:59 +0700 Subject: [PATCH 16/60] fix(ci): propagate verified-compatible PTY and SyncAdapter lint corrections --- .../src/pty_commands/pty/lifecycle_commands.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src-tauri/crates/terminal/src/pty_commands/pty/lifecycle_commands.rs b/src-tauri/crates/terminal/src/pty_commands/pty/lifecycle_commands.rs index be7cb78148..57806df51f 100644 --- a/src-tauri/crates/terminal/src/pty_commands/pty/lifecycle_commands.rs +++ b/src-tauri/crates/terminal/src/pty_commands/pty/lifecycle_commands.rs @@ -259,12 +259,10 @@ pub async fn ack_pty_data( if !session.owns_stream(owner_id) { return Ok(()); } - let prev = session - .unacked_bytes - .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |value| { - Some(value.saturating_sub(byte_count)) - }) - .unwrap_or(0); + let prev = crate::agent_tool::saturating_atomic_sub( + &session.unacked_bytes, + byte_count, + ); let new_val = prev.saturating_sub(byte_count); // Update render telemetry so the reader can adapt emit rate. From beb63d42d564bbb530e60a5af24e5de3b588535d Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:36:28 +0700 Subject: [PATCH 17/60] feat(fork): integrate TP Agent Studio with latest develop (two-tone, isolation, memory, CI) --- .github/workflows/fork-safety.yml | 6 + FORK.md | 10 +- README.md | 39 +-- assets/branding/tp-agent-studio-dev.svg | 13 + assets/branding/tp-agent-studio.svg | 10 + docs/fork/AUTO_DREAM_LOCK.md | 31 +++ docs/fork/PROFILE_ISOLATION.md | 31 +++ docs/fork/ROADMAP.md | 12 +- docs/fork/TWO_TONE_BRANDING.md | 30 +++ scripts/fork/check-icons.mjs | 107 ++++++++ scripts/fork/check-identity.mjs | 63 +++++ scripts/fork/check-safety.mjs | 6 + scripts/tauri/instance-profile.cjs | 20 +- scripts/tauri/instance-profile.test.cjs | 34 +-- src-tauri/crates/agent-core/Cargo.toml | 1 + .../agent-core/src/core/session/scheduler.rs | 51 +++- .../core/tools/impls/desktop/escape_hotkey.rs | 44 +++- .../src/specialization/memory/commands.rs | 22 +- .../memory/workspace_memory/lock.rs | 233 +++++++++++++----- src-tauri/crates/app-paths/src/data_root.rs | 14 +- src-tauri/crates/app-window/src/dock_icon.rs | 10 +- .../search/src/code/commands/text_search.rs | 5 +- src-tauri/crates/system-services/src/tray.rs | 2 +- src-tauri/crates/transport/src/traits.rs | 3 + src-tauri/icons/128x128.png | Bin 3111 -> 1511 bytes src-tauri/icons/128x128@2x.png | Bin 6690 -> 3215 bytes src-tauri/icons/32x32.png | Bin 835 -> 445 bytes src-tauri/icons/64x64.png | Bin 1623 -> 814 bytes src-tauri/icons/dev/128x128.png | Bin 3276 -> 1660 bytes src-tauri/icons/dev/128x128@2x.png | Bin 6474 -> 3553 bytes src-tauri/icons/dev/32x32.png | Bin 780 -> 490 bytes src-tauri/icons/dev/icon.icns | Bin 85769 -> 36364 bytes src-tauri/icons/dev/icon.ico | Bin 16230 -> 7037 bytes src-tauri/icons/dev/icon.png | Bin 13841 -> 8300 bytes src-tauri/icons/dock/dark.png | Bin 9881 -> 7568 bytes src-tauri/icons/icon.icns | Bin 68635 -> 33475 bytes src-tauri/icons/icon.ico | Bin 13222 -> 6390 bytes src-tauri/icons/icon.png | Bin 13645 -> 7568 bytes src-tauri/src/app/bootstrap.rs | 22 +- src-tauri/src/app/dev_process_name.rs | 10 +- src-tauri/src/app_update.rs | 8 +- src-tauri/src/runtime_instance.rs | 216 +++++++++++++++- src-tauri/tauri.conf.json | 25 +- src-tauri/tauri.dev.conf.json | 8 +- src-tauri/tauri.macos.conf.json | 4 +- src-tauri/tauri.windows.conf.json | 2 +- src/hooks/platform/useDeepLinkHandler.test.ts | 30 +++ src/hooks/platform/useDeepLinkHandler.ts | 8 +- 48 files changed, 934 insertions(+), 196 deletions(-) create mode 100644 assets/branding/tp-agent-studio-dev.svg create mode 100644 assets/branding/tp-agent-studio.svg create mode 100644 docs/fork/AUTO_DREAM_LOCK.md create mode 100644 docs/fork/PROFILE_ISOLATION.md create mode 100644 docs/fork/TWO_TONE_BRANDING.md create mode 100644 scripts/fork/check-icons.mjs create mode 100644 scripts/fork/check-identity.mjs diff --git a/.github/workflows/fork-safety.yml b/.github/workflows/fork-safety.yml index 44fee35758..ec294ea4de 100644 --- a/.github/workflows/fork-safety.yml +++ b/.github/workflows/fork-safety.yml @@ -18,3 +18,9 @@ jobs: - uses: actions/checkout@v4 - name: Verify fork updater is fail-closed run: node scripts/fork/check-safety.mjs + - name: Verify fork desktop identity and local data roots + run: node scripts/fork/check-identity.mjs + - name: Verify JavaScript dev and numbered instance parity + run: node --test scripts/tauri/instance-profile.test.cjs + - name: Validate packaged two-tone icons + run: node scripts/fork/check-icons.mjs diff --git a/FORK.md b/FORK.md index a9a77f5745..250b8cf557 100644 --- a/FORK.md +++ b/FORK.md @@ -2,15 +2,16 @@ This repository is the independent development fork maintained at **TheerasakPing/ORG2**. Upstream: https://github.com/org2AI/ORG2 (tracked on branch `develop`). -The product name **ORG2** remains an upstream-derived placeholder until branding, state isolation, and release infrastructure are approved and implemented. +**TP Agent Studio** is the provisional product name. Fork-specific desktop IDs and paths are being introduced, but complete isolation and production release readiness are still unverified. ## Current safety status - **Fork exists** with its own GitHub ownership and history. - **Not independently distributable yet.** Do not install test builds side by side with upstream ORG2. -- The base Tauri updater has `plugins.updater.active=false` and `bundle.createUpdaterArtifacts=false`. +- The base Tauri updater has `plugins.updater.active=false`, an empty endpoints list and `bundle.createUpdaterArtifacts=false`. Fork README no longer links to upstream production installers. - The custom Rust `check_app_update` command is also fail-closed while `FORK_UPDATER_READY=false`. This prevents silently installing upstream's release packages through a separate code path. -- Upstream signing identities, update manifests, download links, app bundle identifiers, deep links, and `~/.orgii` user data paths **have not been migrated**. +- Original two-tone desktop icon artwork and generated macOS/Windows/Linux icon assets are introduced for production and Dev, with the default macOS live Dock variant included (see [branding guide](docs/fork/TWO_TONE_BRANDING.md)). +- Base and development Tauri identities, deep-link schemes, macOS signing placeholders, application data defaults, runtime ports, and external history defaults have been moved to **TP Agent Studio**. **This does not yet prove complete profile isolation**: external tool hooks, sidecars, inherited assets/credentials and fresh-install behavior require integration tests. - The inherited `release.yaml` workflow is guarded to run **only** in `org2AI/ORG2`, not this fork. Do not tag/publish production releases until a separate fork release workflow has been validated. ## Fork strategy @@ -37,6 +38,7 @@ pnpm install --frozen-lockfile pnpm run download:sidecars pnpm run tauri:dev node scripts/fork/check-safety.mjs +node scripts/fork/check-identity.mjs pnpm typecheck pnpm test cd src-tauri @@ -44,7 +46,7 @@ cargo clippy --workspace --all-targets -- -D warnings cargo test --workspace --no-fail-fast ``` -CI file `.github/workflows/fork-safety.yml` checks the release-safety posture independent of Rust/Node dependencies. The above commands are validation targets, **not claims that tests have passed on this fork**. +CI file `.github/workflows/fork-safety.yml` checks the release-safety and desktop-identity posture independent of Rust/Node dependencies. The above commands are validation targets, **not claims that tests have passed on this fork**. ## Contribution and upstream notice diff --git a/README.md b/README.md index 82c5ea4c33..65561e147e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,12 @@ > **Independent community fork — TheerasakPing/ORG2** > > This repository is a fork of [org2AI/ORG2](https://github.com/org2AI/ORG2). -> The download links below still point to the **upstream publisher**, not builds from this fork. +> Work-in-progress app identity: **TP Agent Studio** (provisional branding; legacy compatibility names remain in internal APIs). +> +> ![TP Agent Studio two-tone icon](assets/branding/tp-agent-studio.svg) +> +> Two-tone desktop branding details: [branding guide](docs/fork/TWO_TONE_BRANDING.md). +> This fork does **not** distribute the upstream publisher's installers. > The fork's application updater is intentionally disabled pending independent signing and release infrastructure. > **Do not install experimental fork builds alongside upstream ORG2** until the app identity, > deep links and `~/.orgii` state/storage are isolated and migration-tested. @@ -10,26 +15,13 @@ ---
-

ORG-2

+

TP Agent Studio

The system of record for how agents build software.
Run your coding agents — replay any session, review as a team, and trace every line back to the decision behind it.

--- -

- macOS Apple Silicon - · - Windows installer - · - Windows MSI - · - Linux AppImage - · - Linux DEB - · - All latest release assets -

- +> **No TP Agent Studio installers are published yet.** macOS Apple Silicon, Windows 11, and Linux builds are undergoing identity, data-isolation, CI and signing verification. See [release readiness](FORK.md) and [engineering roadmap](docs/fork/ROADMAP.md). ---

@@ -201,20 +193,13 @@ Use ORG2's built-in Rust harness or launch these supported coding-agent CLIs fro Pi logo Pi

-## Download - -Current build version: v2.0.8 (2026-09-23) +## Release availability -Download the latest ORG2 desktop app with one click: +Current source version: v2.0.8 (2026-09-23) -- [macOS Apple Silicon](https://github.com/org2AI/ORG2/releases/latest/download/ORG2-latest-mac-apple-silicon.dmg) -- [Windows x64 installer](https://github.com/org2AI/ORG2/releases/latest/download/ORG2-latest-windows-x64-setup.exe) -- [Windows x64 MSI](https://github.com/org2AI/ORG2/releases/latest/download/ORG2-latest-windows-x64.msi) -- [Linux x64 AppImage](https://github.com/org2AI/ORG2/releases/latest/download/ORG2-latest-linux-x64.AppImage) -- [Linux x64 DEB](https://github.com/org2AI/ORG2/releases/latest/download/ORG2-latest-linux-x64.deb) -- [All latest release assets](https://github.com/org2AI/ORG2/releases/latest) +**No independently signed TP Agent Studio installers are available yet.** This fork is being developed and tested separately from the original publisher. Builds will only be linked after macOS, Windows and Linux identity, migration, packaging and signature verification are complete. -The direct download links always resolve through GitHub's latest release pointer. +See [Fork Engineering Guide](FORK.md) for current safety status. Do not mistake upstream installers for releases of this fork. ## Develop from source diff --git a/assets/branding/tp-agent-studio-dev.svg b/assets/branding/tp-agent-studio-dev.svg new file mode 100644 index 0000000000..4269cc709a --- /dev/null +++ b/assets/branding/tp-agent-studio-dev.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/assets/branding/tp-agent-studio.svg b/assets/branding/tp-agent-studio.svg new file mode 100644 index 0000000000..5a7e773479 --- /dev/null +++ b/assets/branding/tp-agent-studio.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/fork/AUTO_DREAM_LOCK.md b/docs/fork/AUTO_DREAM_LOCK.md new file mode 100644 index 0000000000..9ed96bb1d8 --- /dev/null +++ b/docs/fork/AUTO_DREAM_LOCK.md @@ -0,0 +1,31 @@ +# Auto-Dream workspace memory — atomic lease upgrade + +## Why + +The original `.consolidate-lock` protocol wrote the process PID and then read it back. Two parallel tasks in the same process share a PID and could both believe they acquired the lock. On Windows the original PID liveness check always returned false, and mtime restoration was Unix-only. + +## Changes (stacked after Branding PR #3) + +- Add a distinct **permanent lock inode**: `{workspace}/.orgii/workspace-memory/.consolidate-lease`. +- Hold `fs2::FileExt::try_lock_exclusive` from before the legacy timestamp update until the RAII lease drops. This supplies OS-level advisory file locking across threads and processes on supported platforms. +- The old `.consolidate-lock` retains its previous timestamp+PID format so existing time-gates and persisted records continue to work. +- Replace Unix-specific timestamp rollback with cross-platform `std::fs::FileTimes`. +- Add eight-contender concurrency, same-process reentrancy, and subprocess lock exclusion tests alongside existing commit/rollback tests. + +## Invariants / remaining work + +1. Never remove or replace the `.consolidate-lease` file while another process may have it open. Keep its inode stable across app restarts; lock is released by the OS after process exit. +2. Only the RAII production entry point holds the lock. The timestamp/PID helper is now private; no product code should bypass the lease. +3. This change does **not** separate per-workspace `.orgii` memory from an upstream ORG2 instance opening the same project. Cross-product workspace metadata requires an opt-in compatibility/migration plan. +4. Crash consistency of the timestamp-based time-gate remains separate from exclusive ownership: a hard process crash may retain a too-recent timestamp; this will need a committed timestamp / in-progress marker split. +5. Run the included separate-process exclusion test on macOS Apple Silicon, Windows 11 and Linux; add *hard-kill/restart* tests and record successful results before shipping. + +## Focused check + +```bash +cd src-tauri +cargo test -p agent_core specialization::memory::workspace_memory::lock::tests +cargo clippy -p agent_core --all-targets -- -D warnings +``` + +**These are requested validation commands, not proof that CI has passed.** diff --git a/docs/fork/PROFILE_ISOLATION.md b/docs/fork/PROFILE_ISOLATION.md new file mode 100644 index 0000000000..aef74cd05c --- /dev/null +++ b/docs/fork/PROFILE_ISOLATION.md @@ -0,0 +1,31 @@ +# Profile isolation: symlink-aware path guard + +## Background + +The independent **TP Agent Studio** binary uses its own default data home (`~/.tp-agent-studio`) and dedicated dev, numbered-instance and service-port namespaces. A portable/test environment can still override the internal `ORGII_HOME` setting. This override must **never** point the fork back into the original publisher's `~/.orgii` user profile. + +A previous guard directly called `canonicalize()` and, if it failed for a path that had not been created, compared the unnormalized string. A path with `../`, a symlinked ancestor or a non-existent suffix could evade the safety check. + +## Implemented + +- Require an absolute override path. +- Lexically resolve `.` and `..` path components before checking containment. +- Resolve the **nearest existing filesystem ancestor** and append missing components; if symlink resolution or permissions fail, refuse to start instead of silently accepting an unverified path. +- Compare to the independently resolved `~/.orgii` user data directory, including nested children and case-insensitive Windows path matching. +- Cover non-existent children, dot-dot traversal and symlinked parents in Rust tests; verify guard presence in the lightweight Fork Safety workflow. +- Maintain opt-in portable/test roots that do not overlap upstream's profile. + +## What is not yet guaranteed + +This is a startup **accidental-overlap guard**, not a hardened per-operation directory sandbox: an attacker who can change a symlink *after* startup can still cause a TOCTOU race. Workspace-local `.orgii` metadata, external CLI user profiles, OS credential stores and cloud accounts have separate paths and still need explicit auditing. Do not claim full fork/upstream isolation until those paths have been tested on macOS Apple Silicon, Windows 11 and Linux. + +## Verification + +```sh +node scripts/fork/check-identity.mjs +cd src-tauri +cargo test -p org2 runtime_instance::tests +cargo clippy --workspace --all-targets -- -D warnings +``` + +CI evidence, not this document, is the authority for a passing build. diff --git a/docs/fork/ROADMAP.md b/docs/fork/ROADMAP.md index 3a4058d0a6..0faea86def 100644 --- a/docs/fork/ROADMAP.md +++ b/docs/fork/ROADMAP.md @@ -8,10 +8,13 @@ ## P0 — Safe ownership and packaging (must pass before installers) - [ ] Select a final brand and domain; inventory ORG2 trademarks and upstream-only UI links. -- [ ] Change app name/identifier and macOS/Windows/Linux metadata without clobbering upstream installs. -- [ ] Introduce a configurable app-data root; isolate SQLite databases, workspace memory, key storage, sidecars, logs, IPC ports and deep-link protocols. +- [x] Introduce original two-tone TP Agent Studio icons for desktop bundle, Dev and default live Dock; remaining tray, Store/mobile and legacy optional Dock variants need rebranding and platform validation. +- [x] Add provisional TP Agent Studio Tauri names/identifiers for main, dev and Windows; installer coexistence requires runtime acceptance tests. +- [x] Move the canonical application data root and runtime-default ports to fork-specific paths; external history and native transcript defaults are isolated. Remaining hard-coded legacy paths, runtime hooks and installer coexistence still require an end-to-end audit. - [x] Disable base updater and custom Rust upstream update route for unreleased fork. -- [ ] Replace update URLs, public signing key, CI release dependencies and signing identities with fork-owned infrastructure. +- [x] Remove clickable upstream installer links from fork README and clear the disabled Tauri updater manifest list. +- [ ] Replace remaining upstream public signing key, CI release dependencies and signing identities with fork-owned infrastructure. +- [x] Harden the explicit fork data-root guard against parent traversal, missing suffixes and symlinked ancestors; add focused Rust and fork-safety tests. - [ ] Run same-machine concurrent-install and migration/rollback tests. - [ ] Publish fork-built packages only after independent signing and end-to-end smoke tests. @@ -19,7 +22,8 @@ ## P1 — Reliability and security -- [ ] Replace PID/write-and-read workspace auto-dream lock with a real cross-process atomic lock and race tests. +- [x] Replace the production auto-dream acquisition path with a stable OS-level exclusive file lease, plus eight-contender, cross-process exclusion tests and portable rollback. +- [ ] Add multi-process crash/kill/restart, Windows/macOS/Linux lock test evidence and split committed timestamp from in-progress state. - [ ] Add sandbox profiles for untrusted agent shell commands; separate read/write paths, environment secrets, network and process limits. - [ ] Introduce versioned, transactional SQLite migrations with verification and recovery procedures. - [ ] Classify transient vs permanent LLM reflection failures; TTL/backoff rather than permanent blacklist for transient errors. diff --git a/docs/fork/TWO_TONE_BRANDING.md b/docs/fork/TWO_TONE_BRANDING.md new file mode 100644 index 0000000000..fa08b9664f --- /dev/null +++ b/docs/fork/TWO_TONE_BRANDING.md @@ -0,0 +1,30 @@ +# TP Agent Studio — Two-tone identity (provisional) + +![TP Agent Studio icon](../../assets/branding/tp-agent-studio.svg) + +## Palette and metaphor + +The fork's native desktop app uses **exactly two brand inks**: Midnight Navy `#101D33` and Electric Cyan `#4DD8F5` (alpha/transparency for shape edges is acceptable). The paired chevrons signify code/tools; the central node symbolizes agent orchestration. Do not reuse or imitate the upstream publisher's original icon or signing identity. + +## Source of truth and packaged resources + +- `assets/branding/tp-agent-studio.svg`: primary source vector, 512x512 viewBox. +- `assets/branding/tp-agent-studio-dev.svg`: same primary geometry with a small cyan development mark, distinguished by a navy center. +- `src-tauri/icons/{icon.png,icon.icns,icon.ico,32x32.png,64x64.png,128x128.png,128x128@2x.png}`: compiled assets for Windows, Linux and macOS. +- `src-tauri/icons/dev/{icon.png,icon.icns,icon.ico,32x32.png,128x128.png,128x128@2x.png}`: development icon variants. +- `src-tauri/icons/dock/dark.png`: uses the same primary art as the main application icon; this is the default live Dock icon. +- `scripts/fork/check-icons.mjs`: validates image signatures, dimensions, palette, PNG pixel compression, embedded ICO/ICNS images and the Dock invariant. + +## Regenerating + +SVG is the editable artwork. Rasterize to the same resolutions, package the PNG/ICO/ICNS resources, and run `node scripts/fork/check-icons.mjs`. The app's image validation is part of the fork-safety CI workflow. When changing the two color codes or path geometry, update both source SVGs and all bundled binary targets in the same pull request; do not ship the original ORG2 icon accidentally. + +## Remaining branding work + +- The historical `light` and `rainbow` optional Dock variants still use legacy upstream art; new fork-owned two-tone alternatives and settings migration are required before shipping. The default `dark` variant now uses TP Agent Studio art. +- Tray icon remains a platform-appropriate monochrome template; separately update its glyph before final release. +- Microsoft Store tile logos, mobile icons and UI splash/logo illustrations still need a dedicated rebranding pass. +- Update external URL/callback, cloud identity and public product copy only with ownership/compatibility tests. +- Perform installer, app-switcher and taskbar icon acceptance tests on macOS Apple Silicon, Windows 11 and Linux. + +**Safety:** fork updater remains disabled; no independently signed/distributed installers yet. Keep the upstream AGPL-3.0-or-later license and attribution. diff --git a/scripts/fork/check-icons.mjs b/scripts/fork/check-icons.mjs new file mode 100644 index 0000000000..5ea273e4f3 --- /dev/null +++ b/scripts/fork/check-icons.mjs @@ -0,0 +1,107 @@ +#!/usr/bin/env node +// Validate the actual shipped two-tone desktop bitmaps, not only their source. +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { inflateSync } from 'node:zlib'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '../..'); +const file = (p) => readFileSync(resolve(root, p)); +const sig = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]); +const navy = [16, 29, 51]; +const cyan = [77, 216, 245]; + +function png(path, expectedSize) { + const data = file(path); + assert.ok(data.subarray(0, 8).equals(sig), path + ' missing PNG signature'); + let offset = 8, width, height, palette, alpha, raw; + while (offset + 12 <= data.length) { + const n = data.readUInt32BE(offset), type = data.toString('ascii', offset + 4, offset + 8); + assert.ok(offset + n + 12 <= data.length, path + ' has malformed chunk'); + const payload = data.subarray(offset + 8, offset + 8 + n); + if (type === 'IHDR') { + width = payload.readUInt32BE(0); height = payload.readUInt32BE(4); + assert.equal(payload[8], 8, 'Expected 8-bit palette'); + assert.equal(payload[9], 3, 'Expected paletted PNG'); + } + if (type === 'PLTE') palette = payload; + if (type === 'tRNS') alpha = payload; + if (type === 'IDAT') raw = raw ? Buffer.concat([raw, payload]) : payload; + offset += 12 + n; + if (type === 'IEND') break; + } + assert.equal(width, expectedSize, path + ' incorrect width'); + assert.equal(height, expectedSize, path + ' incorrect height'); + assert.ok(palette && alpha && raw, path + ' missing palette/transparency/pixels'); + assert.equal(palette.length / 3, alpha.length, 'Palette alpha mismatch'); + assert.deepEqual([...palette.subarray(0, 3)], navy, 'Expected midnight navy base'); + assert.deepEqual([...palette.subarray(palette.length - 3)], cyan, 'Expected electric cyan accent'); + const pixels = inflateSync(raw); + assert.equal(pixels.length, (width + 1) * height, path + ' invalid pixel scanlines'); + for (let y = 0; y < height; y++) { + assert.equal(pixels[y * (width + 1)], 0, 'Unexpected PNG filter type'); + } + return data; +} + +function ico(path) { + const data = file(path); + assert.equal(data.readUInt16LE(0), 0); + assert.equal(data.readUInt16LE(2), 1); + const count = data.readUInt16LE(4); + assert.ok(count >= 4, 'ICO lacks multi-resolution icons'); + for (let i = 0; i < count; i++) { + const entry = 6 + i * 16, len = data.readUInt32LE(entry + 8), offset = data.readUInt32LE(entry + 12); + assert.ok(offset + len <= data.length && len > 0, 'ICO image outside file'); + assert.ok(data.subarray(offset, offset + 8).equals(sig), 'ICO image not PNG'); + } +} + +function icns(path) { + const data = file(path); + assert.equal(data.toString('ascii', 0, 4), 'icns'); + assert.equal(data.readUInt32BE(4), data.length); + let offset = 8, entries = 0; + while (offset < data.length) { + const len = data.readUInt32BE(offset + 4); + assert.ok(len > 8 && offset + len <= data.length, 'Malformed ICNS entry'); + assert.ok(data.subarray(offset + 8, offset + 16).equals(sig), 'ICNS bitmap not PNG'); + offset += len; entries++; + } + assert.ok(entries >= 6, 'ICNS lacks high-DPI variants'); +} + +const generated = [ + ['src-tauri/icons/32x32.png', 32], + ['src-tauri/icons/64x64.png', 64], + ['src-tauri/icons/128x128.png', 128], + ['src-tauri/icons/128x128@2x.png', 256], + ['src-tauri/icons/icon.png', 512], + ['src-tauri/icons/dev/32x32.png', 32], + ['src-tauri/icons/dev/128x128.png', 128], + ['src-tauri/icons/dev/128x128@2x.png', 256], + ['src-tauri/icons/dev/icon.png', 512], + ['src-tauri/icons/dock/dark.png', 512], +]; +for (const [path, n] of generated) png(path, n); +assert.ok(file('src-tauri/icons/icon.png').equals(file('src-tauri/icons/dock/dark.png')), + 'macOS live Dock must use the same mark as the installer'); +assert.ok(!file('src-tauri/icons/icon.png').equals(file('src-tauri/icons/dev/icon.png')), + 'Dev must be recognizable and distinguishable from production'); + +for (const path of ['src-tauri/icons/icon.ico', 'src-tauri/icons/dev/icon.ico']) ico(path); +for (const path of ['src-tauri/icons/icon.icns', 'src-tauri/icons/dev/icon.icns']) icns(path); + +for (const path of ['assets/branding/tp-agent-studio.svg', 'assets/branding/tp-agent-studio-dev.svg']) { + const source = file(path).toString('utf8'); + assert.ok(source.includes('#101D33') && source.includes('#4DD8F5'), + path + ' must preserve the two-ink brand palette'); +} +for (const configFile of ['src-tauri/tauri.conf.json', 'src-tauri/tauri.dev.conf.json']) { + const config = JSON.parse(file(configFile).toString('utf8')); + for (const icon of config.bundle.icon) { + file('src-tauri/' + icon); + } +} +console.log('Two-tone desktop icon sources, multi-resolution PNG, ICO and ICNS passed'); diff --git a/scripts/fork/check-identity.mjs b/scripts/fork/check-identity.mjs new file mode 100644 index 0000000000..525278f0ae --- /dev/null +++ b/scripts/fork/check-identity.mjs @@ -0,0 +1,63 @@ +#!/usr/bin/env node +// CI gate for fork desktop identity. No dependencies or network access. +import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '../..'); +const read = (path) => readFileSync(resolve(root, path), 'utf8'); + +const base = JSON.parse(read('src-tauri/tauri.conf.json')); +const dev = JSON.parse(read('src-tauri/tauri.dev.conf.json')); +const windows = JSON.parse(read('src-tauri/tauri.windows.conf.json')); +const macos = JSON.parse(read('src-tauri/tauri.macos.conf.json')); + +assert.equal(base.identifier, 'com.theerasakping.tpagentstudio'); +assert.equal(dev.identifier, 'com.theerasakping.tpagentstudio.dev'); +assert.equal(base.productName, 'TP Agent Studio'); +assert.equal(dev.productName, 'TP Agent Studio Dev'); +assert.equal(base.app.windows.find((w) => w.label === 'main')?.title, base.productName); +assert.equal(windows.app.windows.find((w) => w.label === 'main')?.title, base.productName); +assert.deepEqual(base.plugins['deep-link'].desktop.schemes, ['tpagentstudio']); +assert.deepEqual(dev.plugins['deep-link'].desktop.schemes, ['tpagentstudio-dev']); +assert.equal(macos.bundle.macOS.signingIdentity, undefined, + 'Do not inherit upstream Apple signing identity'); +assert.equal(macos.bundle.macOS.providerShortName, undefined, + 'Do not inherit upstream Apple team short name'); +assert.equal(base.plugins.updater.active, false); +assert.equal(base.bundle.createUpdaterArtifacts, false); + +const scopes = base.app.security.assetProtocol.scope; +assert.ok(scopes.includes('$HOME/.tp-agent-studio/**')); +assert.ok(scopes.includes('$HOME/.tp-agent-studio-dev/**')); +assert.ok(!scopes.includes('$HOME/.orgii/**')); + +const nodeProfiles = read('scripts/tauri/instance-profile.cjs'); +assert.match(nodeProfiles, /const PRIMARY_IDE_PORT = 23847;/); +assert.match(nodeProfiles, /const PRIMARY_PROXY_PORT = 27888;/); +assert.match(nodeProfiles, /\.tp-agent-studio-dev/); +assert.match(nodeProfiles, /com\.theerasakping\.tpagentstudio/); + +const runtime = read('src-tauri/src/runtime_instance.rs'); +assert.match(runtime, /const FORK_IDE_SERVER_PORT: u16 = 23_847;/); +assert.match(runtime, /const FORK_CLI_PROXY_PORT: u16 = 27_888;/); +assert.match(runtime, /\.tp-agent-studio-dev/); +assert.match(runtime, /\.tp-agent-studio-instance/); +assert.match(runtime, /validate_explicit_home/); +assert.match(runtime, /resolve_profile_candidate/); +assert.match(runtime, /symlink_metadata/); +assert.match(runtime, /profile_path_contains/); +assert.match(runtime, /rejects_missing_suffix_and_parent_traversal_into_upstream_data/); +assert.match(runtime, /rejects_symlinked_parent_into_upstream_profile/); + +const bootstrap = read('src-tauri/src/app/bootstrap.rs'); +assert.match(bootstrap, /runtime_profile\.is_fork\(\)/); +assert.match(bootstrap, /validate_explicit_home/); +assert.match(bootstrap, /std::env::set_var\("ORGII_EXTERNAL_HISTORY_HOME", &history_home\)/); +assert.match(bootstrap, /std::env::set_var\("ORGII_NATIVE_TRANSCRIPT_HOME", &history_home\)/); +assert.match(read('src-tauri/crates/app-paths/src/data_root.rs'), + /home_dir\(\)\.join\("\.tp-agent-studio"\)/); +assert.match(read('src-tauri/src/app_update.rs'), + /const FORK_UPDATER_READY: bool = false;/); +process.stdout.write('Fork desktop identity checks passed. Full profile isolation still requires integration testing.\n'); diff --git a/scripts/fork/check-safety.mjs b/scripts/fork/check-safety.mjs index 64213dbd3e..f7df1281e9 100644 --- a/scripts/fork/check-safety.mjs +++ b/scripts/fork/check-safety.mjs @@ -21,6 +21,12 @@ assert.match(rust, /const FORK_UPDATER_READY:\s*bool\s*=\s*false\s*;/, assert.match(rust, /pub async fn check_app_update\([\s\S]*?require_fork_updater_ready\(\)\?;/, 'Custom check_app_update path must enforce fork update guard'); assert.match(readme, /Independent community fork/); +assert.deepEqual(config.plugins?.updater?.endpoints, [], + 'Until independent signing is configured, no updater manifest URL may be active'); +assert.ok(!readme.includes('https://github.com/org2AI/ORG2/releases/'), + 'Fork README must not offer binaries published by the original upstream'); +assert.match(readme, /No independently signed TP Agent Studio installers are available yet/); + const upstreamRelease = read('.github/workflows/release.yaml'); const releaseLines = upstreamRelease.split('\n'); for (const job of ['build-and-release', 'build-windows', 'build-linux']) { diff --git a/scripts/tauri/instance-profile.cjs b/scripts/tauri/instance-profile.cjs index 940602556a..9d3be28ba3 100644 --- a/scripts/tauri/instance-profile.cjs +++ b/scripts/tauri/instance-profile.cjs @@ -1,8 +1,8 @@ const path = require("path"); const os = require("os"); -const PRIMARY_IDE_PORT = 13847; -const PRIMARY_PROXY_PORT = 17888; +const PRIMARY_IDE_PORT = 23847; +const PRIMARY_PROXY_PORT = 27888; const MAX_INSTANCE_ID = 99; // Reserve the next service slot for dev; numbered bundles remain 2..99. const DEV_INSTANCE_ID = 100; @@ -14,11 +14,11 @@ function createDevInstanceProfile() { productName: devConfig.productName, identifier: devConfig.identifier, deepLinkSchemes: devConfig.plugins["deep-link"].desktop.schemes, - authDeepLinkScheme: "orgii-dev", + authDeepLinkScheme: "tpagentstudio-dev", ideServerPort: PRIMARY_IDE_PORT + DEV_INSTANCE_ID - 1, cliProxyPort: PRIMARY_PROXY_PORT + DEV_INSTANCE_ID - 1, - // Share sessions.db and its related files with the bundled app. - dataHome: path.join(os.homedir(), ".orgii"), + // The fork dev build must never share sessions.db with production or upstream. + dataHome: path.join(os.homedir(), ".tp-agent-studio-dev"), }; } @@ -52,13 +52,13 @@ function createInstanceProfile(value) { const suffix = `instance${id}`; return { id, - productName: `ORG2 Instance ${id}`, - identifier: `org2ai.org2.${suffix}`, - deepLinkSchemes: [`yorgai-${suffix}`, `orgii-${suffix}`], - authDeepLinkScheme: `orgii-${suffix}`, + productName: `TP Agent Studio Instance ${id}`, + identifier: `com.theerasakping.tpagentstudio.${suffix}`, + deepLinkSchemes: [`tpagentstudio-${suffix}`], + authDeepLinkScheme: `tpagentstudio-${suffix}`, ideServerPort: PRIMARY_IDE_PORT + id - 1, cliProxyPort: PRIMARY_PROXY_PORT + id - 1, - dataHome: path.join(os.homedir(), `.orgii-${suffix}`), + dataHome: path.join(os.homedir(), `.tp-agent-studio-${suffix}`), }; } diff --git a/scripts/tauri/instance-profile.test.cjs b/scripts/tauri/instance-profile.test.cjs index 289399c0b8..aa08fdeedd 100644 --- a/scripts/tauri/instance-profile.test.cjs +++ b/scripts/tauri/instance-profile.test.cjs @@ -11,11 +11,11 @@ const { test("dev identity cannot collide with primary or any numbered bundle", () => { const dev = createDevInstanceProfile(); - assert.equal(dev.identifier, "org2ai.org2.dev"); - assert.equal(dev.ideServerPort, 13946); - assert.equal(dev.cliProxyPort, 17987); - assert.equal(dev.authDeepLinkScheme, "orgii-dev"); - assert.match(dev.dataHome, /\.orgii$/); + assert.equal(dev.identifier, "com.theerasakping.tpagentstudio.dev"); + assert.equal(dev.ideServerPort, 23946); + assert.equal(dev.cliProxyPort, 27987); + assert.equal(dev.authDeepLinkScheme, "tpagentstudio-dev"); + assert.match(dev.dataHome, /\.tp-agent-studio-dev$/); for (let id = 2; id <= 99; id++) { const bundle = createInstanceProfile(id); for (const key of [ @@ -38,9 +38,9 @@ test("dev frontend defaults agree with runtime ports and preserve explicit overr const env = { PATH: "/test/bin" }; assert.deepEqual(applyDevInstanceEnv(env), { PATH: "/test/bin", - ORGII_IDE_SERVER_PORT: "13946", - ORGII_CLI_PROXY_PORT: "17987", - ORGII_DEEP_LINK_SCHEME: "orgii-dev", + ORGII_IDE_SERVER_PORT: "23946", + ORGII_CLI_PROXY_PORT: "27987", + ORGII_DEEP_LINK_SCHEME: "tpagentstudio-dev", }); assert.deepEqual(env, { PATH: "/test/bin" }); const overrides = { @@ -55,11 +55,11 @@ test("dev frontend defaults agree with runtime ports and preserve explicit overr test("instance 2 receives isolated identity, schemes, and ports", () => { const profile = createInstanceProfile("2"); - assert.equal(profile.identifier, "org2ai.org2.instance2"); - assert.equal(profile.authDeepLinkScheme, "orgii-instance2"); - assert.equal(profile.ideServerPort, 13848); - assert.equal(profile.cliProxyPort, 17889); - assert.match(profile.dataHome, /\.orgii-instance2$/); + assert.equal(profile.identifier, "com.theerasakping.tpagentstudio.instance2"); + assert.equal(profile.authDeepLinkScheme, "tpagentstudio-instance2"); + assert.equal(profile.ideServerPort, 23848); + assert.equal(profile.cliProxyPort, 27889); + assert.match(profile.dataHome, /\.tp-agent-studio-instance2$/); }); test("primary and unbounded instance ids are rejected", () => { @@ -69,12 +69,12 @@ test("primary and unbounded instance ids are rejected", () => { }); test("IDE server ports resolve through the canonical instance profile", () => { - const profile = createInstanceProfileFromIdeServerPort("13848"); + const profile = createInstanceProfileFromIdeServerPort("23848"); assert.equal(profile.id, 2); - assert.equal(profile.productName, "ORG2 Instance 2"); - assert.equal(profile.cliProxyPort, 17889); + assert.equal(profile.productName, "TP Agent Studio Instance 2"); + assert.equal(profile.cliProxyPort, 27889); - for (const value of [undefined, "13847", "13946", "not-a-port"]) { + for (const value of [undefined, "23847", "23946", "not-a-port"]) { assert.throws(() => createInstanceProfileFromIdeServerPort(value)); } }); diff --git a/src-tauri/crates/agent-core/Cargo.toml b/src-tauri/crates/agent-core/Cargo.toml index 18c8abc4b9..84bd4d6771 100644 --- a/src-tauri/crates/agent-core/Cargo.toml +++ b/src-tauri/crates/agent-core/Cargo.toml @@ -78,6 +78,7 @@ schemars = { workspace = true } # --------------------------------------------------------------------------- rusqlite = { workspace = true } parking_lot = "0.12" +fs2 = "0.4" # Cross-process advisory lease for workspace memory consolidation. # --------------------------------------------------------------------------- # Time / IDs diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index f105275735..706f8f713c 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -121,6 +121,45 @@ pub struct ScheduledMessage { pub execute: ExecuteFn, } +/// Decrement a pending-message counter only when nonzero, retaining +/// exactly the old checked_sub + fetch_update semantics on Rust MSRV 1.85. +fn decrement_pending(counter: &AtomicUsize) { + let mut current = counter.load(Ordering::Acquire); + while current > 0 { + match counter.compare_exchange_weak( + current, + current - 1, + Ordering::AcqRel, + Ordering::Acquire, + ) { + Ok(_) => return, + Err(actual) => current = actual, + } + } +} + +#[cfg(test)] +mod atomic_pending_tests { + use super::decrement_pending; + use std::sync::atomic::{AtomicUsize, Ordering}; + use std::sync::Arc; + + #[test] + fn pending_counter_never_underflows() { + let count = Arc::new(AtomicUsize::new(7)); + let tasks: Vec<_> = (0..20) + .map(|_| { + let count = Arc::clone(&count); + std::thread::spawn(move || decrement_pending(&count)) + }) + .collect(); + for handle in tasks { + handle.join().unwrap(); + } + assert_eq!(count.load(Ordering::Acquire), 0); + } +} + pub(crate) fn panic_payload_to_string(payload: &(dyn Any + Send)) -> String { if let Some(message) = payload.downcast_ref::() { return message.clone(); @@ -478,11 +517,7 @@ impl WorkerTask { } }; if targeted_cancelled { - let _ = self - .pending - .fetch_update(Ordering::AcqRel, Ordering::Acquire, |count| { - count.checked_sub(1) - }); + decrement_pending(&self.pending); crate::foundation::session_bridge::update_turn_intent_status( &self.session_id, &msg.turn_intent_id, @@ -524,11 +559,7 @@ impl WorkerTask { continue; } - let _ = self - .pending - .fetch_update(Ordering::AcqRel, Ordering::Acquire, |count| { - count.checked_sub(1) - }); + decrement_pending(&self.pending); let is_turn = msg.kind == ScheduledKind::Turn; self.processing.store(true, Ordering::Relaxed); diff --git a/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs b/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs index 9d72d17bb3..f445043774 100644 --- a/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs +++ b/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs @@ -35,6 +35,39 @@ pub fn notify_expected_escape() { EXPECTED_ESCAPES.fetch_add(1, Ordering::Relaxed); } +/// Consume one expected synthetic Escape without underflow. A CAS loop +/// avoids deprecated fetch_update and works on the project's minimum Rust. +fn consume_expected_escape(counter: &AtomicU32) -> bool { + let mut remaining = counter.load(Ordering::SeqCst); + while remaining > 0 { + match counter.compare_exchange_weak( + remaining, + remaining - 1, + Ordering::SeqCst, + Ordering::SeqCst, + ) { + Ok(_) => return true, + Err(actual) => remaining = actual, + } + } + false +} + +#[cfg(test)] +mod atomic_escape_tests { + use super::consume_expected_escape; + use std::sync::atomic::{AtomicU32, Ordering}; + + #[test] + fn expected_escapes_are_consumed_once() { + let count = AtomicU32::new(2); + assert!(consume_expected_escape(&count)); + assert!(consume_expected_escape(&count)); + assert!(!consume_expected_escape(&count)); + assert_eq!(count.load(Ordering::SeqCst), 0); + } +} + /// Enable or disable the abort action (the tap itself keeps running). pub fn set_enabled(enabled: bool) { ENABLED.store(enabled, Ordering::Relaxed); @@ -133,16 +166,7 @@ extern "C" fn escape_tap_callback( if is_synthetic { return event; } - if EXPECTED_ESCAPES - .fetch_update(Ordering::SeqCst, Ordering::SeqCst, |n| { - if n > 0 { - Some(n - 1) - } else { - None - } - }) - .is_ok() - { + if consume_expected_escape(&EXPECTED_ESCAPES) { return event; } diff --git a/src-tauri/crates/agent-core/src/specialization/memory/commands.rs b/src-tauri/crates/agent-core/src/specialization/memory/commands.rs index 4b1114158f..fc29407796 100644 --- a/src-tauri/crates/agent-core/src/specialization/memory/commands.rs +++ b/src-tauri/crates/agent-core/src/specialization/memory/commands.rs @@ -674,25 +674,19 @@ pub async fn workspace_memory_status(workspace: String) -> Result { - consolidation_lock::rollback(ws, prior); - false - } - Ok(None) => true, + // Only probe the OS lease; status requests must never modify the + // persistent consolidation timestamp or roll back another writer. + let lock_held = match consolidation_lock::is_lease_held(ws) { + Ok(held) => held, Err(err) => { tracing::warn!( workspace = %ws.display(), error = %err, - "memory::workspace_memory_status: try_acquire failed; reporting lock_held=false but the actual lock state is unknown" + "memory::workspace_memory_status: lease probe failed; lock state unknown" ); - false + // Fail-closed for a UI status: unknown is not proof that the + // workspace can safely start another consolidation. + true } }; diff --git a/src-tauri/crates/agent-core/src/specialization/memory/workspace_memory/lock.rs b/src-tauri/crates/agent-core/src/specialization/memory/workspace_memory/lock.rs index ebd3754bfb..4eca1a8c09 100644 --- a/src-tauri/crates/agent-core/src/specialization/memory/workspace_memory/lock.rs +++ b/src-tauri/crates/agent-core/src/specialization/memory/workspace_memory/lock.rs @@ -10,12 +10,17 @@ //! files), NOT the L3 learnings consolidation engine in //! `super::super::consolidation`. The two subsystems are unrelated. -use std::fs; +use std::fs::{self, File, OpenOptions}; use std::path::{Path, PathBuf}; +use std::time::Duration; use std::time::SystemTime; use tracing::warn; const LOCK_FILE: &str = ".consolidate-lock"; +// A distinct, permanent inode used for atomic OS-level advisory locking. +// Never unlink this while any process may hold it: unlinking permits another +// process to open a different inode and incorrectly become an owner. +const LEASE_FILE: &str = ".consolidate-lease"; /// Stale threshold: even if the PID is live, reclaim after this duration. const HOLDER_STALE_MS: u64 = 60 * 60 * 1000; // 1 hour @@ -61,6 +66,8 @@ pub struct ConsolidationLease { workspace: PathBuf, prior_mtime_ms: u64, committed: bool, + // fs2/FileExt OS lock: held until after Drop has committed/rolled back. + _lock_file: File, } impl ConsolidationLease { @@ -77,15 +84,57 @@ impl Drop for ConsolidationLease { } } +/// Report whether another thread/process owns the actual OS lease. +/// Unlike the historical PID probe, this does not touch the timestamp and +/// cannot accidentally roll back a concurrent consolidation. +pub fn is_lease_held(workspace: &Path) -> Result { + let memory = super::memory_dir(workspace); + if !memory.exists() { + return Ok(false); + } + let lock_file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .truncate(false) + .open(memory.join(LEASE_FILE)) + .map_err(|err| format!("open consolidation lease for status: {err}"))?; + match fs2::FileExt::try_lock_exclusive(&lock_file) { + Ok(()) => { + // The lease is available. Closing the file releases the lock. + drop(lock_file); + Ok(false) + } + Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => Ok(true), + Err(err) => Err(format!("probe consolidation lease: {err}")), + } +} + /// Try to acquire the consolidation lock as an RAII lease. pub fn try_acquire_lease(workspace: &Path) -> Result, String> { - try_acquire(workspace).map(|prior| { - prior.map(|prior_mtime_ms| ConsolidationLease { - workspace: workspace.to_path_buf(), - prior_mtime_ms, - committed: false, - }) - }) + let memory = super::memory_dir(workspace); + fs::create_dir_all(&memory).map_err(|err| format!("mkdir failed: {err}"))?; + let lock_file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .truncate(false) + .open(memory.join(LEASE_FILE)) + .map_err(|err| format!("open consolidation lease: {err}"))?; + match fs2::FileExt::try_lock_exclusive(&lock_file) { + Ok(()) => {} + Err(err) if err.kind() == std::io::ErrorKind::WouldBlock => return Ok(None), + Err(err) => return Err(format!("acquire consolidation lease: {err}")), + } + // The legacy timestamp/PID protocol is read and updated ONLY after the + // exclusive OS lock is held, so threads sharing a PID cannot both win. + let acquired = try_acquire(workspace)?; + Ok(acquired.map(|prior_mtime_ms| ConsolidationLease { + workspace: workspace.to_path_buf(), + prior_mtime_ms, + committed: false, + _lock_file: lock_file, + })) } /// Try to acquire the consolidation lock. @@ -93,8 +142,9 @@ pub fn try_acquire_lease(workspace: &Path) -> Result, /// Returns `Ok(prior_mtime_ms)` on success, `Ok(None)` if blocked by /// another process, `Err` on I/O failure. /// -/// The lock is "acquired" by writing our PID and verifying we won. -pub fn try_acquire(workspace: &Path) -> Result, String> { +/// The PID/timestamp step is only valid while the RAII lease holds the OS +/// lock on the stable `.consolidate-lease` inode. Never call it alone. +fn try_acquire(workspace: &Path) -> Result, String> { let path = lock_path(workspace); let mem_dir = super::memory_dir(workspace); @@ -261,39 +311,16 @@ fn is_process_running(pid: u32) -> bool { } } -/// Set file mtime (cross-platform). +/// Restore the previous consolidation mtime on macOS, Windows and Linux. +/// `FileTimes` avoids the earlier Unix-only utimensat implementation. fn set_file_mtime(path: &Path, mtime_ms: u64) -> Result<(), String> { - let secs = (mtime_ms / 1000) as i64; - - #[cfg(unix)] - { - use std::ffi::CString; - let path_cstr = CString::new(path.to_string_lossy().as_bytes()) - .map_err(|e| format!("CString: {}", e))?; - let times = [ - libc::timespec { - tv_sec: secs, - tv_nsec: ((mtime_ms % 1000) * 1_000_000) as _, - }, - libc::timespec { - tv_sec: secs, - tv_nsec: ((mtime_ms % 1000) * 1_000_000) as _, - }, - ]; - let ret = unsafe { libc::utimensat(libc::AT_FDCWD, path_cstr.as_ptr(), times.as_ptr(), 0) }; - if ret != 0 { - return Err(format!( - "utimensat failed: {}", - std::io::Error::last_os_error() - )); - } - Ok(()) - } - #[cfg(not(unix))] - { - let _ = (path, secs); - Err("set_file_mtime not implemented on this platform".to_string()) - } + let timestamp = SystemTime::UNIX_EPOCH + Duration::from_millis(mtime_ms); + let file = OpenOptions::new() + .write(true) + .open(path) + .map_err(|err| format!("open mtime target: {err}"))?; + file.set_times(fs::FileTimes::new().set_modified(timestamp)) + .map_err(|err| format!("set mtime: {err}")) } #[cfg(test)] @@ -317,24 +344,22 @@ mod tests { #[test] fn test_acquire_fresh() { let tmp = TempDir::new().unwrap(); - let result = try_acquire(tmp.path()); - assert!(result.is_ok()); - let prior = result.unwrap(); - assert_eq!(prior, Some(0)); // No prior lock + let lease = try_acquire_lease(tmp.path()).unwrap(); + assert!(lease.is_some()); + assert!(read_last_consolidated_at(tmp.path()) > 0); + drop(lease); + assert_eq!(read_last_consolidated_at(tmp.path()), 0); } #[test] fn test_acquire_blocks_when_live() { let tmp = TempDir::new().unwrap(); - - // First acquire - let r1 = try_acquire(tmp.path()).unwrap(); - assert!(r1.is_some()); - - // Second acquire from same process is blocked because the lock is - // fresh and our PID is live. - let r2 = try_acquire(tmp.path()).unwrap(); - assert!(r2.is_none(), "should be blocked by live holder"); + let first = try_acquire_lease(tmp.path()).unwrap().unwrap(); + // OS advisory locking must also block within a single process, + // where both contenders have the same PID; this works on Windows. + let second = try_acquire_lease(tmp.path()).unwrap(); + assert!(second.is_none(), "should be blocked by OS lock holder"); + drop(first); } #[test] @@ -382,6 +407,104 @@ mod tests { assert!(read_last_consolidated_at(tmp.path()) > 0); } + #[test] + fn status_probe_does_not_modify_memory_timestamp() { + let tmp = TempDir::new().unwrap(); + assert!(!is_lease_held(tmp.path()).unwrap()); + assert_eq!(read_last_consolidated_at(tmp.path()), 0); + let lease = try_acquire_lease(tmp.path()).unwrap().unwrap(); + let stamp = read_last_consolidated_at(tmp.path()); + assert!(is_lease_held(tmp.path()).unwrap()); + assert_eq!(read_last_consolidated_at(tmp.path()), stamp); + lease.commit(); + assert!(!is_lease_held(tmp.path()).unwrap()); + assert_eq!(read_last_consolidated_at(tmp.path()), stamp); + } + + #[test] + fn lease_blocks_another_thread_in_same_process() { + let tmp = TempDir::new().unwrap(); + let first = try_acquire_lease(tmp.path()).unwrap().unwrap(); + assert!(try_acquire_lease(tmp.path()).unwrap().is_none()); + drop(first); + assert!(try_acquire_lease(tmp.path()).unwrap().is_some()); + } + + #[test] + fn simultaneous_acquirers_have_exactly_one_owner() { + use std::sync::{Arc, Barrier}; + use std::sync::atomic::{AtomicUsize, Ordering}; + + let tmp = TempDir::new().unwrap(); + let path = tmp.path().to_owned(); + let start = Arc::new(Barrier::new(9)); + let hold = Arc::new(Barrier::new(9)); + let acquired = Arc::new(AtomicUsize::new(0)); + let mut threads = Vec::new(); + for _ in 0..8 { + let (p, s, h, count) = (path.clone(), start.clone(), hold.clone(), acquired.clone()); + threads.push(std::thread::spawn(move || { + s.wait(); + let lease = try_acquire_lease(&p).expect("OS lock"); + if lease.is_some() { + count.fetch_add(1, Ordering::SeqCst); + } + h.wait(); // Keep the winner alive until every contender checked. + drop(lease); + })); + } + start.wait(); + hold.wait(); + for thread in threads { thread.join().unwrap(); } + assert_eq!(acquired.load(Ordering::SeqCst), 1); + } + + #[test] + fn subprocess_cannot_steal_parent_lease() { + const CHILD_VAR: &str = "TP_DREAM_LOCK_CHILD_WORKSPACE"; + if let Some(workspace) = std::env::var_os(CHILD_VAR) { + assert!( + try_acquire_lease(Path::new(&workspace)).unwrap().is_none(), + "child process must not obtain the parent's OS lease" + ); + return; + } + + let tmp = TempDir::new().unwrap(); + let parent = try_acquire_lease(tmp.path()).unwrap().unwrap(); + let child = std::process::Command::new(std::env::current_exe().unwrap()) + .arg("subprocess_cannot_steal_parent_lease") + .arg("--nocapture") + .env(CHILD_VAR, tmp.path()) + .output() + .expect("launch child test binary"); + assert!( + child.status.success(), + "child lock test failed:\\n{}\\n{}", + String::from_utf8_lossy(&child.stdout), + String::from_utf8_lossy(&child.stderr) + ); + drop(parent); + } + + #[test] + fn rollback_restores_previous_timestamp_across_platforms() { + let tmp = TempDir::new().unwrap(); + record_consolidation(tmp.path()).unwrap(); + // Move the timestamp beyond the stale PID threshold so the next + // acquisition is eligible while retaining a nonzero prior mtime. + let previous = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_millis() as u64 - HOLDER_STALE_MS - 60_000; + set_file_mtime(&lock_path(tmp.path()), previous).unwrap(); + let prior = read_last_consolidated_at(tmp.path()); + let lease = try_acquire_lease(tmp.path()).unwrap().unwrap(); + drop(lease); + let restored = read_last_consolidated_at(tmp.path()); + assert_eq!(restored, prior); + } + #[test] fn test_lock_path() { let workspace = Path::new("/home/user/workspace"); diff --git a/src-tauri/crates/app-paths/src/data_root.rs b/src-tauri/crates/app-paths/src/data_root.rs index 3ff5822c75..a641ef4744 100644 --- a/src-tauri/crates/app-paths/src/data_root.rs +++ b/src-tauri/crates/app-paths/src/data_root.rs @@ -1,4 +1,4 @@ -//! The `~/.orgii/` data root and the files and directories that live directly +//! The fork-local `~/.tp-agent-studio/` data root and the files and directories that live directly //! under it: databases, caches, settings, the OS Agent ("personal") family, //! sync stores, policy/MCP config, and the file-based session registry. @@ -6,17 +6,17 @@ use std::path::{Path, PathBuf}; use crate::home::home_dir; -/// Application data root: `~/.orgii/`. +/// Independent fork data root: `~/.tp-agent-studio/` by default. /// -/// Test override: setting `ORGII_HOME` redirects every path under the data -/// root to that directory. Production code must never set it. -/// -/// Fallback: `$TMPDIR/.orgii/` (only reached if `dirs::home_dir()` fails). +/// `ORGII_HOME` is still the internal compatibility override for child tools, +/// tests and the bootstrap layer. Never point it to the upstream `~/.orgii/`. +/// Fork-specific Tauri startup selects distinct primary/dev/numbered roots. +/// Fallback: `$TMPDIR/.tp-agent-studio/` when user home is unavailable. pub fn orgii_root() -> PathBuf { if let Ok(override_path) = std::env::var("ORGII_HOME") { return PathBuf::from(override_path); } - home_dir().join(".orgii") + home_dir().join(".tp-agent-studio") } /// Provider keys file: `~/.orgii/credentials.json`. diff --git a/src-tauri/crates/app-window/src/dock_icon.rs b/src-tauri/crates/app-window/src/dock_icon.rs index de62baf3ec..0f7b5a7948 100644 --- a/src-tauri/crates/app-window/src/dock_icon.rs +++ b/src-tauri/crates/app-window/src/dock_icon.rs @@ -14,11 +14,11 @@ use tauri::AppHandle; /// `src/config/settingsSchema/registry/general.ts`. pub const DOCK_ICON_SETTING_KEY: &str = "general.dockIcon"; -/// Bundled 512×512 PNGs rendered from `src/assets/appIcons/*.svg`. +/// Bundled 512×512 PNGs (the default is the fork-owned two-tone icon). /// All variants omit the circle behind the mark; light keeps a soft inset /// edge so the white tile still reads on a light Dock. const DEV_ICON_PNG: &[u8] = include_bytes!("../../../icons/dev/icon.png"); -const DEV_IDENTIFIER: &str = "org2ai.org2.dev"; +const DEV_IDENTIFIER: &str = "com.theerasakping.tpagentstudio.dev"; const DARK_ICON_PNG: &[u8] = include_bytes!("../../../icons/dock/dark.png"); const LIGHT_ICON_PNG: &[u8] = include_bytes!("../../../icons/dock/light.png"); @@ -64,7 +64,7 @@ impl DockIconVariant { } } -/// Dev shares settings with the installed app, so its visual identity must +/// Dev has its own isolated settings store; its visual identity must /// win over every stored/live preference without changing that preference. fn process_icon_png(identifier: &str, variant: DockIconVariant) -> &'static [u8] { if identifier == DEV_IDENTIFIER { @@ -233,10 +233,10 @@ mod tests { DockIconVariant::Rainbow, ] { assert_eq!( - super::process_icon_png("org2ai.org2.dev", variant), + super::process_icon_png("com.theerasakping.tpagentstudio.dev", variant), super::DEV_ICON_PNG ); - for identifier in ["org2ai.org2", "org2ai.org2.instance2"] { + for identifier in ["com.theerasakping.tpagentstudio", "com.theerasakping.tpagentstudio.instance2"] { assert_eq!(super::process_icon_png(identifier, variant), variant.png()); } } diff --git a/src-tauri/crates/search/src/code/commands/text_search.rs b/src-tauri/crates/search/src/code/commands/text_search.rs index e78dfaeb31..3886b2e204 100644 --- a/src-tauri/crates/search/src/code/commands/text_search.rs +++ b/src-tauri/crates/search/src/code/commands/text_search.rs @@ -23,8 +23,9 @@ struct SearchBudget { struct Permit; impl Permit { fn acquire() -> Result { - // Preserve the project's MSRV across toolchains that have deprecated - // fetch_update, without sacrificing the four-worker admission limit. + // Portable to the project's minimum Rust version and current stable: + // newer toolchains deprecate fetch_update in favor of try_update. + // A CAS loop retains the original 4-worker admission bound. let mut workers = WORKERS.load(Ordering::Acquire); loop { if workers >= 4 { diff --git a/src-tauri/crates/system-services/src/tray.rs b/src-tauri/crates/system-services/src/tray.rs index a13fce8e8c..8ec833e379 100644 --- a/src-tauri/crates/system-services/src/tray.rs +++ b/src-tauri/crates/system-services/src/tray.rs @@ -220,7 +220,7 @@ pub fn setup_tray(app: &AppHandle) -> Result<(), Box> { app, &[], "Open App", - "Quit ORG2", + "Quit TP Agent Studio", "Show Kanban", "Show Runtime", )?; diff --git a/src-tauri/crates/transport/src/traits.rs b/src-tauri/crates/transport/src/traits.rs index 30b4154a8d..77b2ccf794 100644 --- a/src-tauri/crates/transport/src/traits.rs +++ b/src-tauri/crates/transport/src/traits.rs @@ -7,6 +7,9 @@ use serde::{Deserialize, Serialize}; use std::fmt::Debug; /// Transport adapter trait - All platforms must implement this interface +// async_trait generates boxed Future return values, already #[must_use]. +// Narrow the current Clippy double_must_use compatibility guard to this trait. +#[allow(clippy::double_must_use)] #[async_trait] pub trait TransportAdapter: Send + Sync + Debug { /// Emit agent event to frontend diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index 5ffb9c5a8b4b25de09d064888df0e79193205bc2..99d09274678143d24e38f7aa996ce5c8ac7d0f40 100644 GIT binary patch literal 1511 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 B<#GT3 diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png index 4ddf7d7d45137fee8583a72000941d279a113d8f..63ea665e2bd91bd601e2a1893ca9b87070047a35 100644 GIT binary patch literal 3215 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 T{P(lj5di6_87ZwvdegrE!L?cC literal 6690 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 Bm45&L diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png index e9d8cee946ddfe43ad744483d2b8492e4ccecd58..43b8a6728892c6d79719ee7af3195086cf398818 100644 GIT binary patch literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!(gJ)!Tm@u}$v`5S_7W!E(hlMB zJ}JuK1?tH)+W8&&)l-bx7MM+1V>NGw-O8g*TQ9mEyz6=9rSFZenz{~OfHo?X1o;Is z2q+jh1SAwR^v_?v|NQ;;|1m(ya;}*S3{0V(E{-7;jL8xq4Xu;g<0mLQc>XXY@c`S6 zO4d%cJ#TnkG|Y6LpmN~wnFgi^R!_DyJRS`^e>Kz$xF@j+>{Gb--{8Pu2G%!CDNGSD z69np4G)!mYiC{U&HbLa5ria;s6b444W&sw3gB~uwjgrmV=;#A7eTGArAj=V;$v%QCDXfN!%p4p^3>~vo zSsywC39>A(b7JFBQ0U-0z_>y~w}WK~&@f{Kpwk3+9hd_A1XxdKHZiz47&SB~XgP2? zC3k%I~3T+RR{p>U`K2VaRrXu``Du4JykTv?8uyRx2OK zeCq{Uid6XwfZk_qU}VwAdlYcz#G)ND-3y&3KU${uv^Te?Sx~4&!J)9d`H>!fq}qZP r=?iw;K7PO<^SCgJ#+zS!A`A?nsee=FwqE-OOpXkmu6{1-oD!MO4v#KmxtOiV4n7QCbj;R5*Yy?FmIqaj8qMs1ABo(O;&Mth8YVYI;LR}HU`Ex=OH z{)EwMM%^)uX>S>Q%V^!jcjy?P`qfKDZy3EJTp+Fd<~$)~6qkIL(FCIsMnC1EWGhDi zeqi*uapMUov4%k9jUjzlmM1ap{gyz3ubgM+%xDH#q-ZA<}v4o^1aQj+7LYO#w zeoaiaqDFh$wzFhe7ANjMj>9RF$z&-HyMrSD=@c;`q1zoSA0)xW3ZoujTA|E7kw{Q7 zndBq|_vKswaesf$DV1Hvyj2oS%KxFeQb4`Vt*fK}^Ye46sHosz z00;vB+FY`E0wDKH%Ot&(!b2c1IXgQ`!^6XLe0-b@d=Q|rvXaWm%BZ)um)6$SsJgnE z&p$gmqf{zI%gf6goU5xVE~E^Ijg5^oKR-`nV}D~*Q&YpQg^?o&BxF%#bG-5ZOL_g0 zQIj$$Q1dbdKsbEY-QCSKhW|kL-Q8W9n3$lAjScQDa{I%7_xJZ{b90kAJ3FbhwUy7o zT+Ex9nW3qvDehKSUv;B^;3#=NX7s(zqAec__=C}VenAjIfJrr|fhm|bw6nUpN?l!D z{C_iq92gj&#l=N#>hA3g8b3KXp~1mHT3A@f&RJPm;TGctT3!p*;u8}j?|(9SUuOX} zMM!GElsls1GqeWg4i68r|COfh7DAne-~Kv1eK6i#W0K`fA?pRPz0CeeXtWHBh@MjD_9L-;K15*H! zrU1l!6cm6sYdkB?ic{Bzf&Q>6g&5!aicFvXKl0L1lX=urT`krpUURv?ev!_*N&CHFY7joS#zQz!srZg(!ajfKgmnr)8A4 zz*tjL(}Uy$r7*Q7=$?n)Q2J5@Z+~fN;jbuw=&lu_VoZK5GDf8_S?rWYQBv#8&CN79 zIZ30VqYuvZJ32aOdwZL9c6PLy?CFH@|XlTf;+1}nxwY9ahwY5bT7Z+JekbnjF zeql>vdU|MSX^GeWV1GgCJXjLe z93LO&76Pzj`7Ou(0MF8xU&Q&1(FeIUNT{_t2*!`6V6uwYN{fLx>&oM@&Zzpk+CKzv z@mr3ecMA=aMa_ z78$gkerD2u48|k~vQpz!2!GWDLD^QL+ZM4lVt`@5a}-&$7XR#-eWiqWiipEm6kmRd)z zZ9Dzbd+UgW>=-voTSDMBjJ_71Gf~>*F@97m!H#jeynJ-#l@LC1yGp$7fr;+~5OEyn z3;xFBfeEYl$jmc;Xv&Ik7ilR$k)HUmxzN1iOLNce!AUAUI$H$b|1tgs?1+zXd6TTB P00000NkvXXu0mjf(gg}4 diff --git a/src-tauri/icons/dev/128x128.png b/src-tauri/icons/dev/128x128.png index 5e5fc8666f24bd71de4222eb3a44b47848463950..59e9aab0693f4e6f2f98833f854d68a47150eec1 100644 GIT binary patch literal 1660 zcmbVMYfuwc7`>a_B%2Un2@yAluvrq`h=8Nfv2+uXu%JW)rcnEeh|jTOWVAZ19WNn; z4YWf*M6o_1qNw8ooLcGl=z^fZsR~Z%V67Gv9cgJr$9AwCwY#zHpZ@F4?%uuk?svX( zzVGaM^6lA^lo3h*z@!}3QXq^_yl_;wKOL@rCJf8-7Zh2EX&L|H)Fix4&YVA$DUM!H z7E|nuTe>-EEtmRHV|tZuR>RS`dpa`@_nJ=)Si5fJd^4Ii^jks-^Hj)4uP?9{0)m>s zOa^kjP< zK>5O4$H7(O7eI6d8q6=)+Eb^PSl0cU4h`tRs07R3Ocof1C#IsKrOdT&QG7>ww1xfrLuL=6+Y{2aDpae-#ChOc_af7rP~(4B$0>_vasZ=C(_sxYY{l=l~iv=6KAtW9U4Vv2OxlM>iC(E zq*u@7WNlC>a<>MDp;;vXUI@o7v&5UEA_J0&W3;A7#ukcjIh?pc_$=*SDwwiR%|2Ab z$8ZBfGV9{*xcx#g+@K4?(N;qsHDK9y^znwuhc9 z5=+bl4d=ps;B`x^1QRTwUuBaR)jl6bhr_p{i0y=kD`$Sk3nZ32trMzm`W2yb9_9m) z7x1=A(GiT>d3hMLsawCTPzo&|47RGJ+$8jZa zEYGCzae(7Ps}F6zbe|S|5l&^#%$*l=AjI;-Tj)l|?4pG@|4|Wr2&a%Y%uDEPPQykydo%Geunm_kWU&x;5 zMc_$;eQ{3(RWVCfu2Q*{okP#JH@`5!2%u7-=R0@Xv`8G&Cn1uj{_=AMX2g{c!zq-B*^Yv%R?JVNnnWB<^s|=E9$u z`oDq+|LHX3rG60TK%Rq*m3z{cmC~Cr?w)epbjJj=jEac5th!X&#c~m!oIu0o(TBD} zk0%t;;^XV?lN64^v>kp+9{VY))c?LV9WSaBnrdgS; zt{V*TOhmPx@~i80@qIG(^G(hiFM825?<0G9Ym@StlQ?&lHJ8l3E@8Rtbw@xCd>kbD ze<2m5`rfl0#3l$^>S>zE3Jk|tCsT9B(1<)$U-f1Ev#mi4w9EpjGZrCYZa0~!e8gKK ztFE7sGV66v1|yv1f3PA9{3?T|T!Z%2d}(`58p5}6Qo2QuXZqfv z8{eL0t(C3tf0cAf4?}?I@Xaur#@y?}QYkWATHoZWy)gQIP|-tC%iKwp)XMY3#e2u? z00=`eGUCbmrT7ySn#{)+G(k+qRK#w>bRs?RoHio$G!KS_?DlZriTq)$E$wHZ)?&|l z##qf=D^^qI+vd729tf4Oaq~OeU>YK6Jlgd1s&`Zm598~T>WV@zr@^Qg-cM5`gcoT5 zjwDI)wvDNXnTc6SuOS&P1e4&X;eDA<^4>fCOLs)7)3Ov7VGnH5w4SZBJ{q$h1R&Ku zASG)Iis}hL!pqo=1tE}ADq_+UGwx@_!@*6i*$}}r(-@-Vb20Ro&`X;tMyeWN*dRJajc-SHh|Q4 zc(+h`m`bHe@88bEVZc(9C)}*NL=}H~;5@b9Gel)K6GCwivIKroCl_`=2~^zH9MLv{ zU*!IZbrX3ofnuQ(?H^7~uv~kKQ~!&NNI4~zEovB<;iA3`D(@{VL#Zl>*5o*~PXrk$ z>EjaEP1lM{lJOTjpEs$%SJy^li7xNn3oO2WoU|C$_gC1a3@_(6JJssWcBLeJTMVAMwixJl%V+DWtk=4GgCTdx(Q$_=ITOf&$hK_X>C@_I z;2@=2C~|R{)+?T3G8uGroufkG2N%%)j$SwDpKabTsA3eaK&uNmg0ySqqo6jBhNp96$durkH-!QOz20YB_S?5Flvn|gHM0AIh zf7rQ#Da%Bag`I5~X8KERR%LX#I#4>fQ@*!csxEvziRSW8u*l!Oylv#-o4LjlcrX%# z0_q~Rda<9N$a+70xd~4v^3b}s0@Dae7{%$L(W4vP6C>LlP3&KJ@2CYVf!mq$@ylOS z@S2(Ylz%%n9ZB^4+&9T_+@XwW-7ClxdkEftqEDrHaDNBenkn8{=`)(*7{vQAz%0D$ zPJ1vvKkqO|bWy>p#fBAHW;Slt@QG~YGG@H_B>wpCETsl+Rv7k*{fawnI5IwVgDn=w zgey3g>q_kR?$rq7S)dp4`<7h49}be(Z$etCwcPl~v#uMUYA-b<46&hA->eal`?G%q zGklLg8Dei=co>Q8?ubTN|T@^JH3#tmNn+I!l;J2`L<@j(;o{nR~f{Q{H$ zd%H$^-IU^zJO#s;Mf$iEe#fU&Tze&okYTgldYo0zWSQmccN2BMdEEyotxEy>=@ze0 zJe8NTq3|9yq4)v3|0z8*Xlifxqy6fE2;l*{)puLq z48`x-C1#=%DJ#;nNne)@YJ&-GN_5`G?I;DiyZ1W=e(bb5*yQvwhdU)uQx! zU8!u7*X0}WdiFr)JNa(4UG`HRu^KhPMn$V;xX9!6Pru>$jH@3~G)B6TLvN!3M34rw z`A*4zgg~t)v!Pt?N^wshKs7b*C>|#G<_=Ut)9MCTnY2)+{oK=K-(|^kMI=*#P`da*4DGab=?BaR20~ld%h5zqeoIg6n!3Z}tSor(MA@ zs_M12>!z9w(;bpr4F7%W{Pz|{>FXXecwx=7nhAg5)+0}CKOedvcm$aampvqT26dI8 z6)9X%KtDnW8vAY3P0)p&54rnLv@FQN@~Q!TfGKukSMu^Cf^HSTiyFP;7g&+FO~aiX zKiIl~uDon#*2Qb7r)hOU42UASV>2Bg9<_A7CFaW)WqpyKwj9lfKh%WR_L-fNjfYDE ze!`-CkwgK!_sP^xq4~PSiROd&hX-TGnSa z!;7Ceyn^%uj9s9<9|srA| ztTb@+WdANb=XnH>V-)Ok>f(DMxxwr1oREaVnY@b)#Q8aHg2}0}MS~+g?7J0hptgA~m z+;)j8p(H!bY6iVB8h4pMNFEf7$$Oy8}+7ftI$S?kW7lC~F(Ds4DV3^Pe6D~5gtu$L(4ra^M>_4bAkVdqca5}LOB8a21w^!CEl@`x63oR=`{ zNT15JIF4Okm20-V5!YOI#&M{}T@cxvY&N9{)Ysey^e}0s`+-6&gkS^9+EA>giS6BU zKrta%J0$Afn`E&B{*up?6ROQ(pEP3aTMYO`jO9p2+D(qd zuV*gWC&-G(U&XE{$`I_IMt94>ogKL&IqFlCKj+ zzm}E)oGjAABz+YJau0R8J5o4*?k~@^~yd(!a?yu%8HrXsEkIq z`PV=8EyG>GM;@Vi3Q=_V&9N}79AGoC8Z&r@J5F-pC*LB24y$5Fjf_&n%%&&~+$uYg z!ObVp=UPQPQ{7|QRPh>2bT&;J18(iG?;_oggJDks>m0vclZK?KyMp26N_N2co={f_ zM@7+u%AY)GiZxe(kh#Vhk+m%T74}>!+6oBot{Dle-X<5SK#W!Jat!FmV3fX?TT3}; zh)*_EzOjFmghSx7n>1Sf=@%cVNq=!hNqZbNj|A3Nq6U}hgo}!-X?U<+6dGd(B+P6d zc!TYn^oA%fUu&{4huU?Z?#c@(&bcR_1fCH?3QhUNp9(Ujc3*)?Ux%C@s-k$WAWIcbd@ViN`ADeK#@Jamu5;sp_F8C;3 z!Lc#fW>vZYlp$}mH8~3X-9)6H>L=$hJ+}-ZUStvZkp?v&>SGh|DY5Is0!?_)S_9k{5;UK{4wo+J7 r&yj!1ryD@We%}87-uynAE+5*a3lv+Nyx{OBrGOl4ooyPd1JeErx712o diff --git a/src-tauri/icons/dev/128x128@2x.png b/src-tauri/icons/dev/128x128@2x.png index 169edab13bb89b8e14754e84abfd9c41b4597ec0..2fc02be959e999acb2a8b02b5e0cb24d45d028bf 100644 GIT binary patch literal 3553 zcmbVPdsq`!7QZu-#}GmY5FjAPkRXP4h{y)(V-j9L0mG{xA{&JA5^A7ob>Y(?q#+m!GWH|$1cgcM`L?$C5${sns^ovg8xi<6s${4P6J#_ zj4M@YqWR#T|N8a!KfV2*Pr*^v9+Eej5F<<92<7u%sP5FZIL0mheSq1CC1)zsj~_jG zY|nvBUtj*J|5ES3$RO@xG7k&|NkvfD+*vM26EyEK_G}^hQKfj^HMZDc!}rl3j9ESg z1)aATpqnSyj+UZ{z7esoH#M8uUW&I(h)N9UlRgBC8M zn%Am}mj32TY_D-PEu`5mS!Y@%`%0gr&H|quM>xHCu#`UtM=yRU1S{xJt3?dwu>ETD z?rxFDRl8ptyu;j=bb%NC=efYcju?f(1sKqIT zrUBblt0%VAs^Dp%Q0ULJ3?tNY5D^~X0I2MlNngz92j}iR68qT6=o166aY`qmo2%k^ zrGO90)U<9G2WRGp+lTS8Pb_FDqXrbF6;FhqCP#6rJ^SUPDxHXuE^IHAl|8eZI^fh# zt7hLlt06*!dXU7{ zL)&13>g2ZWy8s>!wTd#JF4&;1i2E{m%$f;*QwEp{0~p8*$M0$kWX@AvEP6Jv)rmt@k!`UyAe{tCU%ucHi)h74 zYc?vO5_%ijWzoR&=^@>3*7EanF=TE~Umuo?<9O?uy)V>AdxK~)forsipTYT51-6#=!dXlRQoZqc&BSxctE(=zVW%7o2i{j z{!*%8yI6kVbd_o64q2>qS3oQZpQ>Po{w*JnM1rn8E?Agj)n=sZZ@swZ4rI0U5<86;=eH^txMufK+?AtatKUVzR-k;j(qt`nwAA*leD%9sFbIT2%Yidpv>*pLeP?2pt1HjfoW%Leei$h z{%xI@*|mE7KO9|@sob$cfJWUwiVS>n`0pJu6g!V~ESq6J3^J4bmE5sUW{~A1A@fSI zjR3V9;cPS-3+8Yr3s(7Q0AO_^lotXnbvQ*1F5A9f=>SEHqjoLYs6#6p;MDH!_LRch&3ODp}sD&hOPGd03xnBVDPg~lf zse%||s0IS+Z(wnMO7Wx7>a7(Q2M%NAM@|wG8b)4LE04(O=JJCSyR&dH-8Zg9$3l+{ z%zvR}>-R>jwu(FFRcr6r*&Tb=kAXTvl&dSC#QpwcX47$qVChRZ)JA#2V_iz~(d-r} zrr=Y8z3^D*sQH-Z8Jc0IaYtXGTg(p1zgh%hBfwKpoC$TN&CJt@;-_urx6!QWkkUYQ zCUhaKCZ6>URsYcd%iuON6ele$9BZXb1DdBM079c_nWd6^Ph8OL9Xq zIb>18QbQ{_L^+#@qusUftRM@Sq8yTps2z^+$FBhXUBur)=Eut_gPyz-?Zv)NB&kur zZZ_WXF3iW7BbsPP1xSZou4ExslMnuRLn&z`L zuIzq|VUYYepfguOsoHshk#j_xWwNG#h| z8^PTe^=&c#R}s;&r>S;pUF%xq^x3H&Zr`1pQso~>-oNBY?;um?(^xH@8F&G}*3OOk TrA1an{(}MuvB@!Aa+T)ajz`k! literal 6474 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 E4{z4iBLDyZ diff --git a/src-tauri/icons/dev/32x32.png b/src-tauri/icons/dev/32x32.png index f41c566290386e88add4ec956946b7a63c432886..3c00de3cc1e69b7e2aff0931007ecf7b3903d15e 100644 GIT binary patch literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX#qYVt^%^gWFQeudkGV7X@_um zpA_Zr0`=q??fee?>M2HT3(O|1v6{ETZsk#@truMn-t|25()Y$!O=;IoC`E21Y?o7srqa#$*L9gThZ-Nepp*YHS(_!bccy zNE~2TZWF>fSwW6rQ){pQ|AUl-gaeQ4SRSM%BnTYg4iM$wn8r1W7R^|&V9FjKn6hAj#0?7pg*Zk> zZ4RqR8_Zcb*+kBybi_WIq|~I)u*g9|F!EDZ!qE&afs4B9G&EOesB3hrW8ga?dX!c4 z2`lSCt_`Y|imt95-Hx7o*^5LcP81dw5n)k}YC1VD;n=~&Oj_q13_d?%W%zy5Vdiu7 Sb>_gJWbkzLb6Mw<&;$VI^r1ok delta 767 zcmV{z?4uyh_>bGnAT_}iHhye|gCpqfN{uib z5LQkxlm6RqNOnp{#@$fAU%3-?>h=GO*aZh6;P|;0%H@cXsB(bPO296-Y^(4LrU)tV z*$U?y2cBW#fPbxUxv@iF4$l?l5V-gjySkIObZ<sd;m_@Q&qx z)yiAFZX7x26^Hhn+9})ndbWu+|ABRA-QY5XQ?ngl!QXxQj`)j-B^#)2tURgkiibZ* z7LookYYeZ|fn|8USjL5cj|llURb#FgtD02$Cgk(r+<*OX6n^~D!)tLsx$Tjg?-A?W ztAJC5V6}0rf(FlTLG<>x9&Y7;5`OLB7@|ivV{1#jLhV#qtVZn`5w|rv5cYd;<8eW+ zEmj)pvOruBRi~Ot168%lB2dMg8l>q8vf%oOcEp}fATv3qPa|!rDKsGTU-JuiG+e^f z?)Cc6)_*3#rHO{F>_Pa}r~)K8Knz3(D#tu}XA*;FT8s;swFs*fuG!U4S$$LuDA%R6P0-(Sxk1(6?h*kMtN>=s5KtTbIcIf4Yv~EE8F1$ zgQ)?Kgw1fFC72Gl>JZ~6&e{miu4y7MrUSxlm4h?D-(ItJz?}{f;DV)+>3@M3ie#rp xyuI=lNDdX>AIF^Ec46gOIMadEf5U(I{02voTq-c}(!Brx002ovPDHLkV1lIMcc}mX diff --git a/src-tauri/icons/dev/icon.icns b/src-tauri/icons/dev/icon.icns index b39fb8236c758c1da6be76ce572fedad91bd456b..03092d4b6f8c93d7beb1e2c0fbeac7c71d485692 100644 GIT binary patch literal 36364 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ɲ)5qQT1L@7QDJ@r9TLnb0DUN5U>JlT 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 M`zBETzYQe+4;)-!xBvhE literal 85769 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 J0BV>0{4X1MGFbos diff --git a/src-tauri/icons/dev/icon.ico b/src-tauri/icons/dev/icon.ico index d1283b319a0ce7ffa0bc328aed24f1ca1c1f71ae..8b753eef8762a2b86e453a937bb86669455db3b8 100644 GIT binary patch literal 7037 zcmd5=dstIfw%_NKoP-cgAYf3GLkJLF8j#vxtvv||1S^;zR|LgO={Nu_0x=N0U_dxE~vkkiZwa6l?)w<+c7JYSz0A8=^ zRGy0-Pm&YeZ3$%?Y^0rS;J5~wv@v+&4Ts}~M@bn>=2lNc zB*~hLjgA4-x_sk}#YQ}xi-=VvCM$ck4y`VhabMImkoLlh9`@Gn!K!+ScqOPz4pD$? zW3HiDZ?*p)E~Vi#?RTl6v9=oye&a4hWTP&n#hO+3#S1}EZmd9U4e=uV3J*9sEuYv< zPXO<2oJ|G!N~~7T;B?%#*lMM`0p?Ir6d;CIfJg~y(c*PRi%w@Tu4|b}G8XzcX>q9& zNnww;Q63tD69f?>4?T<*gX{{2+kJ{wm@?+rfgbUe$l~K=yBAo&TsrC9COS#&R>vJx zE7d2!YwE&^6K?lzm#g6nyc%3CMZcD!ix6ERIkmp!X+k8BpD%GP7_3*?Y1YjsWb^LV zTDwZc)aB%6b$pXLPVH<4Qg3J%5qg6l+Qls~=}|_bbCWJxy4)RFR~IryF302M+k5w0 zyW0<;37<2X?*<9*^Oww?Z{wPuhQa$!k!IjDSQP0 z2$fByAv7wGLCv`o(Gzb6nM^9n(g}=+iLzKs&tVu?i4R zM}g(Q4tO)sMixhg5EA9#ip*$m4A|&VMQETgVL)VRdMj!=O1Km~Wj$qkpaHFjjZuyR zV#Z{q9|mqi=mkAR;H|?XA?8j+IsXKbb|k8g�+1aj$q-$X^2|yixBuNdb(5Dom~K zt4hk-oXUdBIT7hF06Lx74bpL(&WUi3o98oebMy1_%C9dwPC)_yXrWDn~;P%-#YB!(Rx zKZ|m;{Ph_#0Pi%Q3yNQeHNgG#pEe^4r&<4I{N7jh5DtFhn~^y5@6GtodIQ_XZhU)F z^|s$}3q7Bo?d-bP!6>cQkJzvFum|4SQc>#h>K1<$#U7}vsZe-&qD+%L?L7?Da!=Gp z4a+u@6Ln*;iGmGmO%`{H70#MrJyJH@2_h$BQqRoo-ff}>tJ>I_iI0WI^r2R!`av}^ zL6F4Wx)T|0?G0FAUri`(BGF$51AO@4u9~!@H(N2OK<-hQUSs!$+@1h#>zJcTGJJS4 zjZ9sNkjzE$njHge;gl6D1ToSAT!_>2-x;!FXn(ksZN3UnIsu>h$I2dHiR=4l0*g!+ zC=}dGc3&VaBsCt^2M~dRihv1?*)d#UWjGZbo1B;&>qKnibxfk6O=9i^94XVKu^Ea< zRu<6(vkgkzByxj@jt2-PA%lZd@?wS})E%sYzQ-a0yhh-zwb2Pq+*Wg4$g4=AcFuKR z@=aU>Jt@hQ#A{htaYBibZeYZ@P*oU2Lf3(veGEuGJy6#X$OF-`Cbr;AO@!7PYk(M4 zV!CVcPG@HBgr+;#(|#2oYTWQAL5U;x<%&%K3z5NEl9go?_;Ddl(_({KNAL&~bQ}|| zi(oQkh%?*CQz)0Ag`=gkf!^c7c>OpT!zh?laRZJX=nMyF$4RU)#=kT$nHH$jG2b9< zAueZIV`H0>PNid_QX%RhHn_D%WDee&dLxFAu?>FV2W*R7iPC%2RVCY}8wF@K-$|S^8}=;Bf)2g}`p$&b{Y+;An8;l?pKo0VPz}gp### z$y#N^gB5D+B|^4rMfB0sl0*+k2VAgAIpZ9|=ZI6tJQ4~_P+h49^d9OFaf9c`rFui| zl3MLzTO332A=&`u>Kk9I#JdbP9Hw_;!~gD3n~rA2FMCHn!`Tl+GqP=<+2Is9XYu6~ z2EfC`;zQ?s5XBM^@dm>+DS>pBG_t zR@#hd(T9T!_qo{)Y$%sE#*Ne)+af?nR&GjdZMnU`uRMtA7Q>8IurZ87PkL^lyg1^? z8#mvzkW6%ANhdRS3c<`jrszH>%BYVNQ(nLu7VJsMs7W{h%l~`Bjm~-1DbS>=NK&Tf zq;Yo$ewk0_yz$K697jka$vA@KyvbLQQ}L5Xg!>-(oVM{E%NN#CG>Kf=uhLHEposZR zkR8@R)UnIajxf6;CUj6DHJ;G=bfQ!$HGR%Ly zQw`h6f9O5%CKr#M6DW`6gMse+k#9!OaCxUGF+~id`Y4SeDyCGV3KfUACmZ? zk3+7VkX#Y0$WY#wvAecZ?6o$ni^Q80c+xa`M(}Wp#*Aso#nO46?2R8Fi3fa?V1s;D zRfhJbD0X{AuxA<`@Z4(8^SVDcb8H3Rz2lg)y%^OhdeDsNKSzUk1hUJgK?^0S%Ho@E zrs}P`A0D_tDKZ~M3QP&Ys+@=0B&Mc-s_aMGq|TRuGy&4t%!;>cic_$u6$#uPO%f<( zo9x^in*vk5es*)l$4_RF!?Foc;oac?CzqgM?Zr}ZONjLHy;*}u5LTp_`4-ay-h8FB ze+oi@mls)a75F8a|2>m!E%>m40`mI^w-2e*bbks=+@-)+n^%h=PDRUTmh zudJ})r%?vHAER-fV^$pYk;?=XV9D&#{$$b3uXua zc4ojh!iczQcY|4vV%<)Wfha?H7|ASmMj7h~IlB9f(PG&@g^1$UAeh8Hn#rT$xO^{K zI-5#$VY;zkGfGKJf#A<_2fxHmj9!*Vrv#`I5@wKjkzaK9R!N?&>yCi z^yZTwU-i*g9D^r|W!MPqxO2R(7twylx=+xj5q`l`PZ0=C`l9uZ<7(5?WHo z){|RL-vsEDiGI=?q#5OGt1>^!?elvg)-wkTPJ(Y@=B6+=?Hu%ZUWhLN)ST;Wn-O$3 z%#X4b>>5MLSq-ymgdvD~5p;kBBj}!D)}>^ABy#v6gt;1l1DQHv+c1 z;$lF0iX^`C&y@s-2r`B@^})CnuSt{C>Fs3hxB3N1QuB z3sGN zDcS|wiiAFa_Aa8+?JIUpzO>4(D8Vx@{#r~ur@Rc-CyH^K+|gDk8N)+vM2Eg$*9J#7 zt11a!jd>`1RuPxar$aVT+Yc_HW;3<)eiv$68eK>nq>u6Cr(P^?t*DcO=;;BQALyyM zj=|i|w022|??-9#3P)V8&!2ZC?6WC@t0WWuvU@@>*_qF@UXKBQU^>uZNDHwZF$=KTNT)QV)!7*hr(Vr{i&)?=!p33hwN?Qj=I!m zbIWzwp)eCyNDaOd(6Z}Eni}YMM0uzwktC|WR>tQA=ymM_AI!|klVStfU+O&nb*&|I{^@)BCiLpml@CzEAG{0j+K z9F?9Ol{HEKJ&tuX(caJvSN@GL#GFU<9RxVvflPClH&TABkQ3<->Bi?r(Vqizb7Rd^ z-{Dctl@O5kMOa3FEsPDWudgqOk@6b+^i}{++h(LV8FV$uru00&ed>&E9+=b?x^!(7 zxhfD{7!P7DpS6aX#;qxap}Zp0iuKdhfh>49zTTg;$t3dUG{$~Pd#}$Ndfbr&R_&Oi z-6WpL8(4<4?7Y(`0GXdwM8C}<`)_O%`@0eNH;Vmb9-R!mg5L3c9u!` zK#fKFn$6y$^Xs(m;KCF3qJ0xDdykEMALn+|H+0MlGc@q)+tk3A2EJ2gddOgWbezwY ze&_mdEADrP76Jxpxj-WqZ7;qf%cz89elrvKp7c9x>2K?Hu2fi9tGqU_`1z(K;VfNo9Y`A@e5l! zk3E2l9~Md9V7m0&Hh3%MZGE1E3gDxtBVAO8Z5X)Quikn!h5Bev< zPeblMlMw-5V&>RLAlX*`_4p-=7~y$)2BHoYLbH|#R(sT1IapG%2s21(Qc|t#L32>> z9vse{pU+iP%!Y0`p9eyyi3pw^u4(7g#N`(&`$78)F8YI1$dGL-1x7u?ksdEgNVe#~ zp$nB#>SXja@S;p(*sHfY^sM5^qB22+=TfPN6pI(0cPWvi?ePU*Ng|L`nI=%)uOnzT z0?__fJePVgyW;KV)O5elfexixZ(qTzOmAxXi8X+<1xRC=ehS% zeR#%EMI-PfpgOBFtvVj--`j4}p!MK0T%)W9-{6`wL3KR3yR*HCHQIJ#VFJ`zx_J{9 z*s{gpLc0%YvNEUmI#a`((kkn6=UVn?paXPjL#T_us#!4(d+-(@H6@vuCPLe-)3j?= zN@b;JRAp3Jntqz+DTzH)(rM><;Nw7*w;ag>x9kA5?%oJ`A4e{UVyd20&q-$%KCZ4P zo;`-ke;i#|+&6(f_&7^=zSA}5{PU}S4oXzqCy+f~Mj{2(-#-A6mPfz)gV&XG`U#>Rm6JhfWQCd;R9Xpmoua+_#^* f-wsc8k()PYMsFejkT~Mff2`B3hiA554|x9q=%zL> literal 16230 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 diff --git a/src-tauri/icons/dev/icon.png b/src-tauri/icons/dev/icon.png index 9bffa6409380485f1e5086bb04df0beb9174c103..8a31445c03e3d95f770245cc42efd19dc03b3a4b 100644 GIT binary patch literal 8300 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 literal 13841 zcmdUWd0b5EAOD#arDAfm=u(3uBvG`eoUC0pWJ_8!mg1H)5~cNo5?OL}6H;RjMTn+F zO`8^_BuZMQRobU*W|}#3p5Jq(a=*Xz_4+OU{QRMrbDrh1zCX+J%*E~7tfwjbu7DuO zw9S8P*oh!g@S_wWKL!37IsHY5AgjJ@-mrG}>F<4wiZ@+O1?zHw|B;1LGc^8C-jaLy z?YjH>ZoRm^Gs)07vNg?SXPvK8Y50p5b9aCCWm3A|DWP07!$=}^PH_W-@SVh9{wkBuYQr91M_?81^%z;BUmm6Ka7428i z=|`|RW6X-V^XJcxu}NGH|K3NGXUv!(8+zfwg+<5)_>V%qR6yXv9SD4QLCOj~R6*dw z|J|YgxAXrORQt-D9J&?z)uCSOG~ zojLPKbECIHpskngK|ukH*qD!fE7rgIVAZ_H+70u%sXM;ZYHU4ik?Gp8=g1D(&^OZr zv_Fp1()aJ5+kfT$HJ2(s=5Jx#2o%?g0E0Q(h8(&+Ska%Wjh+f~+^HON{{(|Dz3DkdnvZgPAal?&b1Zg;Aiu{Eer;f$1(<5{B2UT1Wy zp`G4&6?avF!)Qbz_taH0uc{9Z-Cn+aaOksiBt*%8ji`sO6yeW1r@k3CYdxdqrNwkhjx z3#pB^JV>(M!dZz^fm+R%`^W7&JA%vNJ5&+F1^9u@^47M4ka)PEs1*~il?pcp-c{4r zc%Zx;DJg9xXHvn5W*Tj*c$fSlWJFLf!!m^AmTO=_SkL$pJJ)rS6=nOQr$n~j0=bYK z#02#_2GQOJJKiKGX$zlZO;JJInjZ5Xn<_1xx_*tT9NY~m;{v$Hc|3cnzJ||x{+jiQ zvQ|%dowheb?32B&=UIDHkeO)$@dHFBu!3paFhisIz1keKFp4XpeMerpIvkl)aR{5_Q1FsYH}S z$|!C?^Iz|!EDGYKjOE7OH+5OrI#Xes670#+*^tbXN0+7U-n1ch zyl$sOXi3Bnffb=g&M|6EUg`Ss+jd07^8*@5+vaj-m&ABzL`E}b|IwotRxk68wOTH{ z{Xz)#&z3QXz){?%h)o#mTKBHfIaKQIdjXoz(5kM(=STerlag2z7aeU=E2e)JJ!fUv zE&q!Wc0)-N?)r@?kzWhP8IQv6xE*Q|OBbBkgG}rflZSB)eX9}}#P`?|SJ}Dk^#gPZ zx4GX3-6zPUaM7X0vdki1@qrT&xqBQJBZkH3)iiX@=a0b?YrM|`+ppKlWG&kvBcmU> zG}>j7V8u&VKyLuAze(hNa4~W=VO&r4Q$P`;TxQWE319QkMN%q=Mho~Rip?c$3&rcF zg7q77`{g)kVXk?~`)Acn$Bf6$NUSTZ0C1U|KfkZACyr};RY3|0fjHY+MN8r?n1Ho{ zxbo#bUCZY^)zaLGvOGCaSXV#3Xjv#YBPW0A{h<)E%+I@I&S`|seCIiZ)}=TuJp)^_IJrm|M1RfX8l_b$nvm>^abtPhmw_2(YzSK5v!S&pc`FD;xfJGQI9B*f_D zUzO+7_2;`Rmp;CMgDwaL*OrMV^i~#uwN+j(m)_uQNaePL=ponNE#*BA9iJXM2MFC5 zhE!$i9~2ejT%0)UWYjo45m?3`x?5(XH-vj%XRYGh&%q$UbWC^L!r1c#w1lgUkN9#= z>;k*cx~>T=(=GApUYg*In$;>lk<%SKb=-Se=xgyF=1hM7*pHND(;X4JI3Xu+fA_dt zTHquqVVt2i_gVWsN{lmQmVDr(BJ{3;X1C)f?5*}5l)bxzDx5l4FyTy*ZP>T0`-?Ik z_I#l69VmY-U|Clqt-b~qkT|`7>|2r}r?XnD{y?bI$*`6sPBxnJ7M+a?%#A%@EE9D6+0Z<)x z6e>6X9?}GTHyw+6KH!%_9ZUH*eH^p75#VVn^YB0}@!k>X%X;@pd2-6G_ZWA+VdkF{ z%?W0SslNG zVLj%vr^wi9sy*V;Ke;bj!R_>{d=a0$R&lOM&@gkk`sAjbm3<4h!a~*(%5;@%N|i#CGGuX z!m}bUtxle)*3W5&k#*i8@N3+0FWaV5uT(>~my1BON#n2Q-d?tyNNYr3B3w7N@85O( zy*RAkz$mG^`!!~nIxwb8l3o>GFSpMB2lBy4TKWCI%LI5u-S?8U8r1SQPMI_|GiJR3 zgk6Jw7Y+1^`iO+BYor|CXEHhJqbaMH>hk3|vS>O<0hu(FmK08 zP!s%^jLa{K{~ywY;;P8==hR90MqqDAroj`cXT!*!V*6!+D4whL_2|#xsdT%&IIFLL zmJk$BylBSJX+(A6m1#zgufQN+eHz*{lt*|Gwvpp=peq=iR`1(;tS5G~xBp^G1vNqa zaOIut@^~$8K%OOjkA}bP@q07s9dD6i6x7bIm^R!LG6ip;2jJCTnyFw(Gt*^|Gc>0A zT??!|&WZ@k$;?@9Pw(YGaf_6GXezwT~+}b7z^H(G({^_CFcBD`RS^hthD->u^uR>IMwwt$x8&7*oin@{TA7B@STA}s!cvi%e3DrntQ zx6zqS1w#zaKNfbIs0L(Uc`-)$@BHrAu|Io7XcER=-{Vy%l@Y2Oj*82+$g}rGv>jTK-UIv2@Wt(8c4_qIh{S`2nsZhB zgAcD~`c8wO1wIw`y;e*NKRikp*s^%f5u&TpnYd9MXRLUV8TBlZ%d-4 zkX)wBfgG%%#nPxQQcZkh_ZuD;b1zU5TxNGEkt5b0rE!h!oe)&sT%C4GSDwT_9X*I6 zz_<{d^DXqrPJ2SG|25>XULEX}z!>K>C>baxbG{VhukV{xVA*nTATv^6GWHF+2-m=e z9L3TmD1^S{Dw5Pf_67;I0pEO-42*DEsRjvR*w`Rd!mNZP^3x=Wf}b-kNfHnVa@s2a z=mzlhe?S*!6AUAmDmO|p43p{foxo3ZELulUz&>LnVv8KUrTa7XiraZY(cx^~o8<$?cI7{^j4rtBzKhne)OQ)mEN`hIbAe!^XDk9XzLQE2KYWMiaGuF6Np93@PnG&rmzVRPPee;F zW88stA!`-kW4MAqQ6?Hs+#fWKgF~Z+y*K+`zw*Xe4rSzS)fWuY;8cr>2aEF0Rc#Tb6j3 z7vBIr-FVskDi)e8G}udLu*?IM&r7{92e+E?i@F&?h8nQ~AI8m+{-^}ET~(WLAKS8C z^UUD7RNb3$&>E6*W+>xv!aq2(!3c1x;oHU%u`VV(GWI~H0G(Obj1H~84YY%+?Lwmf zF;ebGIX8?{LOX-uoTUbqiU@bFecVguSRjwxASnKt%O1>f=)9_E0xIfm1uGU;NW-yq z3`#Ehso+Q>pUJOCEqHgS61uHTIHv8xG1hS&O%`k%_|Ra=&SBbJ7P;1jP^o4lY=mMt0`$%5E)kkOFO~fqhUh-i zV3^mig9IjPUN#RIk*>EcZ5XL1TQe}{0g)~275=L^&*>#E2GF*0@6ku(@a<8Gl^S4E z{}x9|b>h{jbrsURF!k5VfjTrQM#XvQgO$XJ)Ew+~7Wf%^{-;QND!A{tXV)gY?awya z^m6H-{_{TTZVV&tGa%C0`$3rLJd4%vMI1v{4m(mHCs6NesFK0gZyQFEm<<~JV_Evp zB#S8p=xp2`eYI*h2jm}06Y9?;^au78u*(G|*GDaKvoW?=a)^hzgj4X7%SkAH(S zzmu{^x`?&;^gFM#ye0SZLvL1A*YND<8@bTt=p7Jb9yA(QfE);)^kaB6_}WQXbJDBi zgjVxo1J5w5U!)D&2=tx!0P%snunZWS$AuC!Ey(i^ebu7P4&GA|q6Hl>^8BoD^Q5Eo;RwjJg-Ia+sh&@Kt%FqSit|b`2e3+-$vEHE0S%x1Ln}l6+En7J z)occroIjhA2Ogrc9Qa~J5X0~0aFL`qH8S<`sW8_M`f2jm&DZp^ajqo>q;S2f*qDjb zS+E&f{<>dOdCO9#;q)o8DgsJT_0!m9tA_nUPtEo%VCTaSq&-)_9Ff!R6Tw9G?Yy!a z&{+DJ)RR2E-i*s=Ppz#iIjPlLFzO#F=B6wfmvVtHFMU+;XhG4|taWL@;Og}jPHQ$9 zlCM=-Y zF9=R@Ig7~-8jvxQRzofNPV`BV^E#gR2#jV07QW9p2VQ9oGJ@ihq3w*Z;_@>S`MK!s zfvVh90((VZ(a&d#qByXIP*(!m|HMhl>4I*9kF|)TbJ@SyN(dnm>c$h}Je1#F?un#0*;G4zIT` zKnS;n-|tQVC)#M^0MfzstKrxrNSdK%1#rR zOj|)kFj*_}V=}u};OnOc0~pg4U>YY!qSIYLBGbr}%Iz+nzE4<~Ya4t@5w{T@zdOW` z*}WFGw-|E%5e&*Wt5u16e`OzqCC|4?4JhdAb@QCZ9>f-WpfMzg$Hrpp7%1D!0nBwS z5|BK`rG71dYyR_SozbP`o6FuOY7Z1@~t{_)hC< zU^e`oK4uCfNag~M1c`L*>>*owWF4gZLn}SqsfN@BgvNgA@x!D~$qHar! zAHKcNr;DU(tc7#-O6Zacm^L%3zjsR~rC%)ELvF_Lz^jwM(pZ?CKqKu~r%GhdMy|Kf zPTZ6`-CS(Ibe;RMT~MqLdXOQvn}W}lwJJ%M7#iCGf^UVi^Qo$biBtsR#1+qnTE~Ruv?Qgo*s&BY!(|UVgficm?;{ zm_CH!6w3!6gE>J9Ek>eYxPSro0(e&JS2NI7xulb}1IZ^lB;le%&~;puO5dwFo-=F~Q#E>!Ubzu5a7d#!(SJwIoeb zlurv1P8F!1GK%}$%xMo+TXGq@9hW0W6^ca;t~;fG^@}yql8oVZuxWO4jV$|S-QQ5y zH=6jB63Rk>E@7Mn1EdPbgMCF({yXv6xBLd{Zly`}i+&VILtBZ!vRY|NqOk9LFjQa= z4t3M%vT_EY5Nf@8M8!W>#&v$iSLRZ8!c)DjF7AMO&_hLXzOSj_(WQEfc4YvEc}@ZeJk>EI_cNTwn& zHX^o-z&6tqozG!oTq>C#@~s&kdY@=v7%VQ}u~{za+Q7Fp`o>Sm1OIsG+d&5j7nl$O zM|AyU8Z5x*EzQQaJ<5^(8@z_ejv zxy#7B9kw630_MR)sDM2tK!soQMy2Mid;pz`^b>W`Yt~SY*JjSUK_mUB^CC!#mmYN@ z))~QIY>)iID-BhJ-gZas^q~@8Ec7jDUvXhrNlOT5gNXtI2GCe(u<0<{7_!iwmYc;+ zyZ2Bc$a`FdBL@~xMeGIKr zFO7f$;{B_Rz;tI!dkQG8)RZkm#dVoomr!a3U)(~UI$n7*f7)zI`1H5M%AeEb)x&U3 zQe{+xicd#k{ctUKIuoe^T*Bo8X8%A_;$qM(<8IVoq+;-=H^#iv~ zctRp$^4U^Q9=2hawn+~EZA<<`W%*klr9EfeA#kR{UF(y z1TD>+l19wbe9P|~joXGWX26!fUIDdffVq!@?R?!1Zc!7aLe?^nQ1G;w_Pa)96CiC!`$#WazbaS{7( zrx#t*Q(esGxtdU45>LdiSq;uwEPHoR&{@Nez-%h|U=0>K9Td^<{`Z|n%&FYE#Pi>N zy!k^=EE}*nb{a?@B9RMx!=FN@dk_5``yoiY<^AIucM#yhYp@iedf9t1GaLWR!o_FMA;wt6D{Imo8%N0kvF%-$`^x$#6Z9-utl) zc6rx_ax3M)wOY6)jr0bt!8~$AC3<8_`dBu3&bjGNK)9aH3OB?nxL4?pE_a+PzH7_`SH)wEI!qJX+bx?PbK^V-3BYK6z zu7b-?HOH&-k9q9DQ_HZju3Ht-$pYf>%htd+DD9oC?4ja%n8akydEFzj{ZmLJLi>b* zGf@Y}k8ABe46)KS;;rpKvKs7ExD}&)BCK1_Ak0%lBo?sUB>9(WF^MOp2C!y`heBh2 zffWiB7&dc$ifCD#8%rdnXy5Oh%Vii7?uWP7@ZGm{OP{1Qq*fE4(%bySW0!v5tzInQXPe;KWTg>GV(yJne)eYg%S^~{iB(%Ge9On zA0OEEDSVU|HCehVgO#aAuBN2OwDb7#uwgNkaL7qmbKQB2#wHz$jKBwB1m<6LKj1ZV z^o{?}%X$jAPysr|d4LAHec|NWu?<(0Xa6NNUP-@#*?udm5d=HL`rDYs@R*2E+NkEe zsaU_SK4J&d?TJy9@!Fo3i+*e$)O?U2cT>c3CnH!Z9h*j9x#IHU0jzV?E;7~N8q6V# zrC@KxRf#!RRY#*!hKoruwcii_(*)U>^QwH0uw`nj7apf z4yJGmd+$*Csd|U&q=0wGss{Y-dkg^ zd?Xw0MrIi>M4Jkl@2)5{lCF3LmNYCxAr;#Mv^6uYy_j-Ym_BahteHf3Qwuz%hW&~1 ztFtAlf|+0__GA%k3yt@T$S?|F=hy_PWmmAC0XqYOf8W#H@bSYlJ>>SQde~2(f@jS% z@@U6C0OBtRZX|rs-$Sw>5vt=&*rf3$Y{~*+9&7<|Q@kY2-tn<|dn9dSn7)$Vv6qq) zEU+-!OG1mJN6Y#Ryq@+#btY^eYxtfZ%lVUSZeFHs^i-l zn4*wWl(|Tb1o*hUm=k+@=zC+D54O{@H(813`icoHO|)TDfw8qSblf7!A~A(8(rC~t z_mq~H0wM6g@ahJBE9v6y%E}<8~J(v#eecXzva&mg>WRhY1zzkuqIQ-$q zv|0o7oqjSt=u0Zku8uqbq%9^`;*Rq--u-Ff)im>kxSDv-udqlCHg7<86yvWtF<^1n z{uk!Mp()D<_xpxHGXq6UnsEMuJgl!eCCrxin0jC|voHMgRt|TdQmNM2chk)v$LG%n zZBvA7oLh6elEdD9p)H_Jwyj`v;MQ-4C7uhTH%teeA0mrRk_JKpKA#D$U+sdjf>Jwd zM>A>xLwlG_;KJ~+&GVM`G`u<%4!U)#T|n7^j;J)%p*!9!{%!dUmlmE+3UPx_gx=SK zh44M{UFqe)$FvN-lO^jI0p2p3 zzNHBg9r)!5ToF_3Fyw0hslUAICJej~XS>HRK|hh^Fof2nO81MiK88E+z=qfD=tz#J zFXqj)j4lIXXz?+*>;~9tq7l~n#IY2xNlQ>=6Rsf$6bx!UGJ65@9mOc(B)gW@-!lxn0DUtLR&~5#1@Np5J=A@3XLfmYz4WEmrIq2G@q3;f zG8bPayJRDRSjiD~ls&SgN5KRXcXc2h9`@-iCW)$2V5JE?_^`P0OaHBZJTw1kn!5au z2bo2XyLw3n*~5z*RDRFHVI=Xy&ed<%|1$s^%IgkqiafTKi{hH@z(O2TU+JLM7vDCA zr2^Ko5LklhqUaTjGyJy(0s)qxjTfBRdTN^{NYW zW#9w*K1@O)FrKcCAfj9u=Ij4)=Fa{&7&QSO(5wFA{9IBvk*G5Mczc)>WgN}mcl$^G zab_<$+>rn!+~Yk78sktlyqX1rB{>^@Pnkvhdrbb{ob!`;`S`GZCzD54t%o7i6Ytn} zV3ss7it9If?yt`&L$Dq8Yt%tlpN#L`!YTL3nt(xa-oK!Ala!*68FdT65J5URc@7o7gw@L>+1@P1X$Kd!JLYN@7U; zBn3S=#k4SZ58^y|6HV__2hEAHXy<*$FXN0u$r)Ajz5Oyr582p-6pAOwGwJw%?Kk}a z@BQsmt*-kucGnHDx$WU?feRFLN}KFr-%k$jY#gScm=C--r_$|?L`{&>!qg?aFKAKE zBZ{mWuYO%qxkLAP^iB5VZdof8+L{;$z>?vZR!YVRCFI6Y*}FC0l;kH=4uV{Krrr)# z2;Kh1oU-u6q%cr+t@E6st#_WtZhx~OHo4(8{`L8!E>J2SogDRJlwpUcyjHj%oV0{W z3K(Gq=M{u12tO8DTi%_tDxk!rHAtmDMizOj_Ru`~YxwUVbA?W(?DBuyb#piIk~80+ zkp){OC7qg&j@6E~se5*%No{X0?3(k-NN%+-Kka-$V2c$)+h;re;%<+CRKm&yzgjk?02f+@|(t22TGjwf}hO<20pTi_BrQ^Vn`3 zr(PG}Yf?_M zQtwNvv-)=;VZNGEdV6e%Wwc2xfiG8`MoQe-q9C@^-RxAE$sKl?d6kA3+I+ZrNM*@2 zOHTj3nHvXXCrydj>vJ6o49Y*N9`M2Ikm?>}U0?3fU((eLJfgqhQNP&ULw4@R{(%vm z^*pjXmRJy&+T_sf1eUO*wx^u*h^UnMC4?__-eZ9v#)&d3K=qe|yZ4c+G=H=E1sqBK zqx1~b(3OEX)%EK6xxcKN7Qz7nS*L)c_5+XhAk%kS*i15?@;w;D7$BJ;*(nD8noB25 zkWExAat!&7e}sm+M1`{N?ZeNPTwv-=v3(aZCsS{3;rLlS?8W2^*?vmWf6@H~Cf;)xTFs)e z>n3FqxPb?Lg=m+^06ms>!>!OrdbukvsHbmz`J^${&jwsUShxXidxb)-clD~rKK-w< zWXRSgsw5}iokRNRG$bE`9c`4lnvRI$B*um z89DE&yLdv}Gg9zlBZuUdclP=(*HF6L8a`pwWyBt2$v-RX7aCEllVv9DG6i|EWyUqU zAsAk;AWespDS|DBH^{oO?-Yj9KX0USCa!cb`pJ905Il0^1-$xze5;07oM$(os~}o$ zbblWskaJg7S>Y8t0;oOt{!nyR^-u2!qC%oZo?p?dm&WuE*<(}j?$_;ZnG+W_nL5OI zaWbM3V#>AdQd}8)y&0aYlXeQKT9`pKHani|Q-srwMGNvSW%AFzG#u-ja8xiu6IkDW z@#@kxQDdj*DZF-My_;U+2L^kx!OXXR!_TI7B|5HjLMFVM~ zlx^vvShcU&9{FQd)8$;^jJQinYW#vI7TB6noPu0i{w!=yzS4jWxQrhMc6T$VgO$&c|zYL2uGm zkKlVXRf&m^6=SD)-{2+FN~>8vw@&fNjOLHb5pADO%EGP~onF;e8rM#-@W%AlVhx2C zk2<&LArBw=srS~iQp{gWJE{BpT)#B6x!1BcyvpcwEeT=3w}?$#i#JU+>s^}_+*R+W z-%XYF#(wtp`njc$KOFiy@?rHn`1k*VpZfd{e!%p9^sA=-?pI0LAAnq|RyQ|cQOOec RQ!ixm#%&v3tlNL~zW_+WX(<2z diff --git a/src-tauri/icons/dock/dark.png b/src-tauri/icons/dock/dark.png index f1605649a5b8fa9f77ee70bd5d93ab7e1f45d4b0..cec5145a5a8feef2b5fe0891814560ddb01b1474 100644 GIT binary patch literal 7568 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 z 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 RnugGs8k-wE|IOv{{{SB`POty~ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns index 8e327687d32b962b0f71ad92a983558fc28ee9d1..1ea1b482c5df6b81ecc61bb1e9909308264cffb2 100644 GIT binary patch literal 33475 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 RnBd5tzw7I~JY;?4{{eW>TE+kX diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index 16a17f6c3986c959a61cf57bae1349d5c1c0f675..00913da27cf0ea2811483e26bf249595a2772d96 100644 GIT binary patch literal 6390 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 CnHG2e diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png index 1676ecd0d1819bb130f279336b578a543a7bcc14..cec5145a5a8feef2b5fe0891814560ddb01b1474 100644 GIT binary patch literal 7568 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 z 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 I>p0*2Ulsc-vj6}9 diff --git a/src-tauri/src/app/bootstrap.rs b/src-tauri/src/app/bootstrap.rs index 87e5084ac4..013b1dcc3c 100644 --- a/src-tauri/src/app/bootstrap.rs +++ b/src-tauri/src/app/bootstrap.rs @@ -85,12 +85,32 @@ fn apply_linux_webkit_cpu_guards() {} /// builder, given the identifier embedded in the generated Tauri context. pub(crate) fn bootstrap(identifier: &str) { let runtime_profile = runtime_instance::RuntimeInstanceProfile::from_identifier(identifier); + if runtime_profile.is_fork() { + // Preserve explicit absolute test/portable roots, but never allow the + // independently branded app to use the original ~/.orgii store. + if let Some(explicit) = std::env::var_os("ORGII_HOME") { + if let Err(reason) = runtime_profile.validate_explicit_home( + &app_paths::home_dir(), + std::path::Path::new(&explicit), + ) { + eprintln!("TP Agent Studio refused unsafe profile override: {reason}"); + std::process::exit(1); + } + } + } if std::env::var_os("ORGII_HOME").is_none() { if let Some(data_home) = runtime_profile.default_orgii_home(&app_paths::home_dir()) { std::env::set_var("ORGII_HOME", data_home); } } - if std::env::var_os("ORGII_EXTERNAL_HISTORY_HOME").is_none() { + if runtime_profile.is_fork() { + // Keep external discovery and provider-native transcript publication + // out of the user's upstream/default CLI homes until an opt-in + // import/migration UI has been designed and tested. + let history_home = app_paths::orgii_root().join("external-history-home"); + std::env::set_var("ORGII_EXTERNAL_HISTORY_HOME", &history_home); + std::env::set_var("ORGII_NATIVE_TRANSCRIPT_HOME", &history_home); + } else if std::env::var_os("ORGII_EXTERNAL_HISTORY_HOME").is_none() { let resolved_orgii_home = app_paths::orgii_root(); if let Some(external_history_home) = runtime_profile.default_external_history_home(&resolved_orgii_home) diff --git a/src-tauri/src/app/dev_process_name.rs b/src-tauri/src/app/dev_process_name.rs index 492f74f779..414c971aa0 100644 --- a/src-tauri/src/app/dev_process_name.rs +++ b/src-tauri/src/app/dev_process_name.rs @@ -6,8 +6,8 @@ use std::io; use std::path::{Path, PathBuf}; -const DEV_IDENTIFIER: &str = "org2ai.org2.dev"; -const DEV_EXECUTABLE_NAME: &str = "ORG2 Dev"; +const DEV_IDENTIFIER: &str = "com.theerasakping.tpagentstudio.dev"; +const DEV_EXECUTABLE_NAME: &str = "TP Agent Studio Dev"; fn needs_named_executable(identifier: &str, executable: &Path) -> bool { if identifier != DEV_IDENTIFIER @@ -72,9 +72,9 @@ mod tests { let bare = Path::new("/build/debug/org2"); assert!(needs_named_executable(DEV_IDENTIFIER, bare)); for identifier in [ - "org2ai.org2", - "org2ai.org2.instance2", - "org2ai.org2.e2e.instance2", + "com.theerasakping.tpagentstudio", + "com.theerasakping.tpagentstudio.instance2", + "com.theerasakping.tpagentstudio.e2e.instance2", ] { assert!(!needs_named_executable(identifier, bare)); } diff --git a/src-tauri/src/app_update.rs b/src-tauri/src/app_update.rs index 22b538d0b1..ca507a326e 100644 --- a/src-tauri/src/app_update.rs +++ b/src-tauri/src/app_update.rs @@ -42,16 +42,16 @@ fn require_fork_updater_ready() -> Result<(), String> { } const STABLE_MANIFEST_URL: &str = - "https://github.com/org2AI/ORG2/releases/latest/download/latest.json"; + "https://github.com/TheerasakPing/ORG2/releases/latest/download/latest.json"; /// Beta channel: rolling `updater` release whose `beta.json` is overwritten /// by every release (stable and beta) in `.github/workflows/release.yaml`, /// so it always points at the newest build of either kind. const BETA_MANIFEST_URL: &str = - "https://github.com/org2AI/ORG2/releases/download/updater/beta.json"; + "https://github.com/TheerasakPing/ORG2/releases/download/updater/beta.json"; -const PRODUCTION_MACOS_APP_PATH: &str = "/Applications/ORG2.app"; -const PRODUCTION_BUNDLE_IDENTIFIER: &str = "org2ai.org2"; +const PRODUCTION_MACOS_APP_PATH: &str = "/Applications/TP Agent Studio.app"; +const PRODUCTION_BUNDLE_IDENTIFIER: &str = "com.theerasakping.tpagentstudio"; static SEPARATE_INSTALL_LOCK: tokio::sync::Mutex<()> = tokio::sync::Mutex::const_new(()); diff --git a/src-tauri/src/runtime_instance.rs b/src-tauri/src/runtime_instance.rs index e1314bce51..f573761f79 100644 --- a/src-tauri/src/runtime_instance.rs +++ b/src-tauri/src/runtime_instance.rs @@ -10,6 +10,18 @@ use std::path::{Path, PathBuf}; const PRIMARY_IDE_SERVER_PORT: u16 = 13_847; const PRIMARY_CLI_PROXY_PORT: u16 = 17_888; + +// Independent fork: keep all TCP defaults outside upstream's 13847..13946 +// and 17888..17987 instance ranges (including the reserved dev slot). +const FORK_IDENTIFIER: &str = "com.theerasakping.tpagentstudio"; +const FORK_DEV_IDENTIFIER: &str = "com.theerasakping.tpagentstudio.dev"; +const FORK_IDE_SERVER_PORT: u16 = 23_847; +const FORK_CLI_PROXY_PORT: u16 = 27_888; +const FORK_INSTANCE_ID_BIAS: u16 = 1000; +const FORK_INSTANCE_IDENTIFIER_PREFIXES: &[&str] = &[ + "com.theerasakping.tpagentstudio.instance", + "com.theerasakping.tpagentstudio.e2e.instance", +]; // Dedicated dev slot, outside the numbered bundle range (2..=99). const DEV_INSTANCE_ID: u16 = 100; const INSTANCE_IDENTIFIER_PREFIXES: &[&str] = &["org2ai.org2.instance", "org2ai.org2.e2e.instance"]; @@ -22,7 +34,48 @@ pub(crate) struct RuntimeInstanceProfile { } impl RuntimeInstanceProfile { + pub(crate) fn is_fork(self) -> bool { + self.instance_id > FORK_INSTANCE_ID_BIAS + } + + fn for_fork_instance(instance_id: u16) -> Self { + Self { + instance_id: FORK_INSTANCE_ID_BIAS + instance_id, + ide_server_port: FORK_IDE_SERVER_PORT + instance_id - 1, + cli_proxy_port: FORK_CLI_PROXY_PORT + instance_id - 1, + } + } + + pub(crate) fn validate_explicit_home(self, user_home: &Path, configured: &Path) -> Result<(), &'static str> { + if !self.is_fork() { + return Ok(()); + } + if !configured.is_absolute() || configured.as_os_str().is_empty() { + return Err("Fork data root must be an absolute path"); + } + let upstream = user_home.join(".orgii"); + // Normalize '..' even when a directory has not been created yet and + // resolve the nearest existing ancestor. A plain canonicalize() + // fallback on the raw path let non-existent paths hide traversal or + // parent symlinks into the upstream profile. + let configured_real = resolve_profile_candidate(configured)?; + let upstream_real = resolve_profile_candidate(&upstream)?; + if profile_path_contains(&upstream_real, &configured_real) { + return Err("Fork data root must not point to the upstream ORG2 profile"); + } + Ok(()) + } + pub(crate) fn from_identifier(identifier: &str) -> Self { + if identifier == FORK_IDENTIFIER { + return Self::for_fork_instance(1); + } + if identifier == FORK_DEV_IDENTIFIER { + return Self::for_fork_instance(DEV_INSTANCE_ID); + } + if let Some(instance_id) = parse_fork_instance_id(identifier) { + return Self::for_fork_instance(instance_id); + } let instance_id = if identifier == "org2ai.org2.dev" { DEV_INSTANCE_ID } else { @@ -39,6 +92,15 @@ impl RuntimeInstanceProfile { /// Primary and dev intentionally share `~/.orgii`, including sessions.db /// and its attachments/replays, by returning `None`. pub(crate) fn default_orgii_home(self, user_home: &Path) -> Option { + if self.is_fork() { + let slot = self.instance_id - FORK_INSTANCE_ID_BIAS; + let folder = match slot { + 1 => ".tp-agent-studio".to_string(), + DEV_INSTANCE_ID => ".tp-agent-studio-dev".to_string(), + id => format!(".tp-agent-studio-instance{id}"), + }; + return Some(user_home.join(folder)); + } if self.instance_id == DEV_INSTANCE_ID { return None; } @@ -52,11 +114,87 @@ impl RuntimeInstanceProfile { self, resolved_orgii_home: &Path, ) -> Option { - (self.instance_id > 1 && self.instance_id != DEV_INSTANCE_ID) + (self.is_fork() || (self.instance_id > 1 && self.instance_id != DEV_INSTANCE_ID)) .then(|| resolved_orgii_home.join("external-history-home")) } } +/// Normalize a full, absolute profile path before consulting the filesystem. +/// No filesystem modifications are made: existing symlinks are resolved, while +/// missing trailing components retain their identity under an existing parent. +/// This guards accidental overlaps; it is not a symlink-race sandbox. +fn resolve_profile_candidate(path: &Path) -> Result { + use std::path::Component; + if !path.is_absolute() { + return Err("Profile path must be absolute"); + } + let mut normalized = PathBuf::new(); + for component in path.components() { + match component { + Component::Prefix(prefix) => normalized.push(prefix.as_os_str()), + Component::RootDir => normalized.push(component.as_os_str()), + Component::CurDir => {} + Component::Normal(part) => normalized.push(part), + Component::ParentDir => { + if !normalized.pop() { + return Err("Profile path escapes the filesystem root"); + } + } + } + } + + let mut parent = normalized; + let mut missing = Vec::new(); + loop { + match std::fs::symlink_metadata(&parent) { + Ok(_) => { + let mut real = parent + .canonicalize() + .map_err(|_| "Cannot resolve a symlink in the profile path")?; + for suffix in missing.iter().rev() { + real.push(suffix); + } + return Ok(real); + } + Err(err) if err.kind() == std::io::ErrorKind::NotFound => { + let Some(name) = parent.file_name() else { + return Err("Cannot resolve the profile path root"); + }; + missing.push(name.to_os_string()); + if !parent.pop() { + return Err("Cannot resolve the profile path parent"); + } + } + Err(_) => return Err("Cannot inspect the profile path"), + } + } +} + +/// Windows paths are case-insensitive even when a not-yet-created child +/// does not exist for std::fs::canonicalize to normalize its final segment. +fn profile_path_contains(parent: &Path, candidate: &Path) -> bool { + #[cfg(windows)] + { + let p = parent.to_string_lossy().to_ascii_lowercase(); + let c = candidate.to_string_lossy().to_ascii_lowercase(); + let sep = std::path::MAIN_SEPARATOR; + c == p || c.starts_with(&format!("{p}{sep}")) + } + #[cfg(not(windows))] + { + candidate.starts_with(parent) + } +} + +fn parse_fork_instance_id(identifier: &str) -> Option { + FORK_INSTANCE_IDENTIFIER_PREFIXES + .iter() + .find_map(|prefix| identifier.strip_prefix(prefix))? + .parse::() + .ok() + .filter(|id| (2..=99).contains(id)) +} + fn parse_instance_id(identifier: &str) -> Option { INSTANCE_IDENTIFIER_PREFIXES .iter() @@ -70,6 +208,82 @@ fn parse_instance_id(identifier: &str) -> Option { mod tests { use super::*; + #[test] + fn rejects_missing_suffix_and_parent_traversal_into_upstream_data() { + let tmp = tempfile::tempdir().unwrap(); + let user_home = tmp.path(); + let upstream = user_home.join(".orgii"); + std::fs::create_dir_all(&upstream).unwrap(); + + let fork = RuntimeInstanceProfile::from_identifier(FORK_IDENTIFIER); + assert!(fork.validate_explicit_home(user_home, &upstream).is_err()); + assert!(fork + .validate_explicit_home(user_home, &user_home.join("scratch/../.orgii/secrets")) + .is_err()); + assert!(fork + .validate_explicit_home(user_home, &upstream.join("not-yet-created/sessions.db")) + .is_err()); + assert!(fork + .validate_explicit_home(user_home, &user_home.join(".orgii-suffix")) + .is_ok()); + assert!(fork + .validate_explicit_home(user_home, &user_home.join(".tp-agent-studio")) + .is_ok()); + } + + #[cfg(unix)] + #[test] + fn rejects_symlinked_parent_into_upstream_profile() { + use std::os::unix::fs::symlink; + let tmp = tempfile::tempdir().unwrap(); + let upstream = tmp.path().join(".orgii"); + std::fs::create_dir_all(&upstream).unwrap(); + let link = tmp.path().join("alias"); + symlink(&upstream, &link).unwrap(); + let fork = RuntimeInstanceProfile::from_identifier(FORK_IDENTIFIER); + assert!(fork.validate_explicit_home(tmp.path(), &link).is_err()); + assert!(fork + .validate_explicit_home(tmp.path(), &link.join("new-profile")) + .is_err()); + } + + #[test] + fn independent_fork_uses_distinct_ports_and_profiles() { + let upstream = RuntimeInstanceProfile::from_identifier("org2ai.org2"); + let fork = RuntimeInstanceProfile::from_identifier(FORK_IDENTIFIER); + let fork_dev = RuntimeInstanceProfile::from_identifier(FORK_DEV_IDENTIFIER); + assert!(fork.is_fork()); + assert!(fork_dev.is_fork()); + assert_ne!(fork.ide_server_port, upstream.ide_server_port); + assert_ne!(fork.cli_proxy_port, upstream.cli_proxy_port); + assert_eq!(fork.ide_server_port, 23_847); + assert_eq!(fork.cli_proxy_port, 27_888); + assert_eq!(fork.default_orgii_home(Path::new("/home/test")), Some(PathBuf::from("/home/test/.tp-agent-studio"))); + assert_eq!(fork_dev.default_orgii_home(Path::new("/home/test")), Some(PathBuf::from("/home/test/.tp-agent-studio-dev"))); + assert_ne!(fork.ide_server_port, fork_dev.ide_server_port); + assert_eq!(fork.default_external_history_home(Path::new("/home/test/.tp-agent-studio")), Some(PathBuf::from("/home/test/.tp-agent-studio/external-history-home"))); + let temp_home = tempfile::tempdir().unwrap(); + assert!(fork.validate_explicit_home(temp_home.path(), &temp_home.path().join(".orgii")).is_err()); + assert!(fork.validate_explicit_home(temp_home.path(), Path::new("relative")).is_err()); + assert!(fork.validate_explicit_home(temp_home.path(), &temp_home.path().join(".tp-agent-studio-e2e")).is_ok()); + } + + #[test] + fn fork_numbered_instances_preserve_separate_profiles() { + let primary = RuntimeInstanceProfile::from_identifier(FORK_IDENTIFIER); + for id in 2..=99 { + let identifier = format!("com.theerasakping.tpagentstudio.instance{id}"); + let other = RuntimeInstanceProfile::from_identifier(&identifier); + assert!(other.is_fork()); + assert_ne!(other.ide_server_port, primary.ide_server_port); + assert_ne!(other.cli_proxy_port, primary.cli_proxy_port); + assert!(other.default_orgii_home(Path::new("/home/test")).unwrap().to_string_lossy().contains("tp-agent-studio-instance")); + } + let webdriver = RuntimeInstanceProfile::from_identifier("com.theerasakping.tpagentstudio.e2e.instance2"); + assert_eq!(webdriver.ide_server_port, 23_848); + assert_eq!(webdriver.cli_proxy_port, 27_889); + } + #[test] fn dev_identifier_shares_primary_data_with_separate_service_defaults() { let dev = RuntimeInstanceProfile::from_identifier("org2ai.org2.dev"); diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 23d4bb2944..0c6c101c8c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,8 +1,8 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", - "productName": "ORG2", + "productName": "TP Agent Studio", "version": "2.0.8", - "identifier": "org2ai.org2", + "identifier": "com.theerasakping.tpagentstudio", "build": { "frontendDist": "../build", "devUrl": "http://localhost:1998", @@ -14,7 +14,7 @@ "windows": [ { "label": "main", - "title": "ORG2", + "title": "TP Agent Studio", "width": 1200, "height": 800, "minWidth": 450, @@ -38,12 +38,19 @@ "csp": "default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self' 'unsafe-inline' 'nonce-orgii-codemirror-style'; style-src-attr 'unsafe-inline'; img-src 'self' asset: http://asset.localhost https: data: blob:; font-src 'self' data:; connect-src 'self' asset: http://asset.localhost ipc: http://ipc.localhost ipc://localhost https: http://127.0.0.1:* http://localhost:* ws://127.0.0.1:* ws://localhost:* wss:; media-src 'self' asset: http://asset.localhost blob:; worker-src 'self' blob:; frame-src 'self' blob: asset: http://asset.localhost https: http://canvas-artifact.localhost canvas-artifact:; object-src 'none'; base-uri 'self'", "assetProtocol": { "enable": true, - "scope": ["$HOME/.orgii/**", "$HOME/.cursor/plugins/cache/**"] + "scope": [ + "$HOME/.tp-agent-studio/**", + "$HOME/.tp-agent-studio-dev/**", + "$HOME/.tp-agent-studio-instance*/**", + "$HOME/.cursor/plugins/cache/**" + ] } } }, "bundle": { - "externalBin": ["binaries/org2-pm"], + "externalBin": [ + "binaries/org2-pm" + ], "resources": { "resources/drag-icons/": "resources/drag-icons/" }, @@ -64,14 +71,14 @@ }, "deep-link": { "desktop": { - "schemes": ["yorgai", "orgii"] + "schemes": [ + "tpagentstudio" + ] } }, "updater": { "active": false, - "endpoints": [ - "https://github.com/org2AI/ORG2/releases/latest/download/latest.json" - ], + "endpoints": [], "dialog": false, "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDExNEQ5NjIzMjA1ODI5OUMKUldTY0tWZ2dJNVpORWFiWXB3NW5UaWwyOHVxRXhzVmRVbXl2WktZNnhiN2tqcXlVY3gxTTlPV3EK" }, diff --git a/src-tauri/tauri.dev.conf.json b/src-tauri/tauri.dev.conf.json index 930d127a81..8a6c24e938 100644 --- a/src-tauri/tauri.dev.conf.json +++ b/src-tauri/tauri.dev.conf.json @@ -1,10 +1,12 @@ { - "productName": "ORG2 Dev", - "identifier": "org2ai.org2.dev", + "productName": "TP Agent Studio Dev", + "identifier": "com.theerasakping.tpagentstudio.dev", "plugins": { "deep-link": { "desktop": { - "schemes": ["yorgai-dev", "orgii-dev"] + "schemes": [ + "tpagentstudio-dev" + ] } }, "updater": { diff --git a/src-tauri/tauri.macos.conf.json b/src-tauri/tauri.macos.conf.json index b8286fc8cd..3189135e6e 100644 --- a/src-tauri/tauri.macos.conf.json +++ b/src-tauri/tauri.macos.conf.json @@ -5,9 +5,7 @@ }, "macOS": { "entitlements": "entitlements.plist", - "signingIdentity": "Developer ID Application: HOUYi HE (S4UG24G7HJ)", - "minimumSystemVersion": "10.15", - "providerShortName": "S4UG24G7HJ" + "minimumSystemVersion": "10.15" } } } diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index 9ea73fd4c7..a0fa4e0cc9 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -3,7 +3,7 @@ "windows": [ { "label": "main", - "title": "ORG2", + "title": "TP Agent Studio", "width": 1200, "height": 800, "minWidth": 450, diff --git a/src/hooks/platform/useDeepLinkHandler.test.ts b/src/hooks/platform/useDeepLinkHandler.test.ts index 05d87bd2a3..d059bbc02e 100644 --- a/src/hooks/platform/useDeepLinkHandler.test.ts +++ b/src/hooks/platform/useDeepLinkHandler.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { isUnclaimedCloudDeepLink, + parseDeepLink, reArmTrackedShareUrls, trackReArmableShareUrl, } from "./useDeepLinkHandler"; @@ -75,3 +76,32 @@ describe("malformed cloud deep-link containment", () => { expect(isUnclaimedCloudDeepLink("not a url")).toBe(false); }); }); + + +describe("fork deep-link routing", () => { + it("normalizes the provisional fork schemes while keeping the in-app /orgii router base", () => { + expect(parseDeepLink("tpagentstudio://marketplace/callback?code=abc")).toEqual({ + path: "/orgii/marketplace/callback", + search: "?code=abc", + }); + expect(parseDeepLink("tpagentstudio-dev://settings")).toEqual({ + path: "/orgii/settings", + search: "", + }); + expect(parseDeepLink("tpagentstudio-instance2://project/open?id=3")).toEqual({ + path: "/orgii/project/open", + search: "?id=3", + }); + expect(parseDeepLink("orgii://marketplace/callback")).toEqual({ + path: "/orgii/marketplace/callback", + search: "", + }); + expect(parseDeepLink("unregistered://marketplace/callback")).toBeNull(); + }); + + it("does not let unhandled fork cloud links fall through to generic routing", () => { + expect(isUnclaimedCloudDeepLink("tpagentstudio://cloud/join?invite=")).toBe(true); + expect(isUnclaimedCloudDeepLink("tpagentstudio-dev://cloud/session?share=")).toBe(true); + expect(isUnclaimedCloudDeepLink("tpagentstudio://marketplace/callback")).toBe(false); + }); +}); diff --git a/src/hooks/platform/useDeepLinkHandler.ts b/src/hooks/platform/useDeepLinkHandler.ts index 26872dd6e8..bbf299fd39 100644 --- a/src/hooks/platform/useDeepLinkHandler.ts +++ b/src/hooks/platform/useDeepLinkHandler.ts @@ -109,7 +109,7 @@ export function reArmTrackedShareUrls( * @param deepLinkUrl - The deep link URL (e.g., yorgai://marketplace/callback?code=xxx) * @returns Object with path and search, or null if invalid */ -function parseDeepLink( +export function parseDeepLink( deepLinkUrl: string ): { path: string; search: string } | null { try { @@ -128,7 +128,9 @@ function parseDeepLink( // earlier (see `parseCloudInviteDeepLink` / `parseCloudShareDeepLink`) // and never reach this generic conversion. - const withoutProtocol = deepLinkUrl.replace(/^(?:yorgai|orgii):\/\//, ""); + const supportedScheme = /^(?:tpagentstudio(?:-dev|-instance\d+)?|yorgai|orgii):\/\//i; + if (!supportedScheme.test(deepLinkUrl)) return null; + const withoutProtocol = deepLinkUrl.replace(supportedScheme, ""); // Split path and query const [pathPart, ...queryParts] = withoutProtocol.split("?"); @@ -156,7 +158,7 @@ function parseDeepLink( // Only correct when called AFTER the dedicated cloud parsers had their turn. export function isUnclaimedCloudDeepLink(url: string): boolean { const trimmed = url.trim(); - if (!trimmed.toLowerCase().startsWith("orgii://")) return false; + if (!/^(?:orgii|tpagentstudio(?:-dev|-instance\d+)?):\/\//i.test(trimmed)) return false; try { return ( new URL(trimmed).hostname.toLowerCase() === CLOUD_INVITE_DEEP_LINK_HOST From a0744016e23d42a04ffea9d04d0fa9804903c685 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:42:26 +0700 Subject: [PATCH 18/60] style(fork): satisfy Prettier for fork deep-link routing --- src/hooks/platform/useDeepLinkHandler.test.ts | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/hooks/platform/useDeepLinkHandler.test.ts b/src/hooks/platform/useDeepLinkHandler.test.ts index d059bbc02e..dd69187355 100644 --- a/src/hooks/platform/useDeepLinkHandler.test.ts +++ b/src/hooks/platform/useDeepLinkHandler.test.ts @@ -77,10 +77,11 @@ describe("malformed cloud deep-link containment", () => { }); }); - describe("fork deep-link routing", () => { it("normalizes the provisional fork schemes while keeping the in-app /orgii router base", () => { - expect(parseDeepLink("tpagentstudio://marketplace/callback?code=abc")).toEqual({ + expect( + parseDeepLink("tpagentstudio://marketplace/callback?code=abc") + ).toEqual({ path: "/orgii/marketplace/callback", search: "?code=abc", }); @@ -88,7 +89,9 @@ describe("fork deep-link routing", () => { path: "/orgii/settings", search: "", }); - expect(parseDeepLink("tpagentstudio-instance2://project/open?id=3")).toEqual({ + expect( + parseDeepLink("tpagentstudio-instance2://project/open?id=3") + ).toEqual({ path: "/orgii/project/open", search: "?id=3", }); @@ -100,8 +103,14 @@ describe("fork deep-link routing", () => { }); it("does not let unhandled fork cloud links fall through to generic routing", () => { - expect(isUnclaimedCloudDeepLink("tpagentstudio://cloud/join?invite=")).toBe(true); - expect(isUnclaimedCloudDeepLink("tpagentstudio-dev://cloud/session?share=")).toBe(true); - expect(isUnclaimedCloudDeepLink("tpagentstudio://marketplace/callback")).toBe(false); + expect(isUnclaimedCloudDeepLink("tpagentstudio://cloud/join?invite=")).toBe( + true + ); + expect( + isUnclaimedCloudDeepLink("tpagentstudio-dev://cloud/session?share=") + ).toBe(true); + expect( + isUnclaimedCloudDeepLink("tpagentstudio://marketplace/callback") + ).toBe(false); }); }); From 10b14c873c43738cf38cc33bace1fe0175502b04 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:42:29 +0700 Subject: [PATCH 19/60] style(fork): satisfy Prettier for fork deep-link routing --- src/hooks/platform/useDeepLinkHandler.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hooks/platform/useDeepLinkHandler.ts b/src/hooks/platform/useDeepLinkHandler.ts index bbf299fd39..d54e0071e2 100644 --- a/src/hooks/platform/useDeepLinkHandler.ts +++ b/src/hooks/platform/useDeepLinkHandler.ts @@ -128,7 +128,8 @@ export function parseDeepLink( // earlier (see `parseCloudInviteDeepLink` / `parseCloudShareDeepLink`) // and never reach this generic conversion. - const supportedScheme = /^(?:tpagentstudio(?:-dev|-instance\d+)?|yorgai|orgii):\/\//i; + const supportedScheme = + /^(?:tpagentstudio(?:-dev|-instance\d+)?|yorgai|orgii):\/\//i; if (!supportedScheme.test(deepLinkUrl)) return null; const withoutProtocol = deepLinkUrl.replace(supportedScheme, ""); @@ -158,7 +159,8 @@ export function parseDeepLink( // Only correct when called AFTER the dedicated cloud parsers had their turn. export function isUnclaimedCloudDeepLink(url: string): boolean { const trimmed = url.trim(); - if (!/^(?:orgii|tpagentstudio(?:-dev|-instance\d+)?):\/\//i.test(trimmed)) return false; + if (!/^(?:orgii|tpagentstudio(?:-dev|-instance\d+)?):\/\//i.test(trimmed)) + return false; try { return ( new URL(trimmed).hostname.toLowerCase() === CLOUD_INVITE_DEEP_LINK_HOST From 5bd557f6e9df9d4be4b77393c5396548d244c453 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:18 +0700 Subject: [PATCH 20/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- src-tauri/crates/agent-core/src/core/providers/traits.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/providers/traits.rs b/src-tauri/crates/agent-core/src/core/providers/traits.rs index 8b4bd8d9ee..5f524fdaa2 100644 --- a/src-tauri/crates/agent-core/src/core/providers/traits.rs +++ b/src-tauri/crates/agent-core/src/core/providers/traits.rs @@ -437,6 +437,8 @@ pub struct ChatOptions { /// /// Implementations handle the specifics of each provider's API /// while maintaining a consistent interface for the agent loop. +// async_trait expands async methods into boxed Futures already marked must_use. +#[allow(clippy::double_must_use)] #[async_trait] #[allow(clippy::too_many_arguments)] pub trait LLMProvider: Send + Sync { From 6133266bde933fa6850e1cb58ba85b89f4f18ba3 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:21 +0700 Subject: [PATCH 21/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- src-tauri/crates/agent-core/src/core/tools/traits.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/tools/traits.rs b/src-tauri/crates/agent-core/src/core/tools/traits.rs index 9998e395e8..1b354ea797 100644 --- a/src-tauri/crates/agent-core/src/core/tools/traits.rs +++ b/src-tauri/crates/agent-core/src/core/tools/traits.rs @@ -90,6 +90,8 @@ use super::params::ensure_object_schema; /// Each tool provides a name, description, JSON Schema parameters, /// and an async execute method. Tools are registered in a [`ToolRegistry`] /// and invoked by the agent loop when the LLM requests a tool call. +// async_trait's boxed Future is already must_use; scope this lint to this trait. +#[allow(clippy::double_must_use)] #[async_trait] pub trait Tool: Send + Sync { /// Tool name used in function calls (e.g., "read_file", "exec"). From 116272b18475cf240f8009d10964763d728b14f1 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:24 +0700 Subject: [PATCH 22/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- src-tauri/crates/agent-core/src/core/turn_executor/types.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/turn_executor/types.rs b/src-tauri/crates/agent-core/src/core/turn_executor/types.rs index 137c361caa..2bb5380e56 100644 --- a/src-tauri/crates/agent-core/src/core/turn_executor/types.rs +++ b/src-tauri/crates/agent-core/src/core/turn_executor/types.rs @@ -31,6 +31,7 @@ pub enum PermissionVerdict { /// `execute_turn` calls this when a tool has an `Ask` verdict in the policy. /// Implementations handle the actual prompt UI (a frontend dialog driven by /// a `permission:request` event delivered over the Tauri IPC Channel). +#[allow(clippy::double_must_use)] #[async_trait] pub trait PermissionProvider: Send + Sync { /// Check if a tool has been granted "always allow" for the current session. @@ -53,6 +54,7 @@ pub trait PermissionProvider: Send + Sync { /// before `execute_turn`, then perform a zero-wait collect before each provider /// request. Implementations must return immediately when their work is not yet /// ready. +#[allow(clippy::double_must_use)] #[async_trait] pub trait TurnIterationHook: Send + Sync { async fn before_llm_iteration( @@ -210,6 +212,8 @@ pub struct ToolHookIntervention { /// /// Implementors handle streaming deltas, tool call/result events, /// and persistence. Each agent type provides its own implementation. +// async_trait yields a must_use boxed Future; guard only this callback trait. +#[allow(clippy::double_must_use)] #[async_trait] #[allow(unused_variables, clippy::too_many_arguments)] // Event implementations share this callback contract across providers; keep From a8223c349428a3b03f551e802488e67b45a862a8 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:27 +0700 Subject: [PATCH 23/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- src-tauri/crates/agent-core/src/integrations/channels/traits.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/crates/agent-core/src/integrations/channels/traits.rs b/src-tauri/crates/agent-core/src/integrations/channels/traits.rs index d6426f26e6..1368409ce4 100644 --- a/src-tauri/crates/agent-core/src/integrations/channels/traits.rs +++ b/src-tauri/crates/agent-core/src/integrations/channels/traits.rs @@ -9,6 +9,8 @@ use crate::bus::{InboundMessage, OutboundMessage}; /// /// Each channel implementation handles connecting to an external service /// (Telegram, Discord, etc.), receiving messages, and sending responses. +// async_trait's boxed Future is already must_use; keep the lint exception local. +#[allow(clippy::double_must_use)] #[async_trait] pub trait Channel: Send + Sync { /// Channel name including account ID (e.g., "telegram:default", "discord:work"). From 73808b429d9b02ccfa63ca4916c53345d3111813 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:30 +0700 Subject: [PATCH 24/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- src-tauri/crates/agent-core/src/integrations/gateway/service.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/crates/agent-core/src/integrations/gateway/service.rs b/src-tauri/crates/agent-core/src/integrations/gateway/service.rs index 3394135582..2385590f48 100644 --- a/src-tauri/crates/agent-core/src/integrations/gateway/service.rs +++ b/src-tauri/crates/agent-core/src/integrations/gateway/service.rs @@ -23,6 +23,8 @@ use super::workers::{spawn_inbound_processor, spawn_outbound_dispatcher}; /// /// The gateway delegates message processing to this handler, which is implemented /// by the agent layer. This decouples the gateway from any specific agent. +// async_trait's generated boxed Future already has must_use semantics. +#[allow(clippy::double_must_use)] #[async_trait::async_trait] pub trait InboundMessageHandler: Send + Sync + 'static { async fn handle_message(&self, msg: InboundMessage) -> Result, String>; From 2f6f04f876644bc0c6d13e94213c1a521dbbe074 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:34 +0700 Subject: [PATCH 25/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- .../agent-core/src/specialization/memory/embeddings/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src-tauri/crates/agent-core/src/specialization/memory/embeddings/mod.rs b/src-tauri/crates/agent-core/src/specialization/memory/embeddings/mod.rs index c9e4547420..164c0132ac 100644 --- a/src-tauri/crates/agent-core/src/specialization/memory/embeddings/mod.rs +++ b/src-tauri/crates/agent-core/src/specialization/memory/embeddings/mod.rs @@ -29,6 +29,8 @@ pub struct EmbeddingResult { } /// Trait for embedding providers. +// async_trait generates a boxed Future already considered must_use. +#[allow(clippy::double_must_use)] #[async_trait] pub trait EmbeddingProvider: Send + Sync { /// Generate an embedding for a single text. From 45a074b04589dd7488a2501513f918fd23b70ab2 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:46:37 +0700 Subject: [PATCH 26/60] fix(ci): scope async_trait Clippy allowances and avoid cloned single-element slices --- .../src/core/session/persistence/native_transfer_tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/crates/agent-core/src/core/session/persistence/native_transfer_tests.rs b/src-tauri/crates/agent-core/src/core/session/persistence/native_transfer_tests.rs index a6ac27015e..b1bae25259 100644 --- a/src-tauri/crates/agent-core/src/core/session/persistence/native_transfer_tests.rs +++ b/src-tauri/crates/agent-core/src/core/session/persistence/native_transfer_tests.rs @@ -47,7 +47,7 @@ async fn native_ipc_embeds_disk_images_without_cli_refs_and_preserves_display_ro let sid = "sdeagent-transfer-images"; seed(sid); let url = "data:image/png;base64,QUJD".to_string(); - let id = super::super::save_user_msg(sid, "inspect", Some(&[url.clone()])).unwrap(); + let id = super::super::save_user_msg(sid, "inspect", Some(std::slice::from_ref(&url))).unwrap(); bind(sid, &id, "image-intent"); let stored = super::super::load_messages(sid).unwrap(); let paths: Vec = serde_json::from_str(stored[0].images.as_ref().unwrap()).unwrap(); @@ -60,7 +60,7 @@ async fn native_ipc_embeds_disk_images_without_cli_refs_and_preserves_display_ro assert_eq!(native[0]["turnIntentId"], "image-intent"); assert_eq!( native[0]["images"], - serde_json::to_string(&[url.clone()]).unwrap() + serde_json::to_string(std::slice::from_ref(&url)).unwrap() ); } let display = crate::state::commands::agent_load_messages(sid.into(), None) From 0edb4e3772f2c9b143ce5ccf6915909ecf12890b Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:51:53 +0700 Subject: [PATCH 27/60] fix(fork): align frontend runtime identity, ports and OAuth scheme with Rust --- src/config/runtimeInstance.ts | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/config/runtimeInstance.ts b/src/config/runtimeInstance.ts index db9fb2a0e8..16328e543a 100644 --- a/src/config/runtimeInstance.ts +++ b/src/config/runtimeInstance.ts @@ -7,6 +7,9 @@ export interface RuntimeInstanceProfile { const PRIMARY_IDE_SERVER_PORT = 13_847; const PRIMARY_CLI_PROXY_PORT = 17_888; +const FORK_IDE_SERVER_PORT = 23_847; +const FORK_CLI_PROXY_PORT = 27_888; +const FORK_IDENTIFIER = "com.theerasakping.tpagentstudio"; // Dedicated dev slot, outside the numbered bundle range (2..99). const DEV_INSTANCE_ID = 100; @@ -18,7 +21,36 @@ const DEV_INSTANCE_ID = 100; export function runtimeInstanceProfileForIdentifier( identifier: string ): RuntimeInstanceProfile { - if (identifier.trim() === "org2ai.org2.dev") { + const normalized = identifier.trim(); + // Keep frontend runtime ports and OAuth callback schemes in parity with + // src-tauri/src/runtime_instance.rs and scripts/tauri/instance-profile.cjs. + // Unknown fork subidentifiers fail back to the FORK primary identity rather + // than accidentally selecting the upstream orgii:// / 13xxx endpoints. + if (normalized === FORK_IDENTIFIER || normalized.startsWith(`${FORK_IDENTIFIER}.`)) { + const forkDev = normalized === `${FORK_IDENTIFIER}.dev`; + const match = /^com\\.theerasakping\\.tpagentstudio\\.(?:e2e\\.)?instance(\\d+)$/.exec( + normalized + ); + const parsedId = match ? Number(match[1]) : 1; + const instanceId = forkDev + ? DEV_INSTANCE_ID + : Number.isInteger(parsedId) && parsedId >= 2 && parsedId <= 99 + ? parsedId + : 1; + const authDeepLinkScheme = forkDev + ? "tpagentstudio-dev" + : instanceId === 1 + ? "tpagentstudio" + : `tpagentstudio-instance${instanceId}`; + return { + instanceId, + ideServerPort: FORK_IDE_SERVER_PORT + instanceId - 1, + cliProxyPort: FORK_CLI_PROXY_PORT + instanceId - 1, + authDeepLinkScheme, + }; + } + + if (normalized === "org2ai.org2.dev") { return { instanceId: DEV_INSTANCE_ID, ideServerPort: PRIMARY_IDE_SERVER_PORT + DEV_INSTANCE_ID - 1, From ae768d4d906bfa14d6cb65ffc5e2c59d14983121 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:52:10 +0700 Subject: [PATCH 28/60] fix(fork): correct numbered instance regex and formatting --- src/config/runtimeInstance.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/config/runtimeInstance.ts b/src/config/runtimeInstance.ts index 16328e543a..0b2105d602 100644 --- a/src/config/runtimeInstance.ts +++ b/src/config/runtimeInstance.ts @@ -26,9 +26,12 @@ export function runtimeInstanceProfileForIdentifier( // src-tauri/src/runtime_instance.rs and scripts/tauri/instance-profile.cjs. // Unknown fork subidentifiers fail back to the FORK primary identity rather // than accidentally selecting the upstream orgii:// / 13xxx endpoints. - if (normalized === FORK_IDENTIFIER || normalized.startsWith(`${FORK_IDENTIFIER}.`)) { + if ( + normalized === FORK_IDENTIFIER || + normalized.startsWith(`${FORK_IDENTIFIER}.`) + ) { const forkDev = normalized === `${FORK_IDENTIFIER}.dev`; - const match = /^com\\.theerasakping\\.tpagentstudio\\.(?:e2e\\.)?instance(\\d+)$/.exec( + const match = /^com\.theerasakping\.tpagentstudio\.(?:e2e\.)?instance(\d+)$/.exec( normalized ); const parsedId = match ? Number(match[1]) : 1; From 6b04a6754f0313046566613e3420058f527f76a5 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:52:31 +0700 Subject: [PATCH 29/60] test(fork): cover frontend identity parity for prod, dev, numbered, and E2E --- src/config/runtimeInstance.test.ts | 52 ++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/config/runtimeInstance.test.ts b/src/config/runtimeInstance.test.ts index 1f2124dc8c..e5b034e643 100644 --- a/src/config/runtimeInstance.test.ts +++ b/src/config/runtimeInstance.test.ts @@ -3,6 +3,58 @@ import { describe, expect, it } from "vitest"; import { runtimeInstanceProfileForIdentifier } from "./runtimeInstance"; describe("runtimeInstanceProfileForIdentifier", () => { + it("isolates fork production ports and its registered auth scheme", () => { + expect( + runtimeInstanceProfileForIdentifier("com.theerasakping.tpagentstudio") + ).toEqual({ + instanceId: 1, + ideServerPort: 23_847, + cliProxyPort: 27_888, + authDeepLinkScheme: "tpagentstudio", + }); + }); + + it("keeps the fork dev identity separate from both production and upstream", () => { + expect( + runtimeInstanceProfileForIdentifier("com.theerasakping.tpagentstudio.dev") + ).toEqual({ + instanceId: 100, + ideServerPort: 23_946, + cliProxyPort: 27_987, + authDeepLinkScheme: "tpagentstudio-dev", + }); + }); + + it("matches the numbered and E2E fork profiles generated by the launcher", () => { + for (const identifier of [ + "com.theerasakping.tpagentstudio.instance2", + "com.theerasakping.tpagentstudio.e2e.instance2", + ]) { + expect(runtimeInstanceProfileForIdentifier(identifier)).toEqual({ + instanceId: 2, + ideServerPort: 23_848, + cliProxyPort: 27_889, + authDeepLinkScheme: "tpagentstudio-instance2", + }); + } + }); + + it("never routes unknown fork subidentifiers to upstream ports or orgii", () => { + for (const identifier of [ + "com.theerasakping.tpagentstudio.instance1", + "com.theerasakping.tpagentstudio.instance100", + "com.theerasakping.tpagentstudio.instance2.invalid", + "com.theerasakping.tpagentstudio.unknown", + ]) { + expect(runtimeInstanceProfileForIdentifier(identifier)).toEqual({ + instanceId: 1, + ideServerPort: 23_847, + cliProxyPort: 27_888, + authDeepLinkScheme: "tpagentstudio", + }); + } + }); + it("routes dev HTTP, WebSocket and login away from the bundled app", () => { expect(runtimeInstanceProfileForIdentifier("org2ai.org2.dev")).toEqual({ instanceId: 100, From c22ee9c27a64f0a15fafa833eb480abece2b70e0 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:52:51 +0700 Subject: [PATCH 30/60] test(fork): verify native cloud OAuth callbacks use fork schemes --- src/features/Org2Cloud/config.test.ts | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/features/Org2Cloud/config.test.ts b/src/features/Org2Cloud/config.test.ts index 3bc820b3e1..d2bb7aec02 100644 --- a/src/features/Org2Cloud/config.test.ts +++ b/src/features/Org2Cloud/config.test.ts @@ -86,6 +86,37 @@ describe("buildCloudAuthCallbackUrl", () => { ); }); + it("uses only fork-owned return schemes for fork production and dev builds", () => { + expect( + configureCloudAuthCallbackForIdentifier( + "com.theerasakping.tpagentstudio" + ) + ).toBe("tpagentstudio://auth/callback"); + expect(new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to")).toBe( + "tpagentstudio://auth/callback" + ); + + expect( + configureCloudAuthCallbackForIdentifier( + "com.theerasakping.tpagentstudio.dev" + ) + ).toBe("tpagentstudio-dev://auth/callback"); + expect(new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to")).toBe( + "tpagentstudio-dev://auth/callback" + ); + }); + + it("derives the numbered and E2E fork callback scheme without using orgii", () => { + for (const identifier of [ + "com.theerasakping.tpagentstudio.instance2", + "com.theerasakping.tpagentstudio.e2e.instance2", + ]) { + expect(configureCloudAuthCallbackForIdentifier(identifier)).toBe( + "tpagentstudio-instance2://auth/callback" + ); + } + }); + it("derives an isolated callback from the runtime Tauri identifier", () => { expect( configureCloudAuthCallbackForIdentifier("org2ai.org2.instance2") From 38ad2ca8e593ab261bf945fd2d99906da77a1559 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:54:35 +0700 Subject: [PATCH 31/60] docs(fork): record frontend runtime parity and unresolved Cloud ownership gates --- docs/fork/ROADMAP.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/fork/ROADMAP.md b/docs/fork/ROADMAP.md index 0faea86def..b770bc3d41 100644 --- a/docs/fork/ROADMAP.md +++ b/docs/fork/ROADMAP.md @@ -15,6 +15,9 @@ - [x] Remove clickable upstream installer links from fork README and clear the disabled Tauri updater manifest list. - [ ] Replace remaining upstream public signing key, CI release dependencies and signing identities with fork-owned infrastructure. - [x] Harden the explicit fork data-root guard against parent traversal, missing suffixes and symlinked ancestors; add focused Rust and fork-safety tests. +- [x] Align fork frontend runtime ports and OAuth callback schemes with embedded Rust application identifiers; include production/dev/numbered/E2E parity tests (CI evidence pending). +- [ ] **P0 Cloud ownership:** Fork defaults still reference the ORG2-managed Supabase/web backend and some Cloud parsers still accept only `orgii://` links. Configure fork-owned endpoints, secrets/credential namespaces and redirect allowlists; until then, prohibit real-account cloud onboarding and production distribution. See [Cloud boundary audit](FORK_CLOUD_BOUNDARY.md). +- [ ] Separate workspace-local `.orgii` metadata from upstream workspace metadata with opt-in migration, source-attributed ownership and rollback tests. - [ ] Run same-machine concurrent-install and migration/rollback tests. - [ ] Publish fork-built packages only after independent signing and end-to-end smoke tests. From c10001cad13df19d74a1a0b47a7aa2f83c75e99e Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:55:29 +0700 Subject: [PATCH 32/60] docs(fork): define release-blocking Cloud/OAuth identity and isolation audit --- docs/fork/FORK_CLOUD_BOUNDARY.md | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 docs/fork/FORK_CLOUD_BOUNDARY.md diff --git a/docs/fork/FORK_CLOUD_BOUNDARY.md b/docs/fork/FORK_CLOUD_BOUNDARY.md new file mode 100644 index 0000000000..1c158eaf41 --- /dev/null +++ b/docs/fork/FORK_CLOUD_BOUNDARY.md @@ -0,0 +1,54 @@ +# TP Agent Studio — Cloud and protocol ownership boundary + +**Status:** P0 release blocker, source audit only (2026-10-17). Not production-certified. +**PR:** https://github.com/TheerasakPing/ORG2/pull/9 + +## Verified from source + +| Area | Current fork behavior | Release implication | +| --- | --- | --- | +| Desktop protocol | Tauri production: `tpagentstudio://`; Dev: `tpagentstudio-dev://`; numbered: `tpagentstudio-instanceN://` | Native registration and per-OS fresh-install collision tests outstanding | +| Frontend runtime profile | `src/config/runtimeInstance.ts` now maps fork bundle IDs to the same 23847/27888 ports and fork protocols as Rust / JS launcher | Source parity is not proof of E2E callback registration | +| OAuth callback target | `configureCloudAuthCallbackForIdentifier` derives the target from the runtime bundle ID | External Cloud web server must explicitly allow its own fork redirect and validate state | +| Default cloud service | `src/features/Org2Cloud/config.ts` still embeds ORG2-managed Supabase and web origin as fallback | **No fork-owned Cloud has been configured; do not use real accounts or distribute as independent Cloud** | +| Endpoint override | LocalStorage key `orgii:org2-cloud-v1:endpointOverride` | Browser storage and keychain ownership must be audited; malformed override falls back to upstream | +| Inbound invite/share | `org2CloudOrgManagement.ts` accepts `orgii://cloud/...` | Fork URLs are not handled by dedicated parsers | +| Session reference | `cloudSessionReference.ts` uses the `orgii:` reference scheme | Cross-instance / fork-specific provenance undefined | +| Billing | `billingComplete.ts` accepts `orgii://billing/complete` | Must not reuse original publisher billing confirmation flow | +| Memory | Workspace-local `.orgii` remains compatible with upstream data | Avoid opening same workspace simultaneously until data isolation/migration is implemented | + +## Interim policy + +1. Keep updater, inherited release jobs, production signing, and publishing **disabled**. +2. Treat Cloud onboarding, billing, remote sync, auth callbacks and implicit upstream credentials as **not production-ready** on this fork. +3. Do not enable upstream Cloud defaults or loosen scheme parsers as a quick fix. Changing URL scheme strings alone does not create owned authentication, tenants or billing infrastructure. +4. Do not migrate or copy persisted upstream access/refresh tokens or OS keychain entries automatically. Require user consent, explicit source/target and rollback plan. +5. Continue to validate local-only Agent Harness, session UI and tools independently of Cloud. + +## Required implementation sequence + +### A — Inventory and fork-owned backend + +- [ ] Map all Cloud HTTP/WS clients, external login/payment pages, OS deep-link registrations, callback allowlists, app credentials and persisted sync cursors. +- [ ] Provision an explicitly fork-owned web origin and auth data plane, or an approved user-provided deployment, with isolated Supabase project, RLS, signing/key material and rotation process. +- [ ] Expose a release-safe Cloud **disabled/unconfigured** state instead of silently falling back to the upstream origin (including malformed or null overrides). Update UI so connection errors are actionable. +- [ ] Namespace Cloud browser keys/atoms, localStorage, OAuth state and secure OS credential storage per application + instance. +- [ ] Reject accidental imports from the upstream default unless a separately approved, scoped migration process authorizes them. + +### B — Owned protocol and parser contracts + +- [ ] Generate invite, share and billing callback links from an explicit, audited fork scheme and owned web origin. +- [ ] Normalize direct deep-link entry points for production, Dev and numbered instances; restrict auth and payment callbacks to exact expected scheme/host/path and state. +- [ ] Reject unexpected scheme, userinfo, duplicate critical parameters, fragments and malformed inputs. Never log or copy bearer tokens to generic navigation. +- [ ] Keep unsupported/unclaimed Cloud URLs fail-closed rather than converting to a generic React Router path. + +### C — Cross-platform acceptance + +- [ ] Unit-test explicit owned Cloud endpoint, missing config, malformed override, scheme matching, OAuth state, invite/share, billing, and data reset on switch. +- [ ] Test same-machine installs with original ORG2 on macOS Apple Silicon, Windows 11 and Linux: bundles, protocol handlers, ports, keychains, updater, workspace-local memory and credential files. +- [ ] Confirm genuine Cloud login and revocation against a **fork-owned staging tenant only** with redacted test artifacts. +- [ ] Record passing CI workflow URLs, installers/hashes, signed/notarized artifacts and a downgrade/rollback plan. + +**Acceptance:** the fork cannot automatically read, write, authenticate against, bill through or update itself from the original publisher's Cloud services or profiles. Cloud use remains explicitly disabled until this contract is met. + +Source findings are *not* operational proof; no Cloud tenancy, installer or credential-coexistence test is claimed here. From 5500b5f04d2e934765a5618e672154205a4bd121 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 14:58:56 +0700 Subject: [PATCH 33/60] style(test): align fork OAuth callback test layout with Prettier --- src/features/Org2Cloud/config.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/features/Org2Cloud/config.test.ts b/src/features/Org2Cloud/config.test.ts index d2bb7aec02..985acb4b21 100644 --- a/src/features/Org2Cloud/config.test.ts +++ b/src/features/Org2Cloud/config.test.ts @@ -88,9 +88,7 @@ describe("buildCloudAuthCallbackUrl", () => { it("uses only fork-owned return schemes for fork production and dev builds", () => { expect( - configureCloudAuthCallbackForIdentifier( - "com.theerasakping.tpagentstudio" - ) + configureCloudAuthCallbackForIdentifier("com.theerasakping.tpagentstudio") ).toBe("tpagentstudio://auth/callback"); expect(new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to")).toBe( "tpagentstudio://auth/callback" From 1fb706acd3637359ad25cc4c5c902311e0aa32c7 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:05:31 +0700 Subject: [PATCH 34/60] fix(scheduler): catch synchronous executor panics and recover dead session worker --- .../agent-core/src/core/session/scheduler.rs | 66 +++++++++++++++++-- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index 706f8f713c..0ec74b5a35 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -220,6 +220,8 @@ pub struct EnqueueResult { /// Inner state initialized lazily on first enqueue. struct SchedulerInner { tx: mpsc::Sender, + /// Retain the worker handle to detect unexpected task termination. + worker: tokio::task::JoinHandle<()>, } /// Per-session FIFO message queue with a single background worker. @@ -292,10 +294,57 @@ impl DialogScheduler { async fn ensure_initialized(&self) -> mpsc::Sender { let mut guard = self.inner.lock().await; if let Some(inner) = guard.as_ref() { - return inner.tx.clone(); + if !inner.worker.is_finished() && !inner.tx.is_closed() { + return inner.tx.clone(); + } + + // A previous worker died (for example, from a panic outside the + // turn executor). Its receiver is gone, but the retained sender + // makes the scheduler appear initialized forever. Reset only the + // now-orphaned in-memory queue, never replay dropped tool effects. + warn!( + session_id = %self.session_id, + "[scheduler] worker terminated unexpectedly; replacing closed queue" + ); + self.generation.fetch_add(1, Ordering::AcqRel); + self.pending.store(0, Ordering::Release); + let was_running_turn = self.processing_turn.swap(false, Ordering::AcqRel); + self.processing.store(false, Ordering::Release); + self.client_message_ids.lock().await.clear(); + let interrupted = { + let mut control = self.turn_control.lock(); + control.cancelled.clear(); + control.current.take() + }; + if let Some(ref turn_id) = interrupted { + crate::foundation::session_bridge::update_turn_intent_status( + &self.session_id, + turn_id, + crate::foundation::session_bridge::TurnIntentBridgeStatus::Failed, + ); + } + crate::foundation::session_bridge::mark_pending_turn_intents_stale(&self.session_id); + if was_running_turn { + if let Err(err) = crate::session::persistence::update_status( + &self.session_id, + crate::session::SessionStatus::Abandoned, + ) { + warn!( + session_id = %self.session_id, + error = %err, + "[scheduler] could not persist interrupted session status" + ); + } + let streaming_error = StreamingError::new( + "Session worker stopped unexpectedly; the interrupted turn was not replayed. Send a new message to retry.".to_string(), + classify_streaming_error_message("Session worker stopped unexpectedly"), + ); + broadcast_agent_error_structured(&self.session_id, &streaming_error); + } + self.broadcast_queue_status(); } - // First enqueue — spawn the worker now + // First enqueue or replace a dead worker — spawn a new receiver let (tx, rx) = mpsc::channel::(self.capacity); let worker = WorkerTask { @@ -308,14 +357,17 @@ impl DialogScheduler { client_message_ids: Arc::clone(&self.client_message_ids), turn_control: Arc::clone(&self.turn_control), }; - tokio::spawn(worker.run()); + let worker = tokio::spawn(worker.run()); info!( "[scheduler] Worker spawned for session={} (capacity={})", self.session_id, self.capacity ); - *guard = Some(SchedulerInner { tx: tx.clone() }); + *guard = Some(SchedulerInner { + tx: tx.clone(), + worker, + }); tx } @@ -597,8 +649,10 @@ impl WorkerTask { let client_message_id = msg.client_message_id.clone(); let turn_intent_id = msg.turn_intent_id.clone(); let org_run_id = msg.org_run_id.clone(); - let execute_future = (msg.execute)(); - let result = std::panic::AssertUnwindSafe(execute_future) + // The factory itself can panic before it returns a Future. + // Place its invocation INSIDE the catch boundary so an otherwise + // valid per-session worker cannot disappear with a live sender. + let result = std::panic::AssertUnwindSafe(async { (msg.execute)().await }) .catch_unwind() .await .unwrap_or_else(|panic_payload| { From c8491d6d42798f7789c8135fe290534fd5e36eb1 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:06:13 +0700 Subject: [PATCH 35/60] test(scheduler): verify factory panic and worker crash do not poison future turns --- .../agent-core/src/core/session/scheduler.rs | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index 0ec74b5a35..3449a657d6 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -914,6 +914,106 @@ mod tests { use super::*; use std::sync::atomic::{AtomicUsize, Ordering}; + #[tokio::test] + async fn executor_factory_panic_does_not_kill_the_session_worker() { + let scheduler = DialogScheduler::new("session-factory-panic", 8); + scheduler + .enqueue(ScheduledMessage { + kind: ScheduledKind::Turn, + message_id: "factory-panics".into(), + generation: 0, + client_message_id: None, + turn_intent_id: String::new(), + org_run_id: None, + content: "panic".into(), + execute: Box::new(|| panic!("factory failed before creating a future")), + }) + .await + .expect("factory panic must not occur on the caller"); + + let completed = Arc::new(AtomicUsize::new(0)); + let completed_in_turn = Arc::clone(&completed); + scheduler + .enqueue(ScheduledMessage { + kind: ScheduledKind::Turn, + message_id: "after-factory-panic".into(), + generation: 0, + client_message_id: None, + turn_intent_id: String::new(), + org_run_id: None, + content: "continue".into(), + execute: Box::new(move || { + Box::pin(async move { + completed_in_turn.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }), + }) + .await + .expect("enqueue after factory panic"); + + tokio::time::timeout(std::time::Duration::from_secs(2), async { + while completed.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }) + .await + .expect("factory panic must not poison the worker or later queue items"); + assert_eq!(scheduler.pending_count(), 0); + } + + #[tokio::test] + async fn a_dead_worker_is_recreated_on_the_next_enqueue() { + let scheduler = DialogScheduler::new("session-aborted-worker", 8); + scheduler.ensure_initialized().await; + { + let guard = scheduler.inner.lock().await; + guard.as_ref().expect("worker started").worker.abort(); + } + tokio::time::timeout(std::time::Duration::from_secs(2), async { + loop { + let finished = { + let guard = scheduler.inner.lock().await; + guard.as_ref().expect("worker exists").worker.is_finished() + }; + if finished { + break; + } + tokio::task::yield_now().await; + } + }) + .await + .expect("aborted worker eventually stops"); + + let completed = Arc::new(AtomicUsize::new(0)); + let completed_in_turn = Arc::clone(&completed); + scheduler + .enqueue(ScheduledMessage { + kind: ScheduledKind::Maintenance, + message_id: "after-worker-abort".into(), + generation: 0, + client_message_id: None, + turn_intent_id: String::new(), + org_run_id: None, + content: String::new(), + execute: Box::new(move || { + Box::pin(async move { + completed_in_turn.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }), + }) + .await + .expect("dead worker must be replaced"); + tokio::time::timeout(std::time::Duration::from_secs(2), async { + while completed.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }) + .await + .expect("replacement worker processes a fresh queue item"); + } + #[test] fn targeted_cancellation_registry_is_bounded_and_keeps_the_latest_fence() { let scheduler = DialogScheduler::new("session-targeted-cancel-bound", 8); From 520b3b28be162c11002c89e0c75fc0b7ffa19a80 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:06:53 +0700 Subject: [PATCH 36/60] fix(recovery): always attempt stale running-session cleanup after partial startup errors --- src-tauri/src/app/startup_recovery.rs | 55 ++++++++++++++++++++------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src-tauri/src/app/startup_recovery.rs b/src-tauri/src/app/startup_recovery.rs index 693f03672c..10dbb46a30 100644 --- a/src-tauri/src/app/startup_recovery.rs +++ b/src-tauri/src/app/startup_recovery.rs @@ -26,25 +26,54 @@ pub(crate) fn run_persistence_startup_recovery() -> Result Date: Sat, 17 Oct 2026 15:09:00 +0700 Subject: [PATCH 37/60] fix(ci): resolve frontend Prettier violations from fork identity tests --- src/config/runtimeInstance.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/config/runtimeInstance.ts b/src/config/runtimeInstance.ts index 0b2105d602..441a4cb799 100644 --- a/src/config/runtimeInstance.ts +++ b/src/config/runtimeInstance.ts @@ -31,9 +31,8 @@ export function runtimeInstanceProfileForIdentifier( normalized.startsWith(`${FORK_IDENTIFIER}.`) ) { const forkDev = normalized === `${FORK_IDENTIFIER}.dev`; - const match = /^com\.theerasakping\.tpagentstudio\.(?:e2e\.)?instance(\d+)$/.exec( - normalized - ); + const suffix = normalized.slice(FORK_IDENTIFIER.length); + const match = /^(?:\.e2e)?\.instance(\d+)$/.exec(suffix); const parsedId = match ? Number(match[1]) : 1; const instanceId = forkDev ? DEV_INSTANCE_ID From bb9c61cc05312190df2c7f3c2f478b9103985812 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:09:04 +0700 Subject: [PATCH 38/60] fix(ci): resolve frontend Prettier violations from fork identity tests --- src/features/Org2Cloud/config.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/features/Org2Cloud/config.test.ts b/src/features/Org2Cloud/config.test.ts index 985acb4b21..d2f27731a5 100644 --- a/src/features/Org2Cloud/config.test.ts +++ b/src/features/Org2Cloud/config.test.ts @@ -90,18 +90,18 @@ describe("buildCloudAuthCallbackUrl", () => { expect( configureCloudAuthCallbackForIdentifier("com.theerasakping.tpagentstudio") ).toBe("tpagentstudio://auth/callback"); - expect(new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to")).toBe( - "tpagentstudio://auth/callback" - ); + expect( + new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to") + ).toBe("tpagentstudio://auth/callback"); expect( configureCloudAuthCallbackForIdentifier( "com.theerasakping.tpagentstudio.dev" ) ).toBe("tpagentstudio-dev://auth/callback"); - expect(new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to")).toBe( - "tpagentstudio-dev://auth/callback" - ); + expect( + new URL(buildOrg2CloudLoginUrl()).searchParams.get("return_to") + ).toBe("tpagentstudio-dev://auth/callback"); }); it("derives the numbered and E2E fork callback scheme without using orgii", () => { From f49a92c12c1134ba04f7e4c86e7c0b835a5014db Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:09:53 +0700 Subject: [PATCH 39/60] fix(scheduler): persist failed status when executor bypasses normal terminal finalizer --- .../agent-core/src/core/session/scheduler.rs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index 3449a657d6..b03a53506f 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -778,6 +778,28 @@ impl WorkerTask { crate::foundation::session_bridge::TurnIntentBridgeStatus::Failed, ); } + // If the callback failed before its normal finalizer + // ran, the session DB can still say "running" while the + // in-memory worker has already moved on. Clear that + // phantom status for ordinary failed turns. Never alter + // previously terminal, stale, or intervention-owned work. + if is_turn + && !already_terminal + && !stale_callback + && !user_directed_waiting + && !user_directed_cancelled + { + if let Err(error) = crate::session::persistence::update_status( + &self.session_id, + crate::session::SessionStatus::Failed, + ) { + warn!( + session_id = %self.session_id, + error = %error, + "[scheduler] failed to persist failed turn session status" + ); + } + } // Turn-only: an `agent:error` renders as a chat bubble. // Maintenance jobs report failures through their own // channel (e.g. the manual-compact command's reply). From 7d093b07a0dc62e429c099f9cc86dacc2e0b5610 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:10:25 +0700 Subject: [PATCH 40/60] test(scheduler): failed executor must not leave SQLite session running --- .../agent-core/src/core/session/scheduler.rs | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index b03a53506f..05f97cd266 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -984,6 +984,61 @@ mod tests { assert_eq!(scheduler.pending_count(), 0); } + #[tokio::test] + #[serial_test::serial] + async fn failed_executor_reconciles_persisted_running_session() { + use crate::session::persistence::{self, UnifiedSessionRecord}; + use core_types::key_source::KeySource; + + let _sandbox = test_helpers::test_env::sandbox(); + let session_id = "session-failed-executor-status"; + { + let conn = database::db::get_connection().expect("test DB"); + crate::persistence::test_schema::ensure_agent_sessions_schema(&conn); + persistence::init(&conn).expect("session tables"); + } + let record = UnifiedSessionRecord { + session_id: session_id.to_string(), + name: "status regression".to_string(), + status: crate::session::SessionStatus::Running.as_str().to_string(), + created_at: "2024-01-01T00:00:00Z".to_string(), + updated_at: "2024-01-01T00:00:00Z".to_string(), + session_type: "sde".to_string(), + key_source: KeySource::OwnKey, + ..Default::default() + }; + persistence::upsert_session(&record).expect("seed running session"); + + let scheduler = DialogScheduler::new(session_id, 8); + scheduler + .enqueue(ScheduledMessage { + kind: ScheduledKind::Turn, + message_id: "failing-turn".into(), + generation: 0, + client_message_id: None, + turn_intent_id: String::new(), + org_run_id: None, + content: "fail".into(), + execute: Box::new(|| Box::pin(async { Err("provider failed".to_string()) })), + }) + .await + .expect("enqueue"); + + tokio::time::timeout(std::time::Duration::from_secs(3), async { + loop { + if persistence::get_session(session_id) + .expect("query session") + .is_some_and(|row| row.status == crate::session::SessionStatus::Failed.as_str()) + { + break; + } + tokio::task::yield_now().await; + } + }) + .await + .expect("failed callback must clear durable running status"); + } + #[tokio::test] async fn a_dead_worker_is_recreated_on_the_next_enqueue() { let scheduler = DialogScheduler::new("session-aborted-worker", 8); From 8f66222739fc3921a2b0db4910c41545884e0a20 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:10:52 +0700 Subject: [PATCH 41/60] fix(scheduler): move executor factory separately from message metadata --- src-tauri/crates/agent-core/src/core/session/scheduler.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index 05f97cd266..5ad6908c2e 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -652,7 +652,8 @@ impl WorkerTask { // The factory itself can panic before it returns a Future. // Place its invocation INSIDE the catch boundary so an otherwise // valid per-session worker cannot disappear with a live sender. - let result = std::panic::AssertUnwindSafe(async { (msg.execute)().await }) + let execute = msg.execute; + let result = std::panic::AssertUnwindSafe(async move { execute().await }) .catch_unwind() .await .unwrap_or_else(|panic_payload| { From 8303669ee56fb998d4b5ca42b8235e275d617739 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:11:41 +0700 Subject: [PATCH 42/60] fix(recovery): collect owned startup failure messages across independent phases --- src-tauri/src/app/startup_recovery.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/app/startup_recovery.rs b/src-tauri/src/app/startup_recovery.rs index 10dbb46a30..27bad457af 100644 --- a/src-tauri/src/app/startup_recovery.rs +++ b/src-tauri/src/app/startup_recovery.rs @@ -62,7 +62,7 @@ pub(crate) fn run_persistence_startup_recovery() -> Result Date: Sat, 17 Oct 2026 15:12:40 +0700 Subject: [PATCH 43/60] docs(reliability): record multi-session freeze causes, safe diagnostics and recovery gates --- docs/fork/SESSION_STALL_RECOVERY.md | 48 +++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 docs/fork/SESSION_STALL_RECOVERY.md diff --git a/docs/fork/SESSION_STALL_RECOVERY.md b/docs/fork/SESSION_STALL_RECOVERY.md new file mode 100644 index 0000000000..70ba446e68 --- /dev/null +++ b/docs/fork/SESSION_STALL_RECOVERY.md @@ -0,0 +1,48 @@ +# Multi-session stall and crash-restart recovery + +**Status:** source-level reliability changes awaiting CI and high-load reproduction. This is **not** a certified fix for every stall. + +## Observed source-level failure paths + +1. `DialogScheduler::WorkerTask::run` originally invoked `(msg.execute)()` **outside** `catch_unwind`. A synchronous panic in that factory ended the entire per-session Tokio worker; later queued work could be stranded. +2. The scheduler retained a sender forever but did not check whether its worker had died, so a session could remain unusable without constructing a new session. +3. Executor errors could surface as `agent:error` while a SQLite session record retained `running`, producing a misleading sidebar state. +4. Startup recovery used `?` on the first phase failure, skipping the later, independent `running`-to-`abandoned` cleanup. A bad auxiliary turn-intent table could therefore leave phantom running sessions across restarts. +5. Long-lived futures that never resolve, OS resource exhaustion, third-party provider timeouts, and database contention are **not proven** to be caused by any one of the above. + +## Changes on integration PR #9 + +- Catch both future-factory and future-poll panics, returning a surfaced error without killing the session worker. +- Track the worker task; if it has ended unexpectedly, replace the receiver when the next item is enqueued. Explicitly discard orphaned in-memory messages rather than replaying potentially side-effectful tools. +- Reset queue counters, dedup and intent ownership on failed worker replacement; report the interrupted turn and persist `abandoned` best-effort. +- On ordinary executor failure without an already-terminal, stale, or user-intervention-owned intent, persist session `failed` to avoid phantom `running`. +- Attempt all startup recovery phases even after earlier errors, then aggregate/log failures. +- Add regression tests: synchronous factory panic followed by a succeeding turn; manually aborted idle worker replacement; failed executor clearing a durable `running` session. + +## Safe checks for an existing installed app + +**Do not delete `sessions.db`, its `-wal`/`-shm` companions, provider credentials, or entire app profiles to clear a stall.** The installed upstream ORG2 binary does not contain this fork patch. + +1. Quit the affected app normally. Preserve a copy of its profile folder, ideally after all related processes have exited, before any repair. For upstream this is generally `~/.orgii/`; for the fork's production build the intended default is `~/.tp-agent-studio/`. +2. Check app logs for `[scheduler]`, `[StartupRecovery]`, `database is locked`, `agent:error`, provider timeouts and out-of-memory messages. Redact tokens, URLs with credentials, user prompts and private paths before sharing. +3. If the `sqlite3` command is installed, inspect **read-only** status counts, e.g. after quitting: + ```sh + sqlite3 "file:$HOME/.orgii/sessions.db?mode=ro" \ + "SELECT status, COUNT(*) FROM agent_sessions GROUP BY status;" + ``` + Replace the path with the fork root if diagnosing a built TP Agent Studio. This does not edit or reset rows. +4. Capture exact app build version, OS, physical RAM, number of concurrently active sessions, provider/CLI type and whether creating a *fresh* session works. +5. Never force status changes with raw SQL on production user data. Recovery must use typed session lifecycle transitions and preserve terminal markers/Agent Org ownership. + +## Acceptance matrix (pending) + +- [ ] Reproduce simultaneous turns (1, 5, 20, 50) with real providers and separately with controlled local simulators. +- [ ] Verify a panic in the synchronous execute factory does not kill the worker or block later queued turns. +- [ ] Verify a killed/aborted worker is detectable, resets non-durable queue state, does not replay side-effectful tools, and accepts a fresh turn. +- [ ] Verify executor failure clears persisted `running` and emits one visible error event. +- [ ] Force auxiliary startup turn-intent recovery to fail and assert independent session status repair still runs. +- [ ] Test long provider timeouts, network disconnects, SQLite writer contention, high memory pressure, app close/kill/relaunch, and cancellation. +- [ ] Confirm macOS M4, Windows 11 and Linux CI, native E2E, side-by-side installation, app data isolation and successful rollback. +- [ ] Verify no automatic cloud login or upstream credential mixing (see `FORK_CLOUD_BOUNDARY.md`). + +**Release gate:** Do not merge as a production release or publish installer until the above behavioral and security evidence is recorded. Source modifications alone are not proof that the user's currently installed app is repaired. From ba8c4cd6dccc360f5799ba18ee58e8b08a1feb32 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:13:22 +0700 Subject: [PATCH 44/60] docs(roadmap): track scheduler resurrection, startup repair and outstanding stall load testing --- docs/fork/ROADMAP.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/fork/ROADMAP.md b/docs/fork/ROADMAP.md index b770bc3d41..4ff307e224 100644 --- a/docs/fork/ROADMAP.md +++ b/docs/fork/ROADMAP.md @@ -31,6 +31,10 @@ - [ ] Introduce versioned, transactional SQLite migrations with verification and recovery procedures. - [ ] Classify transient vs permanent LLM reflection failures; TTL/backoff rather than permanent blacklist for transient errors. - [ ] Add session crash/restart, cancel/resume, provider-retry-after-tool and background-process teardown fault injection. +- [x] Catch scheduler execute-factory panics, track dead worker handles, recover the queue on next enqueue, and persist failed session state; added targeted regression tests (final CI pending). +- [x] Continue independent startup reconciliation phases after a partial failure so stale in-flight session cleanup is still attempted; see [multi-session recovery audit](SESSION_STALL_RECOVERY.md). +- [ ] Implement bounded progress/heartbeat diagnostics for genuinely hung provider or Tool futures, with cancellation semantics that never replay side-effectful work. +- [ ] Stress-test 1/5/20/50 concurrent sessions under load and validate clean shutdown/restart on all three platforms. **Acceptance:** no double-owned memory consolidation; session/tool cancellation leaves no orphaned jobs; migration failures cannot leave an app silently running on a partially upgraded schema. From ad16a95c0a19ff7ec1b2d509df4d1eb212670812 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:24:19 +0700 Subject: [PATCH 45/60] fix(windows): use non-deprecated atomic try_update under warnings-denied Clippy --- src-tauri/src/market_connection/native_compatibility.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/src/market_connection/native_compatibility.rs b/src-tauri/src/market_connection/native_compatibility.rs index 89be12fb55..452d510537 100644 --- a/src-tauri/src/market_connection/native_compatibility.rs +++ b/src-tauri/src/market_connection/native_compatibility.rs @@ -258,7 +258,7 @@ fn inspect(bundle: &Path, agent: &str) -> Result { // generation avoids reading hundreds of MB from executable/App archives. static GENERATION: AtomicU64 = AtomicU64::new(1); let generation = GENERATION - .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |v| v.checked_add(1)) + .try_update(Ordering::Relaxed, Ordering::Relaxed, |v| v.checked_add(1)) .map_err(|_| "Native App generation exhausted")? .to_string(); #[cfg(not(any(target_os = "macos", test)))] From 26a72395cb415e94cac73d5c01cbcfec85d49db0 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:26:11 +0700 Subject: [PATCH 46/60] docs(readme): summarize TP Agent Studio integration, multi-session fixes and release blockers --- README.md | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 65561e147e..1714e1b03c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,13 @@ > The fork's application updater is intentionally disabled pending independent signing and release infrastructure. > **Do not install experimental fork builds alongside upstream ORG2** until the app identity, > deep links and `~/.orgii` state/storage are isolated and migration-tested. -> See [FORK.md](FORK.md) and [the fork roadmap](docs/fork/ROADMAP.md). +> See [FORK.md](FORK.md), [the fork roadmap](docs/fork/ROADMAP.md), +> [Cloud boundary audit](docs/fork/FORK_CLOUD_BOUNDARY.md) and [session-stall recovery](docs/fork/SESSION_STALL_RECOVERY.md). +> +> **Development status (17 October 2026):** changes are integrated on [PR #9](https://github.com/TheerasakPing/ORG2/pull/9) +> against `develop`, **not yet merged or released**. CI must pass on the final commit, +> including Rust on Windows/macOS, before the pull request is merged. Platform installer, +> co-installation, memory/restart stress and fork-owned Cloud/OAuth acceptance tests remain outstanding. --- @@ -40,6 +46,36 @@ ORG-2 is where your team runs its coding agents — a native Rust harness plus l It is not just another AI coding tool; it is an experiment in human/agent organizations and org-level alignment. ORG2 treats agents as persistent, observable colleagues inside a structured organization — replayable execution, cross-session memory, AI blame, and a local-first Rust runtime so humans, agents, and teams can collaborate around shared context and aligned goals. +## TP Agent Studio fork status / สถานะการพัฒนา + +**ภาษาไทย:** TP Agent Studio เป็น Fork อิสระของ ORG2 ซึ่งกำลังพัฒนาระบบ Rust Agent Harness, +การจัดการหลาย Session, Memory และการกู้คืนเมื่อการทำงานหยุดชะงัก ยังไม่มีไฟล์ติดตั้ง +ที่ผ่านการตรวจสอบสำหรับ macOS Apple Silicon (M4), Windows 11 หรือ Linux +และ **ยังไม่ควรใช้งานกับบัญชี Cloud จริงหรือข้อมูลที่สำคัญ** จนกว่าการแยกบริการ +OAuth/Cloud และทดสอบการย้ายข้อมูลจะเสร็จสมบูรณ์ + +### Recent work (integration PR #9) + +| Area | Implemented in the PR branch | Remaining verification | +| --- | --- | --- | +| Desktop identity | Independent TP Agent Studio package IDs, two-tone icons, fork deep-link scheme, dedicated profile roots and ports | Cross-platform install + side-by-side tests, remaining legacy resources | +| Rust Agent Harness / Session recovery | Per-session worker replacement after unexpected termination, future-factory panic isolation and persisted failure status | Heavy 1/5/20/50-session stress tests, long-hanging providers/tools, native E2E | +| Restart recovery | Continue independent startup DB reconciliation phases after partial errors; avoid automatically replaying side-effectful tools | Crash/kill/restart simulation on each OS and database integrity checks | +| Memory | Initial file-lease and fork-profile isolation hardening | Cross-process kill/restart proof, workspace-local migration, OS-specific validation | +| CI | Automated frontend, security, Rust and quality checks on every PR push | All checks green on **final** HEAD, including Windows Tauri icon parsing | +| Cloud / account isolation | Ownership risks documented; app updater and inherited upstream release workflow disabled | Fork-owned backend, callback allowlists, secure credentials, billing and release signing | + +This is **source-level hardening**, not a confirmed resolution for every multi-session freeze. +A never-resolving provider/tool call can still make a session look busy; do not delete +`sessions.db` or its WAL files to "unfreeze" the app. Use the non-destructive +[session-stall diagnostic and recovery guide](docs/fork/SESSION_STALL_RECOVERY.md). + +**Important:** GitHub commits on this fork do **not** modify an installed upstream ORG2 application. +To track code review and CI: [integration PR #9](https://github.com/TheerasakPing/ORG2/pull/9) · +[GitHub Actions](https://github.com/TheerasakPing/ORG2/actions) · +[Cloud/OAuth release blockers](docs/fork/FORK_CLOUD_BOUNDARY.md) · +[two-tone icon and regeneration](docs/fork/TWO_TONE_BRANDING.md). + ## Features @@ -197,7 +233,7 @@ Use ORG2's built-in Rust harness or launch these supported coding-agent CLIs fro Current source version: v2.0.8 (2026-09-23) -**No independently signed TP Agent Studio installers are available yet.** This fork is being developed and tested separately from the original publisher. Builds will only be linked after macOS, Windows and Linux identity, migration, packaging and signature verification are complete. +**No independently signed TP Agent Studio installers are available yet.** This fork is being developed and tested separately from the original publisher. Releases are blocked on green CI, Windows icon packaging, concurrency/restart stress testing, independent Cloud/OAuth and data/installer coexistence, and release signing. Builds will only be linked after macOS, Windows and Linux identity, migration, packaging and signature verification are complete. See [Fork Engineering Guide](FORK.md) for current safety status. Do not mistake upstream installers for releases of this fork. From 8ef63aef4d29eefaad4c616c017f0bc7ee52fd7e Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:27:52 +0700 Subject: [PATCH 47/60] test(icons): forbid indexed PNG frames that crash Tauri Windows ICO decoding --- scripts/fork/check-icons.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/fork/check-icons.mjs b/scripts/fork/check-icons.mjs index 5ea273e4f3..2c74d59d64 100644 --- a/scripts/fork/check-icons.mjs +++ b/scripts/fork/check-icons.mjs @@ -55,6 +55,9 @@ function ico(path) { const entry = 6 + i * 16, len = data.readUInt32LE(entry + 8), offset = data.readUInt32LE(entry + 12); assert.ok(offset + len <= data.length && len > 0, 'ICO image outside file'); assert.ok(data.subarray(offset, offset + 8).equals(sig), 'ICO image not PNG'); + assert.equal(data[offset + 24], 8, 'ICO PNG must use 8-bit channels'); + assert.equal(data[offset + 25], 6, + 'ICO PNG must use RGBA (PNG color type 6); indexed PNG crashes Tauri on Windows'); } } From cf4751c0ee62a029a929c3748709d6dc3405ce5e Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 15:28:12 +0700 Subject: [PATCH 48/60] fix(windows): repack TP Agent Studio multi-resolution ICO frames as RGBA PNG --- src-tauri/icons/dev/icon.ico | Bin 7037 -> 99387 bytes src-tauri/icons/icon.ico | Bin 6390 -> 99387 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src-tauri/icons/dev/icon.ico b/src-tauri/icons/dev/icon.ico index 8b753eef8762a2b86e453a937bb86669455db3b8..82f0adbb921bd52cea0709d1cdb0d2eac744f8f4 100644 GIT binary patch literal 99387 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�+1aj$q-$X^2|yixBuNdb(5Dom~K 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 diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico index 00913da27cf0ea2811483e26bf249595a2772d96..b67b24099ebb38aa9b15ecc528a8c60a0cfa3eba 100644 GIT binary patch literal 99387 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 GJn?^lFBV<^ literal 6390 zcmd5=dstIfw%_NG}yDI3xkWJ0Nu;wRi#v28);=7PQC&#RnGKKxt@YdMwf6}C2;c#d1n^FQSqK160RSj!oc;r(x56(?kJHH*00r>NFyr($JowCq z0`TJGH%kCm0l)Ru{MkXG$s))O%C(pZ;2l~3BmrfCE-83Eye+rp6`IMZ)BYbHMcgc9 z`jb=WqR6~*O_3vZ>AHmH+$pcNq}6$+H+N*b*_HWrU)HhD%_qOgJ$rNR(4Dv>`k&CE z`h|l0`GBPKwAJolHox`WA3yuse?R&^S9zOgCxqVoM zJ;$<%Zght&lxcAgPNv1 z{My}jZNhz&NMH4>XbC9IkKya=A-%|uk_Bxu3wc|p2=M;;`DC!a+-_$_GI9ShyPfP6 zTSEz^Xd`^!GNe$5gLv2c)Vyu=mES8OJpFh&GJ%BgrEJuq=Jml-`%yvXl zj1TfXioQ6@bbmQO(rQVZI%zR|-_N_JqG=Dx0@SGhe3I;yn)=q``)Er^A^Er+AjS@Q zj?HE?krI=Fi}Vqco5a^DLWhsT6bOY$a0KC4s43J4{tV0=pKwxnT-4pScxLn3GGiX6 zeFy!N4DW@S^JI8AFBQQEVhM2Xj^+*11v1>5nZ=h-lv~Oo?Ybm4-U^jXqaZXgh(@jX zByS+j33BK(hN0qVAsuD2S*p8b9!^B$L9N7Sbw#Ia2x~@g+y)AO$av+DPB0yLCLobU zOX&);nHLww(;im865z=pFADM&!V9A84C&-)AtW`TGMmlCAZuL^-%r-?TN^1kw;nBh z1W~+NGeWn{oE$gL(h|F@g>hl-=d37+D<=_gfsJv)m0P!%cf!Qv z41(*P9kE^+@OAB+U6s9M88XQ!-8+X)S6>usN$!$e0OtH}uPNgJT z5;-kPYC6;?;R9ye6RHh^NT?>T?E(#wjtw_;2XR0QjD;yaQ6FyTjWI!tS`pPZZJRqM zKcf96_M3nT5H)4&_rVF{&(+F};w8vP1Hs6$ivze2w`G}0XXJ4RlvFIOGKSMRGQ^$h z<~XF+)ajw5l!@Bu#W?*q5lt)Us@P%I0Ca{6oWu#NH9BA#SS*XRy6C?mT_Ij~S8HpR zn@XdiqtYPiQbvAcKxmckO1l=#lQAs;;d@M{Q;kwPb#>)iW)>_Z|NIBhy%06@)d*&g zQ`Ob;d*f=~V3siQR{0+MmG<8R!*Pza!fKCJQ{_Lg@ zZ>w5q*(ee=ygyFz12Cg_=oPimJ!0p$56v>sE&`B@yIylG7`o z?-B*5X|Bq_$S)5FWixJA0f!5CI(gVN+`a3xAGFC^FV=`)2uOj_A&|VRki4u8zgMX< zoaf0_RchMO$`e>H19;?K^_x9Xj&Iqo4KoRjMShh1)=dmh*SU;tR=rBAJM zbMoCfrUi$MkBg!|-);Gs!YTC{**-j!OP*B5o~2DfV6%h?i4oDJmhvpa1j!q_Ob`5S zC@>`Ogs5|rntn1>2)i!KG7A&C^{0$0W=7{46<#+`*3^b@T91GkKHG>Y?sxW>;63A+ zZ3!E$1`USSIEcNNDNA8O8uWA}3cD}NA%rcMvS?0ERAVG39tSSW>04PjLY@)_DvMcK zC*PpY{JGW~42Ma|dFLbo7pV6?Y2dGuoncb0s>asmVV|@-!%q4jC~rDl?lg9KtJv)? zNKN5XKT8#V`M6)a`(`BGjTzwSL-pi9YDXzh#3I!RiZ0 z!bg4&a-~CZkzbju{#M3pf1_rXy?reVkP=Uv>CBdob?U8{zFH(*$mXv95J`B;Px99( zw%27FzK>$I)X3SHxOmnJ?32bb?zxU)@cz4)^kf-oP!6EknLlX2LLRc+uSZKH+S;<~ zucu|%cieyL8mY{=AIZ1G3+m?H-z>4Ti|cY9ZkD>A4c3dL^Xban4&_m}f0XiltUeKx zG3`#z0*4Y)ztZ2Bef-fpVoVkhr8=boII$cJJ6R?r-UyL?etX^s5{#AV^LEn%;PvNM z4oyc$@Z3^6t_2Trx!)7H_TrCfNbu4#D~V4Z6`)-z2Z%W-Lmh`AmD_r#A#iwKlgx%Y z!KNjSp-r`RbX23!#0dPSG46K&(;Sonr1B2yUditPAAUWij}#htL#NC+RvB}Qv@61G z;Q2}iehj6-2hn=pX}a=&pIF7O0n6vF97-bCVEuNnKqw>Dr@K4%Ca~h-LoVU) zKEO^4o5v?2zJ?uO-oqH5TWI1{pd5@O#&bd)!-ll&xM{Z8-ki>h;%xBfgbNg1K*o9s zd(oBi$uuu!oD3RKQep`Le^IzN6W`NWvIHtstc#DILli_pe;D7vDtQ#)DJGmCNR$Qr zVOdQz9s-5hk0;|8JY}!K#(D3$r}_sG!*`6YgF1$A2GiJ5AW!__$d^+Z(shIi0$YP@ zLOu3Fn~q%v=*8p!YXNc?^*E|>KFPlj@I(x|0F0!-KNX5n>FZ7p^m##uKOWSd9_*SE zd@C$~vH@(LL?{?Ny?uN_u;*#e4Hl21dyHP2n)9*H6@U=tZ3QkQV|;Oo7#~XV9b45G z69T5Ug5c+H!n(7K;0hdHCbQqAGuGm3hRdB$zE z<-y}3Oo%vMx2RzVQSm5=Kb{EHjUza~yaO5M5049?@sl8e55^Jj+ZS`N#}_Q4+JItf zOH+}xu+X!;srQTH`xh7oIJHRYB*u3^w@A@iRfoJWK3hl~1B$-pW6K;oWc4@;fvn!o zmz}zFsZYMhPTK;)g92?BqwYHWn0dx%G=J{+%;|7-T)4S1s(so;5u!+s~q8y&3sK9GLe5Kl1}IepH-EWHmdjXOL7s_V7=sKG|pAQP-G zF8r23Tm%TVRN_DTc=>q9!Yhm$Ae1fiq3V1?1W{~`srico<|UlGi^?*7E%I)=|~GQcoe54!OLBA#e`0TFDjP_MwgyniAeV>TRz5G>a5RYMK;4lPPYz zmqix2M)E%~I3*$eyVApzuGm3;An(eVCsIeMB*}kT3Lub#^S8@qmIS0Fj*s~(jD{<_ zx(!PeE7tj|XH8bd?~U3MEkEZZ%@6fAq+7zH+t=Ea5_jW+sMITmyGu!53=$4rMZL?p z_ei+ZnN0KACf1?~>tCEUY#Hc!fCvoL>5IOu!QL0aGaDBQXH({5b-$;=tcyjo|ynIiula$nbk(Jvl z&hjC1Cv+-MI6;kU>qaHI_z78&C5fmrVv7Gawt3ra=FjHrf}Uu4o%3nV5=s% z(i0}8BG!+o)`b%bnheV<>hBZtE&|PK|CRWUzh=JqVZ@8{6I(h1&21|4E?mv!Z>nBg zlbb|Tg)&{o&uRlBNpM6vc(cpdlmVM$pj9BN6t48-2}?oN(sj0H(J~Iw+X7t@QBlgh zWy9vEX1CVXC;pp`@wQXFq3bUGgfYZgKwj9#y`aMsT|mE<`g4a&raq!tpPWE{8WiQn zSjh_qCT6aNfO?;XZ3MJGJz;4&yMP=ihQ}_$DW<(-f|XEM_0B;VVt@7@?Q;ju-?QKyG)%K7(RxOZ5S zKF{(Kt)l*pJ^^>wV9s0+Qca<@PS!ahCd|S z#%xBWj)^wu*fWguWqh{6Uq%Z`oEniM)e8?)GM+(s9@*`8qm}Rvu!Rm2vYh_{tApYi z_zGydLoH7lVA(i>6U1UMO4|WyxeC%+NQYoydZ!4fG_&qiqO$3=v>iW&>z_vK`X%3j zyWx80`0p*GV+|l2;!OnmDI@L_!TV_@q|v>EERqqZ#y6w!kV+!ZP(uHcK%*A==K_u0 zp?uz;4DBSO&$Hb$kbGAqtJFlbGgZZ(HQg>#iA{o@jZ{gt+y%lrvoh=v{6kAheV1P^KIusz2G0ISuolTsLKmS0n8LqE4ef+ldZW)pno~>4m zRr~imY75r~-_`rCdpo|$#_db4hPT$RX9jb6x@IGdXDh=?W}aAAyQD32R%A->B*Bzv dYi>RGU&nIpd=9{0BLDPb`0t*8Pyc=$`4{v0Q Date: Sat, 17 Oct 2026 15:53:24 +0700 Subject: [PATCH 49/60] fix(ci): ship RGBA desktop icons and resolve cross-platform Rust clippy failures --- docs/fork/TWO_TONE_BRANDING.md | 2 +- scripts/fork/check-icons.mjs | 55 ++++++++++-------- .../core/tools/impls/desktop/escape_hotkey.rs | 31 +++++----- src-tauri/icons/128x128.png | Bin 1511 -> 65737 bytes src-tauri/icons/128x128@2x.png | Bin 3215 -> 262488 bytes src-tauri/icons/32x32.png | Bin 445 -> 4196 bytes src-tauri/icons/64x64.png | Bin 814 -> 16516 bytes src-tauri/icons/dev/128x128.png | Bin 1660 -> 65737 bytes src-tauri/icons/dev/128x128@2x.png | Bin 3553 -> 262488 bytes src-tauri/icons/dev/32x32.png | Bin 490 -> 4196 bytes src-tauri/icons/dev/icon.icns | Bin 36364 -> 1399337 bytes src-tauri/icons/dev/icon.png | Bin 8300 -> 1049236 bytes src-tauri/icons/dock/dark.png | Bin 7568 -> 1049236 bytes src-tauri/icons/icon.icns | Bin 33475 -> 1399337 bytes src-tauri/icons/icon.png | Bin 7568 -> 1049236 bytes .../src/market_connection/native_admission.rs | 1 + .../market_connection/native_compatibility.rs | 21 +++++-- 17 files changed, 67 insertions(+), 43 deletions(-) diff --git a/docs/fork/TWO_TONE_BRANDING.md b/docs/fork/TWO_TONE_BRANDING.md index fa08b9664f..43c7b176af 100644 --- a/docs/fork/TWO_TONE_BRANDING.md +++ b/docs/fork/TWO_TONE_BRANDING.md @@ -17,7 +17,7 @@ The fork's native desktop app uses **exactly two brand inks**: Midnight Navy `#1 ## Regenerating -SVG is the editable artwork. Rasterize to the same resolutions, package the PNG/ICO/ICNS resources, and run `node scripts/fork/check-icons.mjs`. The app's image validation is part of the fork-safety CI workflow. When changing the two color codes or path geometry, update both source SVGs and all bundled binary targets in the same pull request; do not ship the original ORG2 icon accidentally. +SVG is the editable artwork. Rasterize to 8-bit RGBA PNG (not indexed PNG, which Tauri rejects at build time), package the PNG/ICO/ICNS resources, and run `node scripts/fork/check-icons.mjs`. The app's image validation is part of the fork-safety CI workflow. When changing the two color codes or path geometry, update both source SVGs and all bundled binary targets in the same pull request; do not ship the original ORG2 icon accidentally. ## Remaining branding work diff --git a/scripts/fork/check-icons.mjs b/scripts/fork/check-icons.mjs index 2c74d59d64..637911dcdb 100644 --- a/scripts/fork/check-icons.mjs +++ b/scripts/fork/check-icons.mjs @@ -12,39 +12,50 @@ const sig = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]); const navy = [16, 29, 51]; const cyan = [77, 216, 245]; -function png(path, expectedSize) { - const data = file(path); - assert.ok(data.subarray(0, 8).equals(sig), path + ' missing PNG signature'); - let offset = 8, width, height, palette, alpha, raw; +function assertRgbaPng(data, expectedSize, label) { + assert.ok(data.subarray(0, 8).equals(sig), label + ' missing PNG signature'); + let offset = 8, width, height, raw = []; while (offset + 12 <= data.length) { const n = data.readUInt32BE(offset), type = data.toString('ascii', offset + 4, offset + 8); - assert.ok(offset + n + 12 <= data.length, path + ' has malformed chunk'); + assert.ok(offset + n + 12 <= data.length, label + ' malformed PNG chunk'); const payload = data.subarray(offset + 8, offset + 8 + n); if (type === 'IHDR') { width = payload.readUInt32BE(0); height = payload.readUInt32BE(4); - assert.equal(payload[8], 8, 'Expected 8-bit palette'); - assert.equal(payload[9], 3, 'Expected paletted PNG'); + assert.equal(payload[8], 8, label + ' must use 8-bit channels'); + assert.equal(payload[9], 6, label + ' must use RGBA PNG, not indexed color'); } - if (type === 'PLTE') palette = payload; - if (type === 'tRNS') alpha = payload; - if (type === 'IDAT') raw = raw ? Buffer.concat([raw, payload]) : payload; + if (type === 'IDAT') raw.push(payload); offset += 12 + n; if (type === 'IEND') break; } - assert.equal(width, expectedSize, path + ' incorrect width'); - assert.equal(height, expectedSize, path + ' incorrect height'); - assert.ok(palette && alpha && raw, path + ' missing palette/transparency/pixels'); - assert.equal(palette.length / 3, alpha.length, 'Palette alpha mismatch'); - assert.deepEqual([...palette.subarray(0, 3)], navy, 'Expected midnight navy base'); - assert.deepEqual([...palette.subarray(palette.length - 3)], cyan, 'Expected electric cyan accent'); - const pixels = inflateSync(raw); - assert.equal(pixels.length, (width + 1) * height, path + ' invalid pixel scanlines'); + if (expectedSize !== undefined) { + assert.equal(width, expectedSize, label + ' incorrect width'); + assert.equal(height, expectedSize, label + ' incorrect height'); + } + assert.ok(raw.length > 0, label + ' missing image data'); + const pixels = inflateSync(Buffer.concat(raw)); + const stride = width * 4 + 1; + assert.equal(pixels.length, stride * height, label + ' invalid pixel scanlines'); + let navyCount = 0, cyanCount = 0, transparentCount = 0; for (let y = 0; y < height; y++) { - assert.equal(pixels[y * (width + 1)], 0, 'Unexpected PNG filter type'); + assert.equal(pixels[y * stride], 0, label + ' unexpected scanline filter'); + for (let x = 0; x < width; x++) { + const p = y * stride + 1 + x * 4; + const rgb = [...pixels.subarray(p, p + 3)], a = pixels[p + 3]; + if (a === 0) transparentCount++; + if (a === 255 && rgb.every((v, i) => v === navy[i])) navyCount++; + if (a === 255 && rgb.every((v, i) => v === cyan[i])) cyanCount++; + } } + assert.ok(navyCount > 0 && cyanCount > 0 && transparentCount > 0, + label + ' must preserve both opaque brand inks and transparent corners'); return data; } +function png(path, expectedSize) { + return assertRgbaPng(file(path), expectedSize, path); +} + function ico(path) { const data = file(path); assert.equal(data.readUInt16LE(0), 0); @@ -55,9 +66,7 @@ function ico(path) { const entry = 6 + i * 16, len = data.readUInt32LE(entry + 8), offset = data.readUInt32LE(entry + 12); assert.ok(offset + len <= data.length && len > 0, 'ICO image outside file'); assert.ok(data.subarray(offset, offset + 8).equals(sig), 'ICO image not PNG'); - assert.equal(data[offset + 24], 8, 'ICO PNG must use 8-bit channels'); - assert.equal(data[offset + 25], 6, - 'ICO PNG must use RGBA (PNG color type 6); indexed PNG crashes Tauri on Windows'); + assertRgbaPng(data.subarray(offset, offset + len), undefined, path + ' frame ' + i); } } @@ -69,7 +78,7 @@ function icns(path) { while (offset < data.length) { const len = data.readUInt32BE(offset + 4); assert.ok(len > 8 && offset + len <= data.length, 'Malformed ICNS entry'); - assert.ok(data.subarray(offset + 8, offset + 16).equals(sig), 'ICNS bitmap not PNG'); + assertRgbaPng(data.subarray(offset + 8, offset + len), undefined, path + ' entry ' + entries); offset += len; entries++; } assert.ok(entries >= 6, 'ICNS lacks high-DPI variants'); diff --git a/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs b/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs index f445043774..ffe9ef0d9a 100644 --- a/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs +++ b/src-tauri/crates/agent-core/src/core/tools/impls/desktop/escape_hotkey.rs @@ -53,21 +53,6 @@ fn consume_expected_escape(counter: &AtomicU32) -> bool { false } -#[cfg(test)] -mod atomic_escape_tests { - use super::consume_expected_escape; - use std::sync::atomic::{AtomicU32, Ordering}; - - #[test] - fn expected_escapes_are_consumed_once() { - let count = AtomicU32::new(2); - assert!(consume_expected_escape(&count)); - assert!(consume_expected_escape(&count)); - assert!(!consume_expected_escape(&count)); - assert_eq!(count.load(Ordering::SeqCst), 0); - } -} - /// Enable or disable the abort action (the tap itself keeps running). pub fn set_enabled(enabled: bool) { ENABLED.store(enabled, Ordering::Relaxed); @@ -215,3 +200,19 @@ fn run_event_tap() { CFRelease(tap); } } + +#[cfg(test)] +mod atomic_escape_tests { + use super::consume_expected_escape; + use std::sync::atomic::{AtomicU32, Ordering}; + + #[test] + fn expected_escapes_are_consumed_once() { + let count = AtomicU32::new(2); + assert!(consume_expected_escape(&count)); + assert!(consume_expected_escape(&count)); + assert!(!consume_expected_escape(&count)); + assert_eq!(count.load(Ordering::SeqCst), 0); + } +} + diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png index 99d09274678143d24e38f7aa996ce5c8ac7d0f40..3d6b4b61f0a373eb341fe07a9b523c88bf462070 100644 GIT binary patch literal 65737 zcmeHPF{>m+5Z;%F9GtwsKooH^5d$A81_tMPyh9)A@eo176-~udP-Ha_%|wiE1tURS z5CpSDL=%OFnTbEZ=tUQ=^*ye+dVMw1Q$5{1J+pPt*F81e)!p@dRb4Z)cVC>|eCg_y zhp)_Lv#TdBAHPoZ3g!O$=4EnNQ5O*i_){tde1701BAh1o=B^6w zcs&vpe_?iA)+WH9?6E)-&Z(Rk_|=dfSj@XRZ?Aqd(Ge93`DMMlOH>6WN4>xe4L0zr z@%Sb}=YZt&xy zfO-Fy`b3n9$CB@1jhjtlMi5w8y~8%me_ri9w&m%g{2o1 zGv9+xyl~;!AzT5OkIP|SSSfBw6(cji6<9Lcbzn7x!9BZAI_ zr5B`~FO>8-KwOD>Ri_58<@N1q>y7Rwl$!X>N_+DLy<3seMQi@Fvp~Qb=DAuhd6%v+D#hIu@>9X zpdn@2r0?m^zR8x2LpMTv*HU9rD1y#~LxSzkt@S#52=aBLzQ!C~34ngJC50Sov7Opr zvHG;0<1cAs%!N6-k|5O+NeUZtti^VU zN&4!jA?XY4L3=!%ENzOhsC4HfNjxj0ZSc~n@rgPrcdR1)FhY*gr z@R}F}?bst^Y)PRAIv3^yxJ@?z=z6B2pEl`3UIDP%5;)vLAM|ZoE5A3kq>y7Rw)y5t zwR0zZ_#E5@yiYvz)qFx8Q&K2`&V{8w=kw%D`n1OiCj-Xvb+)y&^9+>~a;(L6+a`0| z%bE0Pe$~T)=WR_S7(-Ghg3g6GKyK3cO1iCbPjY$e&6U`j4eL2=*J65q~oHk5qk}<49`$*|L zy{*;~P@5ELjyH|1{k|gTT<8x-eXRv2=JT%B_-(+uds-60ZrY?!OR^YjIM!l2MyX~@ z+u7`l?dn*s&_)W&t zp1)d>wS|6nPYaGV4~acuv{9Nzd$Fxm7}MV#120Db{9t6S9s@xddl7V(1bg=)$VCl% z6?}WQx37X73G8D~+5ePEJomZK0aLPWdIjqeFu&F$h1z6{&y{l?`y5PpfFqgxAmpws zoK14o+}Xu;u8Bi>wU2JvuY({NUbHlQB!cJT9{OlL|Hgd%(>_v$Y^S*|g3g5+WvTmW z!*%SlGXTI`02>AESWt4m(@1S&jf| zWMfPE{5^?Y&xQVgA+NPzHa02L>~U;KpT9Sbwb=Ft41HZwQaHw>&&N*$oeTW|HC)$_ z6l$YUElHn`AIDm3`vYpY)+U9>7h<35rTuF2k(&NL0DnIs=v?RzsO5Sn5QZjSYWs7n z#dhimQ|cQc4A*e{q_m+3Iv1v#EQc;_QixZ*vFpIt(Bmh+U&EWe&|W##VmqXuhWi?? z#CaUMX3fiTa4dms|v$3v*3uddvOrv(45VYq8xn z*zVNFBLNY>o(85vfR)3wb4>&|v?wr%V*ru-uru(yqeX#95MaeIRkbY&jGh4T-tU+~ zBsirq7g1|>YcxEIR4GDl%T;kV63Q{30E@Z9r$|i` zA~Ce5gW(AP4ALfi8V1qicu#=vW6_|j4Pf&$&-og_rM|QfL<4+0G9u(B0c;Fg59jp~ z2_VCw?kvuTke&$j0xuDQh_Ixxp<-l+Cj)E;8!jaqk48otSWrROLc+48Vx+j26tD?w z0~^6si_rjV3pERv1j80+fEAsGFoJK}Rr^WUX zB5XiwsHj!3M#_kF90fbJbZT{Zm8h*!raE-+5rI0=VJyyQC;qT)Hn#rhzuvje-8tX+ z?m6GN-eUW*80Bmw03arxV;$iYiUUW(^W$Li)9|vcxNvnY@pAV6=y9n_$ob3TnUci9 zisTZPvAibjJwEe;maKaJf=^B_{;WIaivipDpK^O{=l?KSH1Z@hgLxeGNN;u6R{?@D zGsR99+oLS;rd|Tz_nh6 zc8;HL-w42CNA}ci5c;i^qe<{sowt@00!du9&=X*Y&PR%2Vp_c$pKG0s&Xv_b?=s(g zC|^h+{Zo$QOm#60p$0@JONaL-6SdCEQC04(Qu0?M z`L+gN)5i~b=cj+vg{ow6f}YzB563>xfd^KmgT}Sf*%Y#PJ%TgW@LO&abZZGGC<6vn zDJI9LHK(TBsANRzglBF52{i{>e6ub9RvL%D(Lp3fMv}fl*cyY$akBt}0FjYI0wn;{ zjbfye@#(3QjI@jt9&zF0XtbH)l)l$7WTSOHTuNp-A!60Q78>IeZ6KjHgrL#5W`;g) zEkj66z0gBFf`|9OD}j6Ed42Ln4?}v4P+nS^X$5lljy<-1W1aX{&q&% z^L;hh6jg?dHR4dcv^2sC;kioIWR;2xNXp1)tqDw?8sYPK@eAQ+JAIUjVyQ!ZRK&+{ z14A-fjQ2c&a4K z34>G(TO!6G*y*Mv)FD%S#lF`Z<-{-FDMPVzI96k*MMG6ruj)^&TM{wXfsIu*;5emO z#iHC=*h)P5%As{K#6n>|XzopvOoTB+WbO-f~>tq)H%wCUM)zf}w| z9~CTsL%`>e5m(OqfjcB@k=6w@qXC6_(Su?j@&dk2 zDLR4ihpz-dho=4KT4gu|gq(EAqj$tb@1PSxRVK@jRK2Mxxg)D0O#q94PvfTxt}voT zcscV-F5|**8w7Cq^MJxPb_HK=W9{o2EtM`KLx?G=0VTHfH|nqfcEZD*P0>E|n7EF- z)J>;s1^ft56y&?W84s`ESHOrGJp$bRV{uWQoj1W243|W*7_{@;ixWoC+tkOgnWA{+ zL8nchfw;xXXi(h1wp7?G{~V>$qfB7uNaUB?7fa`n$%Di^1rd=u2aWsxRa_~YDze7; zc|g|I#fqq1U{Tx3F>UHjXUdG$=gQ`0-Kz$TmJh{(=|@>x9E&uXnJNh;){!0&9Pw)k z`jU1hisq?cxL{yI)fn-8RHU+CdA+8=ob#gATu|hs5~I_DgfD0gF1N^P)K_8VxORG1 zA$qapUE!rKV+t2A6>e*%e~WN%tBOsa1_i40=BvS|Ba?~PNkkCL!KTs4qw3;w02?}Q zV^*Ua{CFGPrekI3#mkk#*H6vSp*&+fa`(3Zrr`p7=-JDFA~fK10#jO%tR(JF`8&2!SVduxlr4$s=NN&bN_x1it6dE?z;D!-}%nDr>gt? z{QRvqUwQc>FCQHpz4GKMkH2wr^vE7QI{M%TZ1?RS{PufCFFkto$>T47>xYky?(gk6 z{$T+ufCaDs7Qg~n01IFNEPw^D02aUkSO5!P0W5$8umBdo0$2bGU;!+E1+V}XzyesH zbPF7R?6p(d&TYH2?aH?6hwaYx_iWf;L<7=B(1|o7?MOqXrR%-x@tK2;ZM(4TnQb?= z5#ZRsLj%&5G$ySbcO7)OCvOf=h9}?&bdNxv`yH=1GcJ=;|D1)HBV*tOxBEeVVlUh)gine8|Kh}w0q$Z z8%=*Efe-K+gFYabLo9Q;O8x7`oS!4}aLzI-9%=h*PAqhFj2T6j@zl{rxY(cv4M^); zMik}D5W3Ogj^GD=ooPUtKkq8j4<~DrC+m~#d&u^O=Gb2~V8O4Ocy4SvWE@_{Mm=ai zvCzlOL^e@MeuBD(pk6x1_Ll?}{7=dHR6S^5uLhnDm&(mNHm6_V_`Qx_nlU)O-Ad}J znZVaX2z~+|_%GH#8xSD)7dxKJ-fm`J>f5>@K=2d%Wd6+>s1pJN|7OQ8%@!QrZskxH z1T6UJ_O~lWK$FL}bzB{=;MaA2M1l>_Kzt39ee19V{;6%cp#kS(12hm{1B$IO?-;a! z9owc`8gV=}Km&dnP>dZHcb|X_>KVZg{LnxW4LmCf0OoYo{eHwJn_}BB4V2Lju;5qe zueHh8AbAeEpaCBZDCY7n1#A$M{yq*SaIotk4dh)4Sn%sN{0ClYqRY|atK)P-vR&tfCh@tz->|hnA6GrWS`oy zWb5NiR|Sy$i=ck%f@Xfpl1!Q^z=EI7|1!rQWbBnn1843_0RzBu+fq%4^I&T)T$e?ssBKQvIZ22R`{V2;1U`9(XQY&kz$wrZE|wxoghKN@1e&zF7(l9qy`<+;TFl8^!5h6;cR2n|%Bft#p(0CT#&^WQQtnH&CX zO#|_ME5L%ETYm|V)&ivU`CLS+0t^7G{{cYj0n^(2;`IRx0IdH3Kx+Zg`h4Q`0a*Xj z|3CxvX&}lHz#Px@f3kn;*|OF7ZNDGD0B{cd>!UwD!)J=!%~gPX2>1U}0koPSTc6iu z3;t!FppcepaW1^|bRgpjaNs~U&`fIBJxDgZQ4r3UU| zQ~<5gk$I8%o7VsUK;+Gfoa$t{IspIx006YBfusBTqoackh63#>;GpwKkJIU~7ux^; z001aD)&KzL*!jI=Ip#TC=>Px#Kn2jT1^__E&L=ZYXU1M^0{{R36+p)t005Ob|D$Jb z-+%HuKfeFWkAC(4O^@|l>6xq6ahGn_wc`T-l>tD3{>GpGdH?l)ygRz-H66275MJ-A zb=+R|DCKhjKqUb9(5Jq1|Ha?^Wi;r=V4!35p4>vKb=TCL;GWv?9P1ptKu;Ilvd&Em`-f%{@m@^mI-DP%r>u1d)PIjltBS-q)yH0)!m!N^Ps0=K}zR0zj9`p8W0K zo3m&Lwv?9$b*^yUt$W!Z<=AruV~%qJfC2%a=2@%^8Uiq7CXH3Ogt5yOIh&a|0yEV) z0YHHOSkv(j!7{bi4MV9!rE^V@NviSpbRGau7yv&1%il*29tB&zdIuEmL%}an>^GFeZxz7Or3IRaO#@R4n!sC>Uw3gV{Q>}L zy%ji&f8U;_;C2X50c5NIyt8EP>*pT#GwcE(M|BgboEG)~AQJ$*8)c>3L8p0o_BRBC zlnu@nf_^v$0FVIy-c3IRMM;^_yV9X4xPB=B05Sl;yXjZrx9DPgt8usdAO1~Ka2*5y zKw<#2-1HlkmSc~%{64@i*ry)T6kHAg0FV#>-lcHvrr%i551*qcxI93I_VaiQ01^S9 zm!{t#k)(e@Y;CkCF3Hsr&03ad& zyi3{In|?##jXkC*2mq>W3exn8BVL+SD}+Ek5U6 zNvSC)pS5VarE>xR8v&rQm8M_(td*iEDBmp&nAVO502=||-Sqpyum9AoNHzDVul~k( zp05wTb`JnH0N~T#|Cy^mRax|$rBYN^@?mRPeaUfiE$3SD-V{y2l=E3K_Y}thfE55p(e(TH+fUttOu?lxSg=`I zQtLf>Zwg4s7E8ys#ol05v!L z6p(Ay`GUEvV3j!(T(o<6q0L%bD%}u`)0W$^yPYBQyjJFg300#h&qU`i)`sE7# z00d76&=iaV0RV6S0JS##Qh+N2`o6tqcb%r-b_f7~Jpib=>F3$)-xu&>uW2kEH?^dI zTmF>BY}UR8j`N>gwh1OUJe0Jdbg zIf19(nF_8L&#xK(njafk^P?RaTZ}nQea2ca&GDO#@gD!wygZ)=00RKj-1G|~NqNK1 z+`tLPX>4Jf9{Uv4TWd{00Pp~Snwx$hn7ro@0(r~c`!2f__da;fA^0=J9soQ5K)<-V zMc9Ylt45W#L%r9*hvqovbwR9T+=rhj<1x*0Kfvrvw7s*^b11L`qw*nV|~8H8piFpZ^5sg_R(hp05gJD z`R{of?5;4p%idVQug^)b9Fl!Jn}V$@0|0;tC8oH;XL)`RW;gitw|B`K<`rX~YDpx! zcs2#c{1ErKqkBuy>n`vw83+`B0xlHXM++$6AJ}st000aCtOMRn3IWyu03b;xXf6d? z=orxnd@-n6@atR+uRV?mz$yT)1*WS2xEA;#sMZE=jQ0Tm1Aq+awG0Sr;S^woXdBCT8oknRD%0|315rA={ZzW?S~&_tJW{{=>Yz=MW>a&;1Ml@BjcAjBf<_ zE(Q2TP+8?a6~G|)12NZpr#57UIeYKh1J{gy&AqK_`X=7rsr797$+zC)4;oClrvli4 zfafh_0T7<+V3ok(JWKWp9)1;Mx&lghYbOBM3CffP(YX`|Dp!{T(9&Z)n}S=u8Kf+y zu?=CM$9ir}brJ01+5Pu!`bi5zd!*K*=lQ4rCSc>;Q1fgGuB`$>uzKt@CJ!Og^xM`~ z000vJkXUPO3i8|F)8+gUz_s=>K)VnI0DAx+V{IvW=LpTKDVU;{F=u|BYiF8%+p@p( z4FC=RAVnZ~H3d_Y$NM1QxyB$pZyIDBr-vHnM0OXvSn}WF@;2Hch{kCWR0384@ z0{}8s?M*=irKC1`vZUl0Fd!&Z3=4a3Lwv`1Nv;8V^?Ic{-)^{uk;T-0RRgDkRl6tH3fsy zm7%xXEVP^X^;uq7Ka82CU;N;gZ2`bS0LW-HHw8mLX|JGFMYEXUz6Fp926Z z0U)Q<+!V|yy1D00vE1sd>9=cp0I&f7GG@(9!Cf(w_BTzxb=Bz-KLUV_07#Lg)LmcV z)E18Qyjr2ff_kMftg8=|Y0023Frr>*`r0F+5IQIo^tk(cQA^^x? z-kGoTrXWqfvVvcl1ON#EAcObZ6r||~0Js&?Akbq|kfvXG!A}K{IQz@s+InjWdM|xw z`mKixOMpxe=%p!0({FunhJ@j{2LPD>Ag6j~#@tOonto*mzcdH{G6FyjXt^m!(+>d9 z^qT<~@1~$C4bL)i?6bYA8`*5^ygauII#d8N0@Pbn-c3O*1-$35`}sQOmft+s_gf6B4964-O+0RRdGfE*aBnO5^&E03@^+-=fPAL^0r{xwjN-CC&u^6b=B1X3H(LdT%b_)jIB6_R4Wy08jw{)D&EE zWkB!Idvgd&=d5+yx$KqWya1pA0EA##l2LVR&fpJX));CWcNl-`djL=g0D=&;w%&K2 zyJOHQ+06}=VG^U`^4L;iRxQ5GRwT?U3y|q06s1yLL36c5u z-0647t^fc4WNQ*05+|?wLjeE)007Xj1^__E&L_kAXV}th3;+NC6+p)t00133zx3=> z{rHaV?N@gz5EvAwz)96d12!(U)B*sAvsiHgKL17q00000pkoch0Kgrj_9rzq#>NgB zxQhXRYlnf6l{(H!=qVZOt^ojn25kG)KokI6LF{D2CRqCoRuA7_#i#%-0RR9%1669^ zG6n$7aekG~_sA%GW?dD^c?1F`v18{zo&L>;fm93-uD@yP`0N@4) z00A^ml?HBN0^k|Wugdw+vkCsM&i~J10^kAxR3`u+(DxGHA|?Qi0RR9%1666@I2r)- zLFRn=0DWf^DvEmiA8-91C}IGh4^WQ)2-d!R6>t4N008#`^erl&Qjh=RT>lTjANE!S z+_Da=Y8^<>))Ta`e03Y*HTvFypYH|qC#YD$)HE=eJRkz3H{96Q2qyS3HN{lH@ zMdH`|+a-ww{{;X50BE2n4P5NTsq5e7e5!ynWG91S=R+Dum;D1(r~-|!dfO05 zoBan6xTXvQ1ZW_u2ChRqCf}RmxgyYZW}$K@-@j+c1Allzg8*L=Dqkc7a+^Mi|D~T{ zaL;*c0MKs*+}Vc6umKuKrvb%W-0%F)3HY&NY#`?V005$aq#8IMi^Xiune$l+q@zEX zwr^YKFa38(V*t=n;D#)aGz$QN{y?A@E2H!ufq;HAL~9d-i4D*|d<`hJe17a>H<;J{ zZ3Cnq5a00x6E>9w%3AkNLBa<5)HXzm4bVV54LqHSw<4c609*k9AczK{XyB^IAU`xH zAP~j*WYKt8v_@Oj8Th_1=p1Zefp!)>4S*ShX0;6p{RZP@zoqukyPaS6yJ+e;B6d2+o4%%~@}UD_tHB0OwR zk_MznY4c>g!g=Rx3z(sGGm*NfH@1}|1jf>jKcqcru&(5hwaYxsfEM&>ae-A5p;58kEI=Hhz!3e z8hJAozyeqR3t#~(fCaDs7Qg~n01IFNEPw^D02aUkSO5!P0W5$8umBdo0$2bGU;%#% mJbLNTfBx%#n)1)^=D*%~=NI4n>nAkQCvUv<_z$mN{N#U?T&pDj literal 3215 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 T{P(lj5di6_87ZwvdegrE!L?cC diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png index 5c479cac5fdac5b4c67f1012c429f1f8ca024d5c..78ec56e498f9ed3a6586b58521543d37b71fe2b8 100644 GIT binary patch literal 4196 zcmd6qF-yZx5XaL+q)_bOAc~kxq=TU1;G&im4QeSOxCV6A!9}Wz3Zhd%oW&0yZi1_$ zAOtrN#8sy*I>-B$-sAb2`tsVw*TVHBcbB{0ySrD?^Kxk^lO9exj+6103+uGHkp4dU z-m6r;94DLe3X2>2sg#?2uaUOLKH1S}m!wJ(kc3?l#6nE>&+U?fPf{c4R$?^{V*8O0 zjpXVBN!|a3pyVifk~>#7f?Tes1l?3gRHvlxt1>`f0U(e8lHP4({I&oFC+5SUnU$u1 z(7|R>Nn-#c@SZ-ywU_U3WMNYz!!>lUnLro=wxvL#YLrySf*pA6wlPC7n9G7JBYGbi7OWvK}#5udclhV7&z>nbjfWo>@JH z3?ZNKfBzw3h*oD@Z4>+JR_!TJ1IR;(q-M2HT3(O|1v6{ETZsk#@truMn-t|25()Y$!O=;IoC{}>L;Eqjv*C{$qHNsg`c>R7~=fY*fbJ^k1*bl zIKZ&nCWLjef*ix9)?fkt2Pp{&2Oin6JV;GQ5IDjeAj-kX%>@M9oJtH`Oo^4QfsT%W zu9X|CI2-~MR&xX{(9q^!Kf$#`L{yc9m6cUhM06=jB7}d~ zYHAA3h)rM!SI}9%LP1Akk%szm4JC~=4CNXzjcXPynz3NPls!N&Wx)c88x{fzag2`I z99EMyn6q-SiJVF4h&5x1uVZ%I&DrE|me5X#rg32Yl^T252>;PS&XOX9&0(82G+s;R{|T!)+=^Ew|HI zs{_M!5UhK141U&tmib#P2m~H!--elY0|HFt%Yhp8skp{%srTJ%KU62+VEeX!wQzI~ zfz}lQKgb{e1C3d90**tD6}7fqF9bL%1b#200PHbtkp#Y%Q2_pb3MBAt-1@AgdmuB< zN=CCk3JT*EIS)XCJHUxzcX;adgW>AgYgS6ib+kcS*fcpQGV`o7HQ41>`@=gw|BOoK z`|shgOPeMz+(R2~58I~vV%#E|80gIXX99*noqPJ)1ciItjwSkN!Z!iVO5KAXg&BmF zu>pW>6U%{di>xyMSjRe*IRLRsK-*Q}j~EOBoRt{kvbO7=et2j9^zNh5bVeHnt|j^` z8#m@Y;}#iX9BQjcPXh?0zT2OV3(!}cq$t2yah*u1`$!LtUwQjEdiG$W1IT(^q{z5M zrU2G97U>~%Q`RqRtff>3DGG2_G?-XDM0%F9u)%>RbU=cwMW!i1)wme9NPRO_w`R&m zdT`vw6S(FB)f6cTa8_bLb9)~ctXCiD0iYEu*jUS@2~uR-A{kJOv`EilYaJ}4_JtSk zMn$K26UXuwDpbYJ}hw`Dch_7XT>*Q=vwvx$bJbRJF+H0ULKm+c}+rQu?=z%To&g* zWN{Ee5U@q*y_^GpYt|M8o7NnK5rkM$EI0cgJGfBHad))MH4|9jB?MKX)7f&WhV$l6r^~WBxCo$rOD~ z;*)F3xJ9}RCaqhf=sO?qSXSy=I|Nss}h{h;NkkK?reRoQU>@_t!*9E5(0vmpGs{5Sx4e=so) z0=^fj_3?8G`m6TI3<7{3ayZ|Qrv8Os6a*}XS>^=zUjCgB1GXe}g56=3wn+HeweTcg wr%nqhI5GC998j4So`5g#3BDD{0Oy7oMqua7`PDBg_r3vo=f>8?$Mx>>zZV@r761SM literal 814 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 Am;e9( literal 3553 zcmbVPdsq`!7QZu-#}GmY5FjAPkRXP4h{y)(V-j9L0mG{xA{&JA5^A7ob>Y(?q#+m!GWH|$1cgcM`L?$C5${sns^ovg8xi<6s${4P6J#_ zj4M@YqWR#T|N8a!KfV2*Pr*^v9+Eej5F<<92<7u%sP5FZIL0mheSq1CC1)zsj~_jG zY|nvBUtj*J|5ES3$RO@xG7k&|NkvfD+*vM26EyEK_G}^hQKfj^HMZDc!}rl3j9ESg z1)aATpqnSyj+UZ{z7esoH#M8uUW&I(h)N9UlRgBC8M zn%Am}mj32TY_D-PEu`5mS!Y@%`%0gr&H|quM>xHCu#`UtM=yRU1S{xJt3?dwu>ETD z?rxFDRl8ptyu;j=bb%NC=efYcju?f(1sKqIT zrUBblt0%VAs^Dp%Q0ULJ3?tNY5D^~X0I2MlNngz92j}iR68qT6=o166aY`qmo2%k^ zrGO90)U<9G2WRGp+lTS8Pb_FDqXrbF6;FhqCP#6rJ^SUPDxHXuE^IHAl|8eZI^fh# zt7hLlt06*!dXU7{ zL)&13>g2ZWy8s>!wTd#JF4&;1i2E{m%$f;*QwEp{0~p8*$M0$kWX@AvEP6Jv)rmt@k!`UyAe{tCU%ucHi)h74 zYc?vO5_%ijWzoR&=^@>3*7EanF=TE~Umuo?<9O?uy)V>AdxK~)forsipTYT51-6#=!dXlRQoZqc&BSxctE(=zVW%7o2i{j z{!*%8yI6kVbd_o64q2>qS3oQZpQ>Po{w*JnM1rn8E?Agj)n=sZZ@swZ4rI0U5<86;=eH^txMufK+?AtatKUVzR-k;j(qt`nwAA*leD%9sFbIT2%Yidpv>*pLeP?2pt1HjfoW%Leei$h z{%xI@*|mE7KO9|@sob$cfJWUwiVS>n`0pJu6g!V~ESq6J3^J4bmE5sUW{~A1A@fSI zjR3V9;cPS-3+8Yr3s(7Q0AO_^lotXnbvQ*1F5A9f=>SEHqjoLYs6#6p;MDH!_LRch&3ODp}sD&hOPGd03xnBVDPg~lf zse%||s0IS+Z(wnMO7Wx7>a7(Q2M%NAM@|wG8b)4LE04(O=JJCSyR&dH-8Zg9$3l+{ z%zvR}>-R>jwu(FFRcr6r*&Tb=kAXTvl&dSC#QpwcX47$qVChRZ)JA#2V_iz~(d-r} zrr=Y8z3^D*sQH-Z8Jc0IaYtXGTg(p1zgh%hBfwKpoC$TN&CJt@;-_urx6!QWkkUYQ zCUhaKCZ6>URsYcd%iuON6ele$9BZXb1DdBM079c_nWd6^Ph8OL9Xq zIb>18QbQ{_L^+#@qusUftRM@Sq8yTps2z^+$FBhXUBur)=Eut_gPyz-?Zv)NB&kur zZZ_WXF3iW7BbsPP1xSZou4ExslMnuRLn&z`L zuIzq|VUYYepfguOsoHshk#j_xWwNG#h| z8^PTe^=&c#R}s;&r>S;pUF%xq^x3H&Zr`1pQso~>-oNBY?;um?(^xH@8F&G}*3OOk TrA1an{(}MuvB@!Aa+T)ajz`k! diff --git a/src-tauri/icons/dev/32x32.png b/src-tauri/icons/dev/32x32.png index 3c00de3cc1e69b7e2aff0931007ecf7b3903d15e..c04223580da10d4b445d6d2363117b47448e19e9 100644 GIT binary patch literal 4196 zcmd6qJxIeq6oBI*A{06}h$03YL^_B+2s-#jix#zr2(AI$6}pHzIfzaLaTZshx(Tih zZbET$5of0^I>-BpFI>;mB$AjGUN3j|^4@pvy}Mq|)=Nv7?!IozvNFZx{Dx|6q^nbX zmk$m;EGwHU<`*{iJ38#_TV0K|*(W=GySw)C>GscWdCqudjJYTfkpUL(o*Rx@0WgkE*eFB-m^!a|&U3q` zKb$ZI0D^89h|mDT+ee{{>yW$?1Q7~A@+;w$98+|ohZhZzqGYaBn*3k_0raAyz{C+P z{ldd*L;U6d4l2q(fSJpCFZ6?}J6=e~Pp-Ui$vb1RN_1r$8!~RT?GKQ83J6)MMJPE- zbsGwVzQ_OlAQFgHd)!PD`qU4goE7>G5?i!^yFgbKqwH2TYH|q zycZcjAml(2L$r+Hm}mK2;B3G#0JGPR@c`&fTRjtYoKn29mHmDt^$5gzC6l8X2oazR z;HE2C?3YsNf@7G_`#1-t=~9~RwVYfiBK{SbVM?m+c=^{Kz9H%ff?(U26yXYK$0afLLq5uE@ literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX#qYVt^%^gWFQeudkGV7X@_um zpA_Zr0`=q??fee?>M2HT3(O|1v6{ETZsk#@truMn-t|25()Y$!O=;IoC`E21Y?o7srqa#$*L9gThZ-Nepp*YHS(_!bccy zNE~2TZWF>fSwW6rQ){pQ|AUl-gaeQ4SRSM%BnTYg4iM$wn8r1W7R^|&V9FjKn6hAj#0?7pg*Zk> zZ4RqR8_Zcb*+kBybi_WIq|~I)u*g9|F!EDZ!qE&afs4B9G&EOesB3hrW8ga?dX!c4 z2`lSCt_`Y|imt95-Hx7o*^5LcP81dw5n)k}YC1VD;n=~&Oj_q13_d?%W%zy5Vdiu7 Sb>_gJWbkzLb6Mw<&;$VI^r1ok diff --git a/src-tauri/icons/dev/icon.icns b/src-tauri/icons/dev/icon.icns index 03092d4b6f8c93d7beb1e2c0fbeac7c71d485692..db6118454de0334c8b56ac254561cddf44a0e985 100644 GIT binary patch literal 1399337 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 m|8K6!sK*8Z|KuNigjMM>#%1J;7h?*dd zb%+=h$D-oU*49MO#<57XMQb%!Y8_id?JJ6K_c;mu-v9Ui?p^D<>#n=ryVhmBug#vG z{XD;C*wd5b&RqBz02>6kGu4p*AfJ>f(^6cWeVhRRuBnQ|4ESGy`9B|n|4RG2jf4N0 ztsI@1MEDQ-zwtj&NSruwlrJ?gV05-*qPp+Q)%_Of2Ck}%C^kk_9F5t1Zp5KW@uzPk zS$<8u{&Y;!+mQa$8#rUol8m%*fFNa*Ql+Lh?)mb<4-fz9`fq>P2c5UW-YZiR<(c`& zOqEJC`wtpjHk%9omdS(7H_hfS9l9;ulde?rwRELkUrF-S6mDuMDrzwY5r|WgdwRNi zl9RleuC6*)U0GRuu1Y!p5%iZOtSxFrRrA)i%u2$C>izlz_v;^I-SA>bmb?B(LnU83 z^`@DA{5e=$L2y2E%N0Q`Kx$H2;_-Nu7D781LfiJgfR=>aNEX^eQ`u!$_z#B`ad$vV zI?EQfInMyo()w_vsvh-7lh_On#%6Lhk-fmlwc`jkTeeDNel!BN%~Gj|dKaZ9-^s-p z{<$~>fig5}MN+z4o}RR#CWcR?lSlaJMrl7j&+2RvdG^LR98PbM=YBj3q-u()s%lBG zB4NB1#3S|D?ja%W+dfr+iDcN9)nu5oO4|3JG)Q_BESFBz9IdL_W;9lwhkunuqqr%W zAg3Yne*BnQ)oIVTXN3QhEsgS#N<=y%Mh(Tu6+o^g_rR%FRX zGt{?H6WsB7NO`n7p3MnIFg||<(0$RH(@bT!!7J|Cc{6-WlfJ7PB3IC2=PuzN}2@XSG#g;gobM> zCp{Q>f~gaTXqDy>Ws3C)8LO!5JFAi|!gPz2D1nP1m;NL#SVVu+_M}NhSTP781Hn9? z1&o-eiN=u^2p?tGbyA`py}?>@u%8SH(-Sx;s=o*vfpUyuYpykSI~3pqqNaj;fitC0 zlI^Y=5%N>(H1NfKKF3*K8>sskgl+C8JuaE*;RxLq@zf zL6y8KL3(k+=*Le3yj53R=4+R5#J?kwUp)Zcx_4`7WLUuoOvn|PgB8o^9X+1(0#D@B z!63eO>mU+|nS=1DoBaD)44m^ORA2_^Eu4h&aB|Aw7g`K$@>bEu?*Nnx#bbUdw1V`$ zjbHVmkr7<6SU;NH>5B9CGBa%h2vl1bh#-U{MxDaHJRMBJvfDaPd-ZRhgO$)#2*W z-*^m(Fk;KZB22VS??(;{Q-m>8W@wHEq5LY4gzG(ndqPe~1K83?f&QnP4HsP*Mxtp2 zJ?VU@Uvzz+M95>XGkIyy7F}{$uj;4R5S9c8^lkmdt)KmKo_L+h4CGN6pLS1}#PWsc z6tfbgat_0RnCwe=%l)WicSM(}V`>OvVvU{@l8NMYBgW9j`MoJIwYYC{krjeb1S~io zGxcVt1`5Te!P4FjkaInZx^pJeIUN~6_704ITu-AtPFS6k9y=mhdUM?AN_Ox&x<(s> zlG~-l*_&cBW)gS5b$-_)2x9dJi}oP%^2XJN6vnZ`dx6~f@gU={$GAjHkwxz$UY*JC zR#C(d^JZYU7=X4wnoTUtXyjyyp@-2FBv!0*b}oyr0qBd+ zB!Uv6LH60uXb+=N7u1uU+KbpqFm!p;-~0?Tag4W`_V~r>QjCr0c+^K8 zR{_c8n8B5ORww61eIQesPy;>$kXe-=p<2a`kQ z9*!TWYXVLqQ`O*jk^0cLvn4ds~RG@X>L#9@48v}jAyDgG(pWYALgy|^c1 zJmIt|KDa*uV=^>IjNd!4GCMxnQRKA#LRmj=Vw-sS9zn@s$@fIK6AbRq$`o|p&D|C^ ziGDFgE;8zX&g@=Nz4iOwgBZK$Nv1@OjFs$nOKj7RE5cr+F~U?K6-np(K#!EP@UpTz z?If1C8*$kgTC|w%O%=uS&5u!LIAYH5onoB9?^lI|9ZO(pIMkFw;>&xT5-I|miF&{Y z=3x#`C=ERdmw}V5Cf($ca46CpBrMr{ENNR0{1#)*8UEDEq67RSK2_umIl+!*yAi%ymw=3Bj=}TQf398T; z8A4@Z3i|!hpftLgXRy$V^1NFYjDX#4m1ddGt_*Jo9H<)8WmOr^eh8Nd-V~>Bi!~40 zoVeIGPd!oYvS0qP@+5o!ZVq=!P(FWJ0+*A2UxT9I!RqOMUxN_X3jypJH1Fu7Oj!C4 zUxQrv|F#Ad8r+gch~Z+yejuG>5vLZbU$wTqauK3%QMy)l$#VI+l?pJ|U%t{WT8a$p z>)Qicj|}>rd>boh&65pk5XfAYJxl-tc?%kmerIiZw3)&RrQJh zyjqNh#cC5gT5DuVOqS;?oNP{Adj{#Z$3}2hi?$XgM86NDH)%Y~vA9dz67wkeHQgBX zByjQwCbVRs(PAr_Fyey*Oy(e4Z8CJKAh+$hv7bd$LV$5HdYP>XBf;x>(2WtN43EV^2&AFmc;K`Xy6Px!iPEWg#gSD^Q0 zZ-Db>qdhHILjL+5!dtJ#K0@5EX|mB@P*zazSx!?FLV!gxRd_JyNM-&#pQ@U4Rzra0 z^K$q%x-!sn-fGat;*P411&FuQkxk(EUW0o&t_2%rsGBwvs?Zk_iKGwDb`@j(wPKP3 zLV(PFYu4p(>%f`Et+D_oIj8AzQnJ#WK24}Ze(B(|`D*+$N`X_oWmQ+H`TK4Bxm*pH zJuauIKi}*o+v+0t(5%X&hepR%&6Ur8YpdDqUWcz1JW(lM6jTM+=1@GXL?AO_7I&_= zL1W`%f+v)^2;nXvqb~w1hVaXx5r6&$=;1;<1x6^IHj)$csG{OgkTwx*%-qC-qexfH zxt&2`YpII|q8K-30NV?TkASPLBv=9T2X?GxhUapMjPA}z9^R3-W3Dqp+~i4>r4xGh zdKWkhVTYj^WjSEc&7Knzu?%e_3c1lofw~kJ)bhbdF2K$=C)qn9Rb|`2*pGdxbWVw! zT$Ev>KdnC>)W_W8;I^kp>FK+pIDyO@9I9U8hjTX@r?D!aNOlg#CEpC*QJ2Dc>71wiMZb>Q%=!oc;L$)pf{EeO?^->?Jfnv#6qH`Qa&DyCvz{!MWnilpUqs8Ot@aLX z`cJ?`@Tr}Tkoe73#FpTS@*n9EG}n|(SA^7E=(+stkH{`>0jERLZdH|Ygk&ye>l zYSd-|2FyJA2nb$Y?6!0_;iTM0W<#41Vc|)B;0KaiL(kJG(?`R-EHsD^&PC_4Cd8XV z3T&Z#PpO@Q{q$j2(Qw>85DoQ$9GtRqz^(q2VcRaSJ9!X@Hdh)ZDl;?nTMhL;e!XwJ z+{%zeOkQ+VqjZYMw73{qZ}06yo(7^z6{lyZImiNg6#}d3Z_T=V=guXMDJm+R9ejls z+>;JEcXe>m&=E# zML9376u)Q9FSv((5_oj=rkbAF4(`|i?*+-#r*}%Q7fTUGRZm9!iYvG?;G3rjY}bcn z+g0vIp91yGp|wR}{riMTrD4Te)~U05?ab;QrVujz(gLPF^;m`Iwg6M}0Iy_M^hGL| zBiHS_O#;RvyuqDc`Sg+O`1FkxE7Hq6s%j<3)Mu|y#&l!Ip(E9^#F0i)hv~Q3TG`47 z^Y)MvUi6cpz|CynRZn5%sz8pvGe7m28p6eF<>^ziHVnGa%w;s4NnZ<({&eFso{by* z43W!sX6XhsEM^IXnw$Oa_pZ%N+mI;?Gmb3o++BM+LjmR zBM#jaxU;v%O)Zi1QT9Z*$**_y3YA!(EAI#lzkmGVG@_~x;s;it#@WnS8j2cASFA9Y z72Z9+|1_dmVLjJ@@S^h~r##kRC!OJjl2L`$Fk*1=H>6+4rhVFT&KC_4!_)HQ(Jy)` z^izpPhh1v6c122ooZ%<~RrKR?N`4Ir$#996Tbj>|PSe+G2|@9X@u?Lq@m0te2Tc(Q zI|LzHE}{ZysAH_NqCdYBtqu97IFRpz`FO%@Dr5WH7E#eVGr20KtxjKvW-%-s;z|4SbEh#E6figjnKu`f zhW(FnA7eFH@45PRH;+A(8ARh=fHNzQVm!4b{GSLpfILf@Mme~@3MQuYQ4)>&9X%I7 zhU!0oVFajq(jFBR71_Oo3`o2*Ex@7 z1k6Qhwmda)LGrg6$u1h%-Llr1U5&s`Q~Wpjo><|!?{``_8g_+^Rq1a|+jQuBf~?x@Te~Grw92k|M!tX|kE`fji2Xbk1wz z*$p@gM>GzmOhmpKr%7=h#@K%XAjcDBWjSL;=3H^&h+pyq3^*l#TEGd40DR+Y^x`o& z)CnB-jMS5%%0zDTzouPe)+;}ha_8`?&?FJ5V64d!2t?`d`c0XLz>_Z)WApOspvxxH zdl3ItC*d0EQoMd6{OHVloU7joKk|iZ=!2&VQ=I$RAVgCkGtw$Fu@7|vh=0fW*dRWB zY#q`zEWr<6YK~F!fna0Bul}=VQoQTh1Vrk=gJR9*E-_1^MPPRJOe|4Q8Xlpd_bS~y zw&Sqv`V_rJGY-OXJp=S01|axQZ<$3e<=pzDunAZu7|AmcutTak2PDN)dcL`y<_Olu zgMBv&g~Tz*eej99EOAG?wkVz!cg@V@YRnBePJCzQ8P|^BQ|a+)E0VY6 z>d6Qjo^ViX0=7_8uF^%8gkViOENU5A0lvd!K^5QuE{o)rgrM8%EY)<9dK=c0i>h+U z*Xdnr))yJk%X?)h$x*hth@LuOv1*bim3$&hsI<4Lcw*$rXc}NC$tOclQ+gfm?GhlWgRoqoFeke7g zvqY0M&P$)!DJjfq>_zVFOyOOxGmgJLYRLz;e&RL`vi)uVGO6UvI}nimae4>6nBNyo z3%VSq17QhEOqC_JcLBHP1^k}H=S8BFAN}#$@6C@?GY_Qg zifgmL(_KLMYMJAM9{_@)zC-^u$XCHL+rJ<5hQgO?8|L+c zb>our^q!J+yEd0*H6h6pgnt?W-X>ye77BlA9w(Na%xiPru$qdn{q83$rMDNRs9Ug; zh#PNE9l;ITxmqg;Q1ahJPZk#kt9rGc7~9|c{m_=HNb=u?=`Y85ww`p`|2J^iYP0e( zc~cYihpK$rZ;bFkdPNn>-NbiO*4!AIU>;(fhbC_@#NA7nY5pNxw+Vc(Zd?-s)+{Tw zI3=%X9y`!HM7#++xBm67TkfqVBLoA?*ZW7eA)g}uGWz&FBK+FvKk34(8rm@Zy_-NB z{1!+K!uc>fnkV0?U)pl^Badix%@35do$3NuTCoPdF1he`fZ9Ba{uPO`7~HssxF)2^ zFulXgLngZeezfj+>mNza0X-{Dm3Nfxk>l^4em5z*Wnx#Mpy4Y>=KD1~f8%p&t9AP8 zA$-IO`_*jS^WL|T{z5Z?UfeRIix*& zhJda@|AuHzdB?keH*|@nSk>~cu3})!TBL5-*d=hHPPy+j#B~l!1nZO6rgV1vphqIN zd(Uw9Ygbu;&voIT^&Rb9f%v;a7vi&9mV*+JapfF!%a>igGw7?&@su?fj6#Q_@a>$G z5#l_0#|KVwXXnO1e!h1#H+c=FQlN(iW0RQ13VP(Q6z`PI&WC}{@2Uq4j&18l2f9>e zIF)xetN7U5OjL4#Co4icSE7;vVZH(@n^T<9Ni-0=N+EB3N0KVRPkD}--*Og|#2SzK zN4I@KC-hR@7G`@ftYRb6w)ASBN!NkaaJ_5t8U&u`?mo$pOHJ#iYFUmHyOKvFvNkW&O+wxDXf|Bvku63d{w^)=I7Zhw>%W_< zZrQ_;9R*kBaAnX!;ip5xEry3YzuENd-8SnUUa#47{bV@KV}29T_*3!vj&DJoP=6*x z)v^&44x<`#Y}No=TufK)g{FfE5~z{>vbK427GF_~C9erkO+p`iKqLhr4K;ZEK!Hzt z4^5p1F}!zl+aE}A2)S&8s^u@9?*Y2$(;1QrJ)%b=C;TmjIQPiWh@nTkvV$YJWC@f z_=FiggukJ~V9RplZ{%$3z-6!rC!^aeHC#av4PC3wM@FE~@dfkD6rayPk6?lSuXHHV z=!(jBYOAWWJIjl7{CiS;@iKz^=4q^DqLC&v_l#<`@ z$w@#e{I-~6*fG)7LGDzVel%rViXc_m1ZS2fC;pXw9+-9h(H>7wN)vl`@O2t6G^B{u zmEx19gyaFP(r>P-oT=m^AxV$G_VmQ;wv0*-zj&7A7mH@DL^2sys zgb?{9TC7aaGm7w`pKwWj!`JS7G-1De4kv0gM&Q;kW9p&o;?eeQ&U7W$7<7!MHNtHZ z?hQfS3l!JBsP%U)#v-nH$FK_IgA5&bzd~`tS$OADcf>yNH0m!dDG(g7GnRvV z^rdC8op$V19PAb-(q!GX%hpeU)2c<}=m7zD9lr!m#&O`&91a&{MZ+ z87kk{sq~UH`M`^+yt-`JVAg)*m_j&b#}J5)bO>8vLAf)b$cp1%aL3xE4pS+kVEdCO z`v6pNGkZxc#He9`9V1Ne6U177pYjf~Gob_(bz2uQFdTMpMO*H}i@u8I)fR{CVdC3N z`wn|M0V)Q0eab)^X~)D|XnDX4@C_~8YiB%K9Mc?=nGqVn_z%xVu)kty&h7D1)_8Jc zrh5|-s!o@&R)=td=Nv{}e(JimGc=U#-BWP-m1l)-*ph$~@hr47T2c3z83G}@ZC53Q zz8?(MUJBkn>vzjfA=YanN0k{q-K3v7$929P0|m8*YpgjZ*z#*~Tg0Q5-rBu)>$D- z|42IoMsUNIzKDMoCs1sfa++8WArh$UQ%kAmTr$;DaAP-sRpryQjjpZZrXH_T9LcWcFd!=#TAIxMv=-ZW*9%sx8+hqjlP zPHnYrEbtg-R>jPHV)J?GvR77SZ$UFK~Ot>xB{rW{K6L9r^(q~+$i01`j@{qqw z#DY$Ki!2zc>V4$nMnTRz-;b=~$z8~TA5?wzb!`+XeB8*>-|fA0=qLDI9!M(YP;=eK zWMKN1MvgDpduzpgBKT0*UM@SU3wJSNvY~n0&sh{q{m8F$eGVatyk{4MiZV%suQqsm zcqJ1Z^}FeopdF?@+iQY0gOJlVRf||7UV_&y02Q&{74^_Z%}AL0ZNftq8AS^9BbT&1 zn=~O~bfQA3R3whBQ0_F`ZWZ5WanP@!TS9l3^38kBxAazeY^uQ@Op^33webk*D)3`+mEA^jt|fsrL%@B z$!rZ2tH`27R;Z-Yh@!9$c)A`m`f8m`2S00M^|*?fi%@xQ*L@k65@r5zRXso`Gv`swkTi z;X`Xp8wbH`s^Qd8Wd887q-uet5LoO$Tm42u)xR?Hu z;Lt{#U%^uxYQuAdc6v#VEY`6glV|5CWk^(t@nQTVS zBK=fce~Sn{_9_V%w~xA5?WA~laMJ@K_{7^Jal-?rmi2@5&dls9fyXek%rpc~J+{UP zt?&&Bjsi~`IfP%B6Qyr?7kE0~v{FLf?gI|p@p~Fl9?M!SPk(=`>-v9%VJa%bJE?wIb z?7dwieDX7MbIQ0am_B^Hr~Wo!x~C#iIX{pKnVVW@Z4;?qipeYM1utk*=t|iTc(cn` z=s=lOI(K6{HBRR zJ3&5R$dz=x&;ObcT1|lkzFO1Sn{wLpcb7iLE^)MsZYd^nn^P|5gVc`&@``b-RHR*O zKa$FG8aXmSsZb1~LX1EjH_OK5;$tQ>cB* ziU`&|@Vs*AHvRX+W)?#c-STYnpTG4>SWxfG1Rje8;jT*1w}@iI-7I)OwT=3@*w!%L zq2ftq<3hgh20Rk5+hC61F|_eZKiaxYAO~Ez6ZWf*HsLh$&;VC<8&U{;HSellSho!B z+g(nr)>xo#4owms z=;lM9pZch=HZZ!j8{Q~cHDux&2NNo+@ac=*8S5k!X{V~(Sg`%Yu?N32+y}uc_JqG= z&G4OBmCF~lcatRat1tH$z* z8lc6wSq>@WPTcPTqv7d^byZ;++ihkiAFXin@hk6!B1GI&Y-{btZjyz9IHY#t;LJT4 z7(Ke1!W6i@vNSh35NOqE=JJJKbn_|}j80I$>&EN4iuBReRd>tI#cmOP$=y>9HWnnP zqr1)LKK;Pel6A*HRgb-g3{321K&UvjDP-;@!@Xyw_%8}CvlzUfbhnF1&f17Wo*QC4 zSNcb?Hw#9dDGK+rZtx7u@X~Dh2_(kVOx5>d2XxT4i@o9P(IF0Sa!qscR$t$Ta=cIO z8X3u`p#+d80u_I!As!{PZXp=?D16d}M;rRBVX@^@C)1mt&tir1mE z8q?>WQiAORzGs$x%U(>kkYBOgpu1U%_nTMoFHZ?LJ*Nb1)JR^X8|+`x}1(K-zQo*}sQHqH>zqlts@ zEAvqTO4|g2Pkk%_nG2klgJXgVG49)n$rv$_M;xsx9hvkFxf>#OVfhu4=jU!c;1bVI zdr%SHS?E+99aPU;Dh#G-0u{>;D$$*)K@_8%l5ld;O@i4dSoU)HFYoWonYP~i!oPV} zO3^i<3cTHcusmS6&-3hM2uWw0I+TIX;7%y3y(h@|OJQr*_FX%>Uxq8Z-(dnt0%1FJ zI3x#9AZd1wYPkXt-N{z4;+26pBYN*laYCK1A5ilNPh~E}-b++a_`GSGdQVE}fmw%q zLA|bwr1o3bD-<2-RQ~rFv^i*pf;xV;ER&F_gy?is=)B? z{d8=cBDg^w5qZvKWzKmK9*Lp`6B2QKf+>P9u^ai65k?O(R&lJF|BFi>`RH7^x@o(Z zF;aNJ-kZ*tr^1}2;h~3&3ZUHY&0NGV^{}K8{ORr&B{H$gJ0v1B4}w9W;bMTde(&0B z2LXS|IN|%4@}kcgoY3l9YPOVD5ERbMU^NCw+v8-^K}Si+KDDW^V^C z!K=~Mo0#p&)qEFW=ye_gChW+u`E#hJU3<~Ix9%?g^xN{gHlGgaMW1?1_Ui7a+7(}f zo zG5i&p6idOR6uab}Mjem;h*OqNlb2W}w$q`MyBqwPi|7@Qm%(Uj9tht7218y*otN|x zqOC;NaN|`ieZezYevco#6TD;C;EGMZQX{zW^hEe{F_)Id5cSt6ek%j6t4vX%T>&Lq z$UuNtcij%07+`=m`GgH#$G#_+zU?_`>mRM-ybu(DBX%*Tye`AeNGmsM2vtu=Eff^YzC48sRhDVKPVt#bYs#O| zZY|dOb645z9F!jsLEw^tux%q%vW2daSdZAY6m2!P_3tNp=?7mVIBmq%cWA&fBqeLD4FWKrotN+=-aatw5_AaFHl`28ot; zECi>)gLaUC{Qer$FGZ6(SCgK|cS%SvdUY$x_ZZ~Ghj;Tax|Nh+E~WROTQdoMdB+6u zEwEUI&ph_Qs*dc$5EIP5xF9rg zh`uL$l*VbV-EhSrBza979Yves>BD!Y>rEp7M8YX>2dJ8;Q_lLxiy)T;@wv&J_f+>l zc$H6K-tFfd77+eiW3X8FxEa04b5nNuJiibQZoLLFS=+x#8ia~RFgv8Wri5Mwup&wl>Er#cczw8jbExX%Z^ zm^XaL;0k@Ids0$R-m%+OgP8tC0^t+XU+%tr=shhXNW8pbt-KB=E{OP^KVb14<<*@0i@21r)n@$s9?+)+Rl#{!d;VlH9pC zFu{*lF6A$jwf$V|x|n)2QZ^c@rLZ`XTrS|l7o%k`JGAmN2voJ4#Y$wx8V(;mPi!>n zIi{B!Ge?}#nQtRFtFy|zmpTmXEYwst6#6rUbYCa!~^wKnQBo_un zKSACOqpc9TgS1?jUmeLQcPZ}>$<86iek*`=7T27BE=e3mFq_)=E}%U`)r!8akE^r( zf0&WLKeYO?k&#q>$hGV|J$( z!}czX9LvwC=`7?!K%Imh)Z4cO^;*cbSVaGMCk~Zu?C_Uh!u&&DckaoSwH?tQTx>!| z9ef6TI4qW?H_rVKcZF9jxj=|z=F~4O1sybe>BPBst5EyG4XQ3XAAnuouX%+%HpIyl zbIikQ))zp9Jx5k*<(cm#@Qw8^w+5%y^d+5xT#*mfJ!BPT3pje~2ea914R6~7)+2G> z+n&5{M&TSm#@@D>0rzjYapy}4c5h3DZ=(l4SD;~%f*YhOfL~8~Px{JEZtR#AI3D>+ zDgBU+4En>m$W`gox>$H7Js=3VW*v)FVk2(u&3rQx%-&#l7;FNqYQe4Z8wKLYLsQli z(gO3fD={t4KHo_jHW#jH+34=>`tGZt#px||jz{XT+i^-KgZ~-Af6G??|8x_DmX8iQI{$^=&Z+lf z&!1ntx}yWGtL5D(72jWDk}9rPZeG56vEB-ER%B@T^`kF#PK{kHiMz0IH5F|8h&~YVU2)b77<3)L2Q}L)a8$`=j}hxczrCfsa1wcmF&~m+~}UyJ5Ln4@v34=%YI& z7k&z8r{BXYjn7)PqJ_}eYCe0-ECX%G4G=J7*fr~4?gIG4e9%HkB1lR*n2@{mZ$5&xDMS3kJ7hVDoRk0es*q zeEY`LvL!GJfUESbS>Lg{%gRe|ZmkI~hudJYbwpdqM>eHlQOm#ZYIIw2=T4?WkJisN zbbO0eqK^#^-$EAn*m1*!NZNzR_khhX2nW&g%@<+H2t+2Kml{rreac^LAD_2qw58TAGFnp5S^((@ z^OIY5fHQ^*e=UL~w|6NoE}9K-@1e@A@M{Q5!}Kd!Hg>LOtV`Uw!Q5Xv->$bdL{xrm zA=FMMoTv@)5KsP94Q|bbj$6!RBPgsx^7veh;lk_X%y(64X!nyT`7P7i z!=UM$hg@F{b4%{Bbj&WrZ_D5u9V~0OS=P(hul+~? z6IN(ad}f|Dxw94O80r8i{v#WvmIQP%a${BC2if^pU2e;wPG6=Rg#1 zvDH+h&3CqM(d6XLXY4d2(&~1EgGl1KSiy2t(VM~1ZkbC}O)rFg?d=dagPRr9nc!Wt zqkz^`!NRpJXq4^rXqh02Ti)^B-jAE`ovWi4uM_87EtwpG4swn45&ub=3B7}WAk;`va`*<><_HG<8>Sh z$Vj>*%c?OHbpFgzb`^Xz?qYIh`yQ57lB_<>*}wgd0#?HD7JW?r)h&yF4}(rTL^nfx+w&pl0OE;d9$5n{_%8%b*a+DO@=QCQ~6SCXw92 z{3P;}-49k%GiCX1e4q9dn#l!3ZXg5eNVvHHDu&DxzL4niasFg9Tk1Kd%4;ocQt;4MTzVfN4l zYaC|@!!#EclnsjC4$r0RiijYES!2OjhqyA5{vr#0arhz5B7xWHn`>wTM5@uiXn_+d!e_`~Y>!BGk?h z7dsb{)AA)Na3R9O&h*kRZrOv`=M=u<%?(wzjJ1y>0T$^Q-8KYab1{toJJnkSyRxb( zLo3Osy>So{T{)X$~x$m{6HeR3CebY<}uXVV+T zKtFP^&*pD@xZ&SRzra#~U5SDb)Y;DB_!1ZZgu3_aP;a9SjAd;?#8b+z& zN_vFX+E+}16U!&jDr-Q>I~LeSDv;r4aF_(wUGndVh1-`6D3YjQO&@j34|WWVoZ3B3 ze(h&9Oh~mDIguCo&TnyZ;LEM;#r11XpjmEo$odilX4tXjAec-2k_F>3ZU@_^VVM|a z`Js%J7Rp_7zV=bK1aP8Q&ioqMa%v0(f$vyFU+OaKklZg7#Z z8=?Z-yAI>fQ2P`fbku7gDe$ygg%h>uH1*FgyrBvX`@KJqAl+TH?t)z zJ!K!1U0|1;H2x&DSsyyHCX+xY=Ow@}%loI)AHL4@$YEz7jg22ENx?w7a#N{Y{+8?i zz>8lOz^jk~4?8fy#+#AwLIOG)EC)JO4{|lbBuIAs63ES$;3Znya+LKSJ%0P{zn3zZ z(j0`1bvktJb!EhEE<7yVvPrsP?Wnt_TfbCOeJcS+BwWROllnf1>CO96uG-HWgw-F%S> z5x2Y88MQK(U?=z3Wj|IO!_;r1S>L zFLqg)KuLJ{B{Flq!|WP=gC$PbN09xabIi)6|AJq~VU6Mmr|86JV>6alm_7A#*gFx} zdoMw&5{K-|qOz3bhamNh0tfXG)M$f%>=SKcNEdZ?MzVk3C)aN(KKxCJv)v{sH}bHe zkJ$Fp8#tK`aZCn^QvXb;qc74Msu`kw4x&Q3e({oQvTroaP;GHgt>p#Z*tf3`**P%) zN)6K?81qDKXiPy#D)Uc2mG;ZPgJE{Naj0X)dDLSn#!o6}c)v36Bo7$jZkE%~%Ykb+ zu{ScnHFM^UDk0!Yb`W8rkqo^*rY7DvIggQvaIo!e zyaz~e!&m*roVK_S;&x0^i`mtagIDh;5qUoSI*?Kr4%0XH|ExeAEm-vs0O|YV#>WJ6 zGp?bgAa+BEL^59{7Q)|t@rQ}jn~_~5vSgt{Aud$&gq30R@y*iHUkt?Zt1U8~gB(Z{ z9TH}9p7OIj4+)byDfk^dyP-eB0z=(k?!c$K#+>FgUvHSP0Y00t^1P=<`sONWE$NSp zpCj9=0#T9cfurpi{S2d3q$0(raDj(sG#A*zpVC)Z00;s8lrPGKj~^8I*5OZ~n2!Kx zHIV0^1#m0CH^n$u{*+pWP%z&|qBOZO(7+rh)=jEia>4;jX$NW%8$MUg?2dz#Sm3?CxAB6{HhevLQvkz~BP>aIwa5GOjEHRX@WC$}wo!(x z=K-Dxp+59sb;fmI8e)74$j^tMLBRDa9?v#)`!CUO{y?VK_~0aQ>?TKBh~(ZC40LcB zLA^%Inj_NO2ek|qB1e?0M5b)q?3&2~c+LYSMx&LEkS#)XxPitMzGSHJWhXa@_397@ z2TsNn{U&Eo%Wsx8tQM=x?}yak4!J?YYN(CTYD%*$=oo7Wj_5%KG^_#o<9(4CSY)g} z!CGgM173JPozct!fa^loUK@aIeHu3urX!YX9P)|HH@b+0#>)a##GZQXsvj=mliov&j!-%-_Q z=KC?jhkVZX=M@KTx%A^to8{5)vK|suH#p2XSYsFpt0D(}Wcrpm`i7{A&T3QCU32sf zVS~XvHy~_VT;m=93SI3QC40f|OsP#nG+cj&;IZQNPi=+~{D>zGJFSArlOIS~+bD|# zw>u@_lDy`*mjJ#n=Exi@Bx>O|zc?I89LaTe5b_hZdj|NGcN}Q2Io3-ZCb{r@9o%Zl zvKt(WVxq=y!MUe*!}&ar?1p@SA5J5(+sEM&X`uS4|H6H>N3EGWLzi z;p_ZDLqSh2*SKO+j(T_5KRjQAI6VlAbl{|POol^?1@+vVX`xI|2y)05Pd`5P>)yeR zzOwGV&|X13JaSSt(qWm*1u4+=XgHr63C#k2iJ9GbzC&(&^K}ATI^k<7WuqN_m(Nbc z%b6C#OocjBGJ<+N;rMwyd~u9t^hY~%9Sf}*ctBkKN7a2ODE&yA;HT@?2%kGO)OiPq zh0xgkBzifl#ptL_gWgYhTe3j5C|AH3K`*;)0x#(EGz1wMrryz42#p$)!smKY4IB)- zpt2bbTyo+FDf8C6%rSbHew-;>%w>&ULk)%dNBGTtR_aNNe8KRmfEu&Lv8dL-1Wlj9 zX1K0kwE_G}kzYITwX2hc{SeB7i5Kv<*;sc5@VOD8ppU>R$C7BTYGkVjM=y9fhe^q7 z=-@l5;Jr9Po%}CVu1r+~JJ7L&0{CnUdofj}I0qB(Fa$_=(tvvhf4fal@Rk7n@E7Cc zPhIV%O=2)CUUj{OP-3EL#fMzjyUL+x1*4L>^IrX`6!VxN=??pW=Sz$hvD=vG4j$p- zJGLc{`jA!$k0#xW!xa*cgBiw6eeEm(toF-qiea>e&)^zrrDGl?_4>hcbpUk!doYB3 zFo+&Gv;PT4|-cEt^=pUh1ZF!9!H%u0uMLhpSZ zb{Jl(@2+xq7~FcUI+h7jmJ`>e*+)VzKOPAr7Zm&5?A*!Pe2><`ig8I^cCjFIlW)PR zL*;&6caP_xJK)9E@hW>ozN~H4kx2OXkiAyO5{1efdms{eea`;j><~31dN>l7T=*>M zGnQyG{WxK~WaaB;)`zMw_Fd&&`tPNcHXT=T;qxT>p7s{~_}kltHS`^8T=shVHnIYF z$pa}J?pt7j^7wl!a(sBP0`x-q?_EdThZ9!D%q*&HLf~AgOI2L4UcJ(f{^g;wb6eiY zhzySzLD;5ojHC3ogR9NTH*D6Os|?#cYUS^<_SZjsIOD*IVe`b(&m`M7nqlIF7!7lz zY(9GkrQTpXRj14A*;|FX;StQtvVGQJX5SiARop2@1^)- zM{SRxA&vM)*{-v#4POe3?UXV0*YgogtQ{4hC))%e^fZi~ArhQS{qcw)UgKMeNtTg% zX4@QLk$D4Ag;8BJCQUnHY2URsg9XXYD3V!g61C9jr16_)j4m6H);m|H^^?W(P;chM z>@I-&Klj6@kL-V{gqqV(_t@~p$Lq3ye&yW&{E5AKhod^704Q~#>kG2Uq}MMJ?s&NP ziVc{C-2?KfcduwbZty_woQ8c9^aKnHa3PIkW1~B-xC0o)>+>r7*7F81u)4BBnKXMx z0L90j;?Rb30gTTaa%0^LuC_pbW=wAQj<2WhKC^afQP6se)t8^m9RFpqdLGD~^f3V} z_;3pbDg8axlum*hgY-w?Pet+9uk5l?8xBasC(9zawf)W90M@jm)CYvhlHWsieA5ff z8CuyVmYL6fao{9)iBLPvPE*laPCsEB(7t~qWhNe2n=@ji21G>qjbb(ine63)JKQZH z` zQ0`kXbM)?I>rcqJELwQO`QK8%L8yBZw?%`O_n39Uv2~3w!I0OsJ<_`AUAHAhSzX(;BW>B``V2(jOcOe=<)xfy>I`EDg6U~&YZb5%}f);bTiWh zWnHEWQs_)&D#RdnGOc2YNE<7x&NQhuu@hnCvXeq`S(jKVyQVEG5mUMBCWK0|VROx; zzVCBpTA$bV`!9Tdt2xg(&-;1bp7-;W%H>VZ?hm_WQ)t>dI73k`FYrCqV)3_3I<1-FrUf*hQeR#tnm8H2Wu|O zKe)G!Lu(M>I$7G?JiG)Ud(*PfM$z+K0`so)oKmE6r}$n|o$biQxHiZ)jxC^QDEvm2 zdt?^|n;TZYH*s8=(-QOUpD|kehfB2r(igCxzc!UP?Q`&;r@l}onjBT~lh;5;)3WX5 zs-Zt|Xgwrc3KRcW67YNG8lp64b$X&ryx9UsUq_Pw9{Z98Y8h7jN+h_uBM?8&5jm+0fBQD-pC1pCjzTmoVr`gh!cG}$)sP{tpy-Zt5jrhrK5>;kuz1+e&t0kKP2Xl7u)5hLlTKQ0t=m!FuVh7u;D(lN)!F&1uWo4%E)SRY*xxIjw)1s&>c;<>UEVjy@a`<&)e z)?il_|DpwOT>c`oHVLWpdt8Z*j)3I;D1Kc4#rTl93Y$wLnf+m#oG9I$C?#9AOJm4C zt0nah(t;n4{%idqNUaC(YxTn^MCbhL8nM3xw#jc)r5uU!*F=Oxl=rnFG zO&l2}|9ONa0D1Z{(~;d%Z!VFcCHzWST5%fVOw;-2g&~(l*`=daZ?4pL(*A9bAP*bc z7<9}DC5e$;VNl&pN3!1nSIX+yIe;eP8Z`Hg_;uJY`HIeIxaq*K;8(rAJ158JFEY4a z)%GzRxLr^_QyGW+;)@DaEzP_(B-ebh$zVyl3+L@e-whh8P|W>h-C^iG`xMtSIB&Ic z?n6&J7{z}h{4H-&$@0r8E7OtZh4H^^iEI{crb*|E>Q{@KTYZpc=&RNIGw8Rr$*%R! z+YL8P2#@s)XmLJ&ZJpLAn$1Ftq&ZN8Ub5Hzz^u_qvj-nNdT+FNg(E}&1D@bs!H`q2Mvel2cTBq7gkd~`z0 zq?H3sl#fkHazcgi-pUx_;?bb1fZu#;BA1Y1@I1 z+WVMl;?GUgAG{;Cca8>~hIhRMG{>;X znFULdoZ;b{IAt;8!}0wEw+N}rWuI6MO$Fpx%Qme9=Z$7Yb`3I(dS+TCRV9ecEP=90 zFnAYoB3+>bm8TgY^7Q4KRVx}_4{0-~kqJGbAx>bV&F^yRYuTTMqM@>mQlw+kOotg} z+;-^Hk-lI#Go9rYkdMV><^%{b;d~HlRG3)|nT9@tyio#Rj6JIU7+8J)lXX}lU&F&41lJH!xAV5W#2$@po1FLU#`H@{LPmqzR~r1P zew*+NTkvkgG;33ojZ5{sZ+J-#HTl-`b0^|eoK6U4f?7nr4MKA84ozIN#e8a6kE;E# zB+cjA3l2eEhH??iswh7M*$mdmj<|c~aaLB6m|K|assv@(lHZ9MU;f4B(k5OMGguRu zQhT92^wkFb0d;Ez$!PcYPO@m|3cFZ=W~?Z*?sRw&rWq>?gyZ#iZ&2Md)ALO0?e>D^ zmA^pK*_yHZK(IXhu6=DXZMC?>9g+|0)&!(0%xA;JWQ$XqW{fCQ zDIvC8+Z_K#G(WHQ92N}U_lu7yq)l1jaOs$v9L5z*xqcQyzpXoVKET;oK+FskET)BW zxw;6pi^m(1efD@vn7m^5SzJRMeUj*htLcYRy|>j2c0F?HKs)~fbyCM^;!30iw&9M3 z_>ip^7}*tnj)pzc8vepb$$JGCWGhl9`H3hl;; z;)0hTw60j+utyr+#N8=Nz7??f>evp)aUSGD@T$|^fQQ^lhfr#dYg5XlDH9DIwlhjZ zodZ4V5(VuPIA+tKzae>*+mx$qX$_8Zr%s)kMV6*riI4OgR9j*_WYXe8X={i&o1vhO|Fm75dYk!Q5cja#k`!v&759h+Ok6c#`#^-sn-^B<{;VPm9@j=Yu=_|4l4(@ zqo}IHfcVoQR(mga`|2~yOnhGYYeG6c9Lb>br(Iurwv83nYE#z4D%JgpgHbryGWP64 z@Ti%WLXWLp8eEGB=8d87yq?DMS+eC8PXNyOls~)LPL@~S^^^Z|SiqpCyiUF?m{{Tj41Fn-XILWppjiP-YOm~;jeSq5x$AOPH@}jai7QM` zboxerjcHoWR&(E(*k%#@R+bjB%X6XaBzxlY2;&!f9W4AK4yT0A3q~4Gm+F0FxnQxI zwRQkl?BRL-du4`u2o5Rx9LCU!n}MpQJGS4>n|5yF&O|Vs^ywWF+RJGD?T+{l&mJ@( z8)j9_G8TPY7(lPu3RWF1-|cni^Y$n2!5peR_<2yq!vG6;Y%xvbJ=60FtNOl?Yf!aM zjegwEF&3{R=!)=y1sU7kuIfLTIK5iXo)M$`13~R3bz@3akGdYH^y1K|^J%#!N6TGi+QDHSr`3c zU;0In;j^p1eAzl)&B_@k_|><&Yw`ywOCN7yyHh%Gi-#;1d{(B7T5Rsf{MdjzMfvrs zQd)P}vNYrJmE~X?oP%TVsLvrkV8q<>8$@R36127%A6t(dxC~blly)bH)AM7V#ef$b zRtNs$7h!b?QZW8l;`rerIO)g!vM$-|Jm%s-Yo%1RarVLII}bIB{{$f}#As0DvJwu1 z#oDO(i>u!s-vz-3@+KW+vgK&Ty>mQc)n4TjqX=*@+bB{Y}XQYy&PD|D$e z@YW}f@W+vx3qkct`fom9jxn#DA^ezc|})9m=jWCm@3--C;4ZT0&%O^=nu zX?e=V9)b)oOt@VJP>Zjw7fXkiM2DZF(@NU>;PBrz`9}Jqp z;(I2zuT%#MEo(|keJB%gS>WT@zS!r{>%*T|tPt?}nXQV#)F^MbDJ$?%t;ecU_JvP( ze*E9372w4YWg>7f1=}-tKE0Awi>F@S&&)PqgosA;eAy&6BS%X+sea#l;b^Y!cf$i9 zc8L*=7XMfDs=Z;@Ye#M{E70xhUekQ27I=-tvlNQR$upG`0w<+yIkthy#znDa^omVg zZ41r|n8HZPeO$jlJ;sivj0bKzel8AX6BO>k*7o6DEW0-if=1TBW^i06hbL6N!dWIq zpm{*Ru?_m3or2V9%H`zDuhSY85CB5Z#)zVG8toblB0j#omD#U{J{)k0IG_A2BJYP2 z*)Mxm2>!!uUYm`T!{$D3=1;JpwF5YG@64dw zlncJNDc{YE1q-c`_nn!~@Uonr=0jX|L(YVO=69$99^Lk0fV#MqMMEti!B>20{{V4k zewZbsh9JPPcl>x+$KB~k7Jn<08@-!*7##hXyw8?zds0r>36xXTY&+!GsA;Dxw9i|T zwU1VM9T-GGs*l{HOc&=Gr=xHI0-Xf`j^kB*o5{EBp5Ry)S%yNG13&7?mP^7Mo@N}) zrxi~nCsf@ei3)Qyd`69#0gLVJX&o_+V3({g3ZH2q*$#!Suq=)8$rBU6SVo1TXriqr zd78)!!Q)Lw(;vnx)%EzkAstn!Uq*4mQ?pY}VxS$)bytsO+}ijo$P#xU-~`FdmF&Q^ zfoqQUKPaSV|Dy#~NaDn`O%V1+zCGXr0ɲ)5qQT1L@7QDJ@r9TLnb0DUN5U>JlT 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 M`zBETzYQe+4;)-!xBvhE diff --git a/src-tauri/icons/dev/icon.png b/src-tauri/icons/dev/icon.png index 8a31445c03e3d95f770245cc42efd19dc03b3a4b..00a22f65bd644cfa3280e3aa3a1b00d354781193 100644 GIT binary patch literal 1049236 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 F{}1s3f0O_K literal 8300 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 diff --git a/src-tauri/icons/dock/dark.png b/src-tauri/icons/dock/dark.png index cec5145a5a8feef2b5fe0891814560ddb01b1474..0d4805bed58440bb7972f70b6a5666a879338ea7 100644 GIT binary patch literal 1049236 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 J?_U46{|}wC69oVO literal 7568 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 z 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 J?_U46{|}wC69oVO literal 7568 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 z z4Y_3Q+OVck5wT(MN#O#eu3=Pj9+7rw!vk}g%<(XR33<}3y0rNcCIKTciy`ZMLF27p z=am)WZ@uGv^>P>WYW_V3hhCKZ(at}Aoupjd=E`h5Rx8BWtTfoYqOeg2o^;q||5M-F zv1%m53oNxC@r2jtCxPP{%;x`2=lJEDy`w3R1+M-S@{4bg@*Mq)U{3a4sF+@>x!;RJ zMt$(WFPIO{R_Y#vkFb+WU*lM%AB}KqWpS3#ATqN1Msp{P#<}Zvfwk_obIIv+g;siP zPLCHJ8O6ajEWY2_EQxF$r8k^tph0{+0z!)vKYTJi^;4-S;6+u|HzPE3by9HK~=0QEm zgDdBZBr`-{JGaPWjI>(b-wt)Y$H zmC@dt{N#?xLM_)E&hoZZdP`D$3f=ohVfh<+2r2y>J_l->tZE+zVGv25oKFtIG9e`R zYeY~9(aTYGR!V00X!}MsO0g?NpQC#>fb1{}I?9j?WD69b&nIO6*8acxmkeE`e3qykMS*t$N53ZX312Hl&hnCbri$ZsvQT2w*b4juCWa`Z!AS2w?`Ojef{1 zVe^fn6S?RwsCk1_*D%U(EY(e83zMHdSuVLbLS7&g@LAaxh$3^sDaeue8aOVTl^x|3 zT{0TOATmv9XrBO#6_liFWLg%K;aik>3$*Q7pzl{(E97*g z19t?l2+VzVjsgL2R`x5>S#p364D4{-xMSCHcV`VihFW_TRUc0Bqf00c-5K)|R~hlw z6W6p!_1W3s-#S)HTA_iJRG>*I+WrBpe9j6-aMSSsiS%e~Ljyihs(1P1N3<$bRP4db|3S*XubY+a-Y~h!HQ%r3P>!Tmm(N3{elBc69??gEifk-TL z<&YL!ObeDe1a-7ePn?23lDsCShFK0xq6I@7g6*{6XAVIk6lF;ZLh>-=l9Vp>$+GC0 z->)QH{L|8nRv>NhXR3EgdTmd+!j$G!30YaJ1!hb7%J%{*lo$|Sh}|9g6*QtzXMQg;D<~4@%T4lzA#~kV@>Dr*0?bk zJj8mcI|b)8G3CN1zzuQH+W!gB<=9lDd@xFj!Kpd4lsjFGEtv&q1TJ;yoU((wqC#U! zc-|f;;}#+_Uyz_BO2N;$H$S zHgJ-<2iaCal-2f>$4AH|KD7RP4}uTaY??{$aU7~^qn5V*$u_}8@<~1+*4q7jLffFV zrA56QX~F7llq>t3)k?=ro~1%^uTTb>YpyVzTE`rtdcO>RC)b{aEI_C>u7`z?`>h=MGLQAH36xv*mvb*A*FK z0^~eMaHW8-+Wfu8t*4g%+R|;c)r|Gcq!OOToQHm}E%hhLK+K%q3!c%i?~cXfR4M0i zOc{_C9PGuRw57v|AvEkl1@vIa8!32hyE`?sm)d>o@vxdBZSlplg!Xa_zo~NY+g614 zy5WoA>MfSYez!shIq<@F@QV9_#QfP>5ybGl&t66M*j8s z3QO8Du6808cQ^)asu~;u2Z4Y5zhiEq^gk{EQDDgG`-acwmy4w_E*)6kI)3Hn{!?fh zli)@0tXEdQH(E=0|G&3ov+_8)o>G}5wEv&{PM{N5>fO&k(!Xs_y;HsWgj>(}dlTy_ z2XBF$!2jP`(MySEQ~98roZkDZI4M4cqx~Hlm=o&?+^?Y5{k7OJMEYIo`WPm2%k+=wmz`+wjIBSwFC1K`w@^w?*f$D8R7o Result; diff --git a/src-tauri/src/market_connection/native_compatibility.rs b/src-tauri/src/market_connection/native_compatibility.rs index 452d510537..be1f7a2308 100644 --- a/src-tauri/src/market_connection/native_compatibility.rs +++ b/src-tauri/src/market_connection/native_compatibility.rs @@ -257,10 +257,23 @@ fn inspect(bundle: &Path, agent: &str) -> Result { // digest: bindings and model caches live in this same process. A new local // generation avoids reading hundreds of MB from executable/App archives. static GENERATION: AtomicU64 = AtomicU64::new(1); - let generation = GENERATION - .try_update(Ordering::Relaxed, Ordering::Relaxed, |v| v.checked_add(1)) - .map_err(|_| "Native App generation exhausted")? - .to_string(); + // CAS loop is supported by our Rust MSRV and avoids both the deprecated + // fetch_update API and the new try_update API (stable only since 1.95). + let mut observed = GENERATION.load(Ordering::Relaxed); + let generation = loop { + let next = observed + .checked_add(1) + .ok_or("Native App generation exhausted")?; + match GENERATION.compare_exchange_weak( + observed, + next, + Ordering::Relaxed, + Ordering::Relaxed, + ) { + Ok(previous) => break previous.to_string(), + Err(current) => observed = current, + } + }; #[cfg(not(any(target_os = "macos", test)))] let _ = (&version, &generation); let resolved = ResolvedNativeClient { From fcd3e93bb5dcf2a2bcd03889dc64c007ecaff6ed Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 17:02:15 +0700 Subject: [PATCH 50/60] test(macos): align dev executable assertions with TP Agent Studio fork identity --- src-tauri/src/app/dev_process_name.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/app/dev_process_name.rs b/src-tauri/src/app/dev_process_name.rs index 414c971aa0..f1caf5f59e 100644 --- a/src-tauri/src/app/dev_process_name.rs +++ b/src-tauri/src/app/dev_process_name.rs @@ -79,12 +79,18 @@ mod tests { assert!(!needs_named_executable(identifier, bare)); } assert!(!needs_named_executable( + DEV_IDENTIFIER, + Path::new("/build/debug/TP Agent Studio Dev") + )); + // The upstream process name is NOT the fork's dev process name. + // Otherwise a renamed fork could keep showing an upstream Dock title. + assert!(needs_named_executable( DEV_IDENTIFIER, Path::new("/build/debug/ORG2 Dev") )); assert!(!needs_named_executable( DEV_IDENTIFIER, - Path::new("/build/ORG2 Dev.app/Contents/MacOS/org2") + Path::new("/build/TP Agent Studio Dev.app/Contents/MacOS/org2") )); } From 4177ffbf04c9efab26a48fb998ed8a29963fda24 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:51:07 +0700 Subject: [PATCH 51/60] test(scheduler): add deterministic 1/5/20/50 multi-session stress profiles Exercise real Tokio DialogScheduler cross-session overlap, per-session FIFO isolation, queue drainage and targeted stop on synthetic offline turns. --- .../core/session/scheduler/stress_tests.rs | 239 ++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs new file mode 100644 index 0000000000..cd2a0bfa7b --- /dev/null +++ b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs @@ -0,0 +1,239 @@ +//! Synthetic, offline stress tests of the actual DialogScheduler. + //! + //! No real LLM/network/tool calls, account credentials, or interactive UI. + //! All tests are bounded: use 1/5/20/50 session profiles and finite deadlines. + //! These checks prove FIFO and cross-session isolation at the Scheduler + //! boundary, NOT end-to-end provider liveness, crash recovery, or production + //! capacity under 50 real concurrent API/tool workloads. + +use super::{DialogScheduler, ExecutionCompletion, ScheduledKind, ScheduledMessage}; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::{watch, Barrier}; + +const TEST_DEADLINE: Duration = Duration::from_secs(20); + +fn synthetic_message( + message_id: String, + kind: ScheduledKind, + execute: super::ExecuteFn, +) -> ScheduledMessage { + ScheduledMessage { + kind, + message_id, + generation: 0, + client_message_id: None, + // Empty as in the existing scheduler unit tests. This is an in-memory + // concurrency test, not the persistent Turn-intent identity contract. + turn_intent_id: String::new(), + org_run_id: None, + content: String::new(), + execute, + } +} + +/// Concurrent native session workers must not serialize across sessions. +/// The first Turn in each FIFO reaches a barrier before any can finish. +/// Then, a second Turn per session must not start before its first one ends. +async fn exercise_profile(session_count: usize) { + let barrier = Arc::new(Barrier::new(session_count + 1)); + let (release, hold) = watch::channel(false); + let active = Arc::new(AtomicUsize::new(0)); + let first_started = Arc::new(AtomicUsize::new(0)); + let first_completed = Arc::new(AtomicUsize::new(0)); + let second_completed = Arc::new(AtomicUsize::new(0)); + let ordering_errors = Arc::new(AtomicUsize::new(0)); + let mut schedulers = Vec::with_capacity(session_count); + let mut states = Vec::with_capacity(session_count); + + for index in 0..session_count { + let scheduler = DialogScheduler::new( + format!("stress-lab-{session_count}-{index}"), + 4, // 1 queued follow-up + generous per-session queue headroom + ); + let state = Arc::new(AtomicUsize::new(0)); + states.push(Arc::clone(&state)); + let initial_state = Arc::clone(&state); + let first_barrier = Arc::clone(&barrier); + let mut hold_rx = hold.clone(); + let active_in_job = Arc::clone(&active); + let started_in_job = Arc::clone(&first_started); + let completed_in_job = Arc::clone(&first_completed); + let errors_in_job = Arc::clone(&ordering_errors); + + scheduler + .enqueue(synthetic_message( + format!("first-{index}"), + ScheduledKind::Turn, + Box::new(move || { + Box::pin(async move { + active_in_job.fetch_add(1, Ordering::SeqCst); + started_in_job.fetch_add(1, Ordering::SeqCst); + // Once all N first jobs have reached the barrier, + // cross-session scheduling has demonstrably overlapped. + first_barrier.wait().await; + while !*hold_rx.borrow() { + if hold_rx.changed().await.is_err() { + return Err("stress-lab release channel was dropped".into()); + } + } + if initial_state.swap(1, Ordering::SeqCst) != 0 { + errors_in_job.fetch_add(1, Ordering::SeqCst); + } + active_in_job.fetch_sub(1, Ordering::SeqCst); + completed_in_job.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }), + )) + .await + .expect("first Turn must enqueue"); + + let second_state = Arc::clone(&state); + let second_done = Arc::clone(&second_completed); + let second_errors = Arc::clone(&ordering_errors); + scheduler + .enqueue(synthetic_message( + format!("second-{index}"), + ScheduledKind::Turn, + Box::new(move || { + Box::pin(async move { + // A violation is counted even if scheduler catches a + // panic and otherwise masks it as a Turn error. + if second_state.swap(2, Ordering::SeqCst) != 1 { + second_errors.fetch_add(1, Ordering::SeqCst); + } + second_done.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }), + )) + .await + .expect("second FIFO Turn must enqueue"); + // Keep the real session-owned scheduler alive until all work drains. + schedulers.push(scheduler); + } + + tokio::time::timeout(TEST_DEADLINE, barrier.wait()) + .await + .expect("all first Turns must reach the cross-session barrier"); + assert_eq!(first_started.load(Ordering::SeqCst), session_count); + assert_eq!(active.load(Ordering::SeqCst), session_count); + assert_eq!(second_completed.load(Ordering::SeqCst), 0, + "no FIFO follow-up may start while its first Turn is blocked"); + + release.send(true).expect("there must still be live Turn receivers"); + tokio::time::timeout(TEST_DEADLINE, async { + while second_completed.load(Ordering::SeqCst) != session_count { + tokio::task::yield_now().await; + } + }) + .await + .expect("all second FIFO Turns must eventually complete"); + assert_eq!(first_completed.load(Ordering::SeqCst), session_count); + assert_eq!(ordering_errors.load(Ordering::SeqCst), 0); + assert_eq!(active.load(Ordering::SeqCst), 0); + for (index, state) in states.iter().enumerate() { + assert_eq!(state.load(Ordering::SeqCst), 2, + "both FIFO turns must have executed exactly once for session {index}"); + } + for scheduler in &schedulers { + assert_eq!(scheduler.pending_count(), 0); + } +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn one_session_preserves_fifo() { + exercise_profile(1).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn five_sessions_run_in_parallel_and_keep_fifo() { + exercise_profile(5).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn twenty_sessions_run_in_parallel_and_keep_fifo() { + exercise_profile(20).await; +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn fifty_sessions_run_in_parallel_and_keep_fifo() { + exercise_profile(50).await; +} + +/// A failure/targeted Stop in one session cannot cancel a neighbor's queued +/// Turn, even if all sessions are actively processing first Turns. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn targeted_stop_is_session_local_across_five_busy_workers() { + const COUNT: usize = 5; + const STOP_INDEX: usize = 2; + let barrier = Arc::new(Barrier::new(COUNT + 1)); + let (release, hold) = watch::channel(false); + let followup_count = Arc::new(AtomicUsize::new(0)); + let cancelled_ran = Arc::new(AtomicUsize::new(0)); + let mut schedulers = Vec::new(); + + for index in 0..COUNT { + let scheduler = DialogScheduler::new( + format!("stop-isolation-{index}"), + 4, + ); + let b = Arc::clone(&barrier); + let mut rx = hold.clone(); + scheduler.enqueue(synthetic_message( + format!("first-{index}"), + ScheduledKind::Turn, + Box::new(move || Box::pin(async move { + b.wait().await; + while !*rx.borrow() { + if rx.changed().await.is_err() { + return Err("release was dropped".into()); + } + } + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("first Turn enqueued"); + + // Unlike the empty intent of the first fixture, targeted cancellation + // must have a uniquely owned exact intent key. + let second_id = format!("cancel-target-{index}"); + let finished = Arc::clone(&followup_count); + let cancelled = Arc::clone(&cancelled_ran); + scheduler.enqueue(ScheduledMessage { + kind: ScheduledKind::Turn, + message_id: format!("followup-{index}"), + generation: 0, + client_message_id: None, + turn_intent_id: second_id.clone(), + org_run_id: None, + content: String::new(), + execute: Box::new(move || Box::pin(async move { + if index == STOP_INDEX { + cancelled.fetch_add(1, Ordering::SeqCst); + } else { + finished.fetch_add(1, Ordering::SeqCst); + } + Ok(ExecutionCompletion::Finished) + })), + }).await.expect("second Turn enqueued"); + if index == STOP_INDEX { + assert!(!scheduler.invalidate_turn(&second_id), + "second Turn is still pending while first is blocked"); + } + schedulers.push(scheduler); + } + tokio::time::timeout(TEST_DEADLINE, barrier.wait()) + .await.expect("all five initial Turns should start"); + release.send(true).expect("receivers alive"); + tokio::time::timeout(TEST_DEADLINE, async { + while followup_count.load(Ordering::SeqCst) != COUNT - 1 { + tokio::task::yield_now().await; + } + }).await.expect("unaffected sessions must finish"); + assert_eq!(cancelled_ran.load(Ordering::SeqCst), 0); + for s in &schedulers { + assert_eq!(s.pending_count(), 0); + } +} From aa639597196780455a84385f409c8886b48ac676 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:51:41 +0700 Subject: [PATCH 52/60] test(scheduler): register offline concurrent stress matrix module --- src-tauri/crates/agent-core/src/core/session/scheduler.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index 5ad6908c2e..115bd6bb95 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -929,6 +929,9 @@ async fn reconcile_agent_org_run_after_terminal(run_id: &str) { } } +#[cfg(test)] +mod stress_tests; + #[cfg(test)] mod final_summary_tests; From aa0ace6c0827dcd2ef75954fa2660b9cdb3e7671 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:52:15 +0700 Subject: [PATCH 53/60] test(stress): await cancellation dequeue before inspecting per-session queues Prevent false failures when unrelated sessions finish ahead of targeted cancelled queue drain. --- .../src/core/session/scheduler/stress_tests.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs index cd2a0bfa7b..d4c40561f3 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs @@ -232,8 +232,12 @@ async fn targeted_stop_is_session_local_across_five_busy_workers() { tokio::task::yield_now().await; } }).await.expect("unaffected sessions must finish"); + // The cancelled job can still be waiting for its scheduler's receiver + // while other sessions complete. Wait for its dequeue without sleeping. + tokio::time::timeout(TEST_DEADLINE, async { + while schedulers.iter().any(|worker| worker.pending_count() != 0) { + tokio::task::yield_now().await; + } + }).await.expect("targeted cancelled job must drain its queue slot"); assert_eq!(cancelled_ran.load(Ordering::SeqCst), 0); - for s in &schedulers { - assert_eq!(s.pending_count(), 0); - } } From 9108d199020d60b002603d71a01d69d400fb1ac5 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:53:08 +0700 Subject: [PATCH 54/60] test(scheduler): add dead-worker isolation and bounded queue overload scenarios Verify no replay of queued side-effectful work after abort, neighbor session remains independent and full queue rejects promptly. --- .../core/session/scheduler/stress_tests.rs | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs index d4c40561f3..aaba1ad7b2 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs @@ -241,3 +241,140 @@ async fn targeted_stop_is_session_local_across_five_busy_workers() { }).await.expect("targeted cancelled job must drain its queue slot"); assert_eq!(cancelled_ran.load(Ordering::SeqCst), 0); } + + +/// The worker for one session can be aborted without blocking an unrelated +/// per-session FIFO. Replacement only happens on a *new enqueue* and never +/// replays the old pending job from the lost receiver. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn dead_worker_replacement_does_not_replay_or_block_neighbor() { + let dead = DialogScheduler::new("stress-lab-dead", 4); + let neighbor = DialogScheduler::new("stress-lab-neighbor", 4); + let (dead_started_tx, dead_started_rx) = tokio::sync::oneshot::channel(); + let (_dead_release_tx, dead_release_rx) = tokio::sync::oneshot::channel::<()>(); + let stale_ran = Arc::new(AtomicUsize::new(0)); + let recovered_ran = Arc::new(AtomicUsize::new(0)); + let neighbor_ran = Arc::new(AtomicUsize::new(0)); + + dead.enqueue(synthetic_message( + "dead-running".into(), ScheduledKind::Maintenance, + Box::new(move || Box::pin(async move { + let _ = dead_started_tx.send(()); + let _ = dead_release_rx.await; + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("enqueue blocked worker"); + tokio::time::timeout(TEST_DEADLINE, dead_started_rx) + .await.expect("dead worker starts") + .expect("start signal"); + + let stale_count = Arc::clone(&stale_ran); + dead.enqueue(synthetic_message( + "never-replay".into(), ScheduledKind::Maintenance, + Box::new(move || Box::pin(async move { + stale_count.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("enqueue old pending job"); + + let (neighbor_release, neighbor_hold) = tokio::sync::oneshot::channel::<()>(); + let (neighbor_started_tx, neighbor_started_rx) = tokio::sync::oneshot::channel(); + let neighbor_count = Arc::clone(&neighbor_ran); + neighbor.enqueue(synthetic_message( + "neighbor".into(), ScheduledKind::Maintenance, + Box::new(move || Box::pin(async move { + let _ = neighbor_started_tx.send(()); + let _ = neighbor_hold.await; + neighbor_count.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("neighbor starts"); + tokio::time::timeout(TEST_DEADLINE, neighbor_started_rx) + .await.expect("neighbor is independently active") + .expect("neighbor start signal"); + + { + let guard = dead.inner.lock().await; + guard.as_ref().expect("dead worker registered").worker.abort(); + } + tokio::time::timeout(TEST_DEADLINE, async { + loop { + let finished = dead.inner.lock().await + .as_ref().expect("dead handle retained").worker.is_finished(); + if finished { break; } + tokio::task::yield_now().await; + } + }).await.expect("aborted worker must stop"); + + let recovered_count = Arc::clone(&recovered_ran); + dead.enqueue(synthetic_message( + "new-work-not-replay".into(), ScheduledKind::Maintenance, + Box::new(move || Box::pin(async move { + recovered_count.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("a new enqueue must replace terminated worker"); + + neighbor_release.send(()).expect("neighbor is still waiting"); + tokio::time::timeout(TEST_DEADLINE, async { + while recovered_ran.load(Ordering::SeqCst) != 1 || + neighbor_ran.load(Ordering::SeqCst) != 1 { + tokio::task::yield_now().await; + } + }).await.expect("new local job and neighbor job both finish"); + + assert_eq!(stale_ran.load(Ordering::SeqCst), 0, + "lost queue contents must never be replayed as side-effectful work"); + assert_eq!(dead.pending_count(), 0); + assert_eq!(neighbor.pending_count(), 0); +} + +/// Queue admission must reject excess work promptly rather than retaining +/// unlimited messages that make an app with many sessions appear hung. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn bounded_per_session_queue_rejects_overload_and_drains_cleanly() { + let scheduler = DialogScheduler::new("stress-lab-queue-cap", 2); + let (first_started_tx, first_started_rx) = tokio::sync::oneshot::channel(); + let (release, hold) = tokio::sync::oneshot::channel::<()>(); + let finished = Arc::new(AtomicUsize::new(0)); + let initial_finished = Arc::clone(&finished); + + scheduler.enqueue(synthetic_message( + "blocking-first".into(), ScheduledKind::Maintenance, + Box::new(move || Box::pin(async move { + let _ = first_started_tx.send(()); + let _ = hold.await; + initial_finished.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("first maintenance job enqueued"); + tokio::time::timeout(TEST_DEADLINE, first_started_rx) + .await.expect("first job reaches its wait point") + .expect("first start signal"); + + for index in 0..2 { + let count = Arc::clone(&finished); + scheduler.enqueue(synthetic_message( + format!("queued-{index}"), ScheduledKind::Maintenance, + Box::new(move || Box::pin(async move { + count.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + })), + )).await.expect("up to capacity pending jobs admitted"); + } + assert_eq!(scheduler.pending_count(), 2); + let rejected = scheduler.enqueue(synthetic_message( + "over-capacity".into(), ScheduledKind::Maintenance, + Box::new(|| Box::pin(async { Ok(ExecutionCompletion::Finished) })), + )).await.expect_err("the full per-session queue must reject immediately"); + assert!(rejected.contains("full"), "unexpected rejection: {rejected}"); + assert_eq!(scheduler.pending_count(), 2); + + release.send(()).expect("first job is still blocked"); + tokio::time::timeout(TEST_DEADLINE, async { + while finished.load(Ordering::SeqCst) != 3 { + tokio::task::yield_now().await; + } + }).await.expect("accepted queue drains after releasing the first job"); + assert_eq!(scheduler.pending_count(), 0); +} From 702b45b4e0ba36f90dc5f44e2057d37d2d7be8d2 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:54:05 +0700 Subject: [PATCH 55/60] fix(stress): release Tokio watch read borrow before awaiting changed Prevent borrow-across-await compile errors in 1/5/20/50 profiles and targeted cancel scenario. --- .../src/core/session/scheduler/stress_tests.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs index aaba1ad7b2..9e28445d69 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler/stress_tests.rs @@ -73,7 +73,11 @@ async fn exercise_profile(session_count: usize) { // Once all N first jobs have reached the barrier, // cross-session scheduling has demonstrably overlapped. first_barrier.wait().await; - while !*hold_rx.borrow() { + loop { + // Drop the watch Ref before awaiting a mutable + // changed() call (avoids a borrow across await). + let released = { *hold_rx.borrow() }; + if released { break; } if hold_rx.changed().await.is_err() { return Err("stress-lab release channel was dropped".into()); } @@ -187,7 +191,9 @@ async fn targeted_stop_is_session_local_across_five_busy_workers() { ScheduledKind::Turn, Box::new(move || Box::pin(async move { b.wait().await; - while !*rx.borrow() { + loop { + let released = { *rx.borrow() }; + if released { break; } if rx.changed().await.is_err() { return Err("release was dropped".into()); } From bdd16200d334676bc8a13d9d85c9da6c98acb8b6 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:55:17 +0700 Subject: [PATCH 56/60] docs(stress-lab): add reproducible synthetic 1/5/20/50 scheduler test matrix Explicitly scope offline FIFO/failure tests separately from unverified provider, SQLite, OS and sustained-load acceptance. --- docs/fork/MULTI_SESSION_STRESS_LAB.md | 64 +++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 docs/fork/MULTI_SESSION_STRESS_LAB.md diff --git a/docs/fork/MULTI_SESSION_STRESS_LAB.md b/docs/fork/MULTI_SESSION_STRESS_LAB.md new file mode 100644 index 0000000000..99c541cd3e --- /dev/null +++ b/docs/fork/MULTI_SESSION_STRESS_LAB.md @@ -0,0 +1,64 @@ +# TP Agent Studio — Multi-Session Stress Lab + +**Goal:** exercise the real Rust `DialogScheduler` with concurrent Session +workers under controlled, bounded loads. These are **synthetic, offline** +tests: no paid providers, actual tools, subprocesses or user credentials. + +## Run + +From the repository root: + +```bash +cd src-tauri +cargo test -p agent_core --lib session::scheduler::stress_tests -- --nocapture + +# One specific load profile, useful when debugging: +cargo test -p agent_core --lib session::scheduler::stress_tests::fifty_sessions_run_in_parallel_and_keep_fifo -- --exact --nocapture +``` + +A cold Rust compile can take significantly longer than the test execution. +Every scenario has a bounded 20-second in-runtime wait so a deadlocked +fixture fails rather than occupying CI indefinitely. Review the exit code. + +## Test matrix + +| Scenario | Synthetic load | Guarantee checked | +| --- | --- | --- | +| Baseline | 1 Session / 2 Turns | FIFO: second waits for first | +| Multi-5 | 5 Session workers / 10 Turns | Actual cross-session overlap; per-session FIFO | +| Multi-20 | 20 workers / 40 Turns | No cross-session serialization | +| Multi-50 | 50 workers / 100 Turns | All first Turns overlap, all second Turns drain once | +| Targeted cancellation | 5 active workers / 1 cancelled queued Turn | Cancellation stays within its Session | +| Worker abort | 2 workers, one force-aborted | Neighbor still finishes; lost work never replayed | +| Queue pressure | 1 busy worker, queue capacity 2 | Third pending message rejected; accepted work drains | + +The concurrency tests use actual Tokio task scheduling and +`DialogScheduler::enqueue()`. A barrier ensures that every first job +has reached a suspended execution boundary before any is released. +Per-session atomic state confirms the second job cannot run early. +The scheduler catches panics, so violations are recorded explicitly +rather than trusting panics to escape. + +## Important limitations + +- Passing 50 **synthetic** Tokio jobs does **not** prove 50 real provider + connections, high-token contexts or filesystem-changing tools are safe. +- No full-app frontend, sustained soak, process memory, real SQLite + contention, tool effects, crash/restart or installer acceptance is covered. +- A crashed worker's abandoned queued jobs are **not replayed automatically**. + Replaying side-effectful tool work could duplicate external actions. +- First-time Rust dependency compilation may dominate CI timing. Do not skip + failed tests or raise timeouts merely to obtain a green status. + +## Acceptance roadmap + +- [x] Add synthetic 1/5/20/50 scheduler profiles. +- [x] Add targeted-stop isolation, dead-worker isolation and queue overload. +- [ ] Verify focused Rust tests pass on CI (macOS/Windows/Linux). +- [ ] Fault-inject slow/failed providers, network, tools and SQLite contention. +- [ ] Validate 50 genuine Sessions with CPU, RAM, file descriptor and + latency telemetry over a 30-minute sustained workload. +- [ ] Verify full desktop shutdown/restart recovery and side-by-side + fork profile isolation on macOS M4, Windows 11 and Linux. + +See [Reliability roadmap](ROADMAP.md). From b9dec157cdedbe88f4534eaa7139257fc422e1ba Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 20:55:47 +0700 Subject: [PATCH 57/60] docs(roadmap): track synthetic stress test implementation without closing real E2E load acceptance Retain real 1/5/20/50 provider/tool cross-OS soak and clean restart as outstanding. --- docs/fork/ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/fork/ROADMAP.md b/docs/fork/ROADMAP.md index 4ff307e224..0d46c99664 100644 --- a/docs/fork/ROADMAP.md +++ b/docs/fork/ROADMAP.md @@ -34,6 +34,7 @@ - [x] Catch scheduler execute-factory panics, track dead worker handles, recover the queue on next enqueue, and persist failed session state; added targeted regression tests (final CI pending). - [x] Continue independent startup reconciliation phases after a partial failure so stale in-flight session cleanup is still attempted; see [multi-session recovery audit](SESSION_STALL_RECOVERY.md). - [ ] Implement bounded progress/heartbeat diagnostics for genuinely hung provider or Tool futures, with cancellation semantics that never replay side-effectful work. +- [x] Add bounded, synthetic Rust `DialogScheduler` stress tests for 1/5/20/50 concurrent sessions, targeted cancellation, dead-worker no-replay isolation and queue capacity (test code added; CI verification pending). See [Multi-Session Stress Lab](MULTI_SESSION_STRESS_LAB.md). - [ ] Stress-test 1/5/20/50 concurrent sessions under load and validate clean shutdown/restart on all three platforms. **Acceptance:** no double-owned memory consolidation; session/tool cancellation leaves no orphaned jobs; migration failures cannot leave an app silently running on a partially upgraded schema. From 7c3b668b43b4145c45711d58f5b9bd4b1e545fae Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 21:06:32 +0700 Subject: [PATCH 58/60] test(scheduler): inject slow provider, mock timeout, never-ending tool and tool error Verify real scheduler isolation, bounded timeout handling, no-replay on abort and queue continuity without any external API. --- .../scheduler/fault_injection_tests.rs | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 src-tauri/crates/agent-core/src/core/session/scheduler/fault_injection_tests.rs diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler/fault_injection_tests.rs b/src-tauri/crates/agent-core/src/core/session/scheduler/fault_injection_tests.rs new file mode 100644 index 0000000000..a8dac8954c --- /dev/null +++ b/src-tauri/crates/agent-core/src/core/session/scheduler/fault_injection_tests.rs @@ -0,0 +1,253 @@ +//! Offline fault-injection at the actual DialogScheduler future boundary. + //! No provider credentials, external HTTP calls or real tools are invoked. + //! Each test has an explicit, bounded deadline and no automatic replay. + +use super::{DialogScheduler, ExecutionCompletion, ScheduledKind, ScheduledMessage}; +use std::future::pending; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; +use std::time::Duration; +use tokio::sync::oneshot; + +const DEADLINE: Duration = Duration::from_secs(10); + +fn job( + label: &str, + execute: super::ExecuteFn, +) -> ScheduledMessage { + ScheduledMessage { + kind: ScheduledKind::Maintenance, + message_id: label.to_string(), + generation: 0, + client_message_id: None, + turn_intent_id: String::new(), + org_run_id: None, + content: String::new(), + execute, + } +} + +/// A provider callback that is waiting on a remote reply must not cause +/// unrelated schedulers to block. A follow-up in the *same* FIFO must wait. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn slow_provider_future_isolated_from_five_neighbor_sessions() { + let blocked = DialogScheduler::new("slow-provider", 4); + let (started_tx, started_rx) = oneshot::channel::<()>(); + let (release_tx, release_rx) = oneshot::channel::<()>(); + let provider_executed = Arc::new(AtomicUsize::new(0)); + let provider_count = Arc::clone(&provider_executed); + blocked.enqueue(job("waiting-provider", Box::new(move || { + Box::pin(async move { + let _ = started_tx.send(()); + release_rx.await.map_err(|_| "fixture release dropped".to_string())?; + provider_count.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("provider fixture enqueued"); + tokio::time::timeout(DEADLINE, started_rx) + .await.expect("provider callback must enter").expect("start signal"); + + let followup_finished = Arc::new(AtomicUsize::new(0)); + let followup_count = Arc::clone(&followup_finished); + blocked.enqueue(job("queued-behind-provider", Box::new(move || { + Box::pin(async move { + followup_count.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("follow-up must enqueue"); + + let other_finished = Arc::new(AtomicUsize::new(0)); + let mut neighbors = Vec::new(); + for n in 0..5 { + let scheduler = DialogScheduler::new(format!("provider-neighbor-{n}"), 2); + let finished = Arc::clone(&other_finished); + scheduler.enqueue(job("unrelated-session", Box::new(move || { + Box::pin(async move { + finished.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("independent worker enqueues"); + neighbors.push(scheduler); + } + tokio::time::timeout(DEADLINE, async { + while other_finished.load(Ordering::SeqCst) != 5 { + tokio::task::yield_now().await; + } + }).await.expect("other workers must complete while provider waits"); + assert!(blocked.is_processing(), "slow future is still owned by its worker"); + assert_eq!(blocked.pending_count(), 1); + assert_eq!(provider_executed.load(Ordering::SeqCst), 0); + assert_eq!(followup_finished.load(Ordering::SeqCst), 0); + release_tx.send(()).expect("blocked callback remains pending"); + tokio::time::timeout(DEADLINE, async { + while followup_finished.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }).await.expect("follow-up must drain once original provider completes"); + assert_eq!(provider_executed.load(Ordering::SeqCst), 1); + assert_eq!(followup_finished.load(Ordering::SeqCst), 1); + assert_eq!(blocked.pending_count(), 0); + assert_eq!(neighbors.len(), 5); +} + +/// An explicit mock/provider timeout must return a bounded error. The +/// scheduler must not poison the FIFO after receiving that error. +/// Maintenance kind isolates the scheduling contract from durable session +/// state and does not claim to test production retry decisions. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn explicit_mock_provider_timeout_does_not_poison_followup_queue() { + let scheduler = DialogScheduler::new("timeout-provider", 4); + let timed_out = Arc::new(AtomicUsize::new(0)); + let errors = Arc::clone(&timed_out); + scheduler.enqueue(job("mock-provider-timeout", Box::new(move || { + Box::pin(async move { + let outcome = tokio::time::timeout( + Duration::from_millis(60), + pending::<()>(), + ).await; + if outcome.is_err() { + errors.fetch_add(1, Ordering::SeqCst); + return Err("synthetic-provider-timeout".to_string()); + } + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("provider test enqueued"); + + let continued = Arc::new(AtomicUsize::new(0)); + let finished = Arc::clone(&continued); + scheduler.enqueue(job("after-timeout", Box::new(move || { + Box::pin(async move { + finished.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("next job accepted"); + + tokio::time::timeout(DEADLINE, async { + while continued.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }).await.expect("worker must keep draining after explicit simulated error"); + assert_eq!(timed_out.load(Ordering::SeqCst), 1); + assert_eq!(continued.load(Ordering::SeqCst), 1); + assert_eq!(scheduler.pending_count(), 0); +} + +/// An indefinite tool future cannot be replayed by an observer. Aborting +/// its scheduler task drops the in-flight future, and the replacement must +/// accept only a *fresh* job. A neighboring scheduler remains independent. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn never_resolving_tool_is_dropped_on_worker_abort_without_replay() { + struct DropCount(Arc); + impl Drop for DropCount { + fn drop(&mut self) { + self.0.fetch_add(1, Ordering::SeqCst); + } + } + + let blocked = DialogScheduler::new("hanging-tool", 4); + let healthy = DialogScheduler::new("healthy-neighbor", 4); + let drop_count = Arc::new(AtomicUsize::new(0)); + let (started_tx, started_rx) = oneshot::channel::<()>(); + let tool_drop = Arc::clone(&drop_count); + + blocked.enqueue(job("never-return-tool", Box::new(move || { + Box::pin(async move { + let _watch = DropCount(tool_drop); + let _ = started_tx.send(()); + pending::<()>().await; + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("pending tool job accepted"); + tokio::time::timeout(DEADLINE, started_rx) + .await.expect("pending tool must start") + .expect("start notification"); + + let lost_queued_executed = Arc::new(AtomicUsize::new(0)); + let lost = Arc::clone(&lost_queued_executed); + blocked.enqueue(job("lost-queued-followup", Box::new(move || { + Box::pin(async move { + lost.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("pending followup accepted"); + + let neighbor_executed = Arc::new(AtomicUsize::new(0)); + let observed = Arc::clone(&neighbor_executed); + healthy.enqueue(job("healthy-followup", Box::new(move || { + Box::pin(async move { + observed.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("neighbor work accepted"); + tokio::time::timeout(DEADLINE, async { + while neighbor_executed.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }).await.expect("neighbor must be able to finish"); + + { + let owner = blocked.inner.lock().await; + owner.as_ref().expect("worker exists").worker.abort(); + } + tokio::time::timeout(DEADLINE, async { + loop { + let finished = { + let owner = blocked.inner.lock().await; + owner.as_ref().expect("worker exists").worker.is_finished() + }; + if finished && drop_count.load(Ordering::SeqCst) == 1 { break; } + tokio::task::yield_now().await; + } + }).await.expect("aborted worker must drop its nonterminating tool"); + + let fresh_executed = Arc::new(AtomicUsize::new(0)); + let fresh = Arc::clone(&fresh_executed); + blocked.enqueue(job("fresh-after-abort", Box::new(move || { + Box::pin(async move { + fresh.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("fresh enqueue triggers recovery"); + tokio::time::timeout(DEADLINE, async { + while fresh_executed.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }).await.expect("fresh job must complete"); + assert_eq!(drop_count.load(Ordering::SeqCst), 1); + assert_eq!(lost_queued_executed.load(Ordering::SeqCst), 0, + "previously queued side effects must not be replayed"); + assert_eq!(fresh_executed.load(Ordering::SeqCst), 1); + assert_eq!(neighbor_executed.load(Ordering::SeqCst), 1); + assert_eq!(blocked.pending_count(), 0); +} + +/// Tool errors should be scoped to one callback. The worker must keep +/// draining subsequent work; error text is synthetic and content-free. +#[tokio::test(flavor = "multi_thread", worker_threads = 4)] +async fn mock_tool_error_does_not_starve_following_job() { + let scheduler = DialogScheduler::new("tool-error", 2); + let errors = Arc::new(AtomicUsize::new(0)); + let errors_in_job = Arc::clone(&errors); + scheduler.enqueue(job("failing-tool", Box::new(move || { + Box::pin(async move { + errors_in_job.fetch_add(1, Ordering::SeqCst); + Err("synthetic-tool-error".to_string()) + }) + }))).await.expect("failed tool fixture enqueued"); + + let completed = Arc::new(AtomicUsize::new(0)); + let after = Arc::clone(&completed); + scheduler.enqueue(job("after-failure", Box::new(move || { + Box::pin(async move { + after.fetch_add(1, Ordering::SeqCst); + Ok(ExecutionCompletion::Finished) + }) + }))).await.expect("second job accepted"); + tokio::time::timeout(DEADLINE, async { + while completed.load(Ordering::SeqCst) == 0 { + tokio::task::yield_now().await; + } + }).await.expect("failed job must not stop queue"); + assert_eq!(errors.load(Ordering::SeqCst), 1); + assert_eq!(completed.load(Ordering::SeqCst), 1); +} From efc4ea9bbfdf754bdc163d66517ee5ff922596cb Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 21:06:53 +0700 Subject: [PATCH 59/60] test(scheduler): register provider/tool fault injection scenarios separately from stress matrix --- src-tauri/crates/agent-core/src/core/session/scheduler.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src-tauri/crates/agent-core/src/core/session/scheduler.rs b/src-tauri/crates/agent-core/src/core/session/scheduler.rs index 115bd6bb95..7b0fbee370 100644 --- a/src-tauri/crates/agent-core/src/core/session/scheduler.rs +++ b/src-tauri/crates/agent-core/src/core/session/scheduler.rs @@ -932,6 +932,9 @@ async fn reconcile_agent_org_run_after_terminal(run_id: &str) { #[cfg(test)] mod stress_tests; +#[cfg(test)] +mod fault_injection_tests; + #[cfg(test)] mod final_summary_tests; From 6bfff721a3bd3188e1b32441195fed6e467eb227 Mon Sep 17 00:00:00 2001 From: 3aemon Date: Sat, 17 Oct 2026 21:08:52 +0700 Subject: [PATCH 60/60] test(sqlite): inject 5/20/50 concurrent WAL writer contention in isolated temp databases Exercise production with_sessions_writer and begin_immediate, assert per-session rows, WAL reader isolation and integrity without touching user data. --- .../src/db/writer/fault_injection_tests.rs | 153 ++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 src-tauri/crates/database/src/db/writer/fault_injection_tests.rs diff --git a/src-tauri/crates/database/src/db/writer/fault_injection_tests.rs b/src-tauri/crates/database/src/db/writer/fault_injection_tests.rs new file mode 100644 index 0000000000..1523919b9c --- /dev/null +++ b/src-tauri/crates/database/src/db/writer/fault_injection_tests.rs @@ -0,0 +1,153 @@ +//! Isolated SQLite contention simulations using the production WAL writer +//! serializer and BEGIN IMMEDIATE helper. Never opens the user's sessions.db. +use super::{begin_immediate, with_sessions_writer}; +use rusqlite::{params, Connection, Result as SqliteResult}; +use std::sync::{mpsc, Arc, Barrier}; +use std::thread; +use std::time::Duration; + +const DEADLINE: Duration = Duration::from_secs(20); + +fn isolated_db() -> (tempfile::TempDir, std::path::PathBuf) { + let sandbox = tempfile::tempdir().expect("isolated tempdir"); + let path = sandbox.path().join("fault-lab.sqlite3"); + let conn = Connection::open(&path).expect("open isolated database"); + conn.execute_batch( + "PRAGMA journal_mode = WAL; + CREATE TABLE IF NOT EXISTS synthetic_turn_results( + session_no INTEGER NOT NULL, + turn_no INTEGER NOT NULL, + PRIMARY KEY(session_no, turn_no) + );", + ).expect("initialize WAL and isolated fixture schema"); + drop(conn); + (sandbox, path) +} + +fn concurrent_wal_profile(worker_count: usize, rows_per_worker: usize) { + // Files are scoped to a unique TempDir. These tests must never point + // get_connection() at an actual user sessions database or reset its pool. + let (_sandbox, path) = isolated_db(); + let gate = Arc::new(Barrier::new(worker_count + 1)); + let (notify, finished) = mpsc::channel::<(usize, SqliteResult<()>)>(); + let mut threads = Vec::with_capacity(worker_count); + + for worker in 0..worker_count { + let writer_path = path.clone(); + let barrier = Arc::clone(&gate); + let result_tx = notify.clone(); + threads.push(thread::spawn(move || { + barrier.wait(); + let result = (|| -> SqliteResult<()> { + let conn = Connection::open(&writer_path)?; + // With the Rust writer mutex, concurrent in-process writes + // must serialize without ever exhausting this backstop. + conn.busy_timeout(Duration::from_millis(500))?; + with_sessions_writer(|| { + let tx = begin_immediate(&conn)?; + for turn in 0..rows_per_worker { + tx.execute( + "INSERT INTO synthetic_turn_results(session_no, turn_no) + VALUES (?1, ?2)", + params![worker as i64, turn as i64], + )?; + } + tx.commit() + }) + })(); + let _ = result_tx.send((worker, result)); + })); + } + drop(notify); + gate.wait(); + + // A hung writer is a bounded test failure rather than an indefinitely + // running CI job. No detached cleanup actor or retry loop is introduced. + for _ in 0..worker_count { + let (worker, result) = finished.recv_timeout(DEADLINE) + .expect("concurrent writer did not finish before bounded deadline"); + result.unwrap_or_else(|error| { + panic!("SQLite write failed in synthetic Session {worker}: {error}") + }); + } + for handle in threads { + handle.join().expect("synthetic writer thread panicked"); + } + + let conn = Connection::open(&path).expect("verify isolated database"); + let recorded: i64 = conn.query_row( + "SELECT COUNT(*) FROM synthetic_turn_results", [], |row| row.get(0), + ).expect("read committed row count"); + assert_eq!(recorded, (worker_count * rows_per_worker) as i64, + "lost writes or duplicate turns under concurrent WAL writers"); + let mut statement = conn.prepare( + "SELECT session_no, COUNT(*) FROM synthetic_turn_results GROUP BY session_no", + ).expect("prepare per-session count"); + let per_session = statement.query_map([], |row| { + Ok((row.get::<_, i64>(0)?, row.get::<_, i64>(1)?)) + }).expect("group query"); + let mut seen = 0usize; + for item in per_session { + let (_, count) = item.expect("read per-session result"); + assert_eq!(count, rows_per_worker as i64); + seen += 1; + } + assert_eq!(seen, worker_count); + let integrity: String = conn.query_row("PRAGMA integrity_check", [], |row| row.get(0)) + .expect("verify SQLite file integrity"); + assert_eq!(integrity, "ok"); +} + +#[test] +fn five_simultaneous_wal_writers_are_serialized() { + concurrent_wal_profile(5, 12); +} + +#[test] +fn twenty_simultaneous_wal_writers_are_serialized() { + concurrent_wal_profile(20, 8); +} + +#[test] +fn fifty_simultaneous_wal_writers_are_serialized() { + concurrent_wal_profile(50, 6); +} + +/// In WAL mode, an unrelated reader must be able to observe the last +/// committed snapshot while one writer owns an uncommitted transaction. +#[test] +fn reader_is_not_blocked_by_an_in_process_writer_transaction() { + let (_sandbox, path) = isolated_db(); + let (entered_tx, entered_rx) = mpsc::sync_channel::<()>(1); + let (release_tx, release_rx) = mpsc::sync_channel::<()>(1); + let writer_path = path.clone(); + let writer = thread::spawn(move || -> SqliteResult<()> { + let conn = Connection::open(&writer_path)?; + with_sessions_writer(|| { + let tx = begin_immediate(&conn)?; + tx.execute( + "INSERT INTO synthetic_turn_results(session_no, turn_no) VALUES(1, 1)", [], + )?; + let _ = entered_tx.send(()); + release_rx.recv_timeout(Duration::from_secs(5)) + .expect("test reader must release the writer"); + tx.commit() + }) + }); + entered_rx.recv_timeout(Duration::from_secs(5)) + .expect("writer must reach held transaction"); + + let reader = Connection::open(&path).expect("open independent SQLite reader"); + reader.busy_timeout(Duration::from_millis(500)).expect("set reader timeout"); + let before: i64 = reader.query_row( + "SELECT COUNT(*) FROM synthetic_turn_results", [], |row| row.get(0), + ).expect("WAL reader must see committed state while writer has BEGIN IMMEDIATE"); + assert_eq!(before, 0, "uncommitted writes must not leak to another reader"); + + release_tx.send(()).expect("release held writer transaction"); + writer.join().expect("writer thread completes").expect("commit succeeds"); + let after: i64 = reader.query_row( + "SELECT COUNT(*) FROM synthetic_turn_results", [], |row| row.get(0), + ).expect("reader can see committed result"); + assert_eq!(after, 1); +}