Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
318 commits
Select commit Hold shift + click to select a range
cdd4aba
fix(test): await startModelServer before fetching it - a scheduling race
siddWednesday Aug 14, 2026
0fc8c9c
test(actions): close the new-code coverage gaps - all four floors met
siddWednesday Aug 14, 2026
7da5867
chore(pro): stop tracking six pro test files that belong to desktop-pro
siddWednesday Aug 14, 2026
32d7147
ci(win): windows-build checks out shared; both workflows build @offgr…
siddWednesday Aug 14, 2026
58340a7
feat(actions): the Windows semantic rail - local Outlook first (R1 bo…
siddWednesday Aug 14, 2026
9a7f212
docs(r1): tick box 16 - the Windows CI build of this branch is green
siddWednesday Aug 14, 2026
e83198a
fix(tools): break the tools <-> extension-select cycle structurally
siddWednesday Aug 14, 2026
763439e
docs(plan): the re-cut - R2 is full rails + Approval UX v2; reasoning…
siddWednesday Aug 14, 2026
8f887f6
Merge pull request #81 from off-grid-ai/feat/computer-use
siddWednesday Aug 14, 2026
174a0c2
docs(r2): the R2 checklist; R1 boxes 18/18b closed by the merged PR
siddWednesday Aug 14, 2026
d1e1ecc
feat(tools): per-platform tool exposure - Windows joins with the Outl…
siddWednesday Aug 14, 2026
c2fd140
feat(actions): the win32 inline runner - links open, everything else …
siddWednesday Aug 14, 2026
d1d5cf3
feat(actions): Outlook read-back - Windows verifies what it creates (…
siddWednesday Aug 14, 2026
ff83efb
test(actions): the platform-pick seams, both arms each (R2-A follow-t…
siddWednesday Aug 14, 2026
bc3e88b
test(coverage): one report owns each file; a dbtest stops leaking its…
siddWednesday Aug 14, 2026
d01d80a
feat(actions): risk-tiered gating - reversible mutations auto-run wit…
siddWednesday Aug 14, 2026
43d3a8c
feat(actions): the inline-gate plumbing - park-and-render instead of …
siddWednesday Aug 14, 2026
2df0bbb
feat(renderer): the inline gate card + undo chip in the conversation …
siddWednesday Aug 14, 2026
e9e4ba9
test(actions): cover the B3 surface - IPC contract, dock branches, ou…
siddWednesday Aug 14, 2026
6b98f82
docs(r2): tick B4 - the pro queue resolves the engine gate (desktop-p…
siddWednesday Aug 14, 2026
0a7c7ec
feat(browser): the rail's eyes - in-page collector with indexed eleme…
siddWednesday Aug 14, 2026
5a7c223
feat(browser): the rail's hands - CDP driver behind a transport seam …
siddWednesday Aug 14, 2026
9250956
feat(browser): the web-task loop - snapshot/decide/act with takeover …
siddWednesday Aug 14, 2026
1222eb7
feat(browser): the watched pane + takeover handoff (R2-C2)
siddWednesday Aug 14, 2026
5180cf3
feat(browser): web_task through the engine - the browser rail, chat-d…
siddWednesday Aug 14, 2026
6098994
docs(r2): tick C1-C3 - the browser rail is chat-drivable with takeover
siddWednesday Aug 14, 2026
663be36
feat(vision): the UI-TARS action parser (R2-D1 core)
siddWednesday Aug 14, 2026
782fc57
feat(vision): the supervised vision-rail spine - guard, loop, engine …
siddWednesday Aug 14, 2026
98f4142
feat(vision): wire the vision rail into the engine, host behind a cap…
siddWednesday Aug 14, 2026
0754c1e
docs(r2): D spine landed - vision rail wired, actuation capability-ga…
siddWednesday Aug 14, 2026
e549253
feat(safety): injection-resistance review + cross-rail prompt guards …
siddWednesday Aug 14, 2026
52c8a45
test(coverage): write the report even when a test fails (reportOnFail…
siddWednesday Aug 14, 2026
98cebcd
docs(r2): tick E1 (injection review + prompt guards); E2 blockers rec…
siddWednesday Aug 14, 2026
b140395
test(coverage): the db report must not own the unit-tested browser/vi…
siddWednesday Aug 14, 2026
1e13146
test(tools): pin darwin in the tool tests so they pass on the Linux C…
siddWednesday Aug 14, 2026
e238890
feat(vision): the supervised overlay + Stop/Pause controller (R2-D2b …
siddWednesday Aug 17, 2026
f1371c3
docs(r2): D1b done (UI-TARS catalogued) + D2b UX-half done (supervise…
siddWednesday Aug 17, 2026
8e78c1d
feat(vision): warn (don't block) when computer use runs on a non-grou…
siddWednesday Aug 17, 2026
11311f9
docs(r2): D1b corrected (OGAD's own catalog) + D1c model-agnostic gro…
siddWednesday Aug 17, 2026
3ab1155
feat(vision): wire the native actuation - the vision rail can now act…
siddWednesday Aug 17, 2026
6627ce3
docs(r2): D2b-native wired - the vision rail can act (needs real-mach…
siddWednesday Aug 17, 2026
157a838
fix(vision): hand the grounder a screenshot PATH, not raw base64
siddWednesday Aug 17, 2026
bd9cdc0
fix(vision): surface the grounder nudge IN THE CHAT, not just the ove…
siddWednesday Aug 17, 2026
f6b3197
fix(vision): grounder nudge reuses the chat MessageNudge, deterministic
siddWednesday Aug 17, 2026
e1f0455
fix(vision): fire the grounder nudge at QUEUE time, not only when the…
siddWednesday Aug 17, 2026
30ad2a4
docs(r5): the tiered, model-agnostic computer-use plan (AX-first, set…
siddWednesday Aug 17, 2026
adcf0ac
feat(a11y): the AX driving rail's eyes - structured-element parser (R…
siddWednesday Aug 17, 2026
b3d5624
feat(a11y): the element-picking loop - shared by AX and set-of-marks …
siddWednesday Aug 17, 2026
d0a69e1
feat(a11y): the Swift --elements mode - structured AX element emitter…
siddWednesday Aug 17, 2026
14f8a2b
feat(a11y): the cheapest-first routing decision - AX or fall to visio…
siddWednesday Aug 17, 2026
60e2a50
refactor(input): extract the nut.js actuation into a shared module
siddWednesday Aug 17, 2026
4e0cf9b
feat(a11y): make the --elements helper drive real apps (Electron trig…
siddWednesday Aug 17, 2026
4aa0264
feat(a11y): the accessibility driving rail + AX-first computer_task t…
siddWednesday Aug 17, 2026
dc17d65
docs(r5): mark tier-1 T1a-T1e done (AX driving rail landed), T1f = li…
siddWednesday Aug 17, 2026
f89223c
fix(a11y): the grounder nudge is AX-aware - no "load a grounder" when…
siddWednesday Aug 17, 2026
db87742
fix(a11y): the element parser tolerates a general model wrapping its …
siddWednesday Aug 17, 2026
b14df15
chore(a11y): trace the computer_task tiering + AX drive in the app log
siddWednesday Aug 17, 2026
3fad0d2
fix(a11y): type into the focused field (optional index) + trailing su…
siddWednesday Aug 17, 2026
983c796
fix(a11y): coach the message-a-person flow so the model stops typing …
siddWednesday Aug 17, 2026
b1ee7a1
fix(a11y): correct the messaging flow - quick switcher + target the l…
siddWednesday Aug 17, 2026
e1643ac
fix(a11y): drop 1px hover artifacts + raise the element cap so the co…
siddWednesday Aug 17, 2026
e87c3c4
fix(a11y): runaway guard - halt on a repeated action so a live send n…
siddWednesday Aug 17, 2026
07d7d30
feat(computer-use): AX-vs-grounder A/B harness - forced rail, timing,…
siddWednesday Aug 17, 2026
ef18ad0
fix(vision): grounder rail was broken - empty screenshot + missing im…
siddWednesday Aug 17, 2026
d62ab7d
feat(computer-use): floating supervisor window - see what the agent i…
siddWednesday Aug 18, 2026
7cc0ba8
fix(computer-use): supervisor window catches steps it missed while it…
siddWednesday Aug 18, 2026
54f76f9
fix(a11y): stop the A-B-A-B send loop - dedupe by typed text, not index
siddWednesday Aug 18, 2026
4de77cc
fix(browser): harden the web rail - surface results, don't stop after…
siddWednesday Aug 18, 2026
01a8b8b
fix(tools): route interactive web goals to web_task, not open_url
siddWednesday Aug 18, 2026
9338e22
fix(browser): default a start URL + surface web-task errors (no more …
siddWednesday Aug 18, 2026
22eb5e9
feat(orchestrator): planner + executor pure core (plan-and-execute)
siddWednesday Aug 18, 2026
7a3681b
feat(orchestrator): wire plan-and-execute into toolChat
siddWednesday Aug 18, 2026
fa2461d
chore(orchestrator): log the produced plan for diagnosis
siddWednesday Aug 18, 2026
22da25f
fix(orchestrator): backfill an empty web_task/computer_task goal with…
siddWednesday Aug 18, 2026
e789814
fix(browser): bound every CDP command so a wedged transport can't han…
siddWednesday Aug 18, 2026
48cb97d
feat(browser): browser rail reports through the shared supervisor pan…
siddWednesday Aug 18, 2026
ff1df79
fix(browser): load the start page natively before CDP so the debugger…
siddWednesday Aug 18, 2026
79d73ff
feat(routing): hybrid web routing by end-state - watch/open to the re…
siddWednesday Aug 18, 2026
ee3905c
feat(orchestrator): AX rail can drive the user's real browser, so pla…
siddWednesday Aug 18, 2026
a78fbce
fix(ax-rail): coach the model to STOP once the goal is achieved (no o…
siddWednesday Aug 18, 2026
213ba92
fix(ax-rail): coach the native file-picker pattern so file attach/upl…
siddWednesday Aug 18, 2026
2c342a8
feat(routing): a task naming a running native app drives the app, not…
siddWednesday Aug 18, 2026
4260801
feat(browser): give the baked-in browser its own persistent profile, …
siddWednesday Aug 18, 2026
2da9992
feat(routing): website tasks run in the built-in browser, not the use…
siddWednesday Aug 18, 2026
207b2f7
refactor(ax): drop the real-browser fallback now that browser tasks s…
siddWednesday Aug 18, 2026
c7f62f5
fix(browser): dock the live view to the watched pane's region and hid…
siddWednesday Aug 18, 2026
ac8d6b4
feat(actions): OFFGRID_AUTO_APPROVE bypasses the approval gate for te…
siddWednesday Aug 18, 2026
5c0c36a
fix(browser): keep the live view visible while a task runs (regressio…
siddWednesday Aug 18, 2026
0a04055
feat(browser): make the browser split resizable and closeable, and a …
siddWednesday Aug 18, 2026
aeada99
fix(browser): dock the view to the real main window and drop the redu…
siddWednesday Aug 18, 2026
b2c3921
fix(browser): strip <think>/prose before parsing web-rail steps, so r…
siddWednesday Aug 18, 2026
aa30ba3
fix(browser): accept 'type' with no index (focused field) + a submit …
siddWednesday Aug 18, 2026
76d67e9
fix(browser): render the split at the App root so it docks to the vie…
siddWednesday Aug 18, 2026
75c5516
feat(actions): only computer-use tasks ask for approval; in-app actio…
siddWednesday Aug 18, 2026
6b55a15
feat(browser): add a small grip notch to the split's resize handle
siddWednesday Aug 18, 2026
b133dd5
fix(routing): a website request stays a web_task even if a word match…
siddWednesday Aug 19, 2026
5e82e85
fix(rails): a repeated step skips instead of killing the task
siddWednesday Aug 19, 2026
a4060c3
feat(mcp): expose the desktop's action tools over the MCP server so c…
siddWednesday Aug 19, 2026
308347e
feat(mcp): gate the action tools behind a per-device pairing token
siddWednesday Aug 19, 2026
52c1b3b
feat(pairing): LAN-address + pairing-payload building blocks for QR p…
siddWednesday Aug 20, 2026
17e2497
feat(pairing): desktop "Pair a device" panel with QR + copyable code
siddWednesday Aug 20, 2026
2f3c511
refactor(pairing): drop the standalone "Pair a device" Settings panel
siddWednesday Aug 20, 2026
9c4e7ca
build(deps): re-add qrcode.react for the Devices pairing QR
siddWednesday Aug 20, 2026
0cdd0b5
feat(explore): the demo-preset catalog (SSOT for the showcase)
siddWednesday Aug 21, 2026
31c035f
feat(explore): ExploreSection - capability-grouped preset cards
siddWednesday Aug 21, 2026
70d870e
feat(explore): surface demo presets in the chat empty state
siddWednesday Aug 21, 2026
183e6b6
feat(explore): add Explore landing view + seed-prompt handoff
siddWednesday Aug 21, 2026
2bb50b1
fix(explore): use the brand name "Off Grid AI" in the Explore header
siddWednesday Aug 21, 2026
a961ce4
fix(rag): stop a hyphenated query from crashing the whole chat retrieval
siddWednesday Aug 21, 2026
4cb26ee
fix(explore): make the Play-music preset concrete and drop the volume…
siddWednesday Aug 21, 2026
c064376
feat(approvals): show the inline chat card for computer-use gates in …
siddWednesday Aug 21, 2026
964fd72
feat(approvals): core seam for the auto/ask computer-task approval mode
siddWednesday Aug 21, 2026
d9bf87c
feat(approvals): multi-subscriber inline gate surface (fan out to car…
siddWednesday Aug 21, 2026
a7eeefe
test(chat): render clean desktop previews
alichherawalla Aug 22, 2026
9a1f4e2
feat(explore): capability panels + label titles, never the raw prompt
siddWednesday Aug 23, 2026
59aab3c
test(e2e): explore surfaces render label-only cards on both placements
siddWednesday Aug 23, 2026
5fed910
feat(explore): per-preset icons + runs count on each capability panel
siddWednesday Aug 23, 2026
5e45465
fix(browser): stop the agent browser's audio when it's hidden or the …
siddWednesday Aug 23, 2026
4463ae1
fix(chat): remove the grounder-model nudge from the chat
siddWednesday Aug 23, 2026
c65db99
fix(approvals): dismiss the gate card the instant the user decides
siddWednesday Aug 23, 2026
b96cdfe
fix(browser): make the watched-pane resize handle grabbable with a gr…
siddWednesday Aug 23, 2026
df28524
fix(browser): stream web-task steps in the chat, not below the browser
siddWednesday Aug 23, 2026
f750019
refine(explore): make preset prompts concrete and self-explanatory
siddWednesday Aug 23, 2026
37cb1d8
Merge remote-tracking branch 'origin/main' into feat/chat-approvals
siddWednesday Aug 23, 2026
14090a3
fix(merge): bump pro pointer + resolve pre-existing failures surfaced…
siddWednesday Aug 23, 2026
dc00ac0
feat(win/vision): DPI-aware coordinate mapping for the computer-use rail
siddWednesday Aug 23, 2026
2f26fac
ci(win): fail loud if the computer-use input addon (nut.js) is absent
siddWednesday Aug 23, 2026
08c92ff
docs(win): record action-rails + computer-use Windows status
siddWednesday Aug 23, 2026
d3e8504
ci(win): build @offgrid/models + let dispatch pin the shared ref
siddWednesday Aug 23, 2026
a18819c
feat(vision): fall back to the active model when the grounder isn't d…
siddWednesday Aug 23, 2026
b06280c
feat(speech): configure transcription language
alichherawalla Aug 24, 2026
9e67b85
fix(ui): standardize dismissible side panels
alichherawalla Aug 24, 2026
cb36e36
fix(chat): open safe markdown links
alichherawalla Aug 24, 2026
fd952ef
feat(search): add Activity and Files commands
alichherawalla Aug 24, 2026
4dcac8a
test(models): cover transcription settings navigation
alichherawalla Aug 24, 2026
1afea0f
chore(pro): update release feedback features
alichherawalla Aug 24, 2026
09e49ff
test(speech): cover configured language fallback
alichherawalla Aug 24, 2026
b142106
refactor(speech): centralize transcription status
alichherawalla Aug 24, 2026
f07824d
test(speech): cover transcription status
alichherawalla Aug 24, 2026
5317125
ci(shared): build speech package before desktop checks
alichherawalla Aug 24, 2026
0d0afeb
test(speech): cover transcription language IPC
alichherawalla Aug 24, 2026
8af7828
chore(pro): update release feedback dependency
alichherawalla Aug 24, 2026
3875d25
fix(speech): reconcile transferred transcription settings
alichherawalla Aug 24, 2026
036819c
fix(ui): make panels and palette keyboard safe
alichherawalla Aug 24, 2026
a9c3a15
ci: test SQLite with the Node ABI
alichherawalla Aug 24, 2026
de7d010
fix(speech): fall back from stale transcription picks
alichherawalla Aug 24, 2026
090e34f
ci: prepare SQLite before fast integration tests
alichherawalla Aug 24, 2026
434f4c6
ci: align Desktop Pro feedback head
alichherawalla Aug 24, 2026
476d479
ci: restore Electron SQLite after interrupted pushes
alichherawalla Aug 24, 2026
2597a8b
fix(ui): close final navigation and focus gaps
alichherawalla Aug 24, 2026
ce64ee6
ci: report failed Electron ABI restoration
alichherawalla Aug 24, 2026
04cfe08
fix(ui): harden routes and panel focus
alichherawalla Aug 24, 2026
098af0f
chore(pro): align feedback integration head
alichherawalla Aug 24, 2026
f459c71
feat(win/ax): Windows accessibility rail via PowerShell + UI Automation
siddWednesday Aug 24, 2026
5a1fbd3
fix(integrations): route provider verification
alichherawalla Aug 24, 2026
f84f1ea
fix(integrations): share Google OAuth callback
alichherawalla Aug 24, 2026
7978b1d
chore(pro): align Calendar scope fix
alichherawalla Aug 24, 2026
15776a6
chore(pro): bump submodule to the eviction/license fix (420b3c6)
siddWednesday Aug 24, 2026
02e9a49
feat: complete Google connector authorization
alichherawalla Aug 24, 2026
82f4bc3
refactor: animate shared side panels
alichherawalla Aug 24, 2026
5cacb52
feat: add complete Desktop voice turns
alichherawalla Aug 24, 2026
9810c20
chore: update Desktop Pro sync bridge
alichherawalla Aug 24, 2026
a6a8b35
feat(mcp): action-tool auth reads live per-device tokens
siddWednesday Aug 24, 2026
b10addf
ci(release): add artifact_only mode (signed DMG as a run artifact, no…
siddWednesday Aug 24, 2026
ca61029
test: cover Electron SQLite restoration
alichherawalla Aug 24, 2026
70cf5ad
test: prove connector source lifecycle
alichherawalla Aug 24, 2026
ebd2f4a
refactor: simplify Desktop voice state presentation
alichherawalla Aug 24, 2026
46a47ce
refactor: isolate connector authorization controls
alichherawalla Aug 24, 2026
c15d0ec
fix: validate persisted Desktop voice settings
alichherawalla Aug 24, 2026
54e8548
refactor: clarify Desktop navigation and focus
alichherawalla Aug 24, 2026
9057474
fix: make connector controls immutable
alichherawalla Aug 24, 2026
b3173f8
chore: update Pro browsing state boundary
alichherawalla Aug 24, 2026
ec9d16f
chore: update Pro advertising state boundary
alichherawalla Aug 24, 2026
e3791d7
docs: add Google OAuth and mesh release guide
alichherawalla Aug 24, 2026
13ec731
chore: update Pro CI policy pointer
alichherawalla Aug 24, 2026
ef99f3d
feat(audio): show runtime voice readiness
alichherawalla Aug 24, 2026
dd3f0db
fix(time): share local calendar-day helpers
alichherawalla Aug 25, 2026
3784408
Merge branch 'feat/windows-parity' into release/107-feedback
alichherawalla Aug 25, 2026
00f7ecd
fix(chat): resolve Windows parity merge imports
alichherawalla Aug 25, 2026
976b828
feat(speech): integrate private ExecuTorch runtime
alichherawalla Aug 25, 2026
8929844
feat(chat): connect structured search tools
alichherawalla Aug 25, 2026
5c06ccb
feat(settings): unify model and voice controls
alichherawalla Aug 25, 2026
0197806
feat(chat): unify voice and source navigation
alichherawalla Aug 25, 2026
8adb7e7
chore(pro): include chat tools and Windows parity
alichherawalla Aug 25, 2026
d40d761
Merge Windows parity into release/107-feedback
alichherawalla Aug 25, 2026
5b116b0
fix(speech): show every runtime voice
alichherawalla Aug 25, 2026
7248145
test(actions): preserve native DB test ABI
alichherawalla Aug 25, 2026
44ad62b
fix(computer-use): retain recent vision steps
alichherawalla Aug 25, 2026
fe1b622
fix(tools): skip planning plain questions
alichherawalla Aug 25, 2026
6589dcc
feat(explore): add local proposal deck skill
alichherawalla Aug 25, 2026
a703080
feat(actions): route approvals to execution chat
alichherawalla Aug 25, 2026
2002819
chore(pro): include time transfer and action flows
alichherawalla Aug 25, 2026
3b96309
fix(explore): use full-width proposal intake
alichherawalla Aug 25, 2026
3c08902
feat(tasks): add persistent web and computer tabs
alichherawalla Aug 25, 2026
1f5d63a
fix(explore): clarify proposal style references
alichherawalla Aug 25, 2026
9e37ac3
fix(tasks): always open task history
alichherawalla Aug 25, 2026
0052eff
feat(chat): explain completed work inline
alichherawalla Aug 25, 2026
c27dbfd
feat(chat): link installed skill mentions
alichherawalla Aug 25, 2026
ebbff37
feat(actions): continue approvals in chat
alichherawalla Aug 25, 2026
a853cb7
chore(pro): use one approval sync path
alichherawalla Aug 25, 2026
de40f64
fix(actions): use chat-only approval sync
alichherawalla Aug 25, 2026
6fa6719
feat(progress): emit complete download facts
alichherawalla Aug 25, 2026
f829bc1
feat(progress): show complete download status
alichherawalla Aug 25, 2026
83622c2
feat(browser): manage independent tab sessions
alichherawalla Aug 25, 2026
7ab66a1
feat(tasks): retain computer use step details
alichherawalla Aug 25, 2026
f56fd42
feat(computer-use): add grounded runtime controls
alichherawalla Aug 25, 2026
50c3a73
feat(computer-use): add UI-Mate policy adapter
alichherawalla Aug 25, 2026
e4d2e89
feat(tasks): add managed browser workspace
alichherawalla Aug 25, 2026
7af051e
test(tasks): cover computer use settings route
alichherawalla Aug 25, 2026
743e3eb
feat(computer-use): retain AX planning evidence
alichherawalla Aug 25, 2026
21644d0
feat(computer-use): run UI-Mate vision policy
alichherawalla Aug 25, 2026
47159c7
feat(computer-use): build model-governed vision pipeline
alichherawalla Aug 26, 2026
8816c84
feat(desktop): add docked task workspace and live evidence
alichherawalla Aug 26, 2026
5dbee0b
test(computer-use): cover governed web task journeys
alichherawalla Aug 26, 2026
101eb4c
build(computer-use): add graph and secure-input support
alichherawalla Aug 26, 2026
ce1b7f9
docs(computer-use): record pipeline contract and gaps
alichherawalla Aug 26, 2026
df866c0
fix(computer-use): preserve immersive retry workspace
alichherawalla Aug 26, 2026
a054daa
feat(pro): gate browser and computer use
alichherawalla Aug 26, 2026
6c537ec
build(pro): update desktop pro dependency
alichherawalla Aug 26, 2026
84ea0e2
test(computer-use): assert immersive retry detail
alichherawalla Aug 26, 2026
3395821
fix(pro): accept typed IPC handler boundaries
alichherawalla Aug 26, 2026
2602008
build(pro): update desktop pro checks
alichherawalla Aug 26, 2026
6df305e
test(renderer): align integration fixtures with live UI
alichherawalla Aug 26, 2026
50bbbad
test(audio): require complete engine round trip
alichherawalla Aug 26, 2026
c26a2b1
build(pro): update desktop pro dependency
alichherawalla Aug 26, 2026
3112cbc
test(e2e): preserve agentic evidence diagnostics
alichherawalla Aug 26, 2026
e4d7254
ci: secure cross-repo runtime checkout
alichherawalla Aug 26, 2026
25a7cf2
ci(shared): build desktop ui dependency
alichherawalla Aug 26, 2026
1769c2a
ci: allow complete coverage aggregation
alichherawalla Aug 26, 2026
5f5d3ab
refactor(pro): move task surfaces behind private slots
alichherawalla Aug 26, 2026
d879714
test(pro): activate private task activity
alichherawalla Aug 26, 2026
c6309da
ci: allow manual verification runs
alichherawalla Aug 26, 2026
f1c12b6
fix(licensing): preserve effective pro status
alichherawalla Aug 26, 2026
1c9475b
fix(tasks): verify smooth disclosure motion
alichherawalla Aug 26, 2026
41a028e
ci(pro): use complete private verification workflow
alichherawalla Aug 26, 2026
ef29baa
fix(ci): close coverage hang and quality gate
alichherawalla Aug 26, 2026
3989d26
fix(vision): route visual decisions through graph commands
alichherawalla Aug 26, 2026
b45b48c
fix(ci): gate aggregate new-code coverage
alichherawalla Aug 26, 2026
f2121f7
fix(chat): dock tasks below the chat header
alichherawalla Aug 26, 2026
6de6360
chore(pro): update task workspace integration
alichherawalla Aug 26, 2026
c6a055a
fix(navigation): collapse the sidebar until hover
alichherawalla Aug 26, 2026
031f899
fix(vision): normalize model action coordinates
alichherawalla Aug 26, 2026
aadc039
fix(browser): execute history hotkeys semantically
alichherawalla Aug 26, 2026
ca27f80
fix(ci): update DB journey contracts
alichherawalla Aug 26, 2026
1e5b5d1
fix(browser): expose semantic navigation controls
alichherawalla Aug 26, 2026
d64ff0b
fix(startup): restore Electron SQLite ABI
alichherawalla Aug 26, 2026
c23e8f8
chore(pro): update task and startup fixes
alichherawalla Aug 26, 2026
1b85374
fix(chat): show live edited Web Use progress
alichherawalla Aug 26, 2026
f255312
fix(chat): stream remote reasoning details
alichherawalla Aug 26, 2026
b1e3322
fix(chat): allow live task projection without result
alichherawalla Aug 26, 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
  •  
  •  
  •  
77 changes: 70 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ on:
pull_request:
push:
branches: [main]
workflow_dispatch:
jobs:
# ONE job per repo, matching mobile and mobile-pro: typecheck, tests + coverage, boundaries, lint and the
# Playwright e2e all report as a single `ci` check.
Expand All @@ -25,6 +26,10 @@ jobs:
timeout-minutes: 50 # backstop: a hung step fails fast instead of running for hours (unit gates + e2e tour)
steps:
- uses: actions/checkout@v4
with:
# The authoritative coverage gate compares the checked-out change with
# origin/main. A depth-1 checkout has no merge base to measure.
fetch-depth: 0
# Check out pro on the branch that MATCHES this PR/push (so a coordinated
# core+pro change is tested together). If pro has no such branch (most PRs),
# this step's checkout fails quietly and the fallback below pulls pro `main`.
Expand All @@ -40,6 +45,7 @@ jobs:
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: pro
ref: ${{ github.head_ref || github.ref_name }}
fetch-depth: 0
# Don't leave the cross-repo PAT in ./pro/.git/config where a later
# PR-controlled step could reuse it — we only need it for the clone.
persist-credentials: false
Expand All @@ -51,6 +57,7 @@ jobs:
repository: off-grid-ai/desktop-pro
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: pro
fetch-depth: 0
persist-credentials: false
# pro MUST be present: without it the guarded typecheck/coverage path is skipped and
# CI would pass core-only with cratered/misleading coverage (the failure the
Expand Down Expand Up @@ -107,6 +114,30 @@ jobs:
npm --prefix ../shared ci
npm --prefix ../shared/packages/sync run build
npm --prefix ../shared/packages/models run build
npm --prefix ../shared/packages/speech run build
npm --prefix ../shared/packages/ui run build
- name: Check out the private Desktop speech runtime
uses: actions/checkout@v4
with:
repository: off-grid-ai/executorch-speech
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: _executorch_speech
lfs: false
# Keep the checkout credential only until the selective LFS pull in
# the next step. That step removes it before any project code runs.
persist-credentials: true
- name: Put the speech runtime beside this checkout
run: |
if [ ! -f _executorch_speech/package.json ]; then
echo "::error::off-grid-ai/executorch-speech was not checked out. Check CI_CROSS_REPO_TOKEN."
exit 1
fi
# Tests exercise the real native boundary, but ordinary CI does not need
# the 350 MB bundled English asset set used only by the Mac release.
git -C _executorch_speech lfs pull --include='native/bin/executorch-speech' --exclude=''
git -C _executorch_speech config --unset-all http.https://github.com/.extraheader || true
rm -rf ../executorch-speech
mv _executorch_speech ../executorch-speech
- run: npm ci
# Hard gates: types + the full test suite.
- name: Typecheck (core)
Expand All @@ -116,12 +147,23 @@ jobs:
if: ${{ hashFiles('pro/tsconfig.json') != '' }}
timeout-minutes: 6
run: cd pro && npx tsc --noEmit -p tsconfig.json
# Runs the full vitest suite AND enforces the coverage ratchet floor
# (vitest.config.ts `thresholds`) — the same gate as the pre-push hook, so a
# coverage regression fails CI, not just local pushes. The pro/** threshold
# group applies only when pro was checked out above (guarded in the config).
- name: Test + coverage thresholds
timeout-minutes: 10
# npm's Electron install hooks leave sqlite compiled for Electron's ABI. The
# Vitest process is plain Node, and some default integration tests open the
# real database, so put the native module on Node's ABI before that gate.
# The later DB journey script restores the Electron ABI in its EXIT trap.
- name: Rebuild SQLite for the Node test runner
run: npm rebuild better-sqlite3-multiple-ciphers
# This is the fast report, not the complete coverage measurement. DB-only
# journeys run next and e2e can add coarse coverage later. Test failures still
# block here; the aggregate new-code gate below owns the coverage decision.
- name: Test + fast coverage report
# The tests finish in about four minutes. V8 then maps coverage across the
# complete core + Pro source set, including files no test imported. That
# aggregation can take another six minutes on a busy runner, so give report
# generation enough time to finish.
timeout-minutes: 20
env:
OFFGRID_AGGREGATE_COVERAGE: '1'
run: npm run test:coverage
# The DB journeys - 74 files, 255 cases - which CI has NEVER run.
#
Expand All @@ -148,7 +190,7 @@ jobs:
# reason is recorded in vitest.db.ci.config.ts with the evidence from the run that found it. 243 of the
# 248 cases still run here.
OFFGRID_DB_VITEST_CONFIG: vitest.db.ci.config.ts
run: npm run test:db
run: npm run test:db -- --coverage
# Build/native/port integration tests (packaging, whisper build-staging, the
# model-port + System Health seams that own :8439). These need a packaged
# build / native toolchain / a live engine port the pure `verify` runner
Expand Down Expand Up @@ -233,6 +275,27 @@ jobs:
else
echo "no e2e coverage captured (the suite may not have launched)"
fi
# Match the pre-push authority: merge every report that can cover this change,
# then gate only executable lines added on this branch. The floors are the same
# ratchets as scripts/hooks/pre-push; neither whole-tree debt nor a partial suite
# can decide the result.
- name: Coverage gate (new code across all suites)
run: |
reports="coverage/coverage-final.json coverage-db/coverage-final.json"
for report in $reports; do
if [ ! -f "$report" ]; then
echo "::error::required coverage report is missing: $report"
exit 1
fi
done
coarse=""
if [ -f coverage-e2e/coverage-final.json ]; then
coarse="--coarse=coverage-e2e/coverage-final.json"
fi
node ../shared/scripts/new-code-coverage.mjs . $reports $coarse \
--min-statements=78 --min-branches=57 --min-functions=52 --min-lines=78
node ../shared/scripts/new-code-coverage.mjs ./pro $reports $coarse \
--min-statements=72 --min-branches=45 --min-functions=46 --min-lines=72
- name: Upload e2e coverage
if: ${{ always() && vars.OFFGRID_CI_E2E == '1' }}
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
Expand Down
84 changes: 80 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@ on:
type: string
required: false
default: ''
artifact_only:
# Internal demo build: the SAME signed + notarized DMG, but uploaded as a run
# artifact (repo-scoped, auto-expiring) instead of a published Release. Skips the
# release-create/upload, the pro-mac.yml + latest/nightly aliases, Slack, and the
# whole Windows job - so nothing lands on the releases page or the update feed.
description: 'Build the signed+notarized DMG as a run artifact only (no Release, no Windows, no Slack)'
type: boolean
required: false
default: false

permissions:
contents: write
Expand Down Expand Up @@ -160,6 +169,17 @@ jobs:
mkdir -p resources/bin
cp scripts/dictation-hotkey/dictation-hotkey resources/bin/dictation-hotkey
chmod +x resources/bin/dictation-hotkey
# Compile the native actions helper (EventKit) and stage it into resources/bin so
# extraResources bundles it at Contents/Resources/bin — the path runNativeAction
# resolves. Self-contained: no committed binary, built fresh against the pinned
# target. If it ever fails to ship, the calendar tools report "not available" and
# the rest of the app is unaffected, so it can't break a release.
- name: Build native actions helper (computer use, semantic rail)
run: |
bash scripts/build-actions-helper.sh
mkdir -p resources/bin
cp scripts/actions-helper/actions-helper resources/bin/actions-helper
chmod +x resources/bin/actions-helper
# Stage the Parakeet STT runtime (sherpa-onnx CLI + ONNX model) into
# resources/bin/parakeet. Additive: with SHERPA_ONNX_URL / PARAKEET_MODEL_URL
# unset this is a no-op and transcription stays on whisper, so it can't break a
Expand Down Expand Up @@ -228,7 +248,27 @@ jobs:
# drifted lock stops the release instead of resolving a graph nobody committed.
npm --prefix ../shared ci
npm --prefix ../shared/packages/sync run build
# @offgrid/use (the durable action engine) is consumed the same way as sync
# and needs the same explicit build - file-dep prepare alone does not emit
# its dist/ types before the typecheck runs.
npm --prefix ../shared/packages/use run build
npm --prefix ../shared/packages/models run build
- name: Check out the private Desktop speech runtime
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
repository: off-grid-ai/executorch-speech
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: _executorch_speech
lfs: true # Mac releases bundle the default English voices for offline first use.
persist-credentials: false
- name: Put the speech runtime beside this checkout
run: |
if [ ! -f _executorch_speech/package.json ]; then
echo "::error::off-grid-ai/executorch-speech was not checked out. Check CI_CROSS_REPO_TOKEN."
exit 1
fi
rm -rf ../executorch-speech
mv _executorch_speech ../executorch-speech
- name: Install dependencies
run: npm ci
# Stamp the resolved version into package.json so electron-builder picks the
Expand Down Expand Up @@ -268,6 +308,7 @@ jobs:
# notarytool needs the API key as a file; write it from the secret.
printf '%s' "$APPLE_API_KEY_CONTENT" > "$RUNNER_TEMP/AuthKey.p8"
export APPLE_API_KEY="$RUNNER_TEMP/AuthKey.p8"
npm run prepare:speech-defaults
# Build every artifact with publication disabled. The artifact hook verifies
# both the updater ZIP and DMG before this command can complete.
npx electron-builder --mac \
Expand All @@ -278,7 +319,18 @@ jobs:
APP="$(find dist -mindepth 2 -maxdepth 2 -type d -name 'Off Grid AI Desktop.app' -print -quit)"
test -n "$APP"
node scripts/probe-packaged-tts.mjs "$APP" --synthesize
# Internal demo build: hand the signed+notarized DMG back as a run artifact and stop
# (the publish steps below are all skipped). Repo-scoped, auto-expiring, no Release.
- name: Upload signed DMG as a build artifact
if: ${{ inputs.artifact_only }}
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4
with:
name: OffGrid-macOS-${{ needs.version.outputs.version }}
path: dist/OffGrid-*.dmg
if-no-files-found: error
retention-days: 14
- name: Stage verified update assets and publish the release
if: ${{ !inputs.artifact_only }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ needs.version.outputs.version }}
Expand Down Expand Up @@ -310,6 +362,7 @@ jobs:
gh release edit "$TAG" --draft=false --prerelease
fi
- name: Migrate legacy Pro update channel (publish pro-mac.yml)
if: ${{ !inputs.artifact_only }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ needs.version.outputs.version }}
Expand All @@ -335,7 +388,7 @@ jobs:
# --clobber replaces the copy from the prior run. The versioned DMG + updater
# feed (latest-mac.yml) are untouched, so auto-update is unaffected.
- name: Publish stable latest.dmg alias
if: needs.version.outputs.channel == 'stable'
if: ${{ !inputs.artifact_only && needs.version.outputs.channel == 'stable' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ needs.version.outputs.version }}
Expand All @@ -349,7 +402,7 @@ jobs:
# /releases/latest or the stable OffGrid-latest.dmg:
# https://github.com/off-grid-ai/off-grid-ai-desktop/releases/download/nightly/OffGrid-nightly.dmg
- name: Publish constant nightly.dmg link
if: needs.version.outputs.channel == 'beta'
if: ${{ !inputs.artifact_only && needs.version.outputs.channel == 'beta' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ needs.version.outputs.version }}
Expand All @@ -367,7 +420,7 @@ jobs:
# v$VERSION tag exist for beta too, so beta/nightly releases get their changelog on
# the release page, not just stable.
- name: Attach release notes
if: success()
if: ${{ !inputs.artifact_only && success() }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ needs.version.outputs.version }}
Expand All @@ -378,7 +431,7 @@ jobs:
# Slack outage never fails a release. Needs org/repo secret SLACK_WEBHOOK_URL (an
# Incoming Webhook, channel-bound). No secret => the step is a logged no-op.
- name: Announce release in Slack
if: success()
if: ${{ !inputs.artifact_only && success() }}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
PRODUCT: Off Grid AI Desktop
Expand All @@ -398,6 +451,8 @@ jobs:
# (the repo's LFS binaries are macOS-only).
build-win:
needs: [version, build-mac]
# Skipped for an artifact-only demo build (macOS DMG is all the lead needs).
if: ${{ !inputs.artifact_only }}
# windows-2022 = VS 2022 toolchain. windows-latest ships VS 2026, which node-gyp 11
# can't parse, breaking native-module (better-sqlite3) compiles. Pin until it catches up.
runs-on: windows-2022
Expand Down Expand Up @@ -469,7 +524,28 @@ jobs:
# drifted lock stops the release instead of resolving a graph nobody committed.
npm --prefix ../shared ci
npm --prefix ../shared/packages/sync run build
# @offgrid/use (the durable action engine) is consumed the same way as sync
# and needs the same explicit build - file-dep prepare alone does not emit
# its dist/ types before the typecheck runs.
npm --prefix ../shared/packages/use run build
npm --prefix ../shared/packages/models run build
- name: Check out the private Desktop speech package
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
repository: off-grid-ai/executorch-speech
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: _executorch_speech
lfs: false # The current native speech engine is macOS-only.
persist-credentials: false
- name: Put the speech package beside this checkout
shell: bash
run: |
if [ ! -f _executorch_speech/package.json ]; then
echo "::error::off-grid-ai/executorch-speech was not checked out. Check CI_CROSS_REPO_TOKEN."
exit 1
fi
rm -rf ../executorch-speech
mv _executorch_speech ../executorch-speech
- name: Install dependencies
run: npm ci
- name: Fetch Windows native binaries (llama/whisper/sd/ffmpeg)
Expand Down
Loading
Loading