mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 00:02:31 +00:00
* refactor(host): resolve the app root through the port in fork-reachable modules
`parcel-watcher-entry-path.ts` and `session-scanner-service-entry-path.ts` read the
app root via `require('electron').app` inside a try/catch that already returns null
when Electron is absent. They were therefore correct under plain Node at runtime and
only failed the *static* text check — which is real, not pedantic: the comment in
`ports/port-scan-command-client.ts:19` records that the plain-node-entry-guard fails
on that literal text, try/catch or not.
`hasAppEnvironment() ? getAppEnvironment() : null` gives the identical "no app root
here" answer without the text. That restores `hasAppEnvironment`, which an earlier
commit in this stack deleted as unused — it now has the caller it was waiting for.
Ratchet baseline 27 → 25.
Verified: 74 files / 458 tests; `pnpm typecheck` clean; `oxlint` clean.
* feat(orcad): boot the Orca runtime on plain Node
Closes the last two Electron couplings and makes `orcad` a working artifact:
a 4.43 MB Node bundle that boots, pairs, registers a repo, creates a real git
worktree and round-trips a PTY — with zero `require("electron")`.
Ratchet 2 -> 0, so `config/runtime-electron-baseline.txt` is now empty and its
test asserts exactly that: any reachable electron import is a regression.
- speech: inject the service factories, so importing ModelManager for its type
no longer drags Electron's streaming net.request into the graph
- filesystem-watcher: add a WorktreeWatcherRemoval port. Every entry in those
maps arrives through an ipcMain handler carrying a renderer sender, so a host
with no renderer has nothing to close, restore or forget — the inert default
is what the desktop code does against empty maps, not a stub hiding work
- user-data-path / profile-storage-paths: resolve userData through
AppEnvironment. These surfaced only once orcad pulled the store in
Both host ports now anchor to a realm-global symbol. `vi.resetModules()` gives
the re-imported graph a fresh module copy, so a binding installed before the
reset silently read back as uninstalled.
The acceptance smoke drives both hosts through one code path (`--target
orcad|electron`) and seeds its own git repo, so it is hermetic and asserts the
same contract of each. Wired into PR CI.
* test(smoke): remove the seeded workspace container, not just the worktree
* test(smoke): surface the server's stderr when it dies before ready
* fix(smoke): build node-pty for Node before booting orcad in CI
* fix(smoke): drive the CLI built from this checkout, not one on PATH
* docs(ratchet): say the baseline must stay empty, not merely shrink
* build(orcad): externalize only the native modules actually in the graph
57 lines
2.1 KiB
JavaScript
57 lines
2.1 KiB
JavaScript
import { describe, expect, it } from 'vitest'
|
|
import { readFileSync } from 'node:fs'
|
|
import {
|
|
collectElectronImporters,
|
|
diffAgainstBaseline,
|
|
readBaseline
|
|
} from './check-runtime-electron-ratchet.mjs'
|
|
|
|
describe('readBaseline', () => {
|
|
it('drops comments and blank lines and sorts, so baseline formatting cannot cause a false diff', () => {
|
|
expect(readBaseline('# header\n\n b/second.ts \na/first.ts\n')).toEqual([
|
|
'a/first.ts',
|
|
'b/second.ts'
|
|
])
|
|
})
|
|
})
|
|
|
|
describe('diffAgainstBaseline', () => {
|
|
it('reports a module that started importing electron', () => {
|
|
expect(diffAgainstBaseline(['a.ts', 'b.ts'], ['a.ts'])).toEqual({
|
|
added: ['b.ts'],
|
|
removed: []
|
|
})
|
|
})
|
|
|
|
it('reports a module that stopped, so the baseline is forced to tighten rather than drift', () => {
|
|
expect(diffAgainstBaseline(['a.ts'], ['a.ts', 'b.ts'])).toEqual({
|
|
added: [],
|
|
removed: ['b.ts']
|
|
})
|
|
})
|
|
|
|
it('is quiet when the set is unchanged', () => {
|
|
expect(diffAgainstBaseline(['a.ts'], ['a.ts'])).toEqual({ added: [], removed: [] })
|
|
})
|
|
})
|
|
|
|
describe('the checked-in baseline', () => {
|
|
// Why real: the value of this gate is the transitive edges, which a fixture cannot model.
|
|
// If this is slow enough to hurt, it is still cheaper than shipping a runtime that
|
|
// cannot boot on Node.
|
|
it('matches what the runtime actually reaches today', async () => {
|
|
const current = await collectElectronImporters()
|
|
const baseline = readBaseline(readFileSync('config/runtime-electron-baseline.txt', 'utf8'))
|
|
expect(diffAgainstBaseline(current, baseline)).toEqual({ added: [], removed: [] })
|
|
}, 120_000)
|
|
|
|
// Why an exact-empty assertion now: the reachable set reached zero, so "may only
|
|
// shrink" has no room left and any entry at all is a regression. This is strictly
|
|
// stronger than the old under-src/ check, which only stopped a node_modules path from
|
|
// padding a non-empty count.
|
|
it('stays empty, so nothing reachable from the runtime imports electron', () => {
|
|
const baseline = readBaseline(readFileSync('config/runtime-electron-baseline.txt', 'utf8'))
|
|
expect(baseline).toEqual([])
|
|
})
|
|
})
|