mirror of
https://github.com/stablyai/orca.git
synced 2026-11-02 01:57:57 +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>
234 lines
8.2 KiB
TypeScript
234 lines
8.2 KiB
TypeScript
export type ProcessTableRow = {
|
||
pid: number
|
||
ppid: number
|
||
/** Process group id. Optional only on rows produced by the legacy parser input shape. */
|
||
pgid?: number
|
||
/** Terminal foreground process group id (`0`/`-1` means no controlling tty). */
|
||
tpgid?: number
|
||
/** Controlling terminal name, when the host process table provides it. */
|
||
tty?: string
|
||
/** Opaque host process start marker (Linux /proc ticks or host ps marker). */
|
||
startTime?: string
|
||
stat: string
|
||
command: string
|
||
}
|
||
|
||
// Guard process at module load: sandboxed renderers import this half and a bare read would crash the chunk/app.
|
||
const HOST_IS_DARWIN = typeof process !== 'undefined' && process.platform === 'darwin'
|
||
|
||
/** Columns used by the evidence reader. Keep command last so its spaces survive parsing. */
|
||
export const PS_ARGS = (
|
||
HOST_IS_DARWIN
|
||
? ['-axo', 'pid=,ppid=,pgid=,tpgid=,stat=,tty=,lstart=,command=']
|
||
: ['-axo', 'pid=,ppid=,pgid=,tpgid=,stat=,tty=,etimes=,command=']
|
||
) as readonly string[]
|
||
|
||
/** Cheap tier proves unchanged subtrees, never process names. Drop costly macOS tty (0.29/0.34s at 1,900 processes)
|
||
* and Linux argv (1.15s); omit ticking etimes and read stable /proc starts for the pane subtree. */
|
||
export const CHEAP_PS_ARGS = (
|
||
HOST_IS_DARWIN
|
||
? ['-axo', 'pid=,ppid=,pgid=,tpgid=,stat=,lstart=']
|
||
: ['-axo', 'pid=,ppid=,pgid=,tpgid=,stat=']
|
||
) as readonly string[]
|
||
|
||
/** Shell-proof tier keeps job control/argv, dropping costly unused tty/start columns; enough to name foreground processes,
|
||
* never correlate reused PIDs across captures. */
|
||
export const SHELL_FOREGROUND_PS_ARGS = [
|
||
'-axo',
|
||
'pid=,ppid=,pgid=,tpgid=,stat=,command='
|
||
] as readonly string[]
|
||
|
||
/** Match shell-tier columns exactly: the full parser’s optional tty/start pair eats argv like python 3 app.py and misreads zombies.
|
||
* Drop invalid rows, but reject empty captures so missing data cannot prove the shell exited. */
|
||
export function parseShellForegroundRows(stdout: string): ProcessTableRow[] {
|
||
const rows: ProcessTableRow[] = []
|
||
for (const rawLine of stdout.split(/\r?\n/)) {
|
||
const match = rawLine.trim().match(/^(\d+)\s+(\d+)\s+(-?\d+)\s+(-?\d+)\s+(\S+)\s+(.+)$/)
|
||
const pid = match ? Number(match[1]) : 0
|
||
if (match && Number.isSafeInteger(pid) && pid > 0) {
|
||
rows.push({
|
||
pid,
|
||
ppid: Number(match[2]),
|
||
pgid: Number(match[3]),
|
||
tpgid: Number(match[4]),
|
||
stat: match[5],
|
||
command: match[6]
|
||
})
|
||
}
|
||
}
|
||
if (rows.length === 0) {
|
||
throw new ProcessTableCaptureError('empty_capture')
|
||
}
|
||
return rows
|
||
}
|
||
|
||
export type CheapProcessTableRow = {
|
||
pid: number
|
||
ppid: number
|
||
pgid: number
|
||
tpgid: number
|
||
stat: string
|
||
/** Host start marker when the column set carries one (macOS `lstart`). */
|
||
startTime?: string
|
||
}
|
||
|
||
/** Lenient cheap rows only make fingerprints differ and trigger strict capture; empty still means unreadable, never no processes. */
|
||
export function parseCheapProcessTableRows(stdout: string): CheapProcessTableRow[] {
|
||
const rows: CheapProcessTableRow[] = []
|
||
for (const rawLine of stdout.split(/\r?\n/)) {
|
||
const match = rawLine.trim().match(/^(\d+)\s+(\d+)\s+(-?\d+)\s+(-?\d+)\s+(\S+)(?:\s+(.+?))?$/)
|
||
if (!match) {
|
||
continue
|
||
}
|
||
const pid = Number(match[1])
|
||
if (!Number.isSafeInteger(pid) || pid <= 0) {
|
||
continue
|
||
}
|
||
rows.push({
|
||
pid,
|
||
ppid: Number(match[2]),
|
||
pgid: Number(match[3]),
|
||
tpgid: Number(match[4]),
|
||
stat: match[5],
|
||
...(match[6] !== undefined ? { startTime: match[6] } : {})
|
||
})
|
||
}
|
||
if (rows.length === 0) {
|
||
throw new ProcessTableCaptureError('empty_capture')
|
||
}
|
||
return rows
|
||
}
|
||
|
||
// Node’s 1MB default overflows busy captures (~326KB/1,460 rows; 5KB argv is ordinary), making all reads unverifiable.
|
||
// Match pty-descendant-termination.ts’s 32MB ceiling.
|
||
export const PS_MAX_BUFFER_BYTES = 32 * 1024 * 1024
|
||
|
||
/** TTL beyond capture duration; reported age includes both. Renderer cadence also needs this bound,
|
||
* so keep it out of the node:child_process reader graph. */
|
||
export const PROCESS_TABLE_SNAPSHOT_MAX_STALENESS_MS = 500
|
||
|
||
/** Parse legacy/evidence ps rows with CRLF tolerance; anchored greedy final command preserves internal spaces. */
|
||
export function parseProcessTableRows(stdout: string): ProcessTableRow[] {
|
||
const rows: ProcessTableRow[] = []
|
||
for (const line of stdout.split(/\r?\n/)) {
|
||
const trimmed = line.trim()
|
||
const macStartMatch = trimmed.match(
|
||
/^(\d+)\s+(\d+)\s+(-?\d+)\s+(-?\d+)\s+(\S+)\s+(\S+)\s+(\S+\s+\S+\s+\d{1,2}\s+\S+\s+\d{4})\s+(.+)$/
|
||
)
|
||
if (macStartMatch) {
|
||
rows.push({
|
||
pid: Number(macStartMatch[1]),
|
||
ppid: Number(macStartMatch[2]),
|
||
pgid: Number(macStartMatch[3]),
|
||
tpgid: Number(macStartMatch[4]),
|
||
stat: macStartMatch[5],
|
||
tty: macStartMatch[6],
|
||
startTime: macStartMatch[7],
|
||
command: macStartMatch[8]
|
||
})
|
||
continue
|
||
}
|
||
const evidenceMatch = trimmed.match(
|
||
/^(\d+)\s+(\d+)\s+(?:(-?\d+)\s+(-?\d+)\s+)?(\S+)(?:\s+(\S+)\s+(\d+))?\s+(.+)$/
|
||
)
|
||
if (evidenceMatch) {
|
||
rows.push({
|
||
pid: Number(evidenceMatch[1]),
|
||
ppid: Number(evidenceMatch[2]),
|
||
...(evidenceMatch[3] !== undefined
|
||
? { pgid: Number(evidenceMatch[3]), tpgid: Number(evidenceMatch[4]) }
|
||
: {}),
|
||
stat: evidenceMatch[5] ?? evidenceMatch[3],
|
||
...(evidenceMatch[7] !== undefined
|
||
? { tty: evidenceMatch[6], startTime: evidenceMatch[7] }
|
||
: {}),
|
||
command: evidenceMatch[8] ?? evidenceMatch[6] ?? evidenceMatch[4]
|
||
} as ProcessTableRow)
|
||
continue
|
||
}
|
||
const legacyMatch = trimmed.match(
|
||
/^((?:\d+)\s+(?:\d+)\s+)(?:(-?\d+)\s+(-?\d+)\s+)?(\S+)\s+(.+)$/
|
||
)
|
||
if (legacyMatch) {
|
||
rows.push({
|
||
pid: Number(legacyMatch[1].trim().split(/\s+/)[0]),
|
||
ppid: Number(legacyMatch[1].trim().split(/\s+/)[1]),
|
||
...(legacyMatch[2] !== undefined
|
||
? { pgid: Number(legacyMatch[2]), tpgid: Number(legacyMatch[3]) }
|
||
: {}),
|
||
stat: legacyMatch[4],
|
||
command: legacyMatch[5]
|
||
} as ProcessTableRow)
|
||
}
|
||
}
|
||
return rows
|
||
}
|
||
|
||
export class ProcessTableCaptureError extends Error {
|
||
readonly code = 'process_table_unreadable'
|
||
|
||
constructor(readonly reason: string) {
|
||
super(`process table unreadable: ${reason}`)
|
||
this.name = 'ProcessTableCaptureError'
|
||
}
|
||
}
|
||
|
||
/** Require every nonframing row: silently dropping truncation could falsely prove no agent. Accept kernel/TTY sentinels
|
||
* ppid/pgid=0 and tpgid=-1/0; reject pid<=0, negative ppid/pgid or tpgid<-1. Empty/header-only captures are unreadable. */
|
||
export function parseStrictProcessTableRows(stdout: string): ProcessTableRow[] {
|
||
const rows: ProcessTableRow[] = []
|
||
for (const rawLine of stdout.split(/\r?\n/)) {
|
||
const line = rawLine.trim()
|
||
if (!line) {
|
||
continue
|
||
}
|
||
if (/^PID\s+PPID\s+PGID\s+TPGID\s+STAT\s+COMMAND$/i.test(line)) {
|
||
continue
|
||
}
|
||
const macStartMatch = line.match(
|
||
/^(\d+)\s+(\d+)\s+(-?\d+)\s+(-?\d+)\s+(\S+)\s+(\S+)\s+(\S+\s+\S+\s+\d{1,2}\s+\S+\s+\d{4})\s+(.+)$/
|
||
)
|
||
const numericMatch = macStartMatch
|
||
? null
|
||
: line.match(/^(\d+)\s+(\d+)\s+(-?\d+)\s+(-?\d+)\s+(\S+)(?:\s+(\S+)\s+(\d+))?\s+(.+)$/)
|
||
if (!numericMatch && !macStartMatch) {
|
||
throw new ProcessTableCaptureError('malformed_row')
|
||
}
|
||
const match = numericMatch ?? macStartMatch!
|
||
const pid = Number(match[1])
|
||
const ppid = Number(match[2])
|
||
const pgid = Number(match[3])
|
||
const tpgid = Number(match[4])
|
||
if (
|
||
!Number.isSafeInteger(pid) ||
|
||
pid <= 0 ||
|
||
!Number.isSafeInteger(ppid) ||
|
||
ppid < 0 ||
|
||
!Number.isSafeInteger(pgid) ||
|
||
pgid < 0 ||
|
||
!Number.isSafeInteger(tpgid) ||
|
||
(tpgid < 0 && tpgid !== -1) ||
|
||
(match[8] ?? match[6]).length === 0
|
||
) {
|
||
throw new ProcessTableCaptureError('invalid_numeric_field')
|
||
}
|
||
rows.push({
|
||
pid,
|
||
ppid,
|
||
pgid,
|
||
tpgid,
|
||
stat: match[5],
|
||
...(numericMatch && match[7] !== undefined
|
||
? { tty: match[6], startTime: match[7] }
|
||
: macStartMatch
|
||
? { tty: match[6], startTime: match[7] }
|
||
: {}),
|
||
command: numericMatch ? (match[8] ?? match[6]) : match[8]
|
||
})
|
||
}
|
||
if (rows.length === 0) {
|
||
throw new ProcessTableCaptureError('empty_capture')
|
||
}
|
||
return rows
|
||
}
|