Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
26d3b9f
Fix switch geometry and trailing alignment across Settings
cursoragent Sep 8, 2026
8e461d2
Keep Model Pad chrome stable while surrounding copy changes
cursoragent Sep 8, 2026
971d80b
Show custom provider icons in the model picker and pad.
cursoragent Sep 9, 2026
c7b202d
fix: defer workspace chats until the first message commits
sambitcreate Sep 9, 2026
81fcd2f
Tighten custom provider icon tests after review.
cursoragent Sep 9, 2026
9597c6a
Fix ProviderIcon type error on bundled themed marks.
cursoragent Sep 9, 2026
900af0c
feat(remote): add desktop peer connection foundation
sambitcreate Sep 9, 2026
6397b48
docs: record desktop connections UI approval
sambitcreate Sep 9, 2026
44ad722
fix: close empty-chat migration review edge cases
sambitcreate Sep 9, 2026
5ef3d28
fix(remote): address Pullfrog transport and response findings
sambitcreate Sep 9, 2026
a289627
Bound Model Pad animation stabilization
sambitcreate Sep 9, 2026
6c2e30b
fix: scheduled-task provider resolution, journalless Pi rollout gener…
sambitcreate Sep 9, 2026
6047bc4
fix: address review — threat-model §7 route fields, router template c…
sambitcreate Sep 9, 2026
b991ed1
docs: document journalless generation in the Phase 7 rollout runbook
sambitcreate Sep 9, 2026
dd08099
docs: match the two-space hang indent in the Phase 7 notes
sambitcreate Sep 9, 2026
8245226
test: tolerate CI fs-watch latency in the Bot skill watcher lease test
sambitcreate Sep 9, 2026
f7751dc
Fix opaque backgrounds for composer access and thinking menus
sambitcreate Sep 9, 2026
8492109
Harden provider artwork persistence
sambitcreate Sep 11, 2026
fa526be
Bound cold Model Pad E2E duration
sambitcreate Sep 11, 2026
cf15344
Simplify setup journeys with guided pairing and bot creation
sambitcreate Sep 5, 2026
84889cb
Fix spacing below phone connection choices
sambitcreate Sep 5, 2026
29c55d7
Update iOS onboarding shell expectations for scan-first setup
sambitcreate Sep 5, 2026
0c8218e
Harden guided setup readiness
sambitcreate Sep 11, 2026
1a38680
Fix Settings E2E lint contract
sambitcreate Sep 11, 2026
26477f5
Open Telegram details in responsive E2E
sambitcreate Sep 11, 2026
2a5f6c1
Replace the workspace terminal's xterm.js host with libghostty-vt.
cursoragent Sep 2, 2026
16a282c
Align the workspace terminal with T3 Code's official libghostty-vt host.
cursoragent Sep 2, 2026
9e84c77
Keep the Ghostty host compatible with Aiden's ES2020 TypeScript lib.
cursoragent Sep 2, 2026
8bdae1e
Emit Ghostty wasm as hashed Vite assets.
cursoragent Sep 2, 2026
3e0cab1
Keep Ghostty wasm URL literals off the Node test graph.
cursoragent Sep 2, 2026
e541c82
Resolve Ghostty wasm from disk with a dynamic URL in Node tests.
cursoragent Sep 2, 2026
6aafb7c
Harden Ghostty terminal merge readiness
sambitcreate Sep 11, 2026
0e31ee9
Correct provider artwork recovery contract
sambitcreate Sep 11, 2026
f132659
Harden guided setup rollback failures
sambitcreate Sep 11, 2026
391923f
Stabilize scheduled search E2E cleanup
sambitcreate Sep 11, 2026
94c8a1b
Address Ghostty terminal review findings
sambitcreate Sep 11, 2026
7594021
Cover existing-access cleanup failure
sambitcreate Sep 11, 2026
04761bc
Stabilize scheduled search E2E cleanup
sambitcreate Sep 11, 2026
e327c0e
Merge pull request #106 from sambitcreate/feature/opaque-composer-sel…
sambitcreate Sep 11, 2026
6ce2cd8
Merge pull request #105 from sambitcreate/fix/scheduled-provider-and-…
sambitcreate Sep 11, 2026
d5b9966
Merge pull request #104 from sambitcreate/feature/desktop-multi-host-…
sambitcreate Sep 11, 2026
b6b1461
Merge pull request #103 from sambitcreate/feature/draft-agent-chats
sambitcreate Sep 11, 2026
97e89d6
Merge pull request #102 from sambitcreate/cursor/custom-provider-icon…
sambitcreate Sep 11, 2026
f50446c
Merge pull request #101 from sambitcreate/cursor/fix-toggle-switch-ui…
sambitcreate Sep 11, 2026
ce46c28
Merge pull request #96 from sambitcreate/feature/guided-setup-ux
sambitcreate Sep 11, 2026
a2725be
Merge pull request #81 from sambitcreate/cursor/libghostty-terminal-4228
sambitcreate Sep 11, 2026
dc7ddb7
Release Aiden Agent 0.40.0
sambitcreate Sep 11, 2026
5c5b3e2
Document 0.40.0 integration notes
sambitcreate Sep 11, 2026
dc9c81b
Fix Ghostty canvas sizing and pointer mapping
sambitcreate Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .papercuts/troubleshooting.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Troubleshooting

- `.papercuts/` is ignored even when its troubleshooting file is present in the PR branch, so persisting a required update needs an explicit `git add -f`.
- Layout stabilization must race `animation.finished` against a short timeout because paused or infinite document animations never settle; keep geometry polling as the authoritative E2E readiness check.
- Pi 0.80.10 can choose the oldest oversized user turn as `firstKeptEntryId`, leaving both summary inputs empty and producing a no-op checkpoint. When the journal has a newer turn, retry `prepareCompaction` with a minimal retained-tail budget; still refuse the checkpoint if both summary inputs remain empty.
- `Session.getEntries()` includes abandoned branches. Synchronization markers must be read from `Session.getBranch()` or a rolled-back partial write can still look committed.
- Child-runtime unit tests load outside Electron. Keep usage accounting behind an injected callback (with a production-only dynamic import) instead of statically importing the Electron-backed singleton into the reusable child registry.
Expand Down Expand Up @@ -28,6 +30,7 @@
- An Electron E2E teardown deadline must exceed the app's sequential bounded shutdown phases. A 10-second fixture timeout can kill and report a healthy process while foreground, subagent, and packaged-soak drains are still inside their documented 6s + 5s + 5s ceilings.
- Image generation can return a baked checkerboard or an opaque/RGB file even when asked for transparent onboarding art. Inspect the generated pixels, dimensions, and alpha channel before copying it into `renderer/assets/onboarding/`; extract the real background and resample only after visual inspection.
- GitHub release create/edit requests can return HTTP 503 after committing server-side state. Publication must re-read the exact tag, target SHA, draft state, and asset set before retrying or reconciling; never treat an unavailable lookup as a missing release.
- A main-process fallback that reads `settings.lastProviderId` as "the app's last provider" is reading a dead key: the UI persists its real selection in renderer localStorage (`aiden-agent.providerId`/`aiden-agent.model`) and only the Telegram flow ever wrote the settings key. Any main-process consumer (scheduler, tools) must either receive the selection explicitly or have attended chat starts seed the settings fallback.
- A physical XCTest transport spike can keep secrets out of the project and scheme: use a private temporary Derived Data directory, create an injected `.xctestrun` copy beside its `Build/Products` payload, inject an ephemeral canonical pairing-bootstrap JSON into that copy, then use `test-without-building`. Xcode still requires the physical device to remain unlocked through preflight and launch.
- A copied `.xctestrun` resolves `__TESTROOT__` relative to its own location. Keep the injected copy beside `Build/Products` (or deliberately rewrite every relative product path), and derive the advertised LAN address from the default-route interface instead of assuming Wi-Fi is `en0`; otherwise Xcode reports a missing test product or the phone silently times out against a link-local adapter.
- Simulator networking does not prove iOS Local Network privacy readiness. A direct physical LAN request fails as `Local network prohibited` when the host app omits `NSLocalNetworkUsageDescription`; lock both that key and the canonical `NSBonjourServices` value with an XCTest that inspects the built application bundle.
Expand Down Expand Up @@ -379,10 +382,50 @@ owns; reopen the terminal before judging the final live state.

- Zsh does not split scalar loop values by default; use explicit delimiters in pairwise merge probes so branch names are not accidentally concatenated.
- Standalone green PRs still conflicted in shared settings, test registries, and UI fixtures. Assemble the exact combined stack and retain every feature's test registration before merging to main.
- UX review (2026-09-05): the active Xcode installation rejects tools until its license is accepted. Git and desktop C helpers can use the separately installed Command Line Tools via `DEVELOPER_DIR=/Library/Developer/CommandLineTools`; helper build scripts replace the child environment, so this run compiled their unchanged C sources with the same flags directly. iOS physical-device discovery/test remains blocked; do not claim it passed.
- Electron E2E failure diagnostics called `app.process()` outside their try/catch; a closed Electron target hid the original launch error. Keep that call within the best-effort diagnostic block. The isolated E2E profile also cannot establish native Bot Keychain authority; the editor test injects a test-owned IPC catalog and captures the submitted access, while storage/authority tests run separately.

## 2026-09-10 — Google catalog PR validation

The main checkout's shared node_modules matched Pi's pinned version but lacked
postcss-value-parser and @xterm/addon-web-links required by this worktree. The
resulting type errors disappeared after replacing the temporary dependency
symlink with this checkout's own npm ci. Full type-check and lint then passed.

## 2026-09-09 — Draft chat planning

- The checkout has no `.memory/` directory despite AGENTS.md referencing it; used current source and the plan index for project context.
- Native verification: no physical iOS device is online and local Java/Android SDK tools are unavailable. Run generic iOS build-for-testing and shared Remote contract suites; device XCTest and Android runtime acceptance remain unavailable locally.
- Draft lifecycle regression tests intercepted `chats:appendMessage` for first-send failures; updated that fault injection to the new atomic `chats:createWithFirstMessage` boundary.
- Empty-chat migration must distinguish header-only Pi journals (created by the old Todo snapshot read even before Send) from real private records; preserving every journal would leave ordinary abandoned chats behind.
- Completed Pi v3-to-v4 promotion adds lane/navigation records even for a header-only source. Empty cleanup must validate the real receipt, backup digest, and exact migration scaffolding rather than treating all promoted records as user history.

## 2026-09-10 — PR #102 readiness

- The initial source-scanning theory incorrectly credited explicit 1x encode arguments that are already Electron's defaults. Exercise the actual fix with a valid oversized PNG through `providers:save`, relaunch, and verify the recovered, decodable 64px-or-smaller result.
- Treat user-supplied provider PNGs as original-color artwork; an alpha mask turns fully opaque icons into solid squares and disagrees with native clients.
- Model Pad animation settling must ignore infinite animations and retain a bounded timeout so hosted Electron runs cannot wait forever.
- The cold hosted responsive matrix can reach its last 390px case only as the shared 90-second test budget expires, while a warm retry passes in 24 seconds. Give this exhaustive case an explicit bounded 180-second budget without relaxing geometry assertions.
- On hosted Electron, Playwright `fill("")` can leave a controlled search unchanged; use the native value setter plus a bubbling input event for deterministic test cleanup.

## 2026-09-10 — PR96 readiness rebase

- The branch predated the unified Settings work and conflicted in headings, accessible switch names, shared test fixtures, and the tracked-but-ignored papercut log. Resolve these contracts additively and use `git add -f` for the already tracked `.papercuts/troubleshooting.md`.
- A parent save handler showed a toast but resolved its promise, making the editor's inline retry state unreachable. Propagate the rejection after the toast so the review dialog keeps the user's choices and exposes the error.
- Progressive disclosure made two inherited E2E locators inaccessible: tests must open the exact Remote or Telegram details before asserting the controls inside, rather than spending the full timeout waiting for hidden semantics.
- A single rollback `try` coupled external Tailscale route cleanup to local listener/state cleanup; keep independently knowable cleanup steps best-effort and report external versus local uncertainty separately.
- Distinct cleanup messages need branch-specific regressions: cover both newly enabled access being disabled and pre-existing access staying enabled when route removal fails.
- Hosted Electron can leave a controlled scheduled-task search unchanged after Playwright `fill("")`; use the native value setter plus a bubbling input event for deterministic cleanup.

## 2026-09-10 — PR #81 readiness rebase

- The stale terminal migration conflicted with newer browser-link integration and expanded package scripts; preserve current `main` scripts and link routing, then layer the Ghostty-specific test/build hooks back in before regenerating the lockfile.
- `npm ci` completed without Electron's macOS payload, and the first focused Playwright command omitted this repo's explicit config; install the payload with `node node_modules/electron/install.js` and pass `--config=playwright.config.ts`.
- Canvas terminal link detection and host navigation policy had separate truth sources, so unsupported file-like text gained a dead click affordance. Pass the host policy into the surface and filter hover and activation together.
- Ghostty correctly encodes modified keys, but Meta chords belong to the host; suppress unhandled Meta press/release pairs after terminal copy and paste handling. Do not key this off `navigator.platform`: Chromium may reduce it even in a macOS Electron renderer.
- The terminal Playwright fixture launches compiled renderer output; rebuild before interpreting a focused E2E failure after source edits, or the test exercises the previous bundle.

## 2026-09-11 — 0.40.0 integration

- E2E chat-title expectations assume the deterministic chat-model route. On a Mac where the native Foundation Models helper reports `ready`, automatic titles come from Apple Intelligence instead, so `chat-message-queue` sidebar-title lookups fail locally while passing in CI; probe the helper or move it aside before treating those failures as regressions.
- `git add` on the tracked-but-ignored `.papercuts/troubleshooting.md` still needs `-f` after conflict resolution.
23 changes: 23 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,29 @@ The above copyright notice and this permission notice shall be included in all c

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

## Ghostty / libghostty-vt

Aiden's in-app terminal uses a WebAssembly build of Ghostty's `libghostty-vt`
(`renderer/lib/ghostty-terminal/vendor/ghostty-vt.wasm`) plus a 112-byte PTY
callback trampoline. The browser host is adapted from T3 Code's MIT-licensed
`libghostty-vt` adapter.

Ghostty: Copyright (c) 2024-2026 Mitchell Hashimoto and Ghostty contributors
T3 Code adapter: Copyright (c) 2026 T3 Tools Inc.

MIT License. See `renderer/lib/ghostty-terminal/GHOSTTY-LICENSE` and
https://github.com/pingdotgg/t3code/blob/main/LICENSE

## Symbols Nerd Font Mono

Vendored as `renderer/lib/ghostty-terminal/fonts/SymbolsNerdFontMono-Regular.woff2`
for terminal prompt glyphs.

Copyright (c) 2014 Ryan L McIntyre

MIT License. See `renderer/lib/ghostty-terminal/fonts/LICENSE`


## Chart.js

Chart.js is vendored into `resources/generative-ui` for sandboxed Generative UI artifacts.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.selection.selectableGroup
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
Expand All @@ -21,6 +23,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
Expand Down Expand Up @@ -183,29 +186,42 @@ fun AidenPairingScreen(

// Pair New Mac Section
Text(
text = "Pair New Mac",
text = "Connect your Mac",
style = MaterialTheme.typography.titleSmall,
fontWeight = FontWeight.Bold,
color = palette.secondary
)
Spacer(modifier = Modifier.height(8.dp))

// M3 Expressive 3-Tab Pill Segmented Group
Text(
text = "On your Mac, open Settings → Aiden On The Go → Connect a device. Then scan its code here.",
style = MaterialTheme.typography.bodyMedium,
color = palette.secondary
)
Spacer(modifier = Modifier.height(12.dp))

// QR first, with a camera-free setup code fallback.
Surface(
color = palette.raised,
shape = RoundedCornerShape(20.dp),
modifier = Modifier.fillMaxWidth()
) {
Row(
modifier = Modifier.padding(4.dp)
modifier = Modifier
.padding(4.dp)
.selectableGroup()
) {
// Tab 0: Scan QR
Surface(
color = if (selectedTab == 0) palette.accent else Color.Transparent,
shape = RoundedCornerShape(16.dp),
modifier = Modifier
.weight(1f)
.tactilePress { selectedTab = 0 }
.selectable(
selected = selectedTab == 0,
role = Role.Tab,
onClick = { selectedTab = 0 }
)
) {
Box(
contentAlignment = Alignment.Center,
Expand All @@ -226,7 +242,11 @@ fun AidenPairingScreen(
shape = RoundedCornerShape(16.dp),
modifier = Modifier
.weight(1f)
.tactilePress { selectedTab = 1 }
.selectable(
selected = selectedTab == 1,
role = Role.Tab,
onClick = { selectedTab = 1 }
)
) {
Box(
contentAlignment = Alignment.Center,
Expand All @@ -241,31 +261,16 @@ fun AidenPairingScreen(
}
}

// Tab 2: Paste JSON
Surface(
color = if (selectedTab == 2) palette.accent else Color.Transparent,
shape = RoundedCornerShape(16.dp),
modifier = Modifier
.weight(1f)
.tactilePress { selectedTab = 2 }
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.padding(vertical = 8.dp)
) {
Text(
text = "Paste JSON",
style = MaterialTheme.typography.labelMedium,
fontWeight = FontWeight.Bold,
color = if (selectedTab == 2) Color.White else palette.secondary
)
}
}

}
}

Spacer(modifier = Modifier.height(16.dp))

TextButton(onClick = { selectedTab = if (selectedTab == 2) 0 else 2 }) {
Text(if (selectedTab == 2) "Back to scanning" else "Advanced: paste connection details")
}

errorMessage?.let { msg ->
Surface(
color = palette.danger.copy(alpha = 0.12f),
Expand Down Expand Up @@ -325,7 +330,7 @@ fun AidenPairingScreen(
colors = sbtbiswas.AidenOnTheGo.ui.theme.aidenTextFieldColors(),
value = endpointUrl,
onValueChange = { endpointUrl = it },
label = { Text("Mac Address (HTTPS Endpoint)") },
label = { Text("Mac address") },
singleLine = true,
shape = RoundedCornerShape(12.dp),
modifier = Modifier.fillMaxWidth()
Expand Down
Loading
Loading