Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
525 commits
Select commit Hold shift + click to select a range
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
d60fd3f
show Computer Use in active models
alichherawalla Aug 26, 2026
5820a74
fix(browser): repaint live native surface
alichherawalla Aug 26, 2026
ee1f7d0
fix(browser): handle F5 as a native reload
alichherawalla Aug 26, 2026
b1c71cc
fix(tools): stop after launching a task
alichherawalla Aug 26, 2026
9020c9e
fix(web-use): use one specialist lifecycle owner
alichherawalla Aug 26, 2026
6c37d4b
test(chat): cover reasoning after message edit
alichherawalla Aug 26, 2026
6bed3df
fix(computer-use): preflight macOS permissions
alichherawalla Aug 26, 2026
4944c40
feat(computer-use): use native vision tools
alichherawalla Aug 26, 2026
338b01d
fix(computer-use): honor specialist action protocols
alichherawalla Aug 26, 2026
6c21462
fix(computer-use): own specialist lifecycle once
alichherawalla Aug 26, 2026
57c9a80
refactor(computer-use): share the vision task graph
alichherawalla Aug 26, 2026
a2b2cd3
test(computer-use): cover macOS graph journey
alichherawalla Aug 26, 2026
705a78d
fix(ui-mate): use the exact current coordinate frame
alichherawalla Aug 26, 2026
45ee0a5
fix(browser): keep live pointer visible
alichherawalla Aug 26, 2026
48e5f25
fix(tasks): show exact model screenshot
alichherawalla Aug 26, 2026
d12c55b
fix(tasks): keep pane open when expanding chat
alichherawalla Aug 26, 2026
067db5e
fix(vision): reject mismatched model frames
alichherawalla Aug 26, 2026
8c355a6
fix(tasks): restore chat beside task pane
alichherawalla Aug 26, 2026
d23242f
fix(web-use): gate completion on every milestone
alichherawalla Aug 26, 2026
0e96912
fix(web-use): generate distinct visible milestones
alichherawalla Aug 26, 2026
2be7bf4
fix(ui-mate): scope completion to active milestone
alichherawalla Aug 26, 2026
08112a4
fix(computer-use): normalize UI-Mate scroll distance
alichherawalla Aug 26, 2026
aea8ae1
fix(ui): centralize chat task pane state
alichherawalla Aug 26, 2026
c415534
fix(web-use): stabilize visual coordinate grounding
alichherawalla Aug 26, 2026
b07e83d
feat(web-use): unify browser control guidance
alichherawalla Aug 26, 2026
797a8f4
fix(ui-mate): advance focused task milestones
alichherawalla Aug 26, 2026
f1125a7
fix(ui): open dropdown menus above side panels
alichherawalla Aug 27, 2026
332e483
docs(brand): say "Off Grid AI" everywhere
alichherawalla Aug 27, 2026
2ff3524
feat(settings): let you cap what the model spends on thinking
alichherawalla Aug 27, 2026
64d98d9
refactor(chat): move the image lightbox into its own component
alichherawalla Aug 27, 2026
b88c3ca
refactor(chat): let the pane controller decide the toggle label
alichherawalla Aug 27, 2026
b46c6a6
refactor(vision): delete the superseded task runner
alichherawalla Aug 27, 2026
9751ae3
refactor(vision): one owner for the scroll step and point mapping
alichherawalla Aug 27, 2026
bdc6378
refactor(vision): drop the redundant first-load branch
alichherawalla Aug 27, 2026
16c9e9d
perf(vision): build the coordinate grid once per frame size
alichherawalla Aug 27, 2026
d07085d
refactor(vision): read permissions through the shared checks
alichherawalla Aug 27, 2026
c8677cd
perf(web-use): encode each captured frame once
alichherawalla Aug 27, 2026
9c652b2
perf(web-use): only touch the native view when something changed
alichherawalla Aug 27, 2026
f89e1e8
refactor(web-use): one table for the browser shortcuts
alichherawalla Aug 27, 2026
96dc804
refactor(tools): make "is a task" a property of the tool
alichherawalla Aug 27, 2026
d373786
docs(gaps): log the duplicated Computer Use model rule
alichherawalla Aug 27, 2026
aed1392
test(tools): assert the pro refusal is authoritative
alichherawalla Aug 27, 2026
9bf2ab5
feat(tasks): open Computer Use screenshots full size
alichherawalla Aug 27, 2026
6a24f8b
chore(pro): bump the submodule
alichherawalla Aug 27, 2026
e94d2b2
test(e2e): add the agentic studio screenshots
alichherawalla Aug 27, 2026
999725c
fix(speech): stop the audio seam pulling the app database into every …
alichherawalla Aug 27, 2026
2870c76
fix(ui): make the side panel flush to the window edge
alichherawalla Aug 27, 2026
3ba66a5
fix(settings): give the tab row room instead of slicing a tab off
alichherawalla Aug 27, 2026
40ed16e
docs(doctrine): sync the mirrored debugging doctrine
alichherawalla Aug 27, 2026
d4789a6
fix(tools): list the native actions in the Tools tab
alichherawalla Aug 27, 2026
f8f26c1
perf(embeddings): run the embedding pipeline off the main thread
alichherawalla Aug 27, 2026
e08ef1c
perf(tasks): redact step details once, on write, not on every read
alichherawalla Aug 27, 2026
85a59fa
perf(tasks): parse a step-details blob once, not once per token
alichherawalla Aug 27, 2026
68ff14e
fix(models): ring the whole search field, not the bare input
alichherawalla Aug 27, 2026
68ccd4e
perf(tasks): stop streaming display state through the durable store
alichherawalla Aug 27, 2026
18b976c
fix(tasks): resume a retry at the phase it reached, not phase 1
alichherawalla Aug 27, 2026
b24717e
test(models): derive Computer Use counts from the catalog
alichherawalla Aug 27, 2026
8771a29
fix(settings): honour the thinking cap on remote models, and nest the…
alichherawalla Aug 27, 2026
ce05218
fix(llm): clear the two lint errors in the remote chat stream
alichherawalla Aug 27, 2026
f4ccb73
refactor(llm): decompose the remote chat transport
alichherawalla Aug 27, 2026
c963af9
feat(web-use): float a running task in an always-on-top window
alichherawalla Aug 27, 2026
a7190ec
fix(vision): retry a model that reasons but calls no tool
alichherawalla Aug 27, 2026
1bf05cf
Revert "feat(web-use): float a running task in an always-on-top window"
alichherawalla Aug 27, 2026
e1e1224
fix(nav,vision): match sidebar states, drop the leave prompt, replay …
alichherawalla Aug 27, 2026
9c85617
fix(vision): Same as Chat uses the general operator, whatever the mod…
alichherawalla Aug 27, 2026
ce9707e
fix(vision): a specialist parser claims only what it can parse
alichherawalla Aug 27, 2026
9d6b827
fix(vision,browser): retry as a user turn, and one real cursor
alichherawalla Aug 27, 2026
41aa235
feat(chat): answer the chat-icon question from the current view
alichherawalla Aug 27, 2026
5cca388
fix(browser): paint the agent cursor with CSS so Trusted Types cannot…
alichherawalla Aug 27, 2026
6d5443a
feat(tasks): let the docked task surface declare that it is on screen
alichherawalla Aug 27, 2026
133a2d0
feat(browser): main decides which surface hosts the live page
alichherawalla Aug 28, 2026
0153745
fix(browser): size the viewport tolerance to the zoom, and say why a …
alichherawalla Aug 28, 2026
057932c
fix(browser): give every named key a real keycode, and hide the chat …
alichherawalla Aug 28, 2026
d4bef06
test: give jsdom a scrollIntoView
alichherawalla Aug 28, 2026
b6a8f53
feat(llm): measure what a generation cost
alichherawalla Aug 28, 2026
c0a548d
feat(vision): measure capture time and model time per step
alichherawalla Aug 28, 2026
614d50f
feat(chat): show what a generation cost under the answer
alichherawalla Aug 28, 2026
673db50
feat(chat): put generation details behind a preference, off by default
alichherawalla Aug 28, 2026
02625e4
perf(tasks): stop persisting the model prompt with every step
alichherawalla Aug 28, 2026
1c67ac8
chore: bump pro for the floating-card tests
alichherawalla Aug 28, 2026
0d73c78
fix(embeddings): keep source search on vector path
alichherawalla Aug 28, 2026
3870fd2
fix(speech): migrate legacy voices and journeys
alichherawalla Aug 28, 2026
d395736
chore(pro): advance verified release runtime
alichherawalla Aug 28, 2026
b932479
fix(transcription): retry Hindi script misses
alichherawalla Aug 28, 2026
1dbb72a
feat(voice): add tested resend action
alichherawalla Aug 28, 2026
be4977c
fix(chat): explain unavailable remote thinking
alichherawalla Aug 28, 2026
bccc881
fix(browser): harden driver identity and shortcuts
alichherawalla Aug 28, 2026
72769cb
ci: run database journeys on Node 26
alichherawalla Aug 28, 2026
a7496bc
ci: use compatible Node for SQLite journeys
alichherawalla Aug 28, 2026
167aac6
fix(computer-use): make task controls terminal
alichherawalla Aug 28, 2026
bc7da76
refactor(web-use): retire the web_task tool name
alichherawalla Aug 28, 2026
2782eef
fix(actions): keep task approval in its owner
alichherawalla Aug 28, 2026
56b0f2d
fix(computer-use): publish AX frames to supervisor
alichherawalla Aug 28, 2026
cbc952f
chore(release): integrate Computer Use supervisor fixes
alichherawalla Aug 28, 2026
674a12d
test(computer-use): prove Stop crosses the live control path
alichherawalla Aug 28, 2026
e5dfd07
test(actions): bind inline gate fixture to its chat
alichherawalla Aug 28, 2026
8d40754
fix(computer-use): bound screen capture failure
alichherawalla Aug 28, 2026
1fd58ba
chore(release): integrate final Pro journey tests
alichherawalla Aug 28, 2026
00d46b7
fix(mcp): keep remote tasks in their chat
alichherawalla Aug 28, 2026
84c8d62
refactor(tasks): share remote control runtime
alichherawalla Aug 28, 2026
fb63675
refactor(mcp): use shared task origin contract
alichherawalla Aug 28, 2026
faa0c71
chore(pro): sync chat-owned task approvals
alichherawalla Aug 28, 2026
5874a42
refactor(tasks): own live frame pointer once
alichherawalla Aug 28, 2026
6179ec5
chore(pro): reuse live frame pointer
alichherawalla Aug 28, 2026
d9c1cc1
test(tasks): prove remote live task journey
alichherawalla Aug 28, 2026
b68053a
chore(pro): sync live chat task control
alichherawalla Aug 28, 2026
cb24806
test(voice): drain speech UI journey
alichherawalla Aug 28, 2026
63a9ca6
chore(pro): await peer reconnect settlement
alichherawalla Aug 28, 2026
d1e9af3
chore(pro): assert portable live task privacy
alichherawalla Aug 28, 2026
4fe7f3a
refactor(actions): start chat tasks directly
alichherawalla Aug 28, 2026
78658e1
feat(tasks): acknowledge remote runtime controls
alichherawalla Aug 28, 2026
922eb38
feat(mcp): bind remote tasks to paired device consent
alichherawalla Aug 28, 2026
d69e3ff
chore(pro): wire remote task device controls
alichherawalla Aug 28, 2026
38f88cb
docs(tasks): record remote task gate evidence
alichherawalla Aug 28, 2026
24f1f35
fix(computer-use): remove grounder recommendation
alichherawalla Aug 28, 2026
a9fba26
feat(computer-use): make supervisor window resizable
alichherawalla Aug 28, 2026
11b3c6a
chore(pro): wire saved task playback
alichherawalla Aug 28, 2026
51e4de5
feat(tasks): materialize synced visual steps
alichherawalla Aug 28, 2026
b1623ae
chore(pro): wire fixed Computer Use live PiP
alichherawalla Aug 28, 2026
b4e597c
feat(navigation): route internal tabs
alichherawalla Aug 28, 2026
98ec30e
chore(pro): wire routed tabs
alichherawalla Aug 28, 2026
8e21fcc
chore(pro): wire immediate task sync
alichherawalla Aug 28, 2026
757e419
chore(pro): wire task playback evidence pane
alichherawalla Aug 28, 2026
8d04f3d
fix(settings): refresh open chat projections
alichherawalla Aug 28, 2026
b027bd6
fix(actions): run Chat mutations through engine
alichherawalla Aug 28, 2026
5e3040c
fix(notifications): keep approvals in Actions
alichherawalla Aug 28, 2026
6fb5eab
fix(tasks): ignore stale attention events
alichherawalla Aug 28, 2026
d43b47e
fix(chat): block resend during active replies
alichherawalla Aug 28, 2026
c19be2f
fix(computer-use): make PiP visibility reversible
alichherawalla Aug 28, 2026
c86d132
fix(connectors): run Chat mutations through engine
alichherawalla Aug 28, 2026
c6c04cd
fix(notifications): remove approval route
alichherawalla Aug 28, 2026
69c3b15
fix(chat): restore thinking and cancel transcription
alichherawalla Aug 28, 2026
0949d7d
fix(computer-use): bound repeated focus clicks
alichherawalla Aug 28, 2026
bae7fb9
chore(pro): update Computer Use PiP plan
alichherawalla Aug 28, 2026
3ae7e7d
test(voice): exercise request-scoped transcription IPC
alichherawalla Aug 29, 2026
cb68e58
fix(computer-use): exclude supervisor from capture
alichherawalla Aug 29, 2026
314aba2
fix(navigation): preserve internal tab routes
alichherawalla Aug 29, 2026
79c565d
fix(computer-use): exclude supervisor with native capture
alichherawalla Aug 29, 2026
aa71141
test(computer-use): exercise native excluded capture
alichherawalla Aug 29, 2026
60fe1ad
style(computer-use): format capture boundary
alichherawalla Aug 29, 2026
ca0a3f0
test(release): require Computer Use capture helper
alichherawalla Aug 29, 2026
d752d17
refactor(actions): keep task approval source-owned
alichherawalla Aug 29, 2026
e3a8127
fix(mcp): enforce selected Desktop task target
alichherawalla Aug 29, 2026
d715514
chore(pro): wire accurate approval presentation
alichherawalla Aug 29, 2026
d4cb077
style(mcp): format target validation journey
alichherawalla Aug 29, 2026
4b509dc
test(pro): wire settings approval migration
alichherawalla Aug 29, 2026
49a1682
fix(voice): stop cancelled resident inference
alichherawalla Aug 29, 2026
6608694
refactor(browser): remove superseded semantic runtime
alichherawalla Aug 29, 2026
e152a1f
fix(privacy): gate remote screen image sharing
alichherawalla Aug 29, 2026
fd2660f
fix(chat): preflight remote tool support
alichherawalla Aug 29, 2026
e20f258
feat(computer-use): orchestrate text plus specialist
alichherawalla Aug 29, 2026
1242001
test(computer-use): cover hybrid Electron journey
alichherawalla Aug 29, 2026
b9541b2
fix(privacy): bind screen tasks to one model session
alichherawalla Aug 29, 2026
8c6e4c2
fix(voice): recover Hindi transcription script
alichherawalla Aug 29, 2026
6cf3e1f
chore(pro): include Web Use live controls
alichherawalla Aug 29, 2026
bd79188
fix(tasks): retain authenticated launch identity
alichherawalla Aug 29, 2026
710554c
chore(pro): include bounded sync invalidation
alichherawalla Aug 29, 2026
6398a07
chore(pro): include sync heartbeat regression proof
alichherawalla Aug 29, 2026
86b72ec
chore(pro): include authenticated task launch ordering
alichherawalla Aug 29, 2026
7892680
fix(sync): expose task launch entity to Pro
alichherawalla Aug 29, 2026
4314b4a
test(computer-use): exercise macOS capture in CI
alichherawalla Aug 29, 2026
4f4612a
test(voice): complete Electron sender boundary
alichherawalla Aug 29, 2026
952a30a
test(voice): allow native UI journey time in CI
alichherawalla Aug 29, 2026
9f4400c
test(ci): stabilize voice and capture DB journeys
alichherawalla Aug 29, 2026
1622274
chore(pro): include release 107 DB fixture fixes
alichherawalla Aug 29, 2026
2bd749c
test(routes): wait for Models view transitions
alichherawalla Aug 29, 2026
d1dabf5
chore(pro): include stable ambient sharing gate
alichherawalla Aug 29, 2026
c8ab2ec
fix(ci): probe Electron SQLite across platforms
alichherawalla Aug 29, 2026
7bb5359
fix(tasks): isolate retry runtime composition
alichherawalla Aug 29, 2026
bee5173
test(tasks): boot the production task composition
alichherawalla Aug 29, 2026
87a287e
test(voice): allow native speech startup under CI load
alichherawalla Aug 29, 2026
d70b04e
fix(health): isolate idle chat status probe
alichherawalla Aug 29, 2026
8220c98
fix(sync): consume semantic invalidations
alichherawalla Aug 29, 2026
653ad6c
fix(chat): remove idle model and settings churn
alichherawalla Aug 29, 2026
0e82736
fix(sync): use semantic shared-file status
alichherawalla Aug 29, 2026
a849e9f
fix(chat): keep meeting search summaries accurate
alichherawalla Aug 29, 2026
0c98622
fix(sync): keep notification reads scoped
alichherawalla Aug 29, 2026
16a00ce
fix(health): publish model lifecycle status
alichherawalla Aug 29, 2026
c95f2a2
feat(models): link active models and settings panels
alichherawalla Aug 29, 2026
82a1c07
ui: compact remote server settings
alichherawalla Aug 29, 2026
c58e3fe
perf(computer-use): keep remote specialist resident
alichherawalla Aug 29, 2026
7663481
fix(chat): preserve task outcomes in work status
alichherawalla Aug 29, 2026
ab1aaef
fix(models): use standard panel close controls
alichherawalla Aug 29, 2026
9c82990
fix(computer-use): recover through app launcher
alichherawalla Aug 29, 2026
3ff6bfc
feat(models): offer Holo 4B for computer use
alichherawalla Aug 29, 2026
c405488
fix(tasks): return chat control immediately
alichherawalla Aug 29, 2026
4d237ed
refactor(tasks): persist shared automation vocabulary
alichherawalla Aug 29, 2026
a52569e
feat(web-use): harden Playwright boundary
alichherawalla Aug 29, 2026
1bc53bf
fix(automation): unify task lifecycle controls
alichherawalla Aug 29, 2026
c266ada
fix(computer-use): target native apps before vision
alichherawalla Aug 29, 2026
041780e
fix(computer-use): retain accessibility frames
alichherawalla Aug 29, 2026
75bb63c
fix(health): stop idle full-system polling
alichherawalla Aug 29, 2026
76210ca
fix(sync): acknowledge settled peer records
alichherawalla Aug 30, 2026
3e02a40
fix(web-use): attach browser pages to a context
alichherawalla Aug 30, 2026
da3052d
feat(navigation): keep sidebar sections consistent at both widths
alichherawalla Aug 30, 2026
7385e41
fix(web-use): harden task controls and semantic evidence
alichherawalla Aug 30, 2026
a64fc6b
feat(computer-use): complete native task execution controls
alichherawalla Aug 30, 2026
130adad
feat(models): add Release 107 remote model parity
alichherawalla Aug 30, 2026
0d6bd3f
feat(runtime): secure remote tools and proposal workflows
alichherawalla Aug 30, 2026
36ab27c
docs(release): update Release 107 gates and Pro revision
alichherawalla Aug 30, 2026
6892a54
test(release): align task control journeys
alichherawalla Aug 30, 2026
1693a40
test(e2e): dismiss optional model setup nudge
alichherawalla Aug 30, 2026
0611b09
test(models): use stable unavailable fixture
alichherawalla Aug 30, 2026
d55b1dd
test(input): cover native actuation contract
alichherawalla Aug 30, 2026
ba1a067
test(coverage): measure input adapter once
alichherawalla Aug 30, 2026
bcb86a0
fix(release): close desktop verification gates
alichherawalla Aug 30, 2026
3c9c868
fix(web-use): remove task support dependency cycle
alichherawalla Aug 30, 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
  •  
  •  
  •  
9 changes: 6 additions & 3 deletions .dependency-cruiser.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ module.exports = {
name: 'not-to-unresolvable',
comment: 'A broken/typo/moved import must fail the build, not surface at runtime.',
severity: 'error',
from: {},
from: { path: '^src/' },
to: { couldNotResolve: true }
},
{
Expand Down Expand Up @@ -71,7 +71,8 @@ module.exports = {
'the boundary. A stray core->pro import ships paid source in the public repo.',
severity: 'error',
from: {
pathNot: '(loadProFeaturesMain|loadProFeaturesRenderer|main\\.tsx|bootstrap/proStub)'
pathNot:
'(loadProFeaturesMain|loadProFeaturesRenderer|main\\.tsx|bootstrap/proStub|\\.(test|spec)\\.[tj]sx?$|/__tests__/)'
},
to: { path: 'bootstrap/proStub\\.ts$|(^|/)pro/(main|renderer)/' }
},
Expand Down Expand Up @@ -107,7 +108,9 @@ module.exports = {
}
],
options: {
doNotFollow: { path: 'node_modules' },
// Pro is a sibling checkout in CI. Inspect the core -> Pro edge, but do not
// traverse the private graph and apply open-core rules inside Pro itself.
doNotFollow: { path: 'node_modules|^pro/' },
tsConfig: { fileName: 'tsconfig.web.json' },
exclude: { path: 'node_modules|e2e/' },
tsPreCompilationDeps: true,
Expand Down
82 changes: 74 additions & 8 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 All @@ -63,7 +70,10 @@ jobs:
fi
- uses: actions/setup-node@v4
with:
node-version: '24' # node:sqlite (used by integration tests) is available unflagged
# Node 22 supports node:sqlite and both native SQLite dependencies. Node
# 24 aborts while Vitest unloads the cipher module; Node 26 cannot build
# better-sqlite3 12.6.
node-version: '22'
# Shared packages are file: dependencies on the SIBLING shared monorepo. CI must provision it before
# installing Desktop. actions/checkout refuses a path outside the workspace, so it lands inside and is
# moved up one level - exactly where the file: specifiers point.
Expand Down Expand Up @@ -107,6 +117,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 +150,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 +193,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 +278,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
90 changes: 86 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 @@ -149,6 +158,12 @@ jobs:
chmod +x resources/bin/meeting-recorder
file resources/bin/meeting-recorder
otool -l resources/bin/meeting-recorder | awk '/LC_BUILD_VERSION/{f=1} f&&/minos/{print "[ci] meeting-recorder minos="$2; exit}'
- name: Build Computer Use capture helper (exclude supervisor window)
run: |
MACOS_DEPLOYMENT_TARGET=13.0 bash scripts/build-computer-use-capture.sh resources/bin
chmod +x resources/bin/computer-use-capture
file resources/bin/computer-use-capture
otool -l resources/bin/computer-use-capture | awk '/LC_BUILD_VERSION/{f=1} f&&/minos/{print "[ci] computer-use-capture minos="$2; exit}'
# Compile the dictation push-to-talk helper (CGEventTap) and stage it into
# resources/bin so extraResources bundles it at Contents/Resources/bin — the
# path PushToTalkHotkey resolves. Self-contained: no committed binary, built
Expand All @@ -160,6 +175,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 +254,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 +314,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 +325,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 +368,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 +394,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 +408,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 +426,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 +437,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 +457,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 +530,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