Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
209 commits
Select commit Hold shift + click to select a range
cfdcddd
interim
alichherawalla Sep 11, 2026
17c4f86
Start hands-free capture when Ares wakes
alichherawalla Sep 11, 2026
19bd889
Merge remote-tracking branch 'origin/main' into feature/god-twin-curr…
alichherawalla Sep 25, 2026
f818b70
fix(god-twin): tolerate partial renderer bridges
alichherawalla Sep 25, 2026
78f5319
feat: support direct provider authentication and identity hooks
alichherawalla Oct 1, 2026
3b38993
feat: add branded connection setup to onboarding and integrations
alichherawalla Oct 1, 2026
93ef76f
docs: align brand guidance and record integration research
alichherawalla Oct 1, 2026
9957a22
chore: pin provider integration submodule and include review evidence
alichherawalla Oct 1, 2026
889a3d6
Merge remote-tracking branch 'origin/main' into feat/direct-account-c…
claude Oct 6, 2026
06875c3
Merge remote-tracking branch 'origin/feature/god-twin-current-main' i…
claude Oct 6, 2026
b13ffa5
feat(god-twin): check short clips for the wake word on this machine
claude Oct 6, 2026
416cea1
feat(god-twin): God Twin replaces Assistant: talk to Ares, wake it wi…
claude Oct 6, 2026
75b82ca
fix(accounts): let Pro revoke a provider sign-in before a connector i…
claude Oct 6, 2026
3d3c331
fix(accounts): say an account is read live instead of offering to syn…
claude Oct 6, 2026
9c388b6
fix(accounts): onboarding says accounts are read live, and Reconnect …
claude Oct 6, 2026
aa8f2e1
feat(accounts): a paired browser sees each account's access, and cann…
claude Oct 6, 2026
13812b8
feat(god-twin): God Twin is the assistant: one name, and it acts as w…
claude Oct 6, 2026
2df1ee7
fix: keep Connect your work up when the connector list is missing; al…
claude Oct 6, 2026
437474a
feat(god): call it God, not God Twin
claude Oct 6, 2026
47395b1
feat(god): God is a chat with Ares that knows your day and speaks up
claude Oct 6, 2026
48171d0
feat(god): the wake word is Ares, the companion's name
claude Oct 6, 2026
f15fb10
fix(llm): wait for a model load while the engine is working, not a fi…
claude Oct 6, 2026
e44e2d5
docs: save Microsoft registration evidence locally
alichherawalla Oct 1, 2026
0d83654
docs: save Codex work log audit
alichherawalla Oct 6, 2026
75a4b37
fix(god): Ares's Talk button stops listening too, and its controls ar…
claude Oct 6, 2026
a789c83
ui: replace God robot icon with Ares helmet
alichherawalla Oct 6, 2026
cce8323
feat(god): God knows Off Grid AI's features and what is new
claude Oct 6, 2026
6c63375
feat(god): God is Pro, and chat mode does not listen
claude Oct 6, 2026
63dc2f1
Merge remote-tracking branch 'origin/feat/direct-account-connections'…
claude Oct 6, 2026
dc21ff8
build: every build can find the Google and Microsoft app registrations
claude Oct 6, 2026
6e6d0de
fix(bridge): sealed frames to the browser stay in sequence; pin Pro r…
claude Oct 6, 2026
b02a1f9
fix(god): answer plain questions instead of starting a web task
alichherawalla Oct 6, 2026
9a0d9d9
feat(connectors): edit a connector and confirm before removing it
alichherawalla Oct 6, 2026
7bc153c
test(god): the shell test expects God to be Pro in a free build
alichherawalla Oct 6, 2026
01db4b7
test(accounts): add, change and remove every account kind in the real…
alichherawalla Oct 6, 2026
ea971d8
fix(tools): "emails" finds the email tools in every connected account
alichherawalla Oct 6, 2026
7f83048
feat(god): conversations know whether they belong to Chat or God
alichherawalla Oct 6, 2026
5bbdb99
feat(god): God is Chat, set up to do everything, with Ares's controls…
alichherawalla Oct 6, 2026
720bce7
test(app): render App inside TooltipProvider, as main.tsx does
alichherawalla Oct 6, 2026
0b75fad
fix(god): God's empty chat asks for a question; no model or gallery b…
alichherawalla Oct 6, 2026
cf2052b
test(accounts): wait for a cold first launch before opening Integrations
alichherawalla Oct 6, 2026
80401a7
build(pro): pin Pro's revoke-failure notice
alichherawalla Oct 6, 2026
079e869
docs(audit): answer every row of the work log audit
alichherawalla Oct 6, 2026
10f3a2d
test: give jsdom's storage back where Node 26 shadows it
alichherawalla Oct 6, 2026
dabb0cd
docs: screenshots for the PR (synthetic profile): God, accounts, Obsi…
alichherawalla Oct 6, 2026
b95fce3
fix(gateway): forward remote reasoning exactly as Chat does
alichherawalla Oct 6, 2026
3f3cdd4
feat(god): a dot on God when it has something new for you
alichherawalla Oct 6, 2026
f5629c0
feat(god): God reacts with an emoji when a message only needs acknowl…
alichherawalla Oct 6, 2026
683dc4d
feat(god): scheduled tasks God runs on its own (routines)
alichherawalla Oct 6, 2026
26b7b30
fix(god): room at the ends of Ares's control bar; type the routine ga…
alichherawalla Oct 6, 2026
6d114e2
fix(god): Ares on the desktop steps aside while the God screen is in …
alichherawalla Oct 6, 2026
650a496
feat(god): see and manage scheduled tasks in God settings
alichherawalla Oct 6, 2026
3766c4b
feat(god): routines that react to what happens, and an Add form
alichherawalla Oct 6, 2026
cf07a01
build(pro): pin the hooks God's routines react to
alichherawalla Oct 6, 2026
3685813
fix(god): a request put as a question still gets Web Use
alichherawalla Oct 6, 2026
8c8695c
Revert "fix(god): a request put as a question still gets Web Use"
alichherawalla Oct 6, 2026
60c4ce5
fix(god): always offer the acting tools in assistant mode and let the…
alichherawalla Oct 6, 2026
5389631
fix(bridge): a paired browser gets the same tools this chat has on, b…
alichherawalla Oct 6, 2026
971ee8a
feat(gateway): list every active model, so a client sees the decider …
alichherawalla Oct 6, 2026
3c176f6
fix(god): a routine never runs an unapproved change, and its runs nev…
alichherawalla Oct 6, 2026
bd76a5f
fix(god): a routine's held action says it waits for approval, not tha…
alichherawalla Oct 6, 2026
756bd6a
fix(bridge): a tool the desktop lists also runs, connector tools on a…
alichherawalla Oct 6, 2026
6c70ac3
chore(pro): updating a Google account keeps its new sign-in
alichherawalla Oct 6, 2026
f207309
fix(connectors): a new command does not inherit the old command's sec…
alichherawalla Oct 6, 2026
9eb2369
fix(connectors): the first test saves the tools for the services gran…
alichherawalla Oct 6, 2026
747c757
fix(web-use): a web task a browser offers its tab for starts in that …
alichherawalla Oct 6, 2026
a87979f
fix(bridge): match the extension's bridge: a web task starts in the c…
alichherawalla Oct 6, 2026
3f08627
chore(pro): a failed mail read is never taken for an empty inbox
alichherawalla Oct 6, 2026
f037937
feat(god): a ding when Ares hears its name, so you know it is listening
alichherawalla Oct 6, 2026
fba7801
feat(god): Ares talks hands-free in voice mode
alichherawalla Oct 6, 2026
066771c
fix(god): a wake always carries its source; drop the dead check
alichherawalla Oct 6, 2026
1bd9c1a
feat(god): one Ares in both places: the same pose, spin, motion and s…
alichherawalla Oct 6, 2026
7dc46c4
fix(bridge): a chat follows its own task by id, and a tool turned off…
alichherawalla Oct 6, 2026
f14b9c9
fix(connectors): Change token gives an edited local connector its tok…
alichherawalla Oct 6, 2026
1f2b70b
fix(bridge): browser chats keep syncing past the browser's 40-turn wi…
alichherawalla Oct 6, 2026
aae5a64
fix(web-use): a chat's offered tab wins over the Web Use browser setting
alichherawalla Oct 6, 2026
9711622
chore(pro): the next meeting comes from connected calendars too
alichherawalla Oct 6, 2026
5ae4c2f
feat(god): train and run the wake-word model on this machine with onn…
alichherawalla Oct 6, 2026
9a126b8
feat(god): a trained wake word listens all the time; the transcriber …
alichherawalla Oct 6, 2026
aa9f243
fix(god): listening for its name works in Chat mode too, not only Voice
alichherawalla Oct 6, 2026
f3040c1
fix(god): clicks pass through Ares on the desktop; only his controls …
alichherawalla Oct 6, 2026
0b38334
fix(settings): Web Use and Computer Use settings tell every window wh…
alichherawalla Oct 6, 2026
aaa6595
fix(chat): a turn that ends with no answer is asked once more, then s…
alichherawalla Oct 6, 2026
aaf3e38
feat(god): pick Manual, Auto or Hands-free right in God's voice box
alichherawalla Oct 6, 2026
02d1483
fix(models): a remote chat model never leaves a local one loaded, at …
alichherawalla Oct 6, 2026
a08ff1a
feat(privacy): work can run without the AI request log keeping any of it
alichherawalla Oct 6, 2026
99b9f9a
test: the bridge journey mocks the embeddings package the app loads; …
alichherawalla Oct 6, 2026
f4787c4
feat(god): God moves to Pro; core keeps only the seams
alichherawalla Oct 6, 2026
c620235
fix(tasks): a web task stopped while it waits never starts
alichherawalla Oct 6, 2026
fca6fb6
fix(tasks): a Continue never inherits a Stop meant for an earlier run
alichherawalla Oct 6, 2026
b29c68a
build(pro): God answers a wake from another screen; teaching closes i…
alichherawalla Oct 6, 2026
f9e5be0
fix(tasks): Retry runs a web task in the browser Tasks > Web Use chooses
alichherawalla Oct 7, 2026
af8642b
feat(tasks): a web task that falls back to the Off Grid AI browser sa…
alichherawalla Oct 7, 2026
7cb7e74
build(pro): Web Use browser choice shows pairing and connection
alichherawalla Oct 7, 2026
bec4b85
fix(models): Models screens mark task models active by their Tasks ro…
alichherawalla Oct 7, 2026
76836e2
fix(voice): one turn mode for Chat and God, picked in the voice box, …
alichherawalla Oct 7, 2026
868239a
feat(god): a reaction on a message just sent comes after a natural pause
alichherawalla Oct 7, 2026
7b248f3
build(pro): God's voice and reaction tests follow the shared turn mode
alichherawalla Oct 7, 2026
629d84c
fix(settings): the grounding and decider backends live in Tasks, besi…
alichherawalla Oct 7, 2026
a0601d4
chore(settings): keep the slot's lint exception beside it
alichherawalla Oct 7, 2026
5d973c5
feat(chat): a ding when a reply arrives, in Chat and God, from one se…
alichherawalla Oct 7, 2026
2f34e8a
build(pro): God's reply sound uses the shared setting and chime
alichherawalla Oct 7, 2026
955e612
refactor(models): one place sets or clears a task model role, and eve…
alichherawalla Oct 7, 2026
a2ffc4d
feat(models): one task roles view for every Models screen, over IPC a…
alichherawalla Oct 7, 2026
f8a1310
feat(models): the Tasks tab shows the models working together, and ea…
alichherawalla Oct 7, 2026
beddf69
feat(settings): a collapsible settings section, with a summary line a…
alichherawalla Oct 7, 2026
18053c6
feat(settings): Image, Voice and Remote tabs open in collapsible sect…
alichherawalla Oct 7, 2026
df8eb24
feat(settings): Text, Transcription, Tools and Tasks open a section a…
alichherawalla Oct 7, 2026
8b607e0
build(pro): Tasks and God settings in sections
alichherawalla Oct 7, 2026
2831df1
build(pro): AI inference runtimes inventory
alichherawalla Oct 7, 2026
a1d7d9b
fix(guide): decode article titles once, and keep only links on the si…
alichherawalla Oct 7, 2026
c98a059
fix(models): a remote decision model carries the Decision tag, so no …
alichherawalla Oct 7, 2026
bc5cf59
fix(models): Use on a decision model sets it for both Web Use and Com…
alichherawalla Oct 7, 2026
fc0f7ca
fix(models): lineups show only task models; the reasoner is the Text …
alichherawalla Oct 7, 2026
8640c61
feat(models): the Tasks tab lists grounding specialists and decision …
alichherawalla Oct 7, 2026
cb904c3
build(pro): Tasks lists on-device models only
alichherawalla Oct 7, 2026
61394ca
build: core no longer needs the private UI package; it is an optional…
alichherawalla Oct 7, 2026
94265f0
build(pro): Pro owns the private UI package's styles
alichherawalla Oct 7, 2026
6f7f160
feat(settings): connectors grouped by service, each group a section s…
alichherawalla Oct 7, 2026
d784544
ci: let npm read the private UI package for Pro, with OPERATOR_UI_TOK…
alichherawalla Oct 7, 2026
a50d66c
feat: admit LAN and Tailscale peers to the extension bridge
alichherawalla Oct 7, 2026
d22304e
ci: say plainly when the private UI package cannot be read, instead o…
alichherawalla Oct 7, 2026
ac4fcb9
ci: trim the UI token secret, and say which way GitHub refused it
alichherawalla Oct 7, 2026
46ffcb2
ci: the checkout's saved GitHub login no longer overrides the UI pack…
alichherawalla Oct 7, 2026
1f219ca
fix(tasks): each browser task has its own id and its own tab from the…
alichherawalla Oct 7, 2026
90e5486
fix(boundary): core loads Pro's account cards through the Pro loader,…
alichherawalla Oct 7, 2026
7f7f3db
test: the voice journey chooses Manual turns, the remote journey open…
alichherawalla Oct 7, 2026
87bce52
test: the OAuth-cancel journey keeps the real slot registry and overr…
alichherawalla Oct 7, 2026
def8a5d
fix(security): task model roles change only from this machine or a pa…
alichherawalla Oct 7, 2026
f4c3f36
fix(voice): a voice turn keeps the chat it was recorded in and is nev…
alichherawalla Oct 7, 2026
85ad290
build(pro): a queued routine checks again when the model queue admits…
alichherawalla Oct 7, 2026
e125ac9
build(pro): tests for Microsoft and Google accounts, Obsidian vaults,…
alichherawalla Oct 7, 2026
8137eb3
fix(tasks): Continue runs inside the same privacy gate and model sett…
alichherawalla Oct 7, 2026
6ff5ace
build(pro): Use your own application shows the setup steps for Google…
alichherawalla Oct 7, 2026
28ef947
fix(bridge): a browser rename updates the desktop title, and an edit …
alichherawalla Oct 7, 2026
e55ddbe
fix(browser): adopting the offered tab names the task, so a task that…
alichherawalla Oct 7, 2026
8d650bb
fix(sync): moving a conversation to God tells paired devices, and Pro…
alichherawalla Oct 7, 2026
5733ad8
refactor(models): role requests are checked in their own module, so t…
alichherawalla Oct 7, 2026
8c6668e
test: the task history composition gives Electron a userData path, no…
alichherawalla Oct 7, 2026
2183381
feat(guide): the Off Grid AI guide reads the quick start, guides, art…
alichherawalla Oct 7, 2026
7808bb5
build(pro): the God's character and equipment are saved with its look
alichherawalla Oct 7, 2026
1477f79
build(pro): God characters and equipment are wired in: avatar, settin…
alichherawalla Oct 7, 2026
4f50f0b
feat(guide): the Off Grid AI guide reads the pages that answer a ques…
alichherawalla Oct 7, 2026
ef9d161
build(pro): the God code is free of lint warnings: scene, wake captur…
alichherawalla Oct 7, 2026
b6cbd72
build(pro): Ares ships as a character with helmet, shield, spear and …
alichherawalla Oct 7, 2026
e263665
build(pro): gods download from R2 on first use: Choose your god, publ…
alichherawalla Oct 7, 2026
8131125
build(pro): no god downloaded means no empty slot in God mode and no …
alichherawalla Oct 7, 2026
025db19
build(pro): Choose your god with portraits, who each god is, and prog…
alichherawalla Oct 7, 2026
92fe6a7
build(pro): gods download from R2 at runtime.getoffgridai.co
alichherawalla Oct 7, 2026
e6dd6bb
feat(chat): an assistant can show its own welcome in an empty convers…
alichherawalla Oct 7, 2026
a64c168
feat(ui): scroll bars are thin and appear only while their area is sc…
alichherawalla Oct 7, 2026
163e079
build(pro): update pro
alichherawalla Oct 7, 2026
ff6b592
build(pro): update pro
alichherawalla Oct 7, 2026
abe5f71
build(pro): update pro
alichherawalla Oct 7, 2026
0311fad
build(pro): update pro
alichherawalla Oct 7, 2026
08dd2c5
build(pro): update pro
alichherawalla Oct 7, 2026
232b609
build(pro): update pro
alichherawalla Oct 7, 2026
56ebb08
build(pro): update pro
alichherawalla Oct 7, 2026
99eeef2
build(pro): update pro
alichherawalla Oct 7, 2026
211254c
build(pro): update pro
alichherawalla Oct 7, 2026
6c2c803
test: keep pro's Playwright journeys out of unit-test coverage
alichherawalla Oct 7, 2026
c3353e5
build(pro): update pro
alichherawalla Oct 7, 2026
fccc441
build(pro): update pro
alichherawalla Oct 7, 2026
c1ba26b
build(pro): update pro
alichherawalla Oct 7, 2026
4e55848
build(pro): update pro
alichherawalla Oct 7, 2026
ca51df8
build(pro): update pro
alichherawalla Oct 7, 2026
af4ce0d
build(pro): update pro
alichherawalla Oct 7, 2026
f6b110e
build(pro): update pro
alichherawalla Oct 7, 2026
ce42da5
build(pro): update pro
alichherawalla Oct 7, 2026
4a77132
build(pro): update pro
alichherawalla Oct 7, 2026
821aed9
fix(god): update Pro pointer for corrected motion assets
alichherawalla Oct 7, 2026
dad90e0
fix(god): update Pro pointer for Athena shield clearance
alichherawalla Oct 7, 2026
1e3339c
build(pro): update pro
alichherawalla Oct 7, 2026
d6fb441
build(pro): update pro
alichherawalla Oct 7, 2026
e2f5864
build(pro): update pro
alichherawalla Oct 7, 2026
1e244d4
Match Pro pricing copy to getoffgridai.co: $69 once or $4.99/month
alichherawalla Oct 8, 2026
495603f
State the next price tier: $119 once or $7.99/month
alichherawalla Oct 8, 2026
8c6eef9
build(pro): update pro
alichherawalla Oct 8, 2026
0deafa0
build(pro): update pro
alichherawalla Oct 8, 2026
fe1ebe8
build(pro): update pro
alichherawalla Oct 8, 2026
807cc85
fix(extension-bridge): open browser frames in arrival order, so a rep…
alichherawalla Oct 8, 2026
e6dbbb9
fix(chat): settle the assistant when the chat closes mid-rest, instea…
alichherawalla Oct 8, 2026
4ea0e59
build(pro): update pro
alichherawalla Oct 8, 2026
f4bcb6f
test(chat): closing the chat while the assistant rests settles it at …
alichherawalla Oct 8, 2026
d93f0c1
build(pro): update pro
alichherawalla Oct 8, 2026
0ffd38a
build(pro): update pro
alichherawalla Oct 8, 2026
20e2506
build(pro): update pro
alichherawalla Oct 8, 2026
d9eb266
Merge remote-tracking branch 'origin/fix/pricing-match-website' into …
alichherawalla Oct 8, 2026
ec9bc62
fix(desktop): website-capture fixes for task titles, chat rendering, …
alichherawalla Oct 8, 2026
f08b2a7
chore(demo): seed the Acme pilot scenes for website capture
alichherawalla Oct 8, 2026
eab2b0a
fix(remote-chat): let a thinking Qwen model on OpenRouter choose its …
alichherawalla Oct 8, 2026
6761bff
docs: add the 2026-10-06 agent landscape
alichherawalla Oct 8, 2026
5ca692a
fix(release): clear lint and guide parsing blockers and pin recovery …
alichherawalla Oct 8, 2026
f315a6e
fix(gateway): cancel owned image requests and detach browser tabs bef…
alichherawalla Oct 8, 2026
cc7200f
fix(release): patch compatible vulnerable desktop dependencies
alichherawalla Oct 8, 2026
e7f3e03
fix(release): patch vulnerable desktop development tools
alichherawalla Oct 8, 2026
9ab7b05
Update Pro for God toolbar settings and monitor positioning
alichherawalla Oct 9, 2026
cb564b8
Update Pro to fix eviction of unpaired licensed devices
alichherawalla Oct 9, 2026
71f276c
Update Pro to keep Sync logs panel development-only
alichherawalla Oct 9, 2026
3f2eeea
Update chat engines and support compatible MTP companion decoding
alichherawalla Oct 9, 2026
8a5a408
Update Pro to give the Gods captured armed motion, a battlecry and an…
alichherawalla Oct 10, 2026
6bcd9dc
Update Pro to rotate the Gods through seven captured unarmed attacks
alichherawalla Oct 10, 2026
31ebe8a
Update Pro to add a Taunt control and stop the God's control bar bein…
alichherawalla Oct 10, 2026
ee30ea3
Add MTP model selection and saved draft token limits
alichherawalla Oct 10, 2026
ee555ee
Update Pro to make the Taunt control alternate a chest thump and a ba…
alichherawalla Oct 10, 2026
902d5da
Update Pro to taunt with a chest thump then a battlecry, and frame th…
alichherawalla Oct 10, 2026
779b46d
Fix active text selection and Grounder CI; use shorter MTP drafts
alichherawalla Oct 10, 2026
2c47b01
Update Pro to close Athena's hand round her spear and put her nails b…
alichherawalla Oct 10, 2026
e6ee17a
Update Pro to let the free hand swing when the God carries a weapon w…
alichherawalla Oct 10, 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
  •  
  •  
  •  
46 changes: 46 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,29 @@ jobs:
# 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: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Put the speech runtime beside this checkout
if: ${{ !cancelled() }}
run: |
Expand Down Expand Up @@ -432,6 +455,29 @@ jobs:
if: runner.os == 'Windows'
with:
python-version: '3.12'
- name: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Install workspace dependencies
run: |
mv _shared ../shared
Expand Down
89 changes: 89 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,29 @@ jobs:
fi
rm -rf ../executorch-speech
mv _executorch_speech ../executorch-speech
- name: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Install dependencies
run: npm ci
# Stamp the resolved version into package.json so electron-builder picks the
Expand All @@ -302,6 +325,13 @@ jobs:
- name: Stamp build version
run: npm version "${{ needs.version.outputs.version }}" --no-git-tag-version --allow-same-version
- name: Stage native files and bundle
env:
# Connect with Off Grid AI (scripts/oauth-build-config.mjs). The build fails without them.
OFFGRID_REQUIRE_OAUTH: '1'
GOOGLE_OAUTH_CLIENT_TYPE: desktop
GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
MICROSOFT_CLIENT_ID: ${{ vars.MICROSOFT_CLIENT_ID }}
run: node scripts/stage-native.mjs && npx electron-vite build
# The version job has already created this build's draft tag. Exclude it
# when finding the previous release for the changelog.
Expand Down Expand Up @@ -587,6 +617,29 @@ jobs:
fi
rm -rf ../executorch-speech
mv _executorch_speech ../executorch-speech
- name: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Install dependencies
run: npm ci
- name: Fetch Windows native binaries (llama/whisper/sd/ffmpeg)
Expand All @@ -598,6 +651,13 @@ jobs:
- name: Stamp build version
run: npm version "${{ needs.version.outputs.version }}" --no-git-tag-version --allow-same-version
- name: Stage native files and bundle
env:
# Connect with Off Grid AI (scripts/oauth-build-config.mjs). The build fails without them.
OFFGRID_REQUIRE_OAUTH: '1'
GOOGLE_OAUTH_CLIENT_TYPE: desktop
GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
MICROSOFT_CLIENT_ID: ${{ vars.MICROSOFT_CLIENT_ID }}
run: node scripts/stage-native.mjs && npx electron-vite build && node scripts/check-windows-onnx-preload.mjs
- name: Package Windows web installer, payload, and update metadata
shell: bash
Expand Down Expand Up @@ -789,6 +849,29 @@ jobs:
install -Dm644 resources/bin/kev-local-server.py build/linux-bin/kev-local-server.py
install -Dm755 build/linux-bin/executorch-speech \
../executorch-speech/native/bin/executorch-speech
- name: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Install dependencies
run: npm ci
- name: Install Linux GPU runtime dependencies
Expand All @@ -809,6 +892,12 @@ jobs:
- name: Build Linux packages
env:
OFFGRID_FORCE_CORE: '0'
# Connect with Off Grid AI (scripts/oauth-build-config.mjs). The build fails without them.
OFFGRID_REQUIRE_OAUTH: '1'
GOOGLE_OAUTH_CLIENT_TYPE: desktop
GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
MICROSOFT_CLIENT_ID: ${{ vars.MICROSOFT_CLIENT_ID }}
run: npm run build:linux:pinned
- name: Report Linux native payload sizes
run: du -sh dist/linux-unpacked/resources/bin/* | sort -h | tail -25
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/windows-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,29 @@ jobs:
npm --prefix ../shared/packages/speech run build
npm --prefix ../shared/packages/ui run build

- name: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Install dependencies
run: npm ci

Expand Down Expand Up @@ -324,6 +347,29 @@ jobs:
rm -rf ../executorch-speech
mv _executorch_speech ../executorch-speech

- name: Let npm read the private UI package (Pro)
# @offgrid/operator-ui is a private Wednesday package that only Pro uses. Core lists it as an
# optional dependency, so without access npm skips it and core still installs; Pro needs it.
shell: bash
env:
UI_TOKEN: ${{ secrets.OPERATOR_UI_TOKEN || secrets.CI_CROSS_REPO_TOKEN }}
run: |
# A pasted secret can carry a newline or spaces, which break token authentication.
UI_TOKEN="$(printf '%s' "$UI_TOKEN" | tr -d '[:space:]')"
if [ -n "$UI_TOKEN" ]; then
git config --global url."https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/".insteadOf "ssh://git@github.com/wednesday-solutions/"
# actions/checkout saves this repo's own GitHub login as a header for all of github.com,
# and it overrides the token above. Clear it for wednesday-solutions only (the most specific
# address wins), so everything else keeps the checkout login.
if git rev-parse --git-dir >/dev/null 2>&1; then
git config --local http.https://github.com/wednesday-solutions/.extraheader ""
fi
fi
# npm skips an optional package it cannot read without saying so: say it here, plainly.
if ! git ls-remote --exit-code "https://x-access-token:${UI_TOKEN}@github.com/wednesday-solutions/component-library-animations.git" HEAD >/dev/null 2>&1; then
status="$(curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer ${UI_TOKEN}" https://api.github.com/repos/wednesday-solutions/component-library-animations)"
echo "::error::CI cannot read wednesday-solutions/component-library-animations (GitHub answered ${status}: 401 bad token, 403 org policy or IP allow list, 404 no access to the repo). Pro will not build without it."
fi
- name: Install dependencies
run: npm ci

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ resources/bin/location.node
# Local env (telemetry/keys) — never commit
.env
.env.local
.env.*.local
# App registration credentials (scripts/oauth-build-config.mjs)
.env.keygen
test-results/
outputs/video-verification/

Expand Down
Loading
Loading