Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
3915 commits
Select commit Hold shift + click to select a range
8e1d6b9
feat(stats): group the usage log by spawn tree instead of settle time
Draek2077 Jul 19, 2026
f7bd208
fix(app): reuse the existing workspace when viewing a project's README
Draek2077 Jul 19, 2026
cefbb05
fix(markdown): unwrap layout-only HTML instead of echoing its markup
Draek2077 Jul 19, 2026
6b3e336
fix(app): themed overlay scrollbar on the open-project screen
Draek2077 Jul 19, 2026
3a18890
docs(projects): add four charters, retire context-health
Draek2077 Jul 19, 2026
22487ea
Merge remote-tracking branch 'origin/main'
Draek2077 Jul 19, 2026
e3e9628
feat(markdown): translate embedded HTML instead of echoing it
Draek2077 Jul 20, 2026
67ed72d
refactor(app): explicit file-preview state and a wider view-mode bar
Draek2077 Jul 20, 2026
1168e75
feat(settings): give agent tool surfaces their own host section
Draek2077 Jul 20, 2026
5a50417
feat(context): account for everything sent before you type
Draek2077 Jul 20, 2026
c67a21a
docs(projects): add the refine charter, index it and markdown-rendering
Draek2077 Jul 20, 2026
b05a9d8
fix(app): ungate the overlay scrollbar on compact web
Draek2077 Jul 20, 2026
8af1000
feat(context): draggable sidebar splitter and compact type scale
Draek2077 Jul 20, 2026
45dc73d
test(app): tab-menu expectations follow the agent -> chat wording
Draek2077 Jul 20, 2026
2c2c044
refactor(context): say what the animated node is actually for
Draek2077 Jul 20, 2026
3130549
feat(context): jump from a finding to the exact lines it is about
Draek2077 Jul 20, 2026
de1be5f
chore(acp): refresh stale catalog pins
Draek2077 Jul 20, 2026
7747f33
chore(deps): absorb lockfile churn from release prepare
Draek2077 Jul 20, 2026
294e7d8
fix(composer): make the fly-out tint actually paint
Draek2077 Jul 20, 2026
c938f31
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 20, 2026
871f313
chore(acp): bump the nova catalog pin to 1.1.28
Draek2077 Jul 20, 2026
add8268
docs(changelog): add 0.6.4 release notes
Draek2077 Jul 20, 2026
c1c93f0
chore(release): cut 0.6.4
Draek2077 Jul 20, 2026
156e289
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 20, 2026
f5079b9
fix(desktop): stop macOS asking for an update it can never install
Draek2077 Jul 20, 2026
4bad9da
feat(website): offer the macOS builds that releases have been shipping
Draek2077 Jul 20, 2026
decc502
Merge remote-tracking branch 'origin/main'
Draek2077 Jul 20, 2026
66e641f
fix(app): show the real, remapped shortcut in toggle tooltips and the…
Draek2077 Jul 20, 2026
c86a998
feat(app): default link opens to the in-app browser tab
Draek2077 Jul 20, 2026
d8b7f42
feat(app): turn Visualizer voice cues on by default
Draek2077 Jul 20, 2026
46e7f22
feat(app): add shared scroll-region, text-area and visibility primitives
Draek2077 Jul 20, 2026
47dbb69
feat(highlight): expose human-readable language names
Draek2077 Jul 20, 2026
5ebe629
feat(app): add an editor status bar and richer file-pane state
Draek2077 Jul 20, 2026
334ca42
feat(app): unify sheet scrolling and text areas across modals
Draek2077 Jul 20, 2026
fbf0243
feat(app): remember saved provider endpoints
Draek2077 Jul 20, 2026
97e92ab
feat(app): warn before opening a browser tab with browser tools off
Draek2077 Jul 20, 2026
b28c304
feat(app): refine agent teams and personality selection
Draek2077 Jul 20, 2026
9bd0e91
chore(app): regenerate the Material Symbols icon set
Draek2077 Jul 20, 2026
5226bf6
feat(protocol): carry saved provider endpoints on the wire
Draek2077 Jul 20, 2026
5052b23
feat(client): report detected line endings on file reads
Draek2077 Jul 20, 2026
a320978
feat(app): add a configurable editor ruler column
Draek2077 Jul 20, 2026
a41d4e3
fix(app): fall back to the active team's personality on a fresh install
Draek2077 Jul 20, 2026
87e0aae
feat(app): gate the preview tab action on browser tools
Draek2077 Jul 20, 2026
488c2f6
polish(app): tidy the desktop updates and project settings sections
Draek2077 Jul 20, 2026
7f1951c
copy(website): tighten the landing headline
Draek2077 Jul 20, 2026
2d97bb4
docs: add the upstream-subagent-convergence charter and status script
Draek2077 Jul 20, 2026
74d7a71
fix(app): make Manage context reachable from every workspace row
Draek2077 Jul 20, 2026
87c08f4
fix(context-management): never open on a silent empty panel
Draek2077 Jul 20, 2026
120c612
chore(app): refresh stale ACP catalog pins
Draek2077 Jul 20, 2026
6c2f7b4
docs(changelog): add 0.6.5 release notes
Draek2077 Jul 20, 2026
7b82eea
chore(release): cut 0.6.5
Draek2077 Jul 20, 2026
e087242
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 20, 2026
f6086c3
feat: user-report batch — input, teams, icons, motion, effects
Draek2077 Jul 20, 2026
535ad7d
@
Draek2077 Jul 21, 2026
c27c5a5
perf(app): splitters track from the first pixel, rail resizes off-thread
Draek2077 Jul 21, 2026
dda4843
feat(app): voice cues are an agent feature on their own audio channel
Draek2077 Jul 21, 2026
e728efb
chore(acp): refresh pinned agent versions (droid 0.176.0, fast-agent …
Draek2077 Jul 21, 2026
bbe29aa
feat(app): quick-mute voice cues from the workspace header
Draek2077 Jul 21, 2026
c3d4a59
fix(app): the header speech button mutes cues, it does not disable them
Draek2077 Jul 21, 2026
cc7916a
docs(changelog): add 0.6.6 release notes
Draek2077 Jul 21, 2026
7b362c6
chore(release): cut 0.6.6
Draek2077 Jul 21, 2026
3862651
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 21, 2026
a1254c4
feat: land accumulated feature work and fixes
Draek2077 Jul 22, 2026
6fa730f
fix(app): restore a green typecheck
Draek2077 Jul 22, 2026
c8fc845
chore(acp): refresh pinned agent versions
Draek2077 Jul 22, 2026
38434b7
docs(changelog): add 0.6.7 release notes
Draek2077 Jul 22, 2026
b194c67
chore(release): cut 0.6.7
Draek2077 Jul 22, 2026
4263780
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 22, 2026
78dcf92
feat(orchestration): node capabilities, workspace access, and e2e evi…
Draek2077 Jul 22, 2026
bc80ed9
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 22, 2026
835ad7c
docs: split chat/workspace lifecycle, drain shipped project folders
Draek2077 Jul 24, 2026
8aef678
feat(composer): model picker tooltip states the selected identity
Draek2077 Jul 24, 2026
fb1bec0
chore: consolidate in-flight work from several worktrees
Draek2077 Jul 24, 2026
7061246
fix(git): resolve the Changes base at the fork point, add a per-workt…
Draek2077 Jul 24, 2026
208bd50
feat(markdown): render mermaid diagrams on every surface and platform
Draek2077 Jul 24, 2026
e2da49c
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 24, 2026
92329a7
fix(git): stop the PR-status poll from clobbering post-commit git state
Draek2077 Jul 24, 2026
f4f3f52
feat(editor): File Editor polish pass — gutter jump, right-click menu…
Draek2077 Jul 24, 2026
0a8abeb
feat: land New Project page, LSP code intelligence, and editor polish
Draek2077 Jul 25, 2026
813a0cb
fix(editor): stop the hover signature painting a slab inside the tooltip
Draek2077 Jul 25, 2026
2602f36
fix(editor): keep the diagnostic gutter right of the line numbers
Draek2077 Jul 25, 2026
a971454
feat: land Refine, LSP references/rename, steer queue, and editor polish
Draek2077 Jul 25, 2026
77ddc2c
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 25, 2026
2480d08
docs(projects): close Wave 2 and re-cut Wave 3
Draek2077 Jul 25, 2026
7fababe
docs(projects): cut Wave 3 as memory, performance and polish
Draek2077 Jul 25, 2026
13e4846
docs: add the references and sources index
Draek2077 Jul 25, 2026
de58681
feat(personality-memory): daemon store, spawn injection, and the thre…
Draek2077 Jul 25, 2026
bf053ef
docs: restructure documentation into indexed trees with one source of…
Draek2077 Jul 25, 2026
ac2ac12
feat(personality-memory): Context Management is where you see and man…
Draek2077 Jul 25, 2026
635446a
docs(personality-memory): fold the design into agent-personalities.md…
Draek2077 Jul 25, 2026
c1b229a
docs(projects): Wave 3 status and a Wave 4 readiness check
Draek2077 Jul 25, 2026
dfbb571
docs(projects): Wave 4 readiness, and move claude-extensions to Wave 5
Draek2077 Jul 25, 2026
f8f4813
docs(projects): dispatch Wave 4 without item 1, and correct item 2
Draek2077 Jul 25, 2026
beb4b83
feat: land Wave 4 — solution view, history retention, token totals, r…
Draek2077 Jul 25, 2026
3a015d5
docs(projects): close Wave 4 and set out what 0.7.0 needs first
Draek2077 Jul 25, 2026
027be94
feat(perf): bound the navigation path, and withdraw the retention dia…
Draek2077 Jul 25, 2026
a2de615
docs(projects): record what the pre-0.7.0 items actually turned out t…
Draek2077 Jul 25, 2026
30ae03f
docs(projects): AsciiDoc shipped — correct the file-rendering row
Draek2077 Jul 25, 2026
ec36a41
docs(projects): the Visualizer PIP window shipped — correct the row
Draek2077 Jul 25, 2026
a5e8ba0
feat: file mutations, workspace images, widgets, and the measured mer…
Draek2077 Jul 25, 2026
0899b51
docs(projects): the tutorial step is paused until 0.9.x
Draek2077 Jul 26, 2026
bc36f79
fix(widgets): resolve the widget preload from the bundle root
Draek2077 Jul 26, 2026
a407957
docs(archdocs): split the orchestration runs page out of the engine c…
Draek2077 Jul 26, 2026
9046439
feat(voice): auto-speech queue, settled playback, and synthesized pauses
Draek2077 Jul 26, 2026
f61911f
fix(orchestration): cascade run cancel to in-flight children, freeze …
Draek2077 Jul 26, 2026
14b298e
docs(orchestration): rewrite the architecture chapter, open the graph…
Draek2077 Jul 26, 2026
3c7949e
fix(voice): stop auto-speech re-reading the previous reply on send
Draek2077 Jul 26, 2026
4916c57
feat(speech): say notation as words, rest at the marks a voice does n…
Draek2077 Jul 26, 2026
937a9df
feat(feedback): in-app Send feedback, posted straight to the hosted i…
Draek2077 Jul 26, 2026
759c69e
chore(website): remove the Otto Cloud page and its waitlist
Draek2077 Jul 26, 2026
009da54
fix(voice): latch the watched-live flag outside the row that gets rem…
Draek2077 Jul 26, 2026
ebaabe1
feat(voice): a volume slider for spoken replies, on its own audio cha…
Draek2077 Jul 26, 2026
86a27f6
feat(appearance): a font-contrast control for reading-ink strength
Draek2077 Jul 26, 2026
99bff56
fix(composer): drop the Features button when the compact toolbar runs…
Draek2077 Jul 26, 2026
15f9ab5
Remove AI-generated PR guideline from CONTRIBUTING.md
Draek2077 Jul 26, 2026
a7fbc15
feat(context): fix-all for mechanical findings, honest memory scoping…
Draek2077 Jul 26, 2026
dda7201
Revise project communication note in README
Draek2077 Jul 26, 2026
3bfa5a1
chore(acp): refresh pinned agent versions
Draek2077 Jul 26, 2026
d896ac7
chore: absorb lockfile peer-marker churn ahead of the release
Draek2077 Jul 26, 2026
ebfefa2
fix(tests): repair the suites CI has been failing on
Draek2077 Jul 26, 2026
ce8f857
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 26, 2026
73c5f1e
chore(dev): isolate the dev lane from the installed app
Draek2077 Jul 26, 2026
72ba031
fix: unblock the playwright and cli jobs, both masked by a local daemon
Draek2077 Jul 26, 2026
f930efa
fix(worktree): compare worktree paths canonically before refusing to …
Draek2077 Jul 26, 2026
067470a
docs(changelog): add 0.7.0 release notes
Draek2077 Jul 26, 2026
7add700
docs(marketing): inventory what Otto adds beyond Paseo
Draek2077 Jul 26, 2026
3f30235
chore(release): cut 0.7.0
Draek2077 Jul 26, 2026
df31619
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 26, 2026
cf36747
feat(desktop): give dev builds a navy icon
Draek2077 Jul 26, 2026
7cb094f
feat(desktop): give dev builds their own AppUserModelID
Draek2077 Jul 26, 2026
e3bb6fb
feat(app): mark dev builds with a navy viewport border
Draek2077 Jul 26, 2026
4762400
fix(desktop): stop the daemon on quit by default
Draek2077 Jul 26, 2026
4b893b9
feat(dev): add an agent lane an AI can run without disturbing anyone
Draek2077 Jul 26, 2026
a2609b4
test(e2e): repair the Playwright suite after it ran blind
Draek2077 Jul 26, 2026
1825155
fix(app): make the dev border cover the viewport in fullscreen
Draek2077 Jul 26, 2026
2cddc64
fix(agent): fall back to the chat's own model when auto-titling
Draek2077 Jul 26, 2026
9f14369
feat(playbooks): scripted starting states and a shared boilerplate co…
Draek2077 Jul 27, 2026
d0f56a6
docs(projects): charter the toolchain catalog and daemon-side detection
Draek2077 Jul 27, 2026
36fce63
docs(projects): charter Godot integration; generate install docs from…
Draek2077 Jul 27, 2026
10dda5e
docs(projects): fill in the toolchain catalog, install routes and sta…
Draek2077 Jul 27, 2026
adc884a
feat: image lifecycle, prompt preview, adopted preview servers, auto-…
Draek2077 Jul 27, 2026
4889597
fix: bound chat image previews to the message view, overlay scrollbar…
Draek2077 Jul 27, 2026
260d2b5
docs(projects): charter the browser tab registry
Draek2077 Jul 27, 2026
fc710f8
chore(acp): refresh codebuddy-code and dirac catalog pins
Draek2077 Jul 27, 2026
35ac4fa
fix(context-management): fold the Prompt tab into the context tree
Draek2077 Jul 27, 2026
f24fce1
docs(changelog): add 0.7.1 release notes
Draek2077 Jul 27, 2026
f888483
chore(release): cut 0.7.1
Draek2077 Jul 27, 2026
9875f84
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 27, 2026
ca02ddb
test(ci): fix the four failures keeping main red
Draek2077 Jul 27, 2026
f9d4ac3
fix(ci): stop the Play workflow from starving the Android APK build
Draek2077 Jul 27, 2026
df376f5
feat(website): rebuild the landing page around a shot manifest
Draek2077 Jul 27, 2026
b6e796c
docs(projects): record the CI outage and the website-showcase companion
Draek2077 Jul 27, 2026
35b3faa
chore(app): refresh the generated editor and terminal webview bundles
Draek2077 Jul 27, 2026
9d1ff0f
feat(app): split failed background tasks into their own track group
Draek2077 Jul 27, 2026
eba7ef4
chore(acp): refresh catalog pins for codebuddy-code, fast-agent, and …
Draek2077 Jul 27, 2026
7d4a402
docs(changelog): add 0.7.2 release notes
Draek2077 Jul 27, 2026
ab708a5
fix(speech): stop the sherpa lib dir from poisoning PATH inside app.asar
Draek2077 Jul 27, 2026
56f798d
fix: stop the reading position jumping, and sub-agents showing up twice
Draek2077 Jul 27, 2026
924f727
docs(changelog): note the scroll, duplicate sub-agent, and PATH fixes…
Draek2077 Jul 27, 2026
21f9373
chore(release): cut 0.7.2
Draek2077 Jul 27, 2026
7ca5281
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 27, 2026
7415a1c
ci(android): build the release APK on the runner instead of EAS
Draek2077 Jul 27, 2026
4ca2416
test: fix two red unit tests on main
Draek2077 Jul 27, 2026
08f4526
test(protocol): match model-tiers assertions to the natively-1M Opus …
Draek2077 Jul 28, 2026
1881412
test(e2e): stop the first-run wizard intercepting every spec
Draek2077 Jul 28, 2026
48c87c8
test(e2e): give the second Model B workspace its own directory
Draek2077 Jul 28, 2026
4301d88
test(e2e): match the Codex mode assertions to the real labels
Draek2077 Jul 28, 2026
6c27e15
test(e2e): answer the in-app archive confirm, not a native dialog
Draek2077 Jul 28, 2026
98df57a
fix(subagents): drop a detached child from the parent track immediately
Draek2077 Jul 28, 2026
5d51059
test(e2e): anchor scroll metrics on the box that holds the messages
Draek2077 Jul 28, 2026
ce96953
fix(claude): stop slow-tool heartbeats announcing phantom sub-agents
Draek2077 Jul 28, 2026
1403bd7
test(e2e): drill into providers before waiting for the model search box
Draek2077 Jul 28, 2026
8943ed7
feat(lsp): list language servers host-wide in the Code Intelligence s…
Draek2077 Jul 28, 2026
8212fd7
test(e2e): start the E2E host with an empty personality roster
Draek2077 Jul 28, 2026
69e3381
test(e2e): give the transcript long enough to grow, and say what was …
Draek2077 Jul 28, 2026
1358dac
test(e2e): check the detached row on the tab the user comes back to
Draek2077 Jul 28, 2026
b195366
test(e2e): press Close again when a sheet is still up
Draek2077 Jul 28, 2026
4c12b5f
fix(e2e): let the mock provider serve metadata generation, and match …
Draek2077 Jul 28, 2026
27206e8
test(e2e): create the Codex workspace on a project nothing backs yet
Draek2077 Jul 28, 2026
28fa641
fix(app): stop three costs the chat surface was paying every time
Draek2077 Jul 29, 2026
1bfa698
feat(daemon): put every .NET process behind one capped, sweeping door
Draek2077 Jul 29, 2026
8344e43
perf(daemon): make git observation follow the active workspace
Draek2077 Jul 29, 2026
34201a7
feat(server): deterministic synthetic conversation generator
Draek2077 Jul 29, 2026
4511441
feat(server): count-bounded synthetic-history model on the mock provider
Draek2077 Jul 29, 2026
6cbf07e
feat(server): let a prompt set the synthetic-history item count per turn
Draek2077 Jul 29, 2026
ac772ec
docs(projects): charter the agent-to-agent flow tests, and the bug th…
Draek2077 Jul 29, 2026
849c02b
docs(agents): split platform gating into packages/app, drop stale dup…
Draek2077 Jul 29, 2026
ad3660b
docs: pay the subagents-cleanup debt, and log the tails found finding it
Draek2077 Jul 29, 2026
1912099
feat(perf): a conversation corpus to measure "a lot is open" against
Draek2077 Jul 29, 2026
35f7d78
chore(acp): refresh catalog version pins
Draek2077 Jul 29, 2026
1c8012e
docs(changelog): add 0.7.3 release notes
Draek2077 Jul 29, 2026
fd0ffc9
chore(release): cut 0.7.3
Draek2077 Jul 29, 2026
576aee5
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 29, 2026
f0298f9
ci: serialize the three workflows that create a release
Draek2077 Jul 29, 2026
ddc9fd8
feat: move chat to workspace, and parent-branch diff base
Draek2077 Jul 30, 2026
9ed89b4
fix(app): move dropped compact-header buttons into the "..." menu
Draek2077 Jul 30, 2026
6f44084
fix(app): never clear the composer on Escape
Draek2077 Jul 30, 2026
568cd03
chore(acp): refresh catalog version pins
Draek2077 Jul 30, 2026
3f3b249
docs(changelog): add 0.7.4 release notes
Draek2077 Jul 30, 2026
0afed9b
chore(release): cut 0.7.4
Draek2077 Jul 30, 2026
0a09d7a
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 30, 2026
e40be51
feat(brain): add @otto-code/brain — self-contained local AI host
Draek2077 Jul 30, 2026
52e6495
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 30, 2026
ea38546
feat(brain): coding capabilities + remote host control
Draek2077 Jul 30, 2026
21407be
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 30, 2026
4e4eccd
feat(composer): stack the queue move arrows and add Send all
Draek2077 Jul 31, 2026
9185e4b
fix(preview): stop opening duplicate preview tabs
Draek2077 Jul 31, 2026
1c76d32
Merge remote-tracking branch 'origin/main'
Draek2077 Jul 31, 2026
177516a
feat(agents): provider-agnostic task-list reminders
Draek2077 Jul 31, 2026
26319c8
fix(brain): deep-partial config PATCH schema + settings UI updates
Draek2077 Jul 31, 2026
a58856c
chore(dev): add dev:brain and dev:win:brain run scripts
Draek2077 Jul 31, 2026
13ac19d
fix(brain): move internal llama-server port off Expo's 8081
Draek2077 Jul 31, 2026
f768670
feat(brain): detect reasoning models from the GGUF chat template
Draek2077 Jul 31, 2026
8859531
feat(brain): fix and expand the agentic-coding benchmark suite
Draek2077 Jul 31, 2026
ed76798
feat(brain): add hasStaleCalibration for the recalibrate prompt
Draek2077 Jul 31, 2026
7c4e77a
feat(brain): TUI reasoning badge, calibration auto-apply, and bench w…
Draek2077 Jul 31, 2026
a7c3b9e
chore: ignore local Otto Brain benchmark results
Draek2077 Jul 31, 2026
a889c61
feat(brain): model quant discovery, deletion, disk usage, and HF token
Draek2077 Jul 31, 2026
c438b97
feat(brain): pull --quant and --list-quants
Draek2077 Jul 31, 2026
388ac05
feat(brain): TUI quant picker, delete-with-confirm, and disk usage
Draek2077 Jul 31, 2026
b137f0f
feat(brain): nudge vision and thinking models up in the model list
Draek2077 Jul 31, 2026
dccf32c
feat(brain): Hugging Face model search and arbitrary-repo add
Draek2077 Jul 31, 2026
d193ac0
feat(brain): TUI Hugging Face search-and-add (f)
Draek2077 Jul 31, 2026
da20cfa
docs(projects): track HF model discovery app-side as brain-host-contr…
Draek2077 Jul 31, 2026
2c208f8
feat(protocol): brain.hf.search / brain.hf.quants / brain.models.add …
Draek2077 Jul 31, 2026
c4424ae
feat(server,client): daemon HF search/add over the otto-brain CLI
Draek2077 Jul 31, 2026
173f39f
feat(app): Hugging Face search-and-add in Brain settings
Draek2077 Jul 31, 2026
2d1b932
docs(projects): mark HF model discovery Phase 2 built across six pack…
Draek2077 Jul 31, 2026
9a83743
feat(brain): flag already-installed repos and quants in HF search
Draek2077 Jul 31, 2026
f06c9a0
feat(brain): context-utilization metric for agentic bench tasks
Draek2077 Jul 31, 2026
7029fe5
feat(brain): synthetic extra-long-horizon benchmark task
Draek2077 Jul 31, 2026
2a2793b
perf(chat): cut mobile streaming cost on native and mobile web
Draek2077 Jul 31, 2026
82bdf26
wip: in-flight observed-backgrounded subagents and composer work
Draek2077 Jul 31, 2026
3e5b7ad
fix: update lockfile signatures and Nix hash [skip ci]
github-actions[bot] Jul 31, 2026
2553d30
fix(composer): shade the full tucked edge of each fanned card
Draek2077 Jul 31, 2026
40a9312
Merge remote-tracking branch 'origin/main'
Draek2077 Jul 31, 2026
9750b48
feat(brain): window-aware context-stress bench task + curated mined-r…
Draek2077 Jul 31, 2026
7d5c6f3
feat(user-mode): provider-neutral connectors layer + green the tree
Draek2077 Jul 31, 2026
5d6d8f9
fix(ci): unbreak the four failing checks on main
Draek2077 Jul 31, 2026
0c5614e
feat(connectors): curated catalog + browse-and-prefill picker
Draek2077 Jul 31, 2026
cafd00e
fix(codex): stop injecting a markdown divider between assistant items
Draek2077 Jul 31, 2026
c211d2c
fix(ci): add the connectors default to the client config fixture
Draek2077 Jul 31, 2026
6015f65
fix: address bugs found in the post-0.7.4 review
Draek2077 Jul 31, 2026
25d8cd6
feat(connectors): add office/marketing/ads/social connectors to the c…
Draek2077 Jul 31, 2026
852fe83
feat(connectors): add LinkedIn Ads/Pages and Microsoft (Bing) Ads
Draek2077 Jul 31, 2026
d77b962
chore(ci): move GitHub Actions and Node to current LTS
Draek2077 Jul 31, 2026
6477d0e
fix(deps): eliminate all critical advisories and remove dead example …
Draek2077 Jul 31, 2026
c2c6eb5
fix(deps): restore platform-complete lockfile
Draek2077 Jul 31, 2026
e58c784
chore(ci): stop Dependabot re-proposing gradle/actions v6
Draek2077 Jul 31, 2026
11118b4
chore(ci): bump docker/login-action
dependabot[bot] Jul 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
29 changes: 29 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "otto-dev",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev:win"],
"port": 8081
},
{
"name": "otto-agent",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev:win:agent"],
"port": 8095
},
{
"name": "website",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev:website"],
"port": 4300
},
{
"name": "archdocs",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "archdocs:serve"],
"port": 4400
}
]
}
117 changes: 117 additions & 0 deletions .claude/skills/release/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
---
name: release
description: Cut a release of Otto — the one streamlined runbook. Default is a stable patch. Use when the user says "release", "release otto", "ship", "ship stable", "cut a release", "new version", "release:patch", "promote", "release beta", or "/release". Handles stable-patch (default), beta, and promote in one place.
user-invocable: true
---

# Release

The self-contained release runbook. **Follow this skill directly — do not re-read `docs/release.md` for a normal release.** `docs/release.md` is the exhaustive reference; come back to it only for the edge cases flagged below (rollout tuning, retrying a failed build). This keeps a release token-light.

**Default = stable patch.** "Release", "ship", "ship stable", "release otto" all mean a patch bump from the previous stable. Only run the beta path when the user explicitly says "beta". Never bump minor/major to trigger or retry a build — that needs an explicit "minor"/"major" from the user.

## The two-step safety gate (applies always)

1. **Preparation** (agent does this — local, reversible): pre-flight checks, draft changelog, sanity check. Show findings, wait.
2. **Go-ahead** (only after the user says "go ahead" / "ship it"): commit the changelog, run the release command.

Invoking this skill is intent to _start_, not authorization to publish. If the user asks for a **preview**, show the prospective changelog and answer questions — do **not** commit, tag, or run any `release:*` command until they explicitly authorize. Last-minute changes always need approval. A sanity-check finding is information, not a directive — surface it, the user decides.

---

## Stable patch (the 95% path)

### 1. Pre-flight (agent, reversible)

Run from a clean tree on `main`, on the exact commit to be released:

```bash
npm run format && npm run lint && npm run typecheck # all green; commit any format churn on its own
npm run acp:version-drift:check # if drift is intentional, say so; else: npm run acp:version-drift:update && commit
npm run release:prepare # run once alone to absorb any package-lock churn into a normal commit
```

Why `release:prepare` first: it runs `npm install --workspaces`, which can churn `package-lock.json`. `version:all:*` aborts on a dirty tree, and the pre-commit hook rejects a lockfile-only commit. Absorbing the churn now avoids a mid-release mess.

### 2. Draft the changelog (agent writes it — never hand it off)

- Heading is **strict**: `## X.Y.Z - YYYY-MM-DD` — no `v`, no extra text. A malformed heading breaks Release Notes Sync.
- Draft from the `v<previous-stable>..HEAD` diff. Covers the **full** delta from the previous stable.
- **User-facing voice**, not implementation. Describe what changed in the app, not the code. No component/module names, no "remount / virtualized / debounced / memoized".
- One sentence per bullet, no trailing periods, one line each. Split any bullet that chains changes with "and"/commas/em-dash. Collapse intra-release fixes (if a feature was added _and_ fixed this release, list only the working feature).
- Order by user impact: features → quality-of-life → internal-with-user-benefit.
- **Attribution** — credit external commit _authors_ (not the PR opener), skip [@boudra](https://github.com/boudra). Link PRs to `Draek2077/otto-code`:
```bash
git log --format='%H %s' v<previous>..HEAD | grep -E '\(#[0-9]+\)$' # find PR numbers
gh pr view N --repo Draek2077/otto-code --json commits --jq '[.commits[].authors[].login] | unique | .[]' # authors
```
Format: `([#123](https://github.com/Draek2077/otto-code/pull/123) by [@user](https://github.com/user))`.

Show the drafted entry to the user and **wait for approval**. Do not commit it yet.

### 3. Pre-release sanity check (stable only)

Review `git diff <latest-release-tag>..HEAD` as a last line of defence. Focus on: protocol breaks (WebSocket / agent lifecycle / server↔client), **old app client vs. new daemon** back-compat (users update daemon first, keep the old app), and regressions. Surface anything risky; the user decides.

### 4. Go-ahead → commit + release

Only after explicit go-ahead:

```bash
# Commit the approved changelog on its OWN commit — no code bundled in.
git commit -m "docs(changelog): add X.Y.Z release notes"

# Confirm prerequisites, then cut it.
npm whoami # must be an otto-code npm org member
npm run release:patch # release:check → version:all:patch (bump+commit+tag) → release:publish → release:push
```

`release:patch` bumps every workspace, publishes the six `@otto-code/*` packages, and pushes HEAD + tag. The tag push triggers CI (see step 5).

**If publish fails mid-chain** (auth expired, registry hiccup): the version commit + tag exist but are unpushed. Don't re-run the full chain — resume with `npm run release:publish` then `npm run release:push`.

### 5. Done — `release:push` is the last step

**Do NOT watch the builds.** No background polling loop, no `gh run list` heartbeat, no scheduled re-check, no "I'll report back when they settle." The user watches CI themselves and has ruled the monitoring a waste of tokens. Report what shipped and end the turn.

The `v*` tag push triggers, in **your** repo: `Desktop Release`, `Android APK Release`, `Android Play Release` (AAB → Play internal track), `Docker`, `Deploy App` (web app), `Release Notes Sync`. `Deploy Website` runs when the GitHub release publishes (stable only).

- **`gh` defaults to upstream Paseo here — always pass `--repo Draek2077/otto-code`** — for the one-off checks below, or when the user asks about a specific failure later.
- macOS desktop jobs **run and produce unsigned artifacts** (they no longer skip for want of Apple signing — changed as of 0.6.6). A red mac job is a **real failure**, not an expected skip. Unsigned means a Gatekeeper warning on first open; that is the known trade, not a defect.
- Spot-check once, if at all: `npm view @otto-code/cli version` shows the new version on `latest`.

Stable rollout is a 36h staged ramp by default; nothing extra needed. To admit everyone immediately or tune the ramp, see **`docs/release.md` → "Staged rollout"**.

---

## Beta path (only when the user says "beta")

Betas are fast release candidates on the `beta` channel: npm publishes on the `beta` dist-tag only, the website download target does not move, and **the sanity check is skipped** (the beta is the smoke test).

```bash
npm run release:beta:patch # → X.Y.Z-beta.1: check, bump, publish beta dist-tag, push tag
# ...smoke desktop + APK prerelease assets from GitHub Releases...
npm run release:beta:next # optional: cut beta.2, beta.3, ...
npm run release:promote # promote X.Y.Z-beta.N → stable X.Y.Z (fresh v* tag)
```

Beta changelog: keep **one** in-place `## X.Y.Z-beta.N - YYYY-MM-DD` entry that always covers the full previous-stable→HEAD delta. Each beta bumps that same heading; promotion overwrites it in place (heading → `X.Y.Z`, date → promotion day). Never leave a stale `-beta.N` heading or append a new per-beta entry. Verify npm: `npm view @otto-code/cli dist-tags` (version under `beta`, not `latest`).

Promotion runs the **stable** completion checklist, including the sanity check.

---

## Hard rules

- **Never bump minor/major to fix or retrigger a build.** Build/CI failures are fixed on the current version. To rebuild a target, push a retry tag — see `docs/release.md` → "Fixing a failed release build" (Docker-only retries use `docker.yml` dispatch, never a re-pushed `v*` tag).
- **No code in the changelog commit or the release commit.** Code shims are their own reviewed commit.
- **"Stable" means stable** — don't offer a beta first when the user said stable.
- **Releases are always patch** unless the user explicitly says "minor"/"major".

## When to open `docs/release.md`

Only for these — everything else is above:

- Staged rollout tuning: instant-admit, `desktop-rollout.yml`, custom ramps, releasing during an active rollout.
- Fixing a failed build: retry-tag patterns (`desktop-vX.Y.Z`, `android-vX.Y.Z`, per-platform), Docker dispatch, why `workflow_dispatch` won't pick up tagged code fixes.
- Watching EAS builds from the terminal; the full completion checklists.
41 changes: 41 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
.git
.debug.conversations
.debug
.dev
.playwright-mcp
**/.playwright-mcp
.otto
**/.otto-provider-history
.plans
.tasks
.valknut
.claude/settings.local.json
**/.claude/settings.local.json
.claude/scheduled_tasks.lock
.claude/worktrees
.wrangler
**/.wrangler
**/.tanstack
PLAN.md
valknut-report.html
valknut-report.json
.env*
**/.env*
.dev.vars
**/.dev.vars
*.pem
**/*.pem
**/.secrets
**/node_modules
**/dist
**/build
**/.cache
**/.expo
**/test-results
**/*.tsbuildinfo
artifacts
packages/app/android
packages/desktop/release
plan.*.log
*.log
CLAUDE.local.md
64 changes: 64 additions & 0 deletions .easignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# .easignore — controls what EAS Build uploads in the project archive.
#
# Why this file exists:
# Without it, EAS falls back to .gitignore, but it only applies the ROOT
# .gitignore — it does NOT honor nested per-package .gitignore files. The
# generated native project is ignored in packages/app/.gitignore (`/android`,
# `/ios`), so EAS never excludes it and sweeps the ~1.3 GB Gradle + CMake
# build tree (packages/app/android/app/{build,.cxx}) into the archive,
# inflating it to ~1.8 GB. EAS regenerates the native project with
# `expo prebuild` on the build server, so none of it needs uploading.
#
# When this file is present, EAS uses ONLY these patterns and ignores
# .gitignore entirely — so everything git normally excludes (node_modules,
# build output) must be re-listed here.
#
# IMPORTANT: native-folder excludes are ANCHORED to the generated app project
# only. Do NOT use a bare `android/` or `ios/` pattern — real native module
# sources live in packages/expo-two-way-audio/{android,ios} and
# packages/app/modules/otto-hardware-keyboard/ios and must be uploaded.

# Dependencies — reinstalled on the build server from the lockfile
node_modules/

# Generated native projects — EAS runs `expo prebuild` itself
/packages/app/android/
/packages/app/ios/

# Build outputs, caches, generated declarations
dist/
build/
out/
.next/
.expo/
.gradle/
.cxx/
.kotlin/
*.tsbuildinfo
coverage/
test-results/
**/test-results/
.vitest-screenshots/

# Otto dev home + local tooling / editor state (not part of the app)
.dev/
.git/
.github/
.claude/
.agents/
.idea/
.vscode/
graphify-out/

# Packages the mobile app does not depend on
packages/desktop/
packages/website/

# Logs and local env
*.log
.env
**/.env.local
**/.env.test.local

# OS cruft
.DS_Store
8 changes: 8 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Normalize all text files to LF so Windows checkouts (core.autocrlf=true)
# match what CI checks: oxfmt flags CRLF working-tree files, making local
# `npm run format:check` fail on files that are clean in the index.
* text=auto eol=lf

# Windows scripts that must keep CRLF endings.
*.bat text eol=crlf
*.cmd text eol=crlf
15 changes: 15 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# These are supported funding model platforms

github: [boudra]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
thanks_dev: # Replace with a single thanks.dev username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
Loading