Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
202 commits
Select commit Hold shift + click to select a range
80fd8c8
docs(computer-use): approach - replicate the mobile-use stack on desktop
siddWednesday Aug 11, 2026
3739d6e
docs(computer-use): build plan with dated timeline
siddWednesday Aug 11, 2026
562f2ee
docs(computer-use): compress timeline for solo AI-assisted development
siddWednesday Aug 11, 2026
a9ac675
docs(computer-use): phase 0 shared-repo setup + mobile sequencing note
siddWednesday Aug 11, 2026
34d0290
docs(computer-use): record decision status; break out the after-v1 mo…
siddWednesday Aug 11, 2026
259095c
docs(computer-use): per-phase repo column + write-access dependency
siddWednesday Aug 11, 2026
eb96d1c
docs(computer-use): agent-browser rail, reuse list, brand guidelines,…
siddWednesday Aug 12, 2026
0a4e563
feat(actions): transport-agnostic approval seam with risk classes
siddWednesday Aug 12, 2026
2aa9411
feat(packaging): TCC usage strings for the computer-use semantic rail
siddWednesday Aug 12, 2026
8f4cfc4
docs(computer-use): lock @offgrid/use package name (lead confirmed)
siddWednesday Aug 12, 2026
614b79f
feat(actions): native helper invoker + EventKit calendar backend
siddWednesday Aug 12, 2026
acb0f0a
feat(actions): wire calendar tools into the chat loop, gated + shipped
siddWednesday Aug 12, 2026
45b7283
feat(actions): add Reminders to the semantic rail
siddWednesday Aug 12, 2026
85e88c2
feat(actions): add Contacts lookup to the semantic rail
siddWednesday Aug 12, 2026
421b9df
feat(actions): add Messages and Mail send to the semantic rail
siddWednesday Aug 12, 2026
0fde34b
feat(actions): add open_url to the semantic rail
siddWednesday Aug 12, 2026
c5205ec
build(mac): stage the native actions helper in local builds
siddWednesday Aug 12, 2026
4fa6ec6
fix(actions): accept timezone-less local times in the helper
siddWednesday Aug 12, 2026
ab803db
Merge remote-tracking branch 'origin/main' into feat/computer-use
siddWednesday Aug 12, 2026
c5fb3c6
docs(computer-use): reframe around the proactive assistant model
siddWednesday Aug 12, 2026
493212d
docs(computer-use): compress the plan to a 2-week sprint
siddWednesday Aug 12, 2026
9c7b3e7
docs(computer-use): design brief for the proactive-assistant demo
siddWednesday Aug 12, 2026
5f7bd02
docs(computer-use): ground the demo brief in the real app
siddWednesday Aug 12, 2026
ba3b95c
docs(computer-use): competitive + prior-art research
siddWednesday Aug 12, 2026
50025ec
docs(computer-use): add PBD research blueprint + two sharper lessons
siddWednesday Aug 12, 2026
e94f6d9
docs(computer-use): make the demo brief match the real app + add evid…
siddWednesday Aug 12, 2026
9926bca
docs(assistant): high-level act-pipeline architecture + decisions + o…
siddWednesday Aug 13, 2026
11d9bd5
docs(assistant): name the actuation layer 'the rails' (canonical)
siddWednesday Aug 13, 2026
6644d4b
docs(assistant): add the brain-and-rails component diagram (ports and…
siddWednesday Aug 13, 2026
1329fe7
docs(assistant): TRD/PRD diagrams - C4 sys arch, swimlane, user flows
siddWednesday Aug 13, 2026
ed8ba94
docs(assistant): fold C4/swimlane/user-flow diagrams into the archite…
siddWednesday Aug 13, 2026
6f7780a
docs(assistant): reshape plan to release-led + Windows from day 1
siddWednesday Aug 13, 2026
27d01bb
docs(assistant): make it a 12-day plan (Windows heavy-rail parity as …
siddWednesday Aug 13, 2026
40fd7cc
docs(assistant): port-from map (incl. mobile) + shorten to a 10-day plan
siddWednesday Aug 13, 2026
6dc8c01
docs(assistant): deep port-vs-bespoke research map across the whole s…
siddWednesday Aug 13, 2026
a2d65a3
docs(plan): name the specific ports per release (from PORTING_MAP)
siddWednesday Aug 13, 2026
acb9699
docs: sanitize the assistant doc set; crown the plan as the build doc
siddWednesday Aug 13, 2026
db3185b
docs(r1): execution checklist - 19 commit-sized boxes with done-when …
siddWednesday Aug 13, 2026
c24ff46
feat(use): consume @offgrid/use from the shared sibling (R1 box 1)
siddWednesday Aug 13, 2026
1b43ed3
docs(r1): tick box 1 - @offgrid/use scaffolded and consumed
siddWednesday Aug 13, 2026
b91dbc5
chore(use): record @offgrid/use's zod dependency in the lock
siddWednesday Aug 13, 2026
6621b93
docs(r1): tick box 2 - the Action contract is in; box 1 wording match…
siddWednesday Aug 13, 2026
84deb91
chore(use): record @offgrid/use's xstate dependency in the lock
siddWednesday Aug 13, 2026
b8c89b8
docs(r1): tick box 3 - the lifecycle machine is in with crash-resume …
siddWednesday Aug 13, 2026
fa345b8
chore(use): lock refresh for @offgrid/use manifest
siddWednesday Aug 13, 2026
bfc7a12
docs(r1): tick box 4 - the durable queue is in; Day 1 of R1 complete
siddWednesday Aug 13, 2026
3372941
chore(use): record @offgrid/use's @noble/hashes dependency in the lock
siddWednesday Aug 13, 2026
1c2eeac
docs(r1): tick boxes 5 and 6 - retry policy and the bound gate are in
siddWednesday Aug 13, 2026
85f23ac
docs: three fixes from external review - offline scope, escalation ru…
siddWednesday Aug 13, 2026
cf68106
docs(r1): tick box 7 - the port, the registry, and the effect journal…
siddWednesday Aug 13, 2026
5ad4f4b
docs(porting): evaluate OpenWorkflow - right shape, wrong storage, st…
siddWednesday Aug 13, 2026
0b4538e
docs(r1): tick box 8 - the engine checkpoint passes; Day 2 of R1 comp…
siddWednesday Aug 13, 2026
260a05a
feat(actions): the use-engine storage adapter on the app database (R1…
siddWednesday Aug 13, 2026
f19caf9
docs(r1): tick box 9 - the engine runs on the app database
siddWednesday Aug 13, 2026
9189ee7
feat(actions): the semantic rail behind the DeviceController port (R1…
siddWednesday Aug 13, 2026
894bb4e
docs(r1): tick box 10 - the semantic rail is mapped and guarded
siddWednesday Aug 13, 2026
be3bfcd
feat(actions): the gate host - the engine's approval callback on the …
siddWednesday Aug 13, 2026
2363fa5
docs(r1): tick box 11 - the gate host bridges the engine to the appro…
siddWednesday Aug 13, 2026
92d4a37
feat(actions): emission hardening - schema wire, SAP repair ladder, b…
siddWednesday Aug 13, 2026
01a49fa
docs(r1): tick box 12 - emission hardening is in
siddWednesday Aug 13, 2026
78d6827
feat(actions): chat mutations run through the durable engine (R1 box 13)
siddWednesday Aug 13, 2026
3cc40b6
docs(r1): tick box 13 - chat mutations are durable; app-testable on m…
siddWednesday Aug 13, 2026
e216c4f
feat(tools): assistant actions are Tools, on by default; Connectors s…
siddWednesday Aug 13, 2026
2b023f9
feat(actions): read-back verification - done means observed (R1 box 14)
siddWednesday Aug 13, 2026
e1b5f9d
docs(r1): tick box 14 - read-back verification is live
siddWednesday Aug 13, 2026
15021fc
test(e2e): the R1 golden path - a chat ask becomes a durable, verifie…
siddWednesday Aug 13, 2026
51f2b39
docs(r1): tick box 15 - golden-path evidence captured and validated
siddWednesday Aug 13, 2026
35f2320
fix(test): green the suite in core-only + Electron-hosted environment…
siddWednesday Aug 14, 2026
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
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
f459c71
feat(win/ax): Windows accessibility rail via PowerShell + UI Automation
siddWednesday Aug 24, 2026
15776a6
chore(pro): bump submodule to the eviction/license fix (420b3c6)
siddWednesday 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
617e982
feat(gateway): image routes run through the job service; opportunisti…
siddWednesday Aug 26, 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
50 changes: 46 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,6 +248,10 @@ 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: Install dependencies
run: npm ci
Expand Down Expand Up @@ -278,7 +302,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 +345,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 +371,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 +385,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 +403,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 +414,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 +434,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,6 +507,10 @@ 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: Install dependencies
run: npm ci
Expand Down
63 changes: 63 additions & 0 deletions .github/workflows/windows-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ on:
type: string
required: false
default: ''
shared_ref:
# off-grid-ai/shared carries @offgrid/models|sync|use. This core branch depends
# on shared feature work that is NOT on shared main, and the auto match below is
# by BRANCH NAME - which differs across repos here - so it would fall back to main
# and miss effectId/undo/computer_task. Pin it on dispatch (e.g. feat/use-approval-tiers).
description: 'off-grid-ai/shared ref for @offgrid/* (empty = match this branch name, else shared main)'
type: string
required: false
default: ''

permissions:
contents: read
Expand Down Expand Up @@ -75,9 +84,63 @@ jobs:
with:
python-version: '3.12'

# `@offgrid/sync` and `@offgrid/use` are file: dependencies on the shared
# monorepo, so it must sit BESIDE this checkout before `npm ci` runs -
# mirrors release.yml's build-win. The branch ref decides the shared ref:
# a build from an integration branch takes the shared branch of the same
# name when one exists, else shared main.
- name: Checkout shared at the matching ref
id: shared_branch
continue-on-error: true
uses: actions/checkout@v4
with:
repository: off-grid-ai/shared
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
ref: ${{ inputs.shared_ref || github.ref_name }}
path: _shared
persist-credentials: false
- name: Fall back to shared main
if: ${{ steps.shared_branch.outcome != 'success' }}
continue-on-error: true
uses: actions/checkout@v4
with:
repository: off-grid-ai/shared
token: ${{ secrets.CI_CROSS_REPO_TOKEN }}
path: _shared
persist-credentials: false
- name: Put shared beside this checkout
shell: bash
run: |
if [ ! -d _shared ]; then
echo "::error::off-grid-ai/shared was not checked out - @offgrid/sync and @offgrid/use cannot resolve. Check CI_CROSS_REPO_TOKEN."
exit 1
fi
rm -rf ../shared
mv _shared ../shared
npm --prefix ../shared ci
npm --prefix ../shared/packages/models run build
npm --prefix ../shared/packages/sync run build
npm --prefix ../shared/packages/use run build

- name: Install dependencies
run: npm ci

- name: Verify the computer-use input addon (nut.js) shipped for Windows
shell: pwsh
run: |
# The vision computer-use rail drives the cursor/keyboard through
# @nut-tree-fork/nut-js, whose Windows binding is the prebuilt (N-API)
# libnut-win32 addon - an OPTIONAL dependency. If npm skips it or the
# prebuild fails to land, the rail loads null and refuses every task
# silently. Fail the build loudly instead, the same way
# fetch-win-binaries.ps1 fails on a missing llama-server.exe.
$addon = "node_modules/@nut-tree-fork/libnut-win32/build/Release/libnut.node"
if (-not (Test-Path $addon)) {
Write-Error "Missing $addon - the Windows computer-use rail would refuse every task. Confirm @nut-tree-fork/libnut-win32 installed (optional dep)."
exit 1
}
Write-Host "OK: computer-use addon present ($((Get-Item $addon).Length) bytes)"

- name: Fetch Windows native binaries (llama/whisper/sd/ffmpeg)
shell: pwsh
env:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ test-results/
# Marketing material (dev.to drafts, emails, assets) — publishing, not app code
/marketing/
scripts/dictation-hotkey/dictation-hotkey
scripts/actions-helper/actions-helper

# Local demo profile — synthetic-data run target for `npm run demo` (never real userData)
.demo-profile/
Expand Down
Loading
Loading