[GH-ISSUE #96] Use MCP elicitation for scoped process-capture session grants #62

Closed
opened 2026-10-15 18:20:40 +00:00 by bsakaguchi · 10 comments
Owner

Originally created by @morluto on GitHub (Jul 13, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/96

Problem

Dynamic and filesystem-backed REA capabilities currently require policy to be configured through startup environment variables. This is a strong ceiling, but first use is cumbersome: users must edit MCP configuration and restart the client even when they want a narrow grant for the current workspace and session.

The problem is broader than process capture. The same ceremony affects evidence import/export, investigation inputs/workspaces, persistent snapshots, native DMG mounting, controlled replay, and other capabilities that require bounded local roots or explicit dynamic authority.

Proposal: one scoped capability-grant system

Use MCP elicitation/create when supported to offer precise grants:

  • Allow once: one operation.
  • Allow for session: held in memory and revoked when the MCP connection closes; recommended default.
  • Remember for project: optional persistent grant with audit and revoke commands.
  • Deny/cancel: preserve refusal behavior.

The same policy evaluator should serve every gated capability rather than creating one ad hoc mechanism per tool family.

Grant dimensions

  • capability: process capture, evidence read/write, investigation input, investigation workspace write, snapshot read/write, native mount, controlled replay, browser/Electron observation;
  • executable paths/roots and working roots;
  • readable/writable/observable filesystem roots;
  • environment variable names, never secret values;
  • network mode: none, loopback-only, or external/host;
  • provider/target restrictions;
  • operation count, byte/time/process budgets where relevant;
  • lifetime: once, connection/session, project persistent;
  • startup/administrator ceiling and whether expansion is possible only through trusted local setup.

Every request must prove it is a subset of the active grant. Any expansion elicits again.

Suggested flow

agent invokes gated operation
  -> REA computes exact missing scope
  -> elicitation/create presents bounded grant
  -> user accepts once/session/project, declines, or cancels
  -> REA records an auditable grant
  -> original operation resumes without a server restart

For clients without elicitation, return a structured permission-required result containing the exact configuration, affected path/capability, safe narrow value, and whether restart is required.

Security requirements

  • Elicitation never silently widens a startup/administrator ceiling.
  • Connection grants disappear on disconnect and cannot leak across clients.
  • roots/list may suggest boundaries but is not authorization.
  • Per-call explicit approval remains required for process execution, extraction, native mounting, replay, and other high-impact operations.
  • Persistent grants are inspectable, attributable, expiring/revocable, and stored without secret values.
  • Symlink/reparse and path-containment checks occur at use time, not only grant time.
  • Loopback-only networking is independently enforceable from external networking.
  • A grant to read evidence does not imply permission to write or execute it.
  • Tool descriptions and annotations accurately disclose effects.

Acceptance criteria

  • An elicitation-capable client can grant one process capture without editing config or restarting.
  • The same mechanism grants bounded evidence, investigation, snapshot, mount, replay, and observation capabilities.
  • Session grants are reusable only for subset requests and revoke on disconnect.
  • Scope expansion triggers new elicitation.
  • Once grants are consumed atomically and cannot race into multiple operations.
  • Project grants are inspectable, expiring/revocable, and audit logged.
  • Non-elicitation clients receive typed actionable fallback instructions.
  • Loopback-only networking is separately enforced.
  • Tests cover accept, decline, cancel, disconnect, subset, expansion, concurrency, expiry, revocation, symlink drift, and fallback.
  • Capability-aware discovery in #101 updates after grant/revoke.
  • Documentation explains ceilings, grants, per-call approval, and capability-specific effects.

Motivation

This is needed for smooth agent-led local analysis while retaining explicit, least-authority control. REA is local by design, but local execution and filesystem access still deserve precise, inspectable grants rather than either broad permanent policy or repeated manual restarts.

Policy layers and precedence

Treat authority as the intersection of independently auditable layers:

effective authority
  = administrator/startup ceiling
  ∩ client-declared roots/capabilities
  ∩ persistent project grant (optional)
  ∩ connection/session grant
  ∩ per-operation approval

No lower layer can widen an upper layer. A denial should identify the first constraining layer without exposing secret configuration.

Grant record

A versioned grant should include:

  • opaque grant ID, issuer/client connection identity, creation/expiry/revocation timestamps;
  • capability and normalized operation family;
  • canonical executable and filesystem scopes with access mode;
  • environment-variable names and whether inherit/set/remove is allowed;
  • network scope and permitted endpoints;
  • provider/target constraints and immutable target digests where relevant;
  • resource budgets;
  • lifetime and remaining use count;
  • parent ceiling/policy digest;
  • human-readable reason shown during elicitation;
  • audit references for issuance, use, refusal, expiration, and revocation.

Secret values, authorization headers, captured content, and raw credentials must never be copied into the grant or audit record.

Scope algebra

Implement and test subset checks as a reusable library. Important rules include:

  • read, write, execute, observe, mount, and network are separate rights;
  • a child path is a subset only after canonicalization and use-time containment checks;
  • executable identity may bind both canonical path and digest;
  • loopback is not a subset of network: none, and external networking is not a subset of loopback;
  • larger timeout/count/byte/process limits are expansions;
  • adding environment names or changing inherit behavior is an expansion;
  • a different provider, target digest, or workspace is an expansion;
  • unknown/unsupported dimensions fail closed.

Elicitation UX contract

The prompt should show the exact delta, not the union of all possible authority:

REA wants to capture one local process
Executable: /canonical/path/to/tool
Working directory: /canonical/project/root
Read: /canonical/project/root/fixtures
Write: isolated temporary evidence directory
Network: loopback only
Maximum duration: 30 seconds
Processes: root plus descendants, maximum 8

Clients should receive structured choices and machine-readable scope. If the client supports only form elicitation, map the choices without asking for secrets. If elicitation is cancelled or declined, the original tool call must end with a typed non-success result and no partial launch.

Lifecycle and concurrency

  • Bind session grants to the MCP transport connection, not a user name or process-global singleton.
  • Reserve an allow once grant atomically before side effects; refund it only if preflight fails before any protected action.
  • Revocation prevents new protected actions and requests cancellation of active actions where safe, while preserving evidence.
  • Expiration uses monotonic time during a process and wall-clock timestamps for audit display.
  • Reconnect never resurrects a session grant.
  • Multiple server instances must not race persistent grant updates; use transactional storage and revision checks.

Typed errors and observability

Use stable error codes such as grant_required, grant_declined, grant_cancelled, scope_expansion_required, ceiling_denied, grant_expired, grant_revoked, and client_elicitation_unsupported. Include the requested scope, missing delta, recoverability, and safe next action.

Expose grant listing, explanation, revocation, and audit inspection through CLI and—where safe—MCP resources. Capability discovery in #101 should identify operations that would become available after an elicitable grant without implying that approval is guaranteed.

Migration and delivery

  1. Model existing environment policy as the administrator ceiling; preserve current fail-closed behavior.
  2. Add in-memory once/session grants and non-elicitation structured fallbacks.
  3. Add elicitation resume flow and discovery refresh.
  4. Add optional persistent project grants, audit/revoke tooling, expiry, and concurrency controls.
  5. Migrate gated capability families to the shared evaluator and remove bespoke permission branches only after parity tests.
Originally created by @morluto on GitHub (Jul 13, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/96 ## Problem Dynamic and filesystem-backed REA capabilities currently require policy to be configured through startup environment variables. This is a strong ceiling, but first use is cumbersome: users must edit MCP configuration and restart the client even when they want a narrow grant for the current workspace and session. The problem is broader than process capture. The same ceremony affects evidence import/export, investigation inputs/workspaces, persistent snapshots, native DMG mounting, controlled replay, and other capabilities that require bounded local roots or explicit dynamic authority. ## Proposal: one scoped capability-grant system Use MCP `elicitation/create` when supported to offer precise grants: - **Allow once**: one operation. - **Allow for session**: held in memory and revoked when the MCP connection closes; recommended default. - **Remember for project**: optional persistent grant with audit and revoke commands. - **Deny/cancel**: preserve refusal behavior. The same policy evaluator should serve every gated capability rather than creating one ad hoc mechanism per tool family. ## Grant dimensions - capability: process capture, evidence read/write, investigation input, investigation workspace write, snapshot read/write, native mount, controlled replay, browser/Electron observation; - executable paths/roots and working roots; - readable/writable/observable filesystem roots; - environment variable names, never secret values; - network mode: none, loopback-only, or external/host; - provider/target restrictions; - operation count, byte/time/process budgets where relevant; - lifetime: once, connection/session, project persistent; - startup/administrator ceiling and whether expansion is possible only through trusted local setup. Every request must prove it is a subset of the active grant. Any expansion elicits again. ## Suggested flow ```text agent invokes gated operation -> REA computes exact missing scope -> elicitation/create presents bounded grant -> user accepts once/session/project, declines, or cancels -> REA records an auditable grant -> original operation resumes without a server restart ``` For clients without elicitation, return a structured permission-required result containing the exact configuration, affected path/capability, safe narrow value, and whether restart is required. ## Security requirements - Elicitation never silently widens a startup/administrator ceiling. - Connection grants disappear on disconnect and cannot leak across clients. - `roots/list` may suggest boundaries but is not authorization. - Per-call explicit approval remains required for process execution, extraction, native mounting, replay, and other high-impact operations. - Persistent grants are inspectable, attributable, expiring/revocable, and stored without secret values. - Symlink/reparse and path-containment checks occur at use time, not only grant time. - Loopback-only networking is independently enforceable from external networking. - A grant to read evidence does not imply permission to write or execute it. - Tool descriptions and annotations accurately disclose effects. ## Acceptance criteria - [ ] An elicitation-capable client can grant one process capture without editing config or restarting. - [ ] The same mechanism grants bounded evidence, investigation, snapshot, mount, replay, and observation capabilities. - [ ] Session grants are reusable only for subset requests and revoke on disconnect. - [ ] Scope expansion triggers new elicitation. - [ ] Once grants are consumed atomically and cannot race into multiple operations. - [ ] Project grants are inspectable, expiring/revocable, and audit logged. - [ ] Non-elicitation clients receive typed actionable fallback instructions. - [ ] Loopback-only networking is separately enforced. - [ ] Tests cover accept, decline, cancel, disconnect, subset, expansion, concurrency, expiry, revocation, symlink drift, and fallback. - [ ] Capability-aware discovery in #101 updates after grant/revoke. - [ ] Documentation explains ceilings, grants, per-call approval, and capability-specific effects. ## Motivation This is needed for smooth agent-led local analysis while retaining explicit, least-authority control. REA is local by design, but local execution and filesystem access still deserve precise, inspectable grants rather than either broad permanent policy or repeated manual restarts. ## Policy layers and precedence Treat authority as the intersection of independently auditable layers: ```text effective authority = administrator/startup ceiling ∩ client-declared roots/capabilities ∩ persistent project grant (optional) ∩ connection/session grant ∩ per-operation approval ``` No lower layer can widen an upper layer. A denial should identify the first constraining layer without exposing secret configuration. ## Grant record A versioned grant should include: - opaque grant ID, issuer/client connection identity, creation/expiry/revocation timestamps; - capability and normalized operation family; - canonical executable and filesystem scopes with access mode; - environment-variable names and whether inherit/set/remove is allowed; - network scope and permitted endpoints; - provider/target constraints and immutable target digests where relevant; - resource budgets; - lifetime and remaining use count; - parent ceiling/policy digest; - human-readable reason shown during elicitation; - audit references for issuance, use, refusal, expiration, and revocation. Secret values, authorization headers, captured content, and raw credentials must never be copied into the grant or audit record. ## Scope algebra Implement and test subset checks as a reusable library. Important rules include: - read, write, execute, observe, mount, and network are separate rights; - a child path is a subset only after canonicalization and use-time containment checks; - executable identity may bind both canonical path and digest; - loopback is not a subset of `network: none`, and external networking is not a subset of loopback; - larger timeout/count/byte/process limits are expansions; - adding environment names or changing inherit behavior is an expansion; - a different provider, target digest, or workspace is an expansion; - unknown/unsupported dimensions fail closed. ## Elicitation UX contract The prompt should show the exact delta, not the union of all possible authority: ```text REA wants to capture one local process Executable: /canonical/path/to/tool Working directory: /canonical/project/root Read: /canonical/project/root/fixtures Write: isolated temporary evidence directory Network: loopback only Maximum duration: 30 seconds Processes: root plus descendants, maximum 8 ``` Clients should receive structured choices and machine-readable scope. If the client supports only form elicitation, map the choices without asking for secrets. If elicitation is cancelled or declined, the original tool call must end with a typed non-success result and no partial launch. ## Lifecycle and concurrency - Bind session grants to the MCP transport connection, not a user name or process-global singleton. - Reserve an `allow once` grant atomically before side effects; refund it only if preflight fails before any protected action. - Revocation prevents new protected actions and requests cancellation of active actions where safe, while preserving evidence. - Expiration uses monotonic time during a process and wall-clock timestamps for audit display. - Reconnect never resurrects a session grant. - Multiple server instances must not race persistent grant updates; use transactional storage and revision checks. ## Typed errors and observability Use stable error codes such as `grant_required`, `grant_declined`, `grant_cancelled`, `scope_expansion_required`, `ceiling_denied`, `grant_expired`, `grant_revoked`, and `client_elicitation_unsupported`. Include the requested scope, missing delta, recoverability, and safe next action. Expose grant listing, explanation, revocation, and audit inspection through CLI and—where safe—MCP resources. Capability discovery in #101 should identify operations that would become available after an elicitable grant without implying that approval is guaranteed. ## Migration and delivery 1. Model existing environment policy as the administrator ceiling; preserve current fail-closed behavior. 2. Add in-memory once/session grants and non-elicitation structured fallbacks. 3. Add elicitation resume flow and discovery refresh. 4. Add optional persistent project grants, audit/revoke tooling, expiry, and concurrency controls. 5. Migrate gated capability families to the shared evaluator and remove bespoke permission branches only after parity tests.
bsakaguchi 2026-10-15 18:20:40 +00:00
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Implementation design audit found two prerequisites that must be resolved before elicitation can safely authorize production capture. First, current configuration turns every permission ceiling into an administrator grant (src/config.ts constructs administrator grants directly from ceilings). Therefore production has either an already-authorized configured scope or no ceiling at all; there is no ceiling-only state within which an elicited grant can operate. Elicitation must not silently install or widen the administrator ceiling. Second, process scenarios currently expose host networking and the PTY backend has no OS-enforced loopback containment, so adding a loopback enum would be a false security claim. The installed MCP SDK also requires a cross-era inputRequired continuation rather than a direct legacy-only elicitInput call. Proposed prerequisite decisions: add an explicit ceiling-only configuration/trusted local ceiling-install flow, and choose a real per-platform loopback containment backend. After that, implement a connection-owned once/session grant adapter using signed request state, canonical scope commitment, accept/decline/cancel parsing, subset reauthorization, and disconnect cleanup. Non-capable and outside-ceiling calls must retain the current typed fallback.

<!-- gh-comment-id:5001847394 --> @morluto commented on GitHub (Jul 17, 2026): Implementation design audit found two prerequisites that must be resolved before elicitation can safely authorize production capture. First, current configuration turns every permission ceiling into an administrator grant (src/config.ts constructs administrator grants directly from ceilings). Therefore production has either an already-authorized configured scope or no ceiling at all; there is no ceiling-only state within which an elicited grant can operate. Elicitation must not silently install or widen the administrator ceiling. Second, process scenarios currently expose host networking and the PTY backend has no OS-enforced loopback containment, so adding a loopback enum would be a false security claim. The installed MCP SDK also requires a cross-era inputRequired continuation rather than a direct legacy-only elicitInput call. Proposed prerequisite decisions: add an explicit ceiling-only configuration/trusted local ceiling-install flow, and choose a real per-platform loopback containment backend. After that, implement a connection-owned once/session grant adapter using signed request state, canonical scope commitment, accept/decline/cancel parsing, subset reauthorization, and disconnect cleanup. Non-capable and outside-ceiling calls must retain the current typed fallback.
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Implemented the first prerequisite on the current branch: REA_PROCESS_CAPTURE_AUTO_GRANT=false now configures the enabled process-capture boundary as an administrator ceiling without installing an administrator-lifetime grant. The default remains true for compatibility. Documentation states that ceiling-only mode is fail-closed and does not itself authorize capture; focused configuration and permission tests pass, and npm run check passes on the exact tree. The canonical process-capture PermissionRequest is also now shared by CLI and MCP. Context7 plus the installed @modelcontextprotocol/server 2.0.0-beta.4 types confirm the next slice must use the current multi-round inputRequired/inputRequired.elicit flow with integrity-protected requestState, not a direct legacy-only elicitInput call. Remaining #96 scope: advertise elicitation, implement signed accept-once/session retries and decline/cancel/fallback handling, bind session grants to connection cleanup, add trusted project persistence/audit flow, and separately deliver real loopback containment before advertising loopback-only networking. The issue remains open.

<!-- gh-comment-id:5002834520 --> @morluto commented on GitHub (Jul 17, 2026): Implemented the first prerequisite on the current branch: REA_PROCESS_CAPTURE_AUTO_GRANT=false now configures the enabled process-capture boundary as an administrator ceiling without installing an administrator-lifetime grant. The default remains true for compatibility. Documentation states that ceiling-only mode is fail-closed and does not itself authorize capture; focused configuration and permission tests pass, and npm run check passes on the exact tree. The canonical process-capture PermissionRequest is also now shared by CLI and MCP. Context7 plus the installed @modelcontextprotocol/server 2.0.0-beta.4 types confirm the next slice must use the current multi-round inputRequired/inputRequired.elicit flow with integrity-protected requestState, not a direct legacy-only elicitInput call. Remaining #96 scope: advertise elicitation, implement signed accept-once/session retries and decline/cancel/fallback handling, bind session grants to connection cleanup, add trusted project persistence/audit flow, and separately deliver real loopback containment before advertising loopback-only networking. The issue remains open.
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Implemented and validated the next #96 slice in the current worktree:

  • REA_PROCESS_CAPTURE_AUTO_GRANT=false now installs the configured process-capture boundary as an administrator ceiling without an implicit grant.
  • Process-capture MCP authorization can issue a signed, ten-minute input-required continuation for the exact executable, roots, environment names, network scope, and operation identity.
  • Accepted grants support once and session; once grants are consumed immediately by the retried operation.
  • Continuation nonces are consumed on accept, decline, or cancel, so a terminal response cannot be replayed.
  • Altered, expired, unsupported, or out-of-ceiling continuations fail closed to the existing structured permission-required result.
  • Session grants are cleared when the REA stdio MCP connection closes.
  • Documentation now states the protocol gate truthfully.

Validation: npm run check passed on the exact final tree (159 test files, 1,052 tests), followed by git diff --check.

This issue should remain open. The currently pinned MCP SDK type surface includes multi-round input-required APIs, but its runtime negotiates the older protocol path; attempting the legacy automatic shim hung in integration testing. REA therefore does not advertise or wait for elicitation on that runtime. A real elicitation-capable runtime/client round trip, project-lifetime grant UX/audit/revocation, and enforceable loopback-only process containment remain separate acceptance gaps.

<!-- gh-comment-id:5003141732 --> @morluto commented on GitHub (Jul 17, 2026): Implemented and validated the next #96 slice in the current worktree: - `REA_PROCESS_CAPTURE_AUTO_GRANT=false` now installs the configured process-capture boundary as an administrator ceiling without an implicit grant. - Process-capture MCP authorization can issue a signed, ten-minute input-required continuation for the exact executable, roots, environment names, network scope, and operation identity. - Accepted grants support `once` and `session`; once grants are consumed immediately by the retried operation. - Continuation nonces are consumed on accept, decline, or cancel, so a terminal response cannot be replayed. - Altered, expired, unsupported, or out-of-ceiling continuations fail closed to the existing structured permission-required result. - Session grants are cleared when the REA stdio MCP connection closes. - Documentation now states the protocol gate truthfully. Validation: `npm run check` passed on the exact final tree (159 test files, 1,052 tests), followed by `git diff --check`. This issue should remain open. The currently pinned MCP SDK type surface includes multi-round input-required APIs, but its runtime negotiates the older protocol path; attempting the legacy automatic shim hung in integration testing. REA therefore does not advertise or wait for elicitation on that runtime. A real elicitation-capable runtime/client round trip, project-lifetime grant UX/audit/revocation, and enforceable loopback-only process containment remain separate acceptance gaps.
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Current-main update (2026-07-17):

The signed once/session elicitation groundwork is implemented and covered locally: exact-request continuations, nonce consumption, decline/cancel handling, legacy-protocol fail-closed behavior, and connection-close cleanup. The pinned MCP runtime still negotiates the older protocol, so no production interactive grant is claimed yet.

An independent final-diff review found that the next step must be re-scoped before enabling it:

  • once/session grants currently enter a process-global PermissionAuthority, so concurrent MCP connections could consume or revoke each other's grants;
  • project persistence cannot safely publish authority before a durable commit, while persisting first needs an exact rollback protocol;
  • SIGHUP can change the configured project store while an existing signed continuation still targets the old configuration;
  • the current project store uses pathname-based stat/read/write checks and mode bits, not same-handle no-follow ownership/private-DACL admission.

I removed the proposed project-lifetime append path rather than ship those authority and TOCTOU gaps. The focused suite passes (10 tests across elicitation, project-store, and reload coverage), and the complete pre-review tree passed npm run check (160 files / 1,060 tests).

Remaining order:

  1. introduce a per-connection once/session grant overlay and cross-connection tests;
  2. bind signed state to tool identity plus policy/config generation;
  3. land handle-based project-store admission/rollback (and keep Windows unavailable until the #287/#290 native path/DACL boundary exists);
  4. verify a real modern MCP client round trip;
  5. implement and prove enforceable loopback-only containment.

This issue remains open.

<!-- gh-comment-id:5004496645 --> @morluto commented on GitHub (Jul 17, 2026): Current-main update (2026-07-17): The signed once/session elicitation groundwork is implemented and covered locally: exact-request continuations, nonce consumption, decline/cancel handling, legacy-protocol fail-closed behavior, and connection-close cleanup. The pinned MCP runtime still negotiates the older protocol, so no production interactive grant is claimed yet. An independent final-diff review found that the next step must be re-scoped before enabling it: - once/session grants currently enter a process-global `PermissionAuthority`, so concurrent MCP connections could consume or revoke each other's grants; - project persistence cannot safely publish authority before a durable commit, while persisting first needs an exact rollback protocol; - SIGHUP can change the configured project store while an existing signed continuation still targets the old configuration; - the current project store uses pathname-based `stat`/read/write checks and mode bits, not same-handle no-follow ownership/private-DACL admission. I removed the proposed project-lifetime append path rather than ship those authority and TOCTOU gaps. The focused suite passes (10 tests across elicitation, project-store, and reload coverage), and the complete pre-review tree passed `npm run check` (160 files / 1,060 tests). Remaining order: 1. introduce a per-connection once/session grant overlay and cross-connection tests; 2. bind signed state to tool identity plus policy/config generation; 3. land handle-based project-store admission/rollback (and keep Windows unavailable until the #287/#290 native path/DACL boundary exists); 4. verify a real modern MCP client round trip; 5. implement and prove enforceable loopback-only containment. This issue remains open.
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Current-main update (2026-07-17):\n\nThe signed once/session elicitation groundwork is implemented and covered locally: exact-request continuations, nonce consumption, decline/cancel handling, legacy-protocol fail-closed behavior, and connection-close cleanup. The pinned MCP runtime still negotiates the older protocol, so no production interactive grant is claimed yet.\n\nAn independent final-diff review found that the next step must be re-scoped before enabling it:\n\n- once/session grants currently enter a process-global , so concurrent MCP connections could consume or revoke each other's grants;\n- project persistence cannot safely publish authority before a durable commit, while persisting first needs an exact rollback protocol;\n- SIGHUP can change the configured project store while an existing signed continuation still targets the old configuration;\n- the current project store uses pathname-based /read/write checks and mode bits, not same-handle no-follow ownership/private-DACL admission.\n\nI removed the proposed project-lifetime append path rather than ship those authority and TOCTOU gaps. The focused suite passes (10 tests across elicitation, project-store, and reload coverage), and the complete pre-review tree passed

rea-agents@2.0.0 precheck
npm run deps:check

rea-agents@2.0.0 deps:check
node scripts/check-dependency-install.mjs

rea-agents@2.0.0 check
npm run typecheck && npm run lint && npm run format:check && npm run docs:check && npm test

rea-agents@2.0.0 typecheck
tsc --noEmit

rea-agents@2.0.0 lint
oxlint

src/application/ArtifactInventory.ts:654:3: warning eslint(max-lines): File has too many lines (620). help: Maximum allowed is 500.
src/application/ArtifactInventory.ts:117:44: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/application/ArtifactInventory.ts:136:47: warning eslint(max-lines-per-function): The async function has too many lines (153). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/ArtifactInventory.ts:136:53: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/application/ArtifactInventory.ts:389:20: warning eslint(max-lines-per-function): The async function has too many lines (144). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/artifactComparison.ts:215:22: warning eslint(complexity): function has a complexity of 22. Maximum allowed is 20.
src/domain/managedApplicationGraph.ts:806:3: warning eslint(max-lines): File has too many lines (768). help: Maximum allowed is 500.
src/application/InvestigationWorkspaceStore.ts:86:57: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/application/AuthorizedArtifactInventory.ts:14:54: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/reconstructionCoverage.ts:890:3: warning eslint(max-lines): File has too many lines (839). help: Maximum allowed is 500.
src/domain/reconstructionCoverage.ts:521:32: warning eslint(max-lines-per-function): The function has too many lines (113). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/javascriptFeatureTraversal.ts:132:24: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/errors.ts:1161:3: warning eslint(max-lines): File has too many lines (1029). help: Maximum allowed is 500.
src/domain/errors.ts:549:14: warning eslint(max-params): Function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/javascriptApplicationVersionKeys.ts:76:19: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/javascriptApplicationVersionItems.ts:276:23: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/application/JavaScriptReplayService.ts:63:45: warning eslint(complexity): async function has a complexity of 37. Maximum allowed is 20.
src/application/JavaScriptReplayService.ts:63:45: warning eslint(max-lines-per-function): The async function has too many lines (268). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/functionComparison.ts:524:3: warning eslint(max-lines): File has too many lines (508). help: Maximum allowed is 500.
src/domain/browserObservation.ts:646:73: warning eslint(max-lines): File has too many lines (618). help: Maximum allowed is 500.
src/contracts/toolOutputSchemas.ts:655:3: warning eslint(max-lines): File has too many lines (637). help: Maximum allowed is 500.
src/domain/managedNativeVerification.ts:529:4: warning eslint(max-lines): File has too many lines (501). help: Maximum allowed is 500.
src/domain/managedNativeVerification.ts:188:46: warning eslint(max-lines-per-function): The function has too many lines (111). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/managedNativeVerification.ts:364:23: warning eslint(max-lines-per-function): The function has too many lines (104). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/managedNativeVerification.ts:364:23: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/managedMemberComparison.ts:770:3: warning eslint(max-lines): File has too many lines (726). help: Maximum allowed is 500.
src/domain/managedMemberComparison.ts:217:38: warning eslint(max-lines-per-function): The function has too many lines (104). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/managedMemberComparison.ts:401:27: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/managedReconstruction.ts:125:44: warning eslint(max-lines-per-function): The function has too many lines (103). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedMemberInspector.ts:1491:3: warning eslint(max-lines): File has too many lines (1447). help: Maximum allowed is 500.
src/dotnet/ManagedMemberInspector.ts:998:20: warning eslint(max-lines-per-function): The function has too many lines (131). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedMemberInspector.ts:1214:22: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/dotnet/ManagedMemberInspector.ts:1383:43: warning eslint(max-lines-per-function): The function has too many lines (109). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedPeReader.ts:98:16: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/dotnet/ManagedPeReader.ts:193:36: warning eslint(max-lines-per-function): The function has too many lines (104). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedMetadataInventory.ts:673:5: warning eslint(max-lines): File has too many lines (648). help: Maximum allowed is 500.
src/dotnet/ManagedMetadataInventory.ts:263:22: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/dotnet/ManagedMetadataInventory.ts:460:22: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/dotnet/ManagedMetadataLayout.ts:199:17: warning eslint(complexity): function has a complexity of 46. Maximum allowed is 20.
src/dotnet/ManagedMetadataLayout.ts:199:17: warning eslint(max-lines-per-function): The function has too many lines (107). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedMetadataLayout.ts:308:42: warning eslint(complexity): function has a complexity of 25. Maximum allowed is 20.
src/dotnet/ManagedMetadataLayout.ts:308:42: warning eslint(max-lines-per-function): The function has too many lines (144). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedNativeBoundaryInspector.ts:600:3: warning eslint(max-lines): File has too many lines (576). help: Maximum allowed is 500.
src/dotnet/ManagedNativeBoundaryInspector.ts:213:23: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/dotnet/ManagedNativeBoundaryInspector.ts:482:52: warning eslint(max-lines-per-function): The function has too many lines (119). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/CrossVersionInvestigation.ts:538:44: warning eslint(max-lines): File has too many lines (514). help: Maximum allowed is 500.
src/server/createServer.ts:69:29: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20.
src/server/createServer.ts:69:29: warning eslint(max-lines-per-function): The function has too many lines (213). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/BinarySession.ts:891:4: warning eslint(max-lines): File has too many lines (807). help: Maximum allowed is 500.
src/application/BinarySession.ts:405:7: warning eslint(max-lines-per-function): The method open has too many lines (110). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/BinarySession.ts:414:28: warning eslint(complexity): async function has a complexity of 30. Maximum allowed is 20.
src/application/BinarySession.ts:626:16: warning eslint(complexity): async method execute has a complexity of 24. Maximum allowed is 20.
src/config.ts:570:18: warning eslint(max-lines): File has too many lines (551). help: Maximum allowed is 500.
src/config.ts:319:28: warning eslint(complexity): function has a complexity of 28. Maximum allowed is 20.
src/config.ts:319:28: warning eslint(max-lines-per-function): The function has too many lines (242). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/replay/LinuxJavaScriptReplayRunner.ts:580:3: warning eslint(max-lines): File has too many lines (559). help: Maximum allowed is 500.
src/replay/LinuxJavaScriptReplayRunner.ts:33:16: warning eslint(complexity): async method execute has a complexity of 23. Maximum allowed is 20.
src/replay/LinuxJavaScriptReplayRunner.ts:33:16: warning eslint(max-lines-per-function): The async method execute has too many lines (171). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/replay/LinuxJavaScriptReplayRunner.ts:246:26: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/replay/LinuxJavaScriptReplayRunner.ts:542:27: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/server/registerEnhancedTools.ts:150:27: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20.
src/server/registerBrowserTools.ts:44:37: warning eslint(max-lines-per-function): The function has too many lines (227). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerSessionTools.ts:726:3: warning eslint(max-lines): File has too many lines (712). help: Maximum allowed is 500.
src/server/registerSessionTools.ts:225:31: warning eslint(max-lines-per-function): The function has too many lines (105). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerSessionTools.ts:443:32: warning eslint(max-lines-per-function): The function has too many lines (150). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerSessionTools.ts:614:37: warning eslint(max-lines-per-function): The function has too many lines (113). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerOfficialTools.ts:48:30: warning eslint(max-lines-per-function): The function has too many lines (106). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerElectronTools.ts:34:38: warning eslint(max-lines-per-function): The function has too many lines (122). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerApplicationTools.ts:74:41: warning eslint(max-lines-per-function): The function has too many lines (112). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerApplicationTools.ts:264:31: warning eslint(max-lines-per-function): The function has too many lines (134). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerManagedWorkflowTools.ts:43:45: warning eslint(max-lines-per-function): The function has too many lines (327). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/EnhancedTools.ts:563:5: warning eslint(max-lines): File has too many lines (529). help: Maximum allowed is 500.
src/server/registerSessionStatusTool.ts:16:42: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/server/registerInvestigationTools.ts:591:3: warning eslint(max-lines): File has too many lines (575). help: Maximum allowed is 500.
src/server/registerInvestigationTools.ts:75:32: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/server/registerInvestigationTools.ts:92:33: warning eslint(max-lines-per-function): The function has too many lines (161). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerInvestigationTools.ts:101:5: warning eslint(max-lines-per-function): The async function has too many lines (150). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerInvestigationTools.ts:394:32: warning eslint(max-lines-per-function): The function has too many lines (110). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/server/registerEvidenceResources.ts:17:42: warning eslint(max-lines-per-function): The function has too many lines (324). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/WindowsNativeAuthority.ts:837:75: warning eslint(max-lines): File has too many lines (715). help: Maximum allowed is 500.
tests/fixtures/managedPe.ts:112:22: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
tests/fixtures/managedPe.ts:267:38: warning eslint(complexity): function has a complexity of 23. Maximum allowed is 20.
src/application/RealHopperAssertions.ts:96:45: warning eslint(max-lines-per-function): The function has too many lines (101). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/DirectAnalysis.ts:86:42: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/application/DirectAnalysis.ts:250:21: warning eslint(complexity): async function has a complexity of 26. Maximum allowed is 20.
src/application/DirectAnalysis.ts:250:21: warning eslint(max-lines-per-function): The async function has too many lines (134). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/dotnet/ManagedArtifactInspector.ts:164:31: warning eslint(complexity): function has a complexity of 24. Maximum allowed is 20.
src/dotnet/ManagedArtifactInspector.ts:264:31: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/ghidra/GhidraProvider.ts:588:3: warning eslint(max-lines): File has too many lines (562). help: Maximum allowed is 500.
src/ghidra/GhidraClient.ts:597:2: warning eslint(max-lines): File has too many lines (566). help: Maximum allowed is 500.
src/ghidra/GhidraClient.ts:230:21: warning eslint(max-lines-per-function): The private async method startWithin has too many lines (107). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/lib/managed-pe-fixture.mjs:235:38: warning eslint(complexity): function has a complexity of 28. Maximum allowed is 20.
scripts/lib/managed-pe-fixture.mjs:235:38: warning eslint(max-lines-per-function): The function has too many lines (143). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-managed-conformance.mjs:1348:2: warning eslint(max-lines): File has too many lines (1295). help: Maximum allowed is 500.
scripts/verify-managed-conformance.mjs:659:1: warning eslint(max-lines-per-function): The async function runOptionalIlspyOracle has too many lines (127). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-managed-conformance.mjs:828:1: warning eslint(complexity): async function verifyManagedAppManifest has a complexity of 26. Maximum allowed is 20.
scripts/verify-managed-conformance.mjs:828:1: warning eslint(max-lines-per-function): The async function verifyManagedAppManifest has too many lines (110). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-managed-conformance.mjs:940:1: warning eslint(max-lines-per-function): The function verifyManagedAppManifestApplicationGraph has too many lines (126). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/browser/CdpObservationSession.ts:288:7: warning eslint(max-params): Function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/replay/JavaScriptReplayWorker.ts:298:17: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20.
src/browser/CdpCaptureDocuments.ts:315:21: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
scripts/lib/product-catalog.mjs:536:64: warning eslint(max-lines): File has too many lines (514). help: Maximum allowed is 500.
src/browser/CdpWebMcpDiscovery.ts:136:31: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20.
src/browser/CdpWebMcpDiscovery.ts:216:27: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/browser/CdpWebMcpDiscovery.ts:332:16: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/browser/PngVisualDiff.ts:180:21: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/webBundleAnalyzer.ts:640:3: warning eslint(max-lines): File has too many lines (610). help: Maximum allowed is 500.
src/domain/webBundleAnalyzer.ts:38:41: warning eslint(max-lines-per-function): The function has too many lines (121). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/domain/webBundleAnalyzer.ts:310:17: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/webBundleAnalyzer.ts:331:20: warning eslint(max-params): Arrow function has too many parameters (7). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/domain/webBundleAnalyzer.ts:411:36: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/browser/CdpCaptureEvents.ts:739:17: warning eslint(max-lines): File has too many lines (699). help: Maximum allowed is 500.
src/browser/CdpPageCapture.ts:632:6: warning eslint(max-lines): File has too many lines (610). help: Maximum allowed is 500.
src/browser/CdpPageCapture.ts:406:24: warning eslint(max-lines-per-function): The async function has too many lines (119). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/browser/CdpPageCapture.ts:406:30: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
tests/fixtures/fakeCdpBrowser.ts:359:19: warning eslint(complexity): function has a complexity of 24. Maximum allowed is 20.
tests/fixtures/fakeCdpBrowser.ts:639:20: warning eslint(complexity): function has a complexity of 30. Maximum allowed is 20.
src/application/Setup.ts:656:5: warning eslint(max-lines): File has too many lines (607). help: Maximum allowed is 500.
src/application/Setup.ts:137:25: warning eslint(max-lines-per-function): The async function has too many lines (102). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/SetupPlan.ts:9:26: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
scripts/verify-real-browser.mjs:336:1: warning eslint(complexity): function assertObservation has a complexity of 25. Maximum allowed is 20.
src/application/MacHopper.ts:123:36: warning eslint(max-lines-per-function): The function has too many lines (103). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/cliPolicyCommands.ts:54:39: warning eslint(max-lines-per-function): The function has too many lines (113). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/Doctor.ts:651:60: warning eslint(max-lines): File has too many lines (620). help: Maximum allowed is 500.
src/application/Doctor.ts:105:26: warning eslint(complexity): async function has a complexity of 67. Maximum allowed is 20.
src/application/Doctor.ts:105:26: warning eslint(max-lines-per-function): The async function has too many lines (268). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/application/Doctor.ts:388:33: warning eslint(max-lines-per-function): The function has too many lines (164). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-real-ghidra.mjs:1111:2: warning eslint(max-lines): File has too many lines (1062). help: Maximum allowed is 500.
scripts/verify-real-ghidra.mjs:260:1: warning eslint(complexity): async function verifyInventoryOperations has a complexity of 22. Maximum allowed is 20.
scripts/verify-real-ghidra.mjs:260:1: warning eslint(max-lines-per-function): The async function verifyInventoryOperations has too many lines (118). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-real-ghidra.mjs:380:1: warning eslint(max-lines-per-function): The async function verifyDebugFunctionOperations has too many lines (169). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-real-ghidra.mjs:814:1: warning eslint(complexity): function assertDossier has a complexity of 26. Maximum allowed is 20.
src/cliApplicationCommands.ts:106:39: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
src/cliApplicationCommands.ts:239:29: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.
tests/fixtures/fakeGhidra.mjs:31:31: warning eslint(max-lines-per-function): The function has too many lines (102). Maximum allowed is 100. help: Consider splitting it into smaller functions.
tests/fixtures/fakeGhidra.mjs:200:25: warning eslint(max-lines-per-function): The function has too many lines (106). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/cli.ts:1211:4: warning eslint(max-lines): File has too many lines (1186). help: Maximum allowed is 500.
src/cli.ts:714:33: warning eslint(max-lines-per-function): The function has too many lines (422). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/cliElectronCommands.ts:73:45: warning eslint(max-lines-per-function): The function has too many lines (156). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/cliElectronCommands.ts:230:46: warning eslint(max-lines-per-function): The function has too many lines (151). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/cliBrowserCommands.ts:105:32: warning eslint(max-lines-per-function): The function has too many lines (178). Maximum allowed is 100. help: Consider splitting it into smaller functions.
src/main.ts:73:20: warning eslint(max-lines-per-function): The async function has too many lines (207). Maximum allowed is 100. help: Consider splitting it into smaller functions.
scripts/verify-package.mjs:1201:2: warning eslint(max-lines): File has too many lines (1189). help: Maximum allowed is 500.
tests/ghidraMcp.test.ts:327:19: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20.
tests/mainErrors.test.ts:11:22: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions.

rea-agents@2.0.0 format:check
prettier --check .

Checking formatting...
All matched files use Prettier code style!

rea-agents@2.0.0 docs:check
node scripts/generate-package-metadata.mjs --check && npm run build && node scripts/generate-skill-metadata.mjs --check && node scripts/generate-product-catalog.mjs --check && node scripts/check-doc-facts.mjs && node scripts/check-typedoc.mjs && node scripts/generate-error-schema.mjs --check

rea-agents@2.0.0 prebuild
npm run deps:check && node scripts/generate-package-metadata.mjs

rea-agents@2.0.0 deps:check
node scripts/check-dependency-install.mjs

rea-agents@2.0.0 build
tsc -p tsconfig.build.json

rea-agents@2.0.0 postbuild
node scripts/record-build-cache.mjs (160 files / 1,060 tests).\n\nRemaining order:\n1. introduce a per-connection once/session grant overlay and cross-connection tests;\n2. bind signed state to tool identity plus policy/config generation;\n3. land handle-based project-store admission/rollback (and keep Windows unavailable until the #287/#290 native path/DACL boundary exists);\n4. verify a real modern MCP client round trip;\n5. implement and prove enforceable loopback-only containment.\n\nThis issue remains open.

<!-- gh-comment-id:5004505795 --> @morluto commented on GitHub (Jul 17, 2026): Current-main update (2026-07-17):\n\nThe signed once/session elicitation groundwork is implemented and covered locally: exact-request continuations, nonce consumption, decline/cancel handling, legacy-protocol fail-closed behavior, and connection-close cleanup. The pinned MCP runtime still negotiates the older protocol, so no production interactive grant is claimed yet.\n\nAn independent final-diff review found that the next step must be re-scoped before enabling it:\n\n- once/session grants currently enter a process-global , so concurrent MCP connections could consume or revoke each other's grants;\n- project persistence cannot safely publish authority before a durable commit, while persisting first needs an exact rollback protocol;\n- SIGHUP can change the configured project store while an existing signed continuation still targets the old configuration;\n- the current project store uses pathname-based /read/write checks and mode bits, not same-handle no-follow ownership/private-DACL admission.\n\nI removed the proposed project-lifetime append path rather than ship those authority and TOCTOU gaps. The focused suite passes (10 tests across elicitation, project-store, and reload coverage), and the complete pre-review tree passed > rea-agents@2.0.0 precheck > npm run deps:check > rea-agents@2.0.0 deps:check > node scripts/check-dependency-install.mjs > rea-agents@2.0.0 check > npm run typecheck && npm run lint && npm run format:check && npm run docs:check && npm test > rea-agents@2.0.0 typecheck > tsc --noEmit > rea-agents@2.0.0 lint > oxlint src/application/ArtifactInventory.ts:654:3: warning eslint(max-lines): File has too many lines (620). help: Maximum allowed is 500. src/application/ArtifactInventory.ts:117:44: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/application/ArtifactInventory.ts:136:47: warning eslint(max-lines-per-function): The async function has too many lines (153). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/ArtifactInventory.ts:136:53: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/application/ArtifactInventory.ts:389:20: warning eslint(max-lines-per-function): The async function has too many lines (144). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/artifactComparison.ts:215:22: warning eslint(complexity): function has a complexity of 22. Maximum allowed is 20. src/domain/managedApplicationGraph.ts:806:3: warning eslint(max-lines): File has too many lines (768). help: Maximum allowed is 500. src/application/InvestigationWorkspaceStore.ts:86:57: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/application/AuthorizedArtifactInventory.ts:14:54: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/reconstructionCoverage.ts:890:3: warning eslint(max-lines): File has too many lines (839). help: Maximum allowed is 500. src/domain/reconstructionCoverage.ts:521:32: warning eslint(max-lines-per-function): The function has too many lines (113). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/javascriptFeatureTraversal.ts:132:24: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/errors.ts:1161:3: warning eslint(max-lines): File has too many lines (1029). help: Maximum allowed is 500. src/domain/errors.ts:549:14: warning eslint(max-params): Function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/javascriptApplicationVersionKeys.ts:76:19: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/javascriptApplicationVersionItems.ts:276:23: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/application/JavaScriptReplayService.ts:63:45: warning eslint(complexity): async function has a complexity of 37. Maximum allowed is 20. src/application/JavaScriptReplayService.ts:63:45: warning eslint(max-lines-per-function): The async function has too many lines (268). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/functionComparison.ts:524:3: warning eslint(max-lines): File has too many lines (508). help: Maximum allowed is 500. src/domain/browserObservation.ts:646:73: warning eslint(max-lines): File has too many lines (618). help: Maximum allowed is 500. src/contracts/toolOutputSchemas.ts:655:3: warning eslint(max-lines): File has too many lines (637). help: Maximum allowed is 500. src/domain/managedNativeVerification.ts:529:4: warning eslint(max-lines): File has too many lines (501). help: Maximum allowed is 500. src/domain/managedNativeVerification.ts:188:46: warning eslint(max-lines-per-function): The function has too many lines (111). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/managedNativeVerification.ts:364:23: warning eslint(max-lines-per-function): The function has too many lines (104). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/managedNativeVerification.ts:364:23: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/managedMemberComparison.ts:770:3: warning eslint(max-lines): File has too many lines (726). help: Maximum allowed is 500. src/domain/managedMemberComparison.ts:217:38: warning eslint(max-lines-per-function): The function has too many lines (104). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/managedMemberComparison.ts:401:27: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/managedReconstruction.ts:125:44: warning eslint(max-lines-per-function): The function has too many lines (103). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedMemberInspector.ts:1491:3: warning eslint(max-lines): File has too many lines (1447). help: Maximum allowed is 500. src/dotnet/ManagedMemberInspector.ts:998:20: warning eslint(max-lines-per-function): The function has too many lines (131). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedMemberInspector.ts:1214:22: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/dotnet/ManagedMemberInspector.ts:1383:43: warning eslint(max-lines-per-function): The function has too many lines (109). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedPeReader.ts:98:16: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/dotnet/ManagedPeReader.ts:193:36: warning eslint(max-lines-per-function): The function has too many lines (104). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedMetadataInventory.ts:673:5: warning eslint(max-lines): File has too many lines (648). help: Maximum allowed is 500. src/dotnet/ManagedMetadataInventory.ts:263:22: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/dotnet/ManagedMetadataInventory.ts:460:22: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/dotnet/ManagedMetadataLayout.ts:199:17: warning eslint(complexity): function has a complexity of 46. Maximum allowed is 20. src/dotnet/ManagedMetadataLayout.ts:199:17: warning eslint(max-lines-per-function): The function has too many lines (107). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedMetadataLayout.ts:308:42: warning eslint(complexity): function has a complexity of 25. Maximum allowed is 20. src/dotnet/ManagedMetadataLayout.ts:308:42: warning eslint(max-lines-per-function): The function has too many lines (144). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedNativeBoundaryInspector.ts:600:3: warning eslint(max-lines): File has too many lines (576). help: Maximum allowed is 500. src/dotnet/ManagedNativeBoundaryInspector.ts:213:23: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/dotnet/ManagedNativeBoundaryInspector.ts:482:52: warning eslint(max-lines-per-function): The function has too many lines (119). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/CrossVersionInvestigation.ts:538:44: warning eslint(max-lines): File has too many lines (514). help: Maximum allowed is 500. src/server/createServer.ts:69:29: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20. src/server/createServer.ts:69:29: warning eslint(max-lines-per-function): The function has too many lines (213). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/BinarySession.ts:891:4: warning eslint(max-lines): File has too many lines (807). help: Maximum allowed is 500. src/application/BinarySession.ts:405:7: warning eslint(max-lines-per-function): The method `open` has too many lines (110). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/BinarySession.ts:414:28: warning eslint(complexity): async function has a complexity of 30. Maximum allowed is 20. src/application/BinarySession.ts:626:16: warning eslint(complexity): async method `execute` has a complexity of 24. Maximum allowed is 20. src/config.ts:570:18: warning eslint(max-lines): File has too many lines (551). help: Maximum allowed is 500. src/config.ts:319:28: warning eslint(complexity): function has a complexity of 28. Maximum allowed is 20. src/config.ts:319:28: warning eslint(max-lines-per-function): The function has too many lines (242). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/replay/LinuxJavaScriptReplayRunner.ts:580:3: warning eslint(max-lines): File has too many lines (559). help: Maximum allowed is 500. src/replay/LinuxJavaScriptReplayRunner.ts:33:16: warning eslint(complexity): async method `execute` has a complexity of 23. Maximum allowed is 20. src/replay/LinuxJavaScriptReplayRunner.ts:33:16: warning eslint(max-lines-per-function): The async method `execute` has too many lines (171). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/replay/LinuxJavaScriptReplayRunner.ts:246:26: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/replay/LinuxJavaScriptReplayRunner.ts:542:27: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/server/registerEnhancedTools.ts:150:27: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20. src/server/registerBrowserTools.ts:44:37: warning eslint(max-lines-per-function): The function has too many lines (227). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerSessionTools.ts:726:3: warning eslint(max-lines): File has too many lines (712). help: Maximum allowed is 500. src/server/registerSessionTools.ts:225:31: warning eslint(max-lines-per-function): The function has too many lines (105). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerSessionTools.ts:443:32: warning eslint(max-lines-per-function): The function has too many lines (150). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerSessionTools.ts:614:37: warning eslint(max-lines-per-function): The function has too many lines (113). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerOfficialTools.ts:48:30: warning eslint(max-lines-per-function): The function has too many lines (106). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerElectronTools.ts:34:38: warning eslint(max-lines-per-function): The function has too many lines (122). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerApplicationTools.ts:74:41: warning eslint(max-lines-per-function): The function has too many lines (112). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerApplicationTools.ts:264:31: warning eslint(max-lines-per-function): The function has too many lines (134). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerManagedWorkflowTools.ts:43:45: warning eslint(max-lines-per-function): The function has too many lines (327). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/EnhancedTools.ts:563:5: warning eslint(max-lines): File has too many lines (529). help: Maximum allowed is 500. src/server/registerSessionStatusTool.ts:16:42: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/server/registerInvestigationTools.ts:591:3: warning eslint(max-lines): File has too many lines (575). help: Maximum allowed is 500. src/server/registerInvestigationTools.ts:75:32: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/server/registerInvestigationTools.ts:92:33: warning eslint(max-lines-per-function): The function has too many lines (161). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerInvestigationTools.ts:101:5: warning eslint(max-lines-per-function): The async function has too many lines (150). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerInvestigationTools.ts:394:32: warning eslint(max-lines-per-function): The function has too many lines (110). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/server/registerEvidenceResources.ts:17:42: warning eslint(max-lines-per-function): The function has too many lines (324). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/WindowsNativeAuthority.ts:837:75: warning eslint(max-lines): File has too many lines (715). help: Maximum allowed is 500. tests/fixtures/managedPe.ts:112:22: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. tests/fixtures/managedPe.ts:267:38: warning eslint(complexity): function has a complexity of 23. Maximum allowed is 20. src/application/RealHopperAssertions.ts:96:45: warning eslint(max-lines-per-function): The function has too many lines (101). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/DirectAnalysis.ts:86:42: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/application/DirectAnalysis.ts:250:21: warning eslint(complexity): async function has a complexity of 26. Maximum allowed is 20. src/application/DirectAnalysis.ts:250:21: warning eslint(max-lines-per-function): The async function has too many lines (134). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/dotnet/ManagedArtifactInspector.ts:164:31: warning eslint(complexity): function has a complexity of 24. Maximum allowed is 20. src/dotnet/ManagedArtifactInspector.ts:264:31: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/ghidra/GhidraProvider.ts:588:3: warning eslint(max-lines): File has too many lines (562). help: Maximum allowed is 500. src/ghidra/GhidraClient.ts:597:2: warning eslint(max-lines): File has too many lines (566). help: Maximum allowed is 500. src/ghidra/GhidraClient.ts:230:21: warning eslint(max-lines-per-function): The private async method `startWithin` has too many lines (107). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/lib/managed-pe-fixture.mjs:235:38: warning eslint(complexity): function has a complexity of 28. Maximum allowed is 20. scripts/lib/managed-pe-fixture.mjs:235:38: warning eslint(max-lines-per-function): The function has too many lines (143). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-managed-conformance.mjs:1348:2: warning eslint(max-lines): File has too many lines (1295). help: Maximum allowed is 500. scripts/verify-managed-conformance.mjs:659:1: warning eslint(max-lines-per-function): The async function `runOptionalIlspyOracle` has too many lines (127). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-managed-conformance.mjs:828:1: warning eslint(complexity): async function `verifyManagedAppManifest` has a complexity of 26. Maximum allowed is 20. scripts/verify-managed-conformance.mjs:828:1: warning eslint(max-lines-per-function): The async function `verifyManagedAppManifest` has too many lines (110). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-managed-conformance.mjs:940:1: warning eslint(max-lines-per-function): The function `verifyManagedAppManifestApplicationGraph` has too many lines (126). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/browser/CdpObservationSession.ts:288:7: warning eslint(max-params): Function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/replay/JavaScriptReplayWorker.ts:298:17: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20. src/browser/CdpCaptureDocuments.ts:315:21: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. scripts/lib/product-catalog.mjs:536:64: warning eslint(max-lines): File has too many lines (514). help: Maximum allowed is 500. src/browser/CdpWebMcpDiscovery.ts:136:31: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20. src/browser/CdpWebMcpDiscovery.ts:216:27: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/browser/CdpWebMcpDiscovery.ts:332:16: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/browser/PngVisualDiff.ts:180:21: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/webBundleAnalyzer.ts:640:3: warning eslint(max-lines): File has too many lines (610). help: Maximum allowed is 500. src/domain/webBundleAnalyzer.ts:38:41: warning eslint(max-lines-per-function): The function has too many lines (121). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/domain/webBundleAnalyzer.ts:310:17: warning eslint(max-params): Arrow function has too many parameters (6). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/webBundleAnalyzer.ts:331:20: warning eslint(max-params): Arrow function has too many parameters (7). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/domain/webBundleAnalyzer.ts:411:36: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/browser/CdpCaptureEvents.ts:739:17: warning eslint(max-lines): File has too many lines (699). help: Maximum allowed is 500. src/browser/CdpPageCapture.ts:632:6: warning eslint(max-lines): File has too many lines (610). help: Maximum allowed is 500. src/browser/CdpPageCapture.ts:406:24: warning eslint(max-lines-per-function): The async function has too many lines (119). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/browser/CdpPageCapture.ts:406:30: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. tests/fixtures/fakeCdpBrowser.ts:359:19: warning eslint(complexity): function has a complexity of 24. Maximum allowed is 20. tests/fixtures/fakeCdpBrowser.ts:639:20: warning eslint(complexity): function has a complexity of 30. Maximum allowed is 20. src/application/Setup.ts:656:5: warning eslint(max-lines): File has too many lines (607). help: Maximum allowed is 500. src/application/Setup.ts:137:25: warning eslint(max-lines-per-function): The async function has too many lines (102). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/SetupPlan.ts:9:26: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. scripts/verify-real-browser.mjs:336:1: warning eslint(complexity): function `assertObservation` has a complexity of 25. Maximum allowed is 20. src/application/MacHopper.ts:123:36: warning eslint(max-lines-per-function): The function has too many lines (103). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/cliPolicyCommands.ts:54:39: warning eslint(max-lines-per-function): The function has too many lines (113). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/Doctor.ts:651:60: warning eslint(max-lines): File has too many lines (620). help: Maximum allowed is 500. src/application/Doctor.ts:105:26: warning eslint(complexity): async function has a complexity of 67. Maximum allowed is 20. src/application/Doctor.ts:105:26: warning eslint(max-lines-per-function): The async function has too many lines (268). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/application/Doctor.ts:388:33: warning eslint(max-lines-per-function): The function has too many lines (164). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-real-ghidra.mjs:1111:2: warning eslint(max-lines): File has too many lines (1062). help: Maximum allowed is 500. scripts/verify-real-ghidra.mjs:260:1: warning eslint(complexity): async function `verifyInventoryOperations` has a complexity of 22. Maximum allowed is 20. scripts/verify-real-ghidra.mjs:260:1: warning eslint(max-lines-per-function): The async function `verifyInventoryOperations` has too many lines (118). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-real-ghidra.mjs:380:1: warning eslint(max-lines-per-function): The async function `verifyDebugFunctionOperations` has too many lines (169). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-real-ghidra.mjs:814:1: warning eslint(complexity): function `assertDossier` has a complexity of 26. Maximum allowed is 20. src/cliApplicationCommands.ts:106:39: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. src/cliApplicationCommands.ts:239:29: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. tests/fixtures/fakeGhidra.mjs:31:31: warning eslint(max-lines-per-function): The function has too many lines (102). Maximum allowed is 100. help: Consider splitting it into smaller functions. tests/fixtures/fakeGhidra.mjs:200:25: warning eslint(max-lines-per-function): The function has too many lines (106). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/cli.ts:1211:4: warning eslint(max-lines): File has too many lines (1186). help: Maximum allowed is 500. src/cli.ts:714:33: warning eslint(max-lines-per-function): The function has too many lines (422). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/cliElectronCommands.ts:73:45: warning eslint(max-lines-per-function): The function has too many lines (156). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/cliElectronCommands.ts:230:46: warning eslint(max-lines-per-function): The function has too many lines (151). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/cliBrowserCommands.ts:105:32: warning eslint(max-lines-per-function): The function has too many lines (178). Maximum allowed is 100. help: Consider splitting it into smaller functions. src/main.ts:73:20: warning eslint(max-lines-per-function): The async function has too many lines (207). Maximum allowed is 100. help: Consider splitting it into smaller functions. scripts/verify-package.mjs:1201:2: warning eslint(max-lines): File has too many lines (1189). help: Maximum allowed is 500. tests/ghidraMcp.test.ts:327:19: warning eslint(complexity): function has a complexity of 21. Maximum allowed is 20. tests/mainErrors.test.ts:11:22: warning eslint(max-params): Arrow function has too many parameters (5). Maximum allowed is 4. help: This rule enforces a maximum number of parameters allowed in function definitions. > rea-agents@2.0.0 format:check > prettier --check . Checking formatting... All matched files use Prettier code style! > rea-agents@2.0.0 docs:check > node scripts/generate-package-metadata.mjs --check && npm run build && node scripts/generate-skill-metadata.mjs --check && node scripts/generate-product-catalog.mjs --check && node scripts/check-doc-facts.mjs && node scripts/check-typedoc.mjs && node scripts/generate-error-schema.mjs --check > rea-agents@2.0.0 prebuild > npm run deps:check && node scripts/generate-package-metadata.mjs > rea-agents@2.0.0 deps:check > node scripts/check-dependency-install.mjs > rea-agents@2.0.0 build > tsc -p tsconfig.build.json > rea-agents@2.0.0 postbuild > node scripts/record-build-cache.mjs (160 files / 1,060 tests).\n\nRemaining order:\n1. introduce a per-connection once/session grant overlay and cross-connection tests;\n2. bind signed state to tool identity plus policy/config generation;\n3. land handle-based project-store admission/rollback (and keep Windows unavailable until the #287/#290 native path/DACL boundary exists);\n4. verify a real modern MCP client round trip;\n5. implement and prove enforceable loopback-only containment.\n\nThis issue remains open.
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Post-review validation update: the exact tree after removing the unsafe project-persistence slice passes npm run check (160 test files, 1,057 tests), including regenerated TypeDoc and product metadata.

<!-- gh-comment-id:5004550369 --> @morluto commented on GitHub (Jul 17, 2026): Post-review validation update: the exact tree after removing the unsafe project-persistence slice passes npm run check (160 test files, 1,057 tests), including regenerated TypeDoc and product metadata.
Author
Owner

@morluto commented on GitHub (Jul 17, 2026):

Implemented and validated the per-connection permission overlay on the current working tree.

What is now covered:

  • every MCP server connection derives its own transient authority overlay;
  • elicited once and session grants on connection A are invisible to connection B;
  • closing/clearing connection B cannot clear A's transient grants;
  • a once grant is evaluated and consumed synchronously after canonicalization, so concurrent requests on one connection cannot both use it;
  • consumption mutates only the authority that supplied the grant, so identical grant IDs remain isolated across connections and do not poison a later configured grant with the same ID;
  • live connections continue to read the current process-wide ceilings and persisted grants after a successful reload.

Regression coverage exercises concurrent once-grant use, identical IDs across two connection overlays, disconnect isolation, and configured-policy reload/collision behavior. The required independent security-boundary review was clean after fixes.

Validation on the final tree:

  • npm run docs:generate
  • npm run check
  • 160 test files / 1,088 tests passed
  • coverage: 81.82% statements, 69.54% branches, 85.30% functions, 83.99% lines

This addresses the per-connection ownership gap, but #96 should remain open. Remaining scope is still: signed project-state binding and handle-safe persistence/rollback, verification with a real modern MCP runtime/client that negotiates the multi-round elicitation protocol, and enforceable loopback containment.

<!-- gh-comment-id:5008211536 --> @morluto commented on GitHub (Jul 17, 2026): Implemented and validated the per-connection permission overlay on the current working tree. What is now covered: - every MCP server connection derives its own transient authority overlay; - elicited `once` and `session` grants on connection A are invisible to connection B; - closing/clearing connection B cannot clear A's transient grants; - a once grant is evaluated and consumed synchronously after canonicalization, so concurrent requests on one connection cannot both use it; - consumption mutates only the authority that supplied the grant, so identical grant IDs remain isolated across connections and do not poison a later configured grant with the same ID; - live connections continue to read the current process-wide ceilings and persisted grants after a successful reload. Regression coverage exercises concurrent once-grant use, identical IDs across two connection overlays, disconnect isolation, and configured-policy reload/collision behavior. The required independent security-boundary review was clean after fixes. Validation on the final tree: - `npm run docs:generate` - `npm run check` - 160 test files / 1,088 tests passed - coverage: 81.82% statements, 69.54% branches, 85.30% functions, 83.99% lines This addresses the per-connection ownership gap, but #96 should remain open. Remaining scope is still: signed project-state binding and handle-safe persistence/rollback, verification with a real modern MCP runtime/client that negotiates the multi-round elicitation protocol, and enforceable loopback containment.
Author
Owner

@morluto commented on GitHub (Jul 18, 2026):

Milestone implementation is now in #305. It adds per-connection scoped elicitation with signed exact-request state, bounded/expiring replay tracking, grant rollback on returned or thrown authorization failure, recoverable policy reloads, and POSIX same-handle O_NOFOLLOW project-store reads with exact post-write verification. Focused regressions and the full npm run check/package verifier pass. Remaining scope stays open: Windows handle/reparse/DACL persistence after #289/#290, stronger persisted-state signing, and real modern MCP client tamper/expiry proof.

<!-- gh-comment-id:5008813723 --> @morluto commented on GitHub (Jul 18, 2026): Milestone implementation is now in #305. It adds per-connection scoped elicitation with signed exact-request state, bounded/expiring replay tracking, grant rollback on returned or thrown authorization failure, recoverable policy reloads, and POSIX same-handle `O_NOFOLLOW` project-store reads with exact post-write verification. Focused regressions and the full `npm run check`/package verifier pass. Remaining scope stays open: Windows handle/reparse/DACL persistence after #289/#290, stronger persisted-state signing, and real modern MCP client tamper/expiry proof.
Author
Owner

@morluto commented on GitHub (Jul 20, 2026):

Split into focused child issues:

These replace the broad remaining scope in this issue. Closing this parent can happen once all children are closed.

<!-- gh-comment-id:5023447123 --> @morluto commented on GitHub (Jul 20, 2026): Split into focused child issues: - [ ] #388 - [ ] #389 These replace the broad remaining scope in this issue. Closing this parent can happen once all children are closed.
Author
Owner

@morluto commented on GitHub (Oct 5, 2026):

Closing as superseded by merged #555, with the direct-tool direction reinforced by #572.

REA no longer maintains permission grants, startup ceilings, project grant stores, or MCP grant elicitation. Agents invoke local tools directly; the selected operation expresses intent, and execution uses the current user's OS permissions. Actual input validation, provider prerequisites, target identity, cancellation, and owned-resource cleanup still apply. Setup approval remains a separate installation workflow.

The remaining elicitation, grant persistence, and scope-expansion work is therefore no longer planned. This closure does not claim that the old grant-system acceptance criteria were implemented.

<!-- gh-comment-id:5995317173 --> @morluto commented on GitHub (Oct 5, 2026): Closing as superseded by merged [#555](https://github.com/morluto/rea/pull/555), with the direct-tool direction reinforced by [#572](https://github.com/morluto/rea/pull/572). REA no longer maintains permission grants, startup ceilings, project grant stores, or MCP grant elicitation. Agents invoke local tools directly; the selected operation expresses intent, and execution uses the current user's OS permissions. Actual input validation, provider prerequisites, target identity, cancellation, and owned-resource cleanup still apply. Setup approval remains a separate installation workflow. The remaining elicitation, grant persistence, and scope-expansion work is therefore no longer planned. This closure does not claim that the old grant-system acceptance criteria were implemented.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#62
No description provided.