Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
9a1bb31
Add Orca architecture tab Scryer integration
Nikolatesla-lj May 10, 2026
8dd2edf
Add orca-scryer upstream sync automation
Nikolatesla-lj May 10, 2026
0175024
Migrate Scryer ReactFlow canvas
Nikolatesla-lj May 10, 2026
c7fa239
Update Orca AppImage launcher install
Nikolatesla-lj May 10, 2026
8db3809
Preserve Orca AppDir symlink install
Nikolatesla-lj May 10, 2026
91a8932
Complete Scryer architecture interaction migration
Nikolatesla-lj May 11, 2026
6403dfd
Preserve Orca AppDir CLI launcher install
Nikolatesla-lj May 11, 2026
1f11a0e
Align Scryer architecture workflows
Nikolatesla-lj May 11, 2026
48949ed
Stabilize architecture model sessions
Nikolatesla-lj May 17, 2026
c3807a7
Stabilize architecture migration test flows
Nikolatesla-lj May 17, 2026
a1a5101
Stabilize architecture e2e isolation
Nikolatesla-lj May 17, 2026
2701654
Stabilize architecture responsive e2e layout
Nikolatesla-lj May 17, 2026
fbcee62
Stabilize architecture integration after upstream merge
Nikolatesla-lj May 20, 2026
efc3581
Harden native runtime preflight
Nikolatesla-lj May 20, 2026
2417edd
Fix architecture lint after upstream sync
Nikolatesla-lj May 20, 2026
187465b
Fix Linux AppDir launchers for orca-ide
Nikolatesla-lj May 20, 2026
4667f07
Refresh AppImage desktop metadata on install
Nikolatesla-lj May 20, 2026
aeccef2
chore: format scryer sync branch
Nikolatesla-lj May 22, 2026
33677e5
release: v0.0.1-rc.13 [rc-slot:2026-06-03-15]
github-actions[bot] Jun 3, 2026
179c3a1
Merge remote-tracking branch 'origin/main' into fork-main-pipeline-in…
Nikolatesla-lj Jun 5, 2026
a8f87f6
feat(pipeline): add PRD-scoped automation pipeline
Nikolatesla-lj Jun 5, 2026
5eac27e
Merge fork main pipeline work into orca-scryer
Nikolatesla-lj Jun 5, 2026
e92c536
Merge upstream main into fork main
Nikolatesla-lj Jun 5, 2026
c424a6b
Merge updated fork main into orca-scryer
Nikolatesla-lj Jun 5, 2026
a8ab727
release: v1.4.49-rc.0 [rc-slot:2026-06-05-15]
github-actions[bot] Jun 5, 2026
30530fc
release: v0.0.1-rc.14 [rc-slot:2026-06-06-03]
github-actions[bot] Jun 6, 2026
fce74c1
Merge upstream main into fork main
Nikolatesla-lj Jun 22, 2026
702a749
Merge updated fork main into orca-scryer
Nikolatesla-lj Jun 22, 2026
28631fc
Restore automations pipeline tab
Nikolatesla-lj Jun 22, 2026
56f950f
Implement native Scryer engine first slice
Nikolatesla-lj Jun 23, 2026
3a4c252
Restore test baseline and update Scryer PRD status
Nikolatesla-lj Jun 23, 2026
654e528
Implement Scryer engine catalog foundation
Nikolatesla-lj Jun 25, 2026
55c3ef3
Split workspace session browser helpers
Nikolatesla-lj Jun 25, 2026
9c2dc6c
Restore Node native rebuild script alias
Nikolatesla-lj Jun 25, 2026
7e52211
Keep Scryer engine available for CLI builds
Nikolatesla-lj Jun 25, 2026
dc1c488
docs: add scryer operation migration slices
Nikolatesla-lj Jun 25, 2026
59b4faa
Hard cut over Architecture renderer to Scryer view model
Nikolatesla-lj Jun 27, 2026
a86476f
Expand Architecture live UI coverage
Nikolatesla-lj Jun 27, 2026
0581889
Update Scryer migration status docs
Nikolatesla-lj Jun 27, 2026
7288460
Fix Architecture IPC test mock typing
Nikolatesla-lj Jun 27, 2026
98cf51a
Reject legacy C4 raw writes on default Architecture model
Nikolatesla-lj Jun 27, 2026
5b4d0ca
#28 hard cut over Architecture view to Scryer engine
Nikolatesla-lj Jun 27, 2026
124a905
#29 expand live Architecture UI coverage
Nikolatesla-lj Jun 27, 2026
fcc5a31
Merge remote-tracking branch 'origin/main' into HEAD
Nikolatesla-lj Jun 27, 2026
c6e64d6
Fix zoom target merge resolution
Nikolatesla-lj Jun 27, 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
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,9 @@ jobs:
with:
run_install: false

- name: Verify Node.js version
run: pnpm run preflight:node

# Why: this job runs the same pnpm install path as pr.yml's verify
# job, so it needs the same pinned node-gyp override to avoid pnpm's
# broken bundled gyp_main.py on Linux. Gate on runner.os matches
Expand All @@ -145,6 +148,9 @@ jobs:
- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Rebuild native modules for Node
run: pnpm run rebuild:native:node

- name: Download E2E build output
uses: actions/download-artifact@v8
with:
Expand Down
8 changes: 6 additions & 2 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: PR Checks

on:
workflow_dispatch:
pull_request:
types:
- opened
Expand Down Expand Up @@ -29,6 +30,9 @@ jobs:
with:
run_install: false

- name: Verify Node.js version
run: pnpm run preflight:node

# Why: pnpm's bundled node-gyp ships gyp_main.py without execute
# permission, which breaks native module builds (e.g. node-pty's
# postinstall) with "/bin/sh: gyp_main.py: Permission denied".
Expand Down Expand Up @@ -83,8 +87,8 @@ jobs:
# Why: postinstall rebuilds better-sqlite3 for Electron's ABI via
# @electron/rebuild, but vitest runs under system Node.js. Rebuild
# it for Node so orchestration tests can load the native module.
- name: Rebuild better-sqlite3 for Node
run: pnpm rebuild better-sqlite3
- name: Rebuild native modules for Node
run: pnpm run rebuild:native:node

# Why: install intentionally blocks Electron's package postinstall, but
# some unit tests import `electron` under Node and require path.txt.
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,14 @@ docs/**
!docs/reference/**
# Keep generated React perf scan ledgers local; durable docs still use docs/reference.
docs/reference/react-performance-audit.md
!docs/orca-scryer-decision-map.md
!docs/adr/
!docs/adr/**
!docs/scryer-cli-tool-parity.md
!docs/prd/
!docs/prd/orca-scryer-engine-catalog-foundation.md
!docs/prd/orca-scryer-operation-migration-work-set.md
!docs/prd/orca-scryer-operation-migration-issue-slices.md
!docs/STYLEGUIDE.md
!docs/mobile-terminal-shortcut-bar.md

Expand Down Expand Up @@ -115,3 +123,4 @@ src/renderer/src/i18n/locales/.zh-catalog-cache.json
src/renderer/src/i18n/locales/.ko-catalog-cache.json
src/renderer/src/i18n/locales/.ja-catalog-cache.json
src/renderer/src/i18n/locales/.es-catalog-cache.json
.gitnexus
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ minimum-release-age-exclude[]=electron@42.3.3
minimum-release-age-exclude[]=mermaid@11.15.0
minimum-release-age-exclude[]=@mermaid-js/parser@1.1.1
minimum-release-age-exclude[]=serve-sim@0.1.40
engine-strict=true
401 changes: 401 additions & 0 deletions CONTEXT.md

Large diffs are not rendered by default.

11 changes: 10 additions & 1 deletion config/electron-builder.config.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ module.exports = {
'out/main/gemini/**',
'out/main/grok/**',
'out/main/hermes/**',
'out/main/scryer/engine/**',
'out/main/win32-utils.js',
'out/main/daemon-entry.js',
'out/main/computer-sidecar.js',
Expand Down Expand Up @@ -287,7 +288,15 @@ module.exports = {
// Why: xvfb lets the bundled `orca serve` CLI run browser panes on a headless
// Linux host — Chromium needs a display server even for offscreen rendering,
// and serve starts Xvfb itself when present (see ensure-virtual-display.ts).
depends: ['python3', 'python3-gi', 'gir1.2-atspi-2.0', 'at-spi2-core', 'xdotool', 'xclip', 'xvfb'],
depends: [
'python3',
'python3-gi',
'gir1.2-atspi-2.0',
'at-spi2-core',
'xdotool',
'xclip',
'xvfb'
],
// Why: symlink the bundled CLI onto PATH at install time so `orca-ide serve`
// works on a headless host. The in-app CLI registration (CliInstaller) is
// GUI-triggered and can never run on a server, so without this the CLI is
Expand Down
6 changes: 6 additions & 0 deletions config/scripts/electron-builder-config.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,12 @@ describe('electron-builder config', () => {
expect(electronBuilderConfig.npmRebuild).toBe(true)
})

it('unpacks CLI runtime imports from out/main', () => {
expect(electronBuilderConfig.asarUnpack).toEqual(
expect.arrayContaining(['out/main/agent-hooks/**', 'out/main/scryer/engine/**'])
)
})

it('verifies packaged main runtime deps from Windows-style asar entries', async () => {
const resourcesDir = await mkdtemp(join(tmpdir(), 'orca-runtime-deps-'))
try {
Expand Down
13 changes: 13 additions & 0 deletions config/scripts/electron-vite-config.test.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { readFile } from 'node:fs/promises'
import { resolve } from 'node:path'
import { describe, expect, it } from 'vitest'

describe('electron-vite config', () => {
it('keeps CLI out/main runtime imports available after main rebuilds', async () => {
const source = await readFile(resolve('electron.vite.config.ts'), 'utf8')

expect(source).toContain("'agent-hooks/managed-agent-hook-controls'")
expect(source).toContain("'scryer/engine/index'")
expect(source).toContain("'src/main/scryer/engine/index.ts'")
})
})
13 changes: 13 additions & 0 deletions config/scripts/package-electron-runtime-contract.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,19 @@ describe('Electron runtime package contract', () => {
expect(installStep.run).toBe('node config/scripts/install-electron-package-binary.mjs')
})

it('keeps PR checks wired to the Node native module rebuild script', () => {
const prWorkflow = readFileSync(join(projectDir, '.github/workflows/pr.yml'), 'utf8')
const parsedWorkflow = parse(prWorkflow)
const rebuildStep = parsedWorkflow.jobs.verify.steps.find(
(step) => step.name === 'Rebuild native modules for Node'
)

expect(rebuildStep.run).toBe('pnpm run rebuild:native:node')
expect(packageJson.scripts['rebuild:native:node']).toBe(
'node config/scripts/rebuild-node-native-deps.mjs'
)
})

it('smokes the packaged CLI from outside the checkout in PR checks', () => {
const prWorkflow = readFileSync(join(projectDir, '.github/workflows/pr.yml'), 'utf8')
const parsedWorkflow = parse(prWorkflow)
Expand Down
40 changes: 40 additions & 0 deletions config/scripts/rebuild-node-native-deps.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env node
import { execFileSync } from 'node:child_process'
import { existsSync } from 'node:fs'
import { join } from 'node:path'

const modules = ['better-sqlite3', 'node-pty', '@parcel/watcher']

const getPnpmCommand = () => {
const corepackRoot = process.env.COREPACK_ROOT
const corepackEntry = corepackRoot ? join(corepackRoot, 'dist/corepack.js') : undefined

if (corepackEntry && existsSync(corepackEntry)) {
return {
command: process.execPath,
args: [corepackEntry, 'pnpm']
}
}

if (process.env.npm_execpath?.includes('pnpm') && existsSync(process.env.npm_execpath)) {
return {
command: process.execPath,
args: [process.env.npm_execpath]
}
}

return {
command: 'pnpm',
args: []
}
}

try {
const pnpm = getPnpmCommand()
execFileSync(pnpm.command, [...pnpm.args, 'rebuild', ...modules], {
stdio: 'inherit'
})
} catch (error) {
console.error('[rebuild] Failed to rebuild native modules for Node.js:', error.message)
process.exit(1)
}
17 changes: 17 additions & 0 deletions config/scripts/verify-node-version.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#!/usr/bin/env node
import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'

const packageJson = JSON.parse(readFileSync(resolve(process.cwd(), 'package.json'), 'utf8'))
const requiredMajor = Number(String(packageJson.engines?.node ?? '').match(/\d+/)?.[0])
const actualMajor = Number(process.versions.node.split('.')[0])

if (!requiredMajor || actualMajor === requiredMajor) {
process.exit(0)
}

console.error(
`[preflight] Orca requires Node ${requiredMajor}.x, but current Node is ${process.versions.node}.`
)
console.error('[preflight] Switch to Node 24 before installing dependencies or running full tests.')
process.exit(1)
2 changes: 2 additions & 0 deletions config/tsconfig.cli.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,11 @@
"../src/main/kimi/hook-service.ts",
"../src/main/kimi/kimi-hook-config-toml.ts",
"../src/main/openclaude/hook-service.ts",
"../src/main/scryer/engine/**/*.ts",
"../src/main/runtime/runtime-metadata.ts",
"../src/main/win32-utils.ts"
],
"exclude": ["../src/main/scryer/engine/**/*.test.ts"],
"compilerOptions": {
"composite": true,
"module": "CommonJS",
Expand Down
3 changes: 3 additions & 0 deletions docs/adr/0001-scryer-engine-parity-with-orca-native-shell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Scryer engine parity with an Orca-native shell

Orca will migrate Scryer by preserving upstream Scryer model and agent-facing behavior while replacing the app shell, process ownership, packaging, and user-facing integration with Orca-native surfaces. This keeps the integration product-native without turning it into a partial Scryer clone.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Scryer agent runs use Orca execution adapters

Scryer agent-run semantics are preserved, but Orca owns Codex/Claude process launch, account state, terminal/runtime state, and UI integration. `ScryerEditSessionController` keeps Scryer model-edit lease and completion-gate workflow over Orca runtime capabilities without duplicating generic agent runtime mechanics.

The edit-session lease token is internal trusted context, not renderer-facing state. Renderer/preload interfaces receive only token-free session status and completion-gate DTOs; `ScryerEditSessionController` resolves any matching token inside the main process before calling the Native Scryer Engine.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Background Scryer runs with visible agent handoff

Default Scryer automation should run as structured background Orca agent work, because build/fill/drift flows need deterministic progress, cancellation, logs, and tests. Visible terminal handoff remains an explicit mode for inspection, recovery, or manual continuation.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Replace Scryer MCP with an Orca CLI tool surface

Orca will not retain Scryer MCP as a product path. Upstream MCP tool behavior is migrated into Orca-native `orca scryer <noun> <verb>` commands backed by the Native Scryer Engine, so Codex, Claude Code, scripts, UI, and humans share one Orca command surface.
3 changes: 3 additions & 0 deletions docs/adr/0005-use-decision-map-as-planning-authority.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use a decision map as planning authority

Multi-session Scryer migration planning will use one compact decision map as the authoritative planning artifact. ADRs and detailed design files are linked assets; they do not replace the map or copy its frontier.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Link detailed design assets from the decision map

Detailed matrices, migration checklists, UML comparisons, and research notes stay in separate Markdown assets and are linked from the decision map. This keeps the map small enough to load into every planning session while preserving the detail needed for implementation.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Implement the Scryer engine natively in TypeScript

The product runtime will implement Scryer model-engine semantics in Orca's TypeScript/Node codebase instead of calling a packaged Rust sidecar. Upstream Rust remains the semantic reference, but native implementation keeps packaging, UI refresh, IPC, agent runtime, and tests inside Orca.
3 changes: 3 additions & 0 deletions docs/adr/0008-native-scryer-engine-owns-state-semantics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Native Scryer engine owns state semantics

The Native Scryer Engine is the only module that owns Scryer state semantics such as planned/committed layers, locking, history, anchors, drift, and health. CLI, IPC, UI, sync, and import paths call the engine instead of implementing their own model rules.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use Scryer 0.3 ScryModel as the canonical engine model

The Native Scryer Engine uses upstream Scryer 0.3 `ScryModel` as its canonical model. Orca `C4ModelData`, flow data, layout data, and pre-0.3 shapes are import or view concerns, not engine truth.
3 changes: 3 additions & 0 deletions docs/adr/0010-follow-upstream-scryer-0-3-model-handling.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Follow upstream Scryer 0.3 model handling

Normal runtime opens only `version: "0.3"` Scryer models and refuses pre-0.3 files with a clear incompatibility result. Preservation of older Orca/Scryer data belongs in an explicit import path, not automatic runtime migration.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Keep Orca view and runtime state outside ScryModel

`ScryModel` stores architecture truth only. Orca selection, expanded paths, active tabs, layout/render cache, retained flow-editor data, agent progress, and model edit leases live in Orca-owned state so UI mechanics do not pollute the agent-facing model.

Only sanitized model-edit lease status is renderer-facing. The raw lease token stays in trusted main-process/edit-session context and must not be persisted into `ScryModel`, renderer store state, DOM state, logs, or prompts.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Use upstream planned/committed semantics with Orca gates

Orca preserves upstream planned/committed semantics: draft edits write planned state, while folds, extraction, corrections, and drift verdicts explicitly affect committed state. Orca adds Model Edit Lease and Completion Gate enforcement so agent completion and UI write-back cannot silently corrupt the model.

Model Edit Lease tokens are write-concurrency credentials held in trusted main-process context. They may be attached to `ScryerOperationContext` by the edit-session controller, but renderer-facing DTOs, logs, prompts, and generic operation inputs must expose only sanitized lease status, never the raw token.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use Native Scryer Engine as the only model semantics interface

Architecture UI, Electron IPC, Orca CLI, agent runtime, drift/sync, and tests must call the Native Scryer Engine or typed wrappers. This keeps parsing, validation, planned/committed policy, locks, leases, history, anchors, build edges, drift semantics, and atomic IO behind one interface.
3 changes: 3 additions & 0 deletions docs/adr/0014-keep-glossary-separate-from-design-specs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Keep glossary separate from design specs

`CONTEXT.md` is a glossary only. Design decisions belong in ADRs, frontier planning belongs in the decision map, and implementation matrices or migration checklists belong in linked design assets.
3 changes: 3 additions & 0 deletions docs/adr/0015-use-orca-native-scryer-operation-catalog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use Orca-native Scryer Operation Catalog

The Native Scryer Engine uses an Orca-owned Operation Catalog as its semantic center. Operation ids are Orca-native, while operation behavior remains anchored to upstream Scryer parity.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use Orca-native Scryer operation and command names

Internal operation ids use dotted Orca-native names such as `scryer.model.read`; CLI commands use noun/verb names such as `orca scryer model read`. Upstream tool names remain parity anchors rather than the product command surface.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use typed operation contracts as the Scryer engine interface

Every Native Scryer Engine operation is defined by one typed contract. The contract declares caller-facing input/output behavior and state effects; detailed matrices live in the linked parity asset rather than in this ADR.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Land first operation contracts as a minimal semantic loop

The first implementation slice is a minimal semantic loop: model read, model validate, node update, link add, link delete, plan pending, and plan fold. This proves read/write layers, validation, pending diff, fold, lock/lease, result envelope, and transport forwarding before broad tool coverage.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Drive first operation contracts from a contract matrix

The first seven operation contracts are defined by one contract matrix before implementation. That matrix is the source for contract tests, CLI mapping, IPC mapping, UI actions, and operation implementation order.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use upstream Scryer field semantics in engine contracts

Engine contracts preserve upstream Scryer semantic field names for model and operation behavior. Orca-native adaptation happens in operation ids, CLI commands, aliases, context, and result envelopes, not by renaming Scryer model fields.
3 changes: 3 additions & 0 deletions docs/adr/0021-use-shared-operation-result-envelope.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use a shared operation result and error envelope

Every Native Scryer Engine operation returns the same success-or-failure envelope. Operation-specific contracts define payload and error details, while CLI, IPC, UI, agents, scripts, and tests all consume the shared shape.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use explicit Orca operation context for Scryer authority

Every Native Scryer Engine operation receives explicit Orca operation context for caller identity, request tracking, project resolution defaults, edit authority, and run correlation. This replaces hidden caller assumptions with deterministic authority checks while preserving upstream Scryer state semantics.
3 changes: 3 additions & 0 deletions docs/adr/0023-use-unified-operation-execution-pipeline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Use a unified operation execution pipeline for Scryer

Every Native Scryer Engine operation runs through one contract-driven execution pipeline. The pipeline owns cross-cutting behavior such as contract lookup, context/input validation, project resolution, authority, lock/lease checks, declared state reads/writes, side effects, and result envelopes; operation files own only Scryer domain semantics.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Reimplement Scryer semantics in Orca-owned code

Orca will migrate Scryer functional semantics and reimplement the code in Orca-owned TypeScript/Node modules rather than directly copying upstream implementation source into the product runtime. Upstream Scryer remains the reference for behavior, schemas, state transitions, and parity tests; Orca owns the implementation.
Loading