mirror of
https://github.com/stablyai/orca.git
synced 2026-10-30 16:47:34 +00:00
* [comment audit] Align legacy failure-read counts with cached display * [comment audit] Condense shared provider lifecycle and browser recovery comments [skip ci] * [comment audit] Condense shared generation, path and preview comments [skip ci] * [comment audit] Condense host, file and Git contract rationale [skip ci] * [comment audit] Tighten Git lifecycle and provider contract comments [skip ci] * [comment audit] Clarify shared host authority and launch isolation [skip ci] * [comment audit] simplify local access mobile and native chat contracts [skip ci] * [comment audit] simplify native chat presentation and state contracts [skip ci] * [comment audit] simplify native runtime and provider contracts [skip ci] * [comment audit] simplify migration and orchestration contracts [skip ci] * [comment audit] simplify plugin trust and process capture rationale [skip ci] * [comment audit] simplify terminal delivery and remote compatibility rationale [skip ci] * [comment audit] clarify remote recovery and launch wire rationale [skip ci] * [comment audit] shorten shared RPC compatibility and runtime evidence comments [skip ci] * [comment audit] simplify secure storage shell startup and sidebar rationale [skip ci] * [comment audit] clarify sidebar, skill and SSH invariants [skip ci] * [comment audit] condense structured chat delivery and timing rationale [skip ci] * [comment audit] condense terminal replay and telemetry invariants [skip ci] * [comment audit] clarify launch permission and terminal delivery rationale [skip ci] * [comment audit] clarify workspace ownership and layout contracts [skip ci] * [comment audit] wait for fitted and painted SSH terminal links * [comment audit] clarify layout persistence and session ownership [skip ci] * [comment audit] clarify host routing and workspace lifecycle contracts [skip ci] * [comment audit] clarify startup persistence and app lifetime comments [skip ci] * [comment audit] clarify recovery and activity boundaries [skip ci] * [comment audit] condense activity and artifact invariants [skip ci] * [comment audit] condense automation authority contracts [skip ci] * [comment audit] simplify automation scheduling and history contracts [skip ci] * [comment audit] clarify browser chrome and annotation lifecycles [skip ci] * [comment audit] clarify browser routing and retained guest ownership [skip ci] * [comment audit] clarify browser recovery and document ownership comments [skip ci] * [comment audit] restore hosted runners required by native IME fixtures * [comment audit] shorten preview, palette and dashboard invariants [skip ci] * [comment audit] clarify terminal preview, dashboard and retention comments [skip ci] * [comment audit] clarify diff-note recovery and editor lifecycle comments [skip ci] * [comment audit] shorten rich-text and combined-diff ownership comments [skip ci] * [comment audit] shorten autosave, draft recovery and model ownership comments [skip ci] * [comment audit] shorten save-queue, notebook and Markdown constraints [skip ci] * [comment audit] shorten Monaco, PDF and rich Markdown safeguards [skip ci] * [comment audit] clarify rich Markdown source and selection safeguards [skip ci] * [comment audit] clarify editor loading and emulator stream lifetimes [skip ci] * [comment audit] trim emulator and feature tour narration [skip ci] * [comment audit] clarify floating workspace and GitHub cache ownership [skip ci] * [comment audit] trim provider controls and Linear filter explanations [skip ci] * [comment audit] clarify pairing and chat resume lifetimes [skip ci] * [comment audit] clarify chat delivery and transcript lifetimes [skip ci] * [comment audit] clarify session options and host-owned status [skip ci] * [comment audit] clarify draft durability and live-status precedence [skip ci] * [comment audit] Trim chat send and model ownership explanations [skip ci] * [comment audit] Shorten transcript ownership and send recovery comments [skip ci] * [comment audit] Simplify native chat composer and transcript hook comments [skip ci] * [comment audit] Shorten native chat scroll and structured session explanations [skip ci] * [comment audit] Trim workspace picker and onboarding commentary [skip ci] * [comment audit] Simplify pet rendering, review cache and quick open comments [skip ci] * [comment audit] Trim sidebar and session history explanations [skip ci] * [comment audit] Condense session resume and review checks comments [skip ci] * [comment audit] Shorten checks state and file explorer refresh comments [skip ci] * [comment audit] Trim plugin bridge and source-control action rationale [skip ci] * [comment audit] Trim source-control listing and review rationale [skip ci] * [comment audit] Shorten sidebar lifecycle and explorer safeguards [skip ci] * [comment audit] Condense Settings account and appearance rationale [skip ci] * [comment audit] Trim pairing and repository Settings explanations [skip ci] * [comment audit] Condense Settings search SSH and terminal safeguards [skip ci] * [comment audit] Shorten Settings voice and provider ownership comments [skip ci] * [comment audit] Condense Settings draft persistence and host-state rationale [skip ci] * [comment audit] Trim Settings hooks and sidebar setup rationale [skip ci] * [comment audit] Condense sidebar deletion and board-filter safeguards [skip ci] * [comment audit] Condense worktree cards, host ownership and Markdown contracts [skip ci] * [comment audit] Condense sidebar drag, folder and filtering contracts [skip ci] * [comment audit] Condense sidebar parity, sleep and host ownership contracts [skip ci] * [comment audit] Prune focus-read baseline after comment cleanup * [comment audit] Clarify sidebar visibility, board drops and agent evidence [skip ci] * [comment audit] Tighten sidebar listing, drag and reveal contracts [skip ci] * [comment audit] Clarify viewport geometry and skill update safeguards [skip ci] * [comment audit] Tighten skill inventory, usage and host status comments [skip ci] * [comment audit] Clarify usage ownership and resource kill safeguards [skip ci] * [comment audit] Tighten tab selection, rename and search contracts [skip ci] * [comment audit] Tighten tab-strip geometry and drag ownership comments [skip ci] * [comment audit] Tighten Tasks recovery, pagination and mutation comments [skip ci] * [comment audit] Tighten provider loading and terminal recovery comments [skip ci] * [comment audit] Tighten completion, cadence and PTY ownership comments [skip ci] * [comment audit] Clarify terminal restore and parked-pane boundaries [skip ci] * [comment audit] Tighten PTY startup and replay explanations [skip ci] * [comment audit] Clarify PTY identity and delivery ownership [skip ci] * [comment audit] Shorten remote reconnect and input replay rationale [skip ci] * [comment audit] Condense terminal parking clipboard and file link comments [skip ci] * [comment audit] Clarify IME ownership and trim trace history [skip ci] * [comment audit] Shorten pane recovery and parked watcher explanations [skip ci] * [comment audit] Condense snapshot replay and visibility recovery rationale [skip ci] * [comment audit] Shorten terminal parking and keyboard ownership rationale [skip ci] * [comment audit] Trim renderer lifecycle and menu rationale [skip ci] * [comment audit] Condense workspace cleanup ownership and settlement notes [skip ci] * [comment audit] Clarify renderer hook evidence and source ownership [skip ci] * [comment audit] Tighten IPC ownership and reconnect explanations [skip ci] * [comment audit] Trim renderer focus, paste and attention comments [skip ci] * [comment audit] Shorten scroll, locale and agent lifecycle comments [skip ci] * [comment audit] Trim agent launch, resume and ownership commentary [skip ci] * [comment audit] Shorten account, browser and editor comments [skip ci] * [comment audit] Clarify host-mirror waits, previews and input ownership [skip ci] * [comment audit] Condense launch recovery and editor tokenization comments [skip ci] * [comment audit] Condense workspace selection and terminal pane rationale [skip ci] * [comment audit] Condense terminal fitting and rendering recovery comments [skip ci] * [comment audit] Condense terminal input and host routing explanations [skip ci] * [comment audit] Condense ownership and sleeping-session recovery rationale [skip ci] * [comment audit] Condense structured launch and terminal link explanations [skip ci] * [comment audit] Condense terminal ownership and workspace file routing rationale [skip ci] * [comment audit] Condense session persistence and workspace activation rationale [skip ci] * [comment audit] Condense workspace routing and browser ownership rationale [skip ci] * [comment audit] Condense mirror recovery and layout authority rationale [skip ci] * [comment audit] Condense runtime transport and file safety rationale [skip ci] * [comment audit] Condense runtime graph and structured session rationale [skip ci] * [comment audit] Condense browser creation and remote tab recovery rationale [skip ci] * [comment audit] Condense snapshot authority and publisher recovery rationale [skip ci] * [comment audit] Condense frame, startup and provider cache rationale [skip ci] * [comment audit] Condense host twin and agent lifecycle rationale [skip ci] * [comment audit] Condense browser authority and editor cleanup rationale [skip ci] * [comment audit] Condense editor buffer identity and review cache rationale [skip ci] * [comment audit] Condense provider lifetime and repository ownership rationale [skip ci] * [comment audit] Condense reconnect, hydration and terminal retirement rationale [skip ci] * [comment audit] Condense recovery, reconciliation and persistence rationale [skip ci] * [comment audit] Condense cleanup ownership and listing admission rationale [skip ci] * [comment audit] Condense teardown ordering and terminal ownership rationale [skip ci] * [comment audit] Condense recovery ledger and web host-boundary rationale [skip ci] * [comment audit] Condense web reconnect and credential lifecycle rationale [skip ci] * [comment audit] Condense cloud rollout and assignment safety rationale [skip ci] * [comment audit] Condense relay session and database recovery rationale [skip ci] * [comment audit] Condense relay placement and protocol compatibility rationale [skip ci] * [comment audit] Condense build and packaging constraints [skip ci] * [comment audit] Condense CI gates and validation isolation rationale [skip ci] * [comment audit] Condense catalog identity and browser validation rationale [skip ci] * [comment audit] Condense mobile browser and frame-budget rationale [skip ci] * [comment audit] Shorten mobile route and browser test explanations [skip ci] * [comment audit] Condense editor and session seam test rationale [skip ci] * [comment audit] Trim session and terminal closure history [skip ci] * [comment audit] Shorten terminal browser and census explanations [skip ci] * [comment audit] Preserve root-only E2E diagnostic baseline * [comment audit] Condense mobile seam and HTML preview test rationale [skip ci] * [comment audit] Condense preview instrumentation and render harness rationale [skip ci] * [comment audit] Condense bundle contracts and native-build constraints [skip ci] * [comment audit] Shorten native packaging and CI routing rationale [skip ci] * [comment audit] Condense release tooling and benchmark constraints [skip ci] * [comment audit] Condense packaging and platform gate rationale [skip ci] * [comment audit] Shorten mobile route and history rationale [skip ci] * [comment audit] Condense mobile browser and component rationale [skip ci] * [comment audit] Shorten drawer and workspace-form rationale [skip ci] * [comment audit] Trim mobile review and editor-document explanations [skip ci] * [comment audit] Condense editor lifecycle and Markdown explanations [skip ci] * [comment audit] Trim mobile file, diagnostics and dictation commentary [skip ci] * [comment audit] Simplify mobile host-list and workspace-view explanations [skip ci] * [comment audit] Clarify mobile shell lifetime and bridge delivery constraints [skip ci] * [comment audit] Condense bridge stream, native request and audio rationale [skip ci] * [comment audit] Reduce bridge schema and page-client commentary [skip ci] * [comment audit] Tighten mobile page bridge contracts [skip ci] * [comment audit] Clarify mobile cache and session constraints [skip ci] * [comment audit] Condense mobile route and lifecycle rationale [skip ci] * [comment audit] Tighten mobile shell hook timing rationale [skip ci] * [comment audit] Clarify route handoff and notification compatibility [skip ci] * [comment audit] Clarify push registration and dictation cleanup constraints [skip ci] * [comment audit] Condense keyboard geometry and native media ownership rationale [skip ci] * [comment audit] Tighten mobile chat scroll and composer concurrency rationale [skip ci] * [comment audit] Condense mobile reply compatibility and upload ownership rationale [skip ci] * [comment audit] Condense optimistic echo and scroll ownership rationale [skip ci] * [comment audit] Tighten stream replay and queued session ownership rationale [skip ci] * [comment audit] Condense mobile composer and reply-schema constraints [skip ci] * [comment audit] Clarify mobile transcript recovery and session ownership [skip ci] * [comment audit] Clarify mobile queue and source-control compatibility [skip ci] * [comment audit] Condense storage and task launch constraints [skip ci] * [comment audit] Clarify task schemas and terminal document ownership [skip ci] * [comment audit] Tighten terminal input and viewport rationale [skip ci] * [comment audit] Shorten terminal and RPC recorder contracts [skip ci] * [comment audit] Condense recorder engine and connection contracts [skip ci] * [comment audit] Shorten host credential and relay recovery comments [skip ci] * [comment audit] Tighten pairing recovery and bundle transport rationale [skip ci] * [comment audit] Clarify RPC delivery and workspace catalog boundaries [skip ci] * [comment audit] Condense catalog and relay entry contracts [skip ci] * [comment audit] Shorten shutdown and SSH relay delivery contracts [skip ci] * [comment audit] Condense WSL relay and E2E regression rationale [skip ci] * [comment audit] Shorten cross-version harness and renderer fixture explanations [skip ci] * [comment audit] Condense paired-host and E2E lifecycle rationale [skip ci] * [comment audit] Shorten layout oracle and regression explanations [skip ci] * [comment audit] Condense paired recovery and ownership regression contracts [skip ci] * [comment audit] Shorten restart, sidebar and SSH lifecycle contracts [skip ci] * [comment audit] Condense terminal rendering and IME regression rationale [skip ci] * [comment audit] Shorten terminal recovery and benchmark contracts [skip ci] * [comment audit] Condense tooling and Windows lifecycle proof rationale [skip ci] * [comment audit] Condense workflow routing and release rationale [skip ci] * [comment audit] Condense mobile security and installer contracts [skip ci] * [comment audit] Shorten native rationale and stylesheet workarounds [skip ci] * [comment audit] Shorten Windows visibility probe rationale [skip ci] * [comment audit] Condense embedded release and signing rationale [skip ci] * [comment audit] Retain current main test behavior in final reconciliation [skip ci] * [comment audit] Complete final comment review across current source inventory * [comment audit] Handle consolidated audit reports before final CI * [comment audit] Preserve credential storage census detail [skip ci] * [comment audit] Scale broad changed E2E selections with verified timing shards * [comment audit] Align E2E assertions with browser close and settled session metadata * [comment audit] Match existing E2Es to current resource and windowing contracts * [comment audit] Observe the shared server outage notice in reconnect coverage * [comment audit] Make existing renderer probes measure settled tab and PTY work * [comment audit] Align palette E2E selector with task search * [comment audit] Refresh remaining palette search selectors * [comment audit] Keep selector correction within selected audit specs * [comment audit] Await emoji fixture settings inside renderer evaluation * [comment audit] Cancel fixture fit retries between terminal tests --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com>
304 lines
13 KiB
TypeScript
304 lines
13 KiB
TypeScript
/** Build, hash and install probe share this manifest; order determines the hash. Keep erasable-only TypeScript:
|
||
* Node build scripts import via type stripping, which rejects enums, namespaces and parameter properties. */
|
||
// Bun-era slots only: kept so a client can still launch one for rollback (design D7.1 R5).
|
||
export const ORCAD_BUN_RUNTIME_FILENAME = 'bun-runtime'
|
||
export const ORCAD_WINDOWS_BUN_RUNTIME_FILENAME = 'bun-runtime.exe'
|
||
export const ORCAD_BUILD_TARGET_FILENAME = '.build-target'
|
||
export const ORCAD_WINDOWS_PROCESS_TREE_FILENAME = 'windows-process-tree.node'
|
||
/** native/windows-security: secure-file ACLs without spawning icacls. */
|
||
export const ORCAD_WINDOWS_SECURITY_FILENAME = 'windows-security.node'
|
||
/** native/windows-cli-launcher: cmd.exe and .ps1 shims cannot carry every argv intact. */
|
||
export const ORCAD_WINDOWS_CLI_LAUNCHER_FILENAME = 'bin/orca.exe'
|
||
|
||
export function orcadBunRuntimeFilename(target: string): string {
|
||
return isWindowsTarget(target) ? ORCAD_WINDOWS_BUN_RUNTIME_FILENAME : ORCAD_BUN_RUNTIME_FILENAME
|
||
}
|
||
|
||
function isWindowsTarget(target: string): boolean {
|
||
return target === 'win32' || target.startsWith('win32-')
|
||
}
|
||
|
||
/** A Node slot's server target (e.g. linux-x64-musl); `.build-target` would mark it as Bun. */
|
||
export const ORCAD_SERVER_TARGET_FILENAME = '.server-target'
|
||
|
||
/** The pinned Node executableSha256 enters the version hash here. Never ship .build-target in Node slots:
|
||
* Bun-era selectors exit 78 without bun-runtime (design D7.1 R5). */
|
||
export const ORCAD_NODE_RUNTIME_MARKER_FILENAME = '.runtime-node'
|
||
/** Beside the slot dirs and shared across Orca versions (design D2): `runtimes/node-<sha256>/bin/node`. */
|
||
export const ORCAD_RUNTIMES_DIRNAME = 'runtimes'
|
||
export const ORCAD_NODE_RUNTIME_DIR_PREFIX = 'node-'
|
||
export const ORCAD_NODE_RUNTIME_POSIX_EXECUTABLE = 'bin/node'
|
||
// Upstream's own name and layout: renaming node.exe is the masquerading pattern EDR scores.
|
||
export const ORCAD_NODE_RUNTIME_WINDOWS_EXECUTABLE = 'node.exe'
|
||
|
||
export function orcadNodeRuntimeExecutable(target: string): string {
|
||
return isWindowsTarget(target)
|
||
? ORCAD_NODE_RUNTIME_WINDOWS_EXECUTABLE
|
||
: ORCAD_NODE_RUNTIME_POSIX_EXECUTABLE
|
||
}
|
||
|
||
/** Slot-relative path segments of the runtime a slot's marker names. */
|
||
export function orcadNodeRuntimeRelativePath(target: string, executableSha256: string): string[] {
|
||
return [
|
||
'..',
|
||
ORCAD_RUNTIMES_DIRNAME,
|
||
`${ORCAD_NODE_RUNTIME_DIR_PREFIX}${executableSha256}`,
|
||
...orcadNodeRuntimeExecutable(target).split('/')
|
||
]
|
||
}
|
||
|
||
/** N-API level the slot addons are built for; equals SLOT_NAPI_VERSION in the prebuild script. */
|
||
export const ORCAD_ADDON_NAPI_VERSION = 8
|
||
|
||
export const ORCAD_NODE_PTY_DIR = 'node_modules/node-pty'
|
||
export const ORCAD_CLI_ENTRY_FILENAME = 'out/cli/index.js'
|
||
export const ORCAD_CLI_PACKAGE_FILENAME = 'out/package.json'
|
||
// Test files and sources stay out; these are every module the runtime path requires.
|
||
export const ORCAD_NODE_PTY_JS_ARTIFACTS = [
|
||
'package.json',
|
||
'lib/conpty_console_list_agent.js',
|
||
'lib/eventEmitter2.js',
|
||
'lib/index.js',
|
||
'lib/interfaces.js',
|
||
'lib/shared/conout.js',
|
||
'lib/terminal.js',
|
||
'lib/types.js',
|
||
'lib/unixTerminal.js',
|
||
'lib/utils.js',
|
||
'lib/windowsConoutConnection.js',
|
||
'lib/windowsPtyAgent.js',
|
||
'lib/windowsTerminal.js',
|
||
'lib/worker/conoutSocketWorker.js'
|
||
].map((file) => `${ORCAD_NODE_PTY_DIR}/${file}`)
|
||
|
||
/** The prebuild slot's files (config/scripts/orcad-prebuild-slot-contents.mjs), relative to build/Release. */
|
||
export function orcadNodePtySlotFiles(target: string): string[] {
|
||
if (isWindowsTarget(target)) {
|
||
return [
|
||
'conpty.node',
|
||
'conpty_console_list.node',
|
||
'conpty/conpty.dll',
|
||
'conpty/OpenConsole.exe',
|
||
// node-pty's winpty backend, which it selects below Windows build 18309.
|
||
'pty.node',
|
||
'winpty.dll',
|
||
'winpty-agent.exe'
|
||
]
|
||
}
|
||
return target.startsWith('darwin-') ? ['pty.node', 'spawn-helper'] : ['pty.node']
|
||
}
|
||
|
||
export function orcadNodePtyNativeArtifacts(target: string): string[] {
|
||
return orcadNodePtySlotFiles(target).map((file) => `${ORCAD_NODE_PTY_DIR}/build/Release/${file}`)
|
||
}
|
||
|
||
export const ORCAD_PARCEL_WATCHER_ENTRY = 'node_modules/@parcel/watcher/index.js'
|
||
export const ORCAD_PARCEL_WATCHER_NATIVE = 'node_modules/@parcel/watcher/watcher.node'
|
||
export const ORCAD_EMOJI_SHORTCODE_DATASET =
|
||
'node_modules/emojibase-data/en/shortcodes/emojibase.json'
|
||
// linear-sdk.ts loads it through createRequire, which the server bundle cannot follow.
|
||
export const ORCAD_LINEAR_SDK_ENTRY = 'node_modules/@linear/sdk/index.js'
|
||
|
||
export const ORCAD_VERSION = '0.1.0'
|
||
export const ORCAD_LAUNCHER_FILENAME = 'orcad.js'
|
||
export const ORCAD_SERVER_ENTRY_FILENAME = 'orcad-server.js'
|
||
|
||
// Equals FOREIGN_SQLITE_READER_ENTRY_FILENAME; that module is not loadable under type stripping.
|
||
export const ORCAD_FOREIGN_SQLITE_READER_ENTRY = 'foreign-sqlite-reader-entry.js'
|
||
/** Worker thread that runs workspace port detection's probe commands off the event loop. */
|
||
export const ORCAD_PORT_SCAN_COMMAND_WORKER_ENTRY = 'port-scan-command-worker-entry.js'
|
||
// Equals AI_VAULT_SERVICE_ENTRY_FILENAME: the forked child that lists agent sessions.
|
||
export const ORCAD_SESSION_SCANNER_SERVICE_ENTRY = 'session-scanner-service-entry.js'
|
||
// Equals COMPUTER_SIDECAR_ENTRY_FILENAME, and the desktop's out/main entry name.
|
||
export const ORCAD_COMPUTER_SIDECAR_ENTRY = 'computer-sidecar.js'
|
||
/** Plain scripts, one copy for every target: each platform's sidecar runs only its own. */
|
||
export const ORCAD_COMPUTER_USE_RUNTIME_ARTIFACTS = [
|
||
'computer-use-linux/runtime.py',
|
||
'computer-use-windows/runtime.ps1'
|
||
] as const
|
||
|
||
// Kept here because build-orcad.mjs imports this manifest directly under Node type stripping.
|
||
export const ORCAD_RIPGREP_ARTIFACTS = [
|
||
'ripgrep/linux-x64/rg',
|
||
'ripgrep/linux-arm64/rg',
|
||
'ripgrep/darwin-x64/rg',
|
||
'ripgrep/darwin-arm64/rg',
|
||
'ripgrep/win32-x64/rg.exe',
|
||
'ripgrep/win32-arm64/rg.exe'
|
||
] as const
|
||
|
||
/** Only the target's own ripgrep ships (design D2); both libcs share one static build. */
|
||
export function orcadRipgrepArtifact(target: string): string {
|
||
const [platform, arch] = target.split('-')
|
||
const artifact = ORCAD_RIPGREP_ARTIFACTS.find((candidate) =>
|
||
candidate.startsWith(`ripgrep/${platform}-${arch}/`)
|
||
)
|
||
if (!artifact) {
|
||
throw new Error(`orcad ships no ripgrep for ${target}`)
|
||
}
|
||
return artifact
|
||
}
|
||
|
||
/** Packaging-only references; deployed slots still contain their own verified binary. */
|
||
export function orcadTemplatePackagedRipgrep(
|
||
schemaVersion: number,
|
||
target: string,
|
||
reference: unknown
|
||
): string | null {
|
||
if (reference === undefined) {
|
||
return null
|
||
}
|
||
if (schemaVersion !== 4 || reference !== true || target.startsWith('darwin-')) {
|
||
throw new Error(`Invalid packaged ripgrep reference for ${target}`)
|
||
}
|
||
return orcadRipgrepArtifact(target)
|
||
}
|
||
|
||
export const ORCAD_RIPGREP_LICENSE_ARTIFACTS = [
|
||
'ripgrep/licenses/JEMALLOC-COPYING',
|
||
'ripgrep/licenses/LICENSE-MIT',
|
||
'ripgrep/licenses/LLVM-LIBUNWIND-LICENSE.TXT',
|
||
'ripgrep/licenses/MUSL-COPYRIGHT',
|
||
'ripgrep/licenses/PCRE2-LICENCE.md',
|
||
'ripgrep/licenses/README.md',
|
||
'ripgrep/licenses/RUST-CRATE-NOTICES.txt',
|
||
'ripgrep/licenses/SLJIT-LICENSE',
|
||
'ripgrep/licenses/UNLICENSE'
|
||
] as const
|
||
|
||
/** The skill plugin native-chat agents load by path; mirrors resources/native-chat-visuals. */
|
||
export const ORCAD_NATIVE_CHAT_VISUALS_ARTIFACTS = [
|
||
'native-chat-visuals/.claude-plugin/plugin.json',
|
||
'native-chat-visuals/skills/orca-chat-visuals/SKILL.md'
|
||
] as const
|
||
|
||
/** Phones load this page via mobileWeb.bundle.*; its content-addressed assets are listed only in the manifest. */
|
||
export const ORCAD_MOBILE_WEB_DIR = 'out/mobile-web'
|
||
export const ORCAD_MOBILE_WEB_MANIFEST = `${ORCAD_MOBILE_WEB_DIR}/manifest.json`
|
||
|
||
// Mirrors manifest-contract ASSET_PATH_PATTERN; cannot import under type stripping.
|
||
const MOBILE_WEB_ASSET_PATH = /^[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*$/
|
||
|
||
/** A bundle-relative asset path that stays inside the page directory. */
|
||
export function isOrcadMobileWebAssetPath(path: string): boolean {
|
||
return (
|
||
MOBILE_WEB_ASSET_PATH.test(path) &&
|
||
!path.split('/').some((segment) => segment === '.' || segment === '..')
|
||
)
|
||
}
|
||
|
||
/** Slot paths of every asset `manifestText` lists, sorted; throws rather than ship a partial page. */
|
||
export function orcadMobileWebAssetFilenames(manifestText: string): string[] {
|
||
const manifest: unknown = JSON.parse(manifestText)
|
||
const assets =
|
||
manifest && typeof manifest === 'object' && 'assets' in manifest ? manifest.assets : undefined
|
||
if (!Array.isArray(assets) || assets.length === 0) {
|
||
throw new Error(`${ORCAD_MOBILE_WEB_MANIFEST} lists no assets`)
|
||
}
|
||
const filenames = assets.map((asset: unknown) => {
|
||
const path = asset && typeof asset === 'object' && 'path' in asset ? asset.path : undefined
|
||
if (typeof path !== 'string' || !isOrcadMobileWebAssetPath(path)) {
|
||
throw new Error(`${ORCAD_MOBILE_WEB_MANIFEST} names an unsafe asset path: ${String(path)}`)
|
||
}
|
||
return `${ORCAD_MOBILE_WEB_DIR}/${path}`
|
||
})
|
||
return filenames.sort(compareCodeUnits)
|
||
}
|
||
|
||
/** Code-unit order: page asset lists feed the install hash, so they must not depend on locale. */
|
||
export function compareCodeUnits(left: string, right: string): number {
|
||
return left < right ? -1 : left > right ? 1 : 0
|
||
}
|
||
|
||
export type OrcadArtifact = {
|
||
filename: string
|
||
/** Missing optional agent-browser means no headless browser, not a torn install; the remote probe must allow it. */
|
||
optional?: boolean
|
||
}
|
||
|
||
export const ORCAD_ARTIFACTS: readonly OrcadArtifact[] = [
|
||
{ filename: ORCAD_CLI_ENTRY_FILENAME },
|
||
{ filename: ORCAD_CLI_PACKAGE_FILENAME },
|
||
{ filename: ORCAD_LAUNCHER_FILENAME },
|
||
{ filename: ORCAD_SERVER_ENTRY_FILENAME },
|
||
// Forked so a native @parcel/watcher fault kills the child, not the server.
|
||
{ filename: 'parcel-watcher-process-entry.js' },
|
||
// Forked so PTYs outlive the runtime process; its absence makes every restart destructive.
|
||
{ filename: 'daemon-entry.js' },
|
||
{ filename: 'profile-state-writer-worker-entry.js' },
|
||
{ filename: 'profile-state-backup-worker-entry.js' },
|
||
// Worker thread that reads other apps' SQLite (the OpenCode binder and history) off the event loop.
|
||
{ filename: ORCAD_FOREIGN_SQLITE_READER_ENTRY },
|
||
{ filename: ORCAD_PORT_SCAN_COMMAND_WORKER_ENTRY },
|
||
// Forked so transcript parsing stays off the server's event loop; session search stays in-process.
|
||
{ filename: ORCAD_SESSION_SCANNER_SERVICE_ENTRY },
|
||
// Account worker threads keep CLI probes and Claude setup off the event loop.
|
||
{ filename: 'worker-thread-child-process-entry.js' },
|
||
{ filename: 'claude-profile-setup-worker-entry.js' },
|
||
// Dictation loads the recognizer named by orca serve (#31174).
|
||
{ filename: 'stt-worker.js' },
|
||
// The forked computer sidecar finds platform runtimes beside itself (#31777).
|
||
{ filename: ORCAD_COMPUTER_SIDECAR_ENTRY },
|
||
...ORCAD_COMPUTER_USE_RUNTIME_ARTIFACTS.map((filename) => ({ filename })),
|
||
// Target-specific even when the JavaScript bundle is shared across packaged slots.
|
||
{ filename: ORCAD_SERVER_TARGET_FILENAME },
|
||
// orcad never depends on a host runtime or host-installed native module.
|
||
{ filename: ORCAD_NODE_RUNTIME_MARKER_FILENAME },
|
||
{ filename: ORCAD_PARCEL_WATCHER_ENTRY },
|
||
{ filename: ORCAD_PARCEL_WATCHER_NATIVE },
|
||
{ filename: ORCAD_EMOJI_SHORTCODE_DATASET },
|
||
{ filename: ORCAD_LINEAR_SDK_ENTRY },
|
||
...ORCAD_NODE_PTY_JS_ARTIFACTS.map((filename) => ({ filename })),
|
||
...ORCAD_RIPGREP_LICENSE_ARTIFACTS.map((filename) => ({ filename })),
|
||
...ORCAD_NATIVE_CHAT_VISUALS_ARTIFACTS.map((filename) => ({ filename })),
|
||
// Missing page suppresses mobileWeb.bundle.v1, leaving paired phones without a page.
|
||
{ filename: ORCAD_MOBILE_WEB_MANIFEST }
|
||
]
|
||
|
||
/** Written after the artifacts, so it is never an input to its own hash. */
|
||
export const ORCAD_VERSION_FILENAME = '.version'
|
||
export const ORCAD_TEMPLATE_MANIFEST_FILENAME = 'orcad-template.json'
|
||
export const ORCAD_TEMPLATE_TARGETS_DIR = 'targets'
|
||
|
||
/** Written last by the installer; its absence means a torn install. */
|
||
export const ORCAD_INSTALL_COMPLETE_FILENAME = '.install-complete'
|
||
|
||
/** Slot files in hash order for <os>-<arch>[-<libc>]; mobileWebAssets comes from the slot’s own page manifest. */
|
||
export function orcadArtifactFilenames(
|
||
target: string,
|
||
mobileWebAssets: readonly string[]
|
||
): string[] {
|
||
const filenames = ORCAD_ARTIFACTS.filter((artifact) => !artifact.optional).map(
|
||
(artifact) => artifact.filename
|
||
)
|
||
filenames.push(...orcadNodePtyNativeArtifacts(target), orcadRipgrepArtifact(target))
|
||
if (isWindowsTarget(target)) {
|
||
filenames.push(
|
||
ORCAD_WINDOWS_PROCESS_TREE_FILENAME,
|
||
ORCAD_WINDOWS_SECURITY_FILENAME,
|
||
ORCAD_WINDOWS_CLI_LAUNCHER_FILENAME
|
||
)
|
||
}
|
||
filenames.push(...mobileWebAssets)
|
||
return filenames
|
||
}
|
||
|
||
/** Files shared by every template target; the rest live under `targets/<target>/`. */
|
||
export function orcadTemplateCommonFilenames(mobileWebAssets: readonly string[]): string[] {
|
||
const filenames = ORCAD_ARTIFACTS.filter(
|
||
(artifact) =>
|
||
!artifact.optional &&
|
||
artifact.filename !== ORCAD_SERVER_TARGET_FILENAME &&
|
||
artifact.filename !== ORCAD_NODE_RUNTIME_MARKER_FILENAME &&
|
||
artifact.filename !== ORCAD_PARCEL_WATCHER_NATIVE
|
||
).map((artifact) => artifact.filename)
|
||
filenames.push(...mobileWebAssets)
|
||
return filenames
|
||
}
|
||
|
||
/** Files stored under the template's `targets/<target>/`, at their slot-relative paths. */
|
||
export function orcadTemplateTargetFilenames(target: string): string[] {
|
||
const common = new Set(orcadTemplateCommonFilenames([]))
|
||
return orcadArtifactFilenames(target, []).filter((filename) => !common.has(filename))
|
||
}
|