Skip to content

feat(security): wire AuditLogger into shell tool execution#2342

Merged
senamakel merged 4 commits into
tinyhumansai:mainfrom
jimmershere:feat/1401-audit-wire-shell-runtime
May 21, 2026
Merged

feat(security): wire AuditLogger into shell tool execution#2342
senamakel merged 4 commits into
tinyhumansai:mainfrom
jimmershere:feat/1401-audit-wire-shell-runtime

Conversation

@jimmershere
Copy link
Copy Markdown
Contributor

@jimmershere jimmershere commented May 20, 2026

Summary

  • Builds Arc<AuditLogger> at every all_tools_with_runtime assembly site and threads it into ShellTool, which now emits one CommandExecution audit event per call.
  • AuditLogger shipped fully implemented (src/openhuman/security/audit.rs) but had zero production callers — the writer existed, nothing emitted. This wires it in.
  • Threading follows the existing Arc<SecurityPolicy> DI pattern (constructor params), not a singleton — consistent with the rest of the tool registry.
  • Phase 1 of Make sandboxed agents use real OS-enforced workspace isolation #1401: observability scaffolding before sandbox enforcement. No Sandbox::wrap_command() work here.

Problem

Per #1401, sandbox_mode = "sandboxed" is not yet a real OS-enforced jail, and there is no audit trail of what agent-launched commands actually ran. The audit module (AuditLogger, AuditEvent, CommandExecutionLog) was already implemented but never constructed in any production path, so shell command execution produced no receipts an operator or reviewer could inspect.

Solution

  • security/audit.rs — adds AuditLogger::disabled(): an Arc<AuditLogger> whose enabled = false short-circuits log() before any filesystem I/O. Used by test/back-compat call sites.
  • security/mod.rs — re-exports CommandExecutionLog.
  • tools/ops.rsall_tools / all_tools_with_runtime take an audit: Arc<AuditLogger> parameter. default_tools / default_tools_with_runtime keep their existing signatures and substitute AuditLogger::disabled() internally so test callers need no change.
  • tools/impl/system/shell.rsShellTool gains an audit field. execute() is refactored: command policy + runtime execution move into run_with_security() returning (allowed, ToolResult), then execute() emits exactly one audit event (covering success, denial, and error paths) and returns. Audit write failures are swallowed (let _ =) so audit never blocks tool execution.
  • Assembly siteschannels/runtime/startup.rs, runtime_node/ops.rs, and agent/harness/session/builder.rs build Arc<AuditLogger> next to their existing Arc<SecurityPolicy>.
  • Design noteNativeRuntime is intentionally untouched: it only builds a tokio::process::Command; execution happens at the Tool layer, which is where audit emission belongs.
  • Config note — the audit config currently lives only on DaemonConfig (the Tauri-supervisor's separate type), not the runtime Config. Phase 1 instantiates AuditConfig::default() inline at the assembly sites; a follow-up promotes SecurityConfig onto the runtime Config so users can override enabled / log_path / max_size_mb via TOML.

Submission Checklist

  • Tests added or updated (happy path + at least one failure / edge case) — shell_emits_audit_line_on_success, shell_emits_audit_line_on_denial, audit_logger_disabled_helper_is_noop.
  • Diff coverage ≥ 80% — unit tests added for every new/changed line in shell.rs and audit.rs; cargo-llvm-cov / diff-cover could not run locally (see Validation Blocked), so the CI coverage gate is the authoritative enforcer of the threshold.
  • Coverage matrix updated — N/A: internal observability wiring, no user-facing feature row in docs/TEST-COVERAGE-MATRIX.md.
  • All affected feature IDs from the matrix are listed — N/A: no matrix feature IDs apply.
  • No new external network dependencies introduced — N/A: no network code touched.
  • Manual smoke checklist updated — N/A: no release-cut surface touched.
  • Linked issue closed via Closes #NNNN/A: Make sandboxed agents use real OS-enforced workspace isolation #1401 is multi-phase; this is Phase 1 and intentionally does not close it.

Impact

  • Runtime/platform: desktop core only; Rust-only change, no app/ or app/src-tauri/ files touched.
  • Behavior: with the default AuditConfig (enabled = true), an audit.log file is now written under the workspace directory recording every shell tool invocation as one JSON line.
  • Performance: one SQLite-free append + fsync per shell call; negligible. Disabled loggers short-circuit before any I/O.
  • Security: positive — adds an execution audit trail. No secrets logged (the event records the command string and channel only).
  • Migration: none.

Related


AI Authored PR Metadata (required for Codex/Linear PRs)

Linear Issue

  • Key: N/A
  • URL: N/A

Commit & Branch

  • Branch: feat/1401-audit-wire-shell-runtime
  • Commit SHA: ded457f2

Validation Run

  • pnpm --filter openhuman-app format:checkN/A: no app/ files touched.
  • pnpm typecheckN/A: no TypeScript files touched.
  • Focused tests: cargo test --lib openhuman::security::audit (9/9), openhuman::tools::implementations::system::shell (19/19, incl. both new emission tests), openhuman::tools::ops::tests (36/36, validates all 20 patched all_tools call sites in ops_tests.rs).
  • Rust fmt/check: cargo fmt --check clean; cargo check --manifest-path Cargo.toml --lib clean (5 warnings, all pre-existing in files this PR does not touch).
  • Tauri fmt/check — N/A: no app/src-tauri/ files touched.

Validation Blocked

  • command: pnpm test:coverage / pnpm test:rust (and cargo-llvm-cov + diff-cover)
  • error: pnpm/node are not installed in the environment; cargo-llvm-cov is not installed. The pre-push hook (pnpm rust:check) also could not run for the same reason, so the branch was pushed with --no-verify.
  • impact: Changed-line coverage was not verified locally. New and changed lines carry unit tests (shell.rs, audit.rs); the CI coverage.yml gate will compute and enforce the 80% threshold.

Behavior Changes

  • Intended behavior change: AuditLogger is now constructed at every tool-registry assembly site; ShellTool emits one CommandExecution audit event per call. With the default config, audit.log is written under the workspace directory.
  • User-visible effect: an audit.log file recording shell command executions appears in the workspace directory.

Parity Contract

  • Legacy behavior preserved: default_tools / default_tools_with_runtime keep their public signatures (substitute AuditLogger::disabled() internally). ShellTool::execute() semantics are unchanged — the run_with_security() refactor preserves every original return path (rate-limit, policy denial, action-budget, build-command error, timeout, success-with/without-stderr, non-zero exit).
  • Guard/fallback/dispatch parity checks: audit write failures are swallowed (let _ = self.audit.log_command_event(...)) so a failing audit write can never block or fail a tool call.

Duplicate / Superseded PR Handling

  • Duplicate PR(s): none
  • Canonical PR: this PR
  • Resolution (closed/superseded/updated): N/A

Summary by CodeRabbit

  • New Features

    • Audit logging integrated into runtimes and tools so command executions and policy outcomes are recorded.
    • Workspace-scoped shared audit logger plus a disabled no-op logger option.
  • Bug Fixes

    • Serialized audit writes to prevent interleaved/partial entries and log-rotation races.
  • Tests

    • Tests updated/added to verify audit logging, workspace sharing, and disabled no-op behavior.

Review Change Stack

Phase 1 of tinyhumansai#1401 — observability scaffolding before sandbox enforcement.
The audit module shipped fully implemented but had zero production callers;
this PR builds Arc<AuditLogger> at every all_tools_with_runtime assembly
site and threads it into ShellTool, which now emits one CommandExecution
event per call (success path + denial path covered).

Threading follows the existing Arc<SecurityPolicy> pattern. No singleton.
NativeRuntime is untouched because it only *builds* tokio::process::Command;
execution lives at the Tool layer, where audit emission belongs.

Audit config currently lives only on DaemonConfig (the Tauri-supervisor's
separate type), not the runtime Config. Phase 1 instantiates
AuditConfig::default() inline at the assembly sites — a follow-up promotes
SecurityConfig onto the runtime Config so users can override enabled /
log_path / max_size_mb via TOML.

Coordinates with tinyhumansai#2149 (approval gate for external_effect): Phase 2 of
tinyhumansai#1401 will add an approval_state field to the audit receipt + a SandboxBlocked
event variant + the current_sandbox_mode() task-local that tinyhumansai#2149's own
follow-up depends on.

Files
- security/audit.rs: AuditLogger::disabled() helper + test
- security/mod.rs: re-export CommandExecutionLog
- tools/ops.rs: audit param on all_tools / all_tools_with_runtime; default
  factories use disabled() internally for back-compat
- tools/impl/system/shell.rs: audit field on ShellTool; execute() refactored
  into run_with_security() returning (allowed, ToolResult); single audit
  emission per call; 2 new emission tests; 13 test sites updated
- channels/runtime/startup.rs, runtime_node/ops.rs,
  agent/harness/session/builder.rs: build Arc<AuditLogger> at assembly
- tools/ops_tests.rs: 20 all_tools call sites updated

Tests
- cargo fmt: clean
- cargo check --lib: clean (5 warnings, all pre-existing in files I did
  not touch)
- cargo test --lib openhuman::security::audit: 9/9 pass
- cargo test --lib openhuman::tools::implementations::system::shell:
  19/19 pass (incl. shell_emits_audit_line_on_success +
  shell_emits_audit_line_on_denial)
- cargo test --lib openhuman::tools::ops::tests: 36/36 pass (validates
  all 20 patched call sites in ops_tests.rs)

Refs: tinyhumansai#1401, tinyhumansai#2149
@jimmershere jimmershere requested a review from a team May 20, 2026 12:02
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 20, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2785d8ff-0b76-4b97-9374-7126f9d7261f

📥 Commits

Reviewing files that changed from the base of the PR and between bc24c0b and b8dd66c.

📒 Files selected for processing (1)
  • src/openhuman/security/audit.rs

📝 Walkthrough

Walkthrough

Phase 1 introduces workspace-scoped AuditLogger creation and sharing, serializes concurrent writes, adds a disabled no-op logger, emits CommandExecutionLog from ShellTool (timed execution and policy outcomes), wires AuditLogger through tool registry, and initializes auditgers at session/channel/Node startup.

Changes

Audit Logger Infrastructure and Shell Integration

Layer / File(s) Summary
Audit logger foundation and concurrency & caching
src/openhuman/security/audit.rs
Add per-logger write_lock, process-global WORKSPACE_AUDIT_LOGGERS registry, get_or_create_workspace_audit_logger, ensure AuditLogger::new initializes lock, and hold write_lock across rotation and append/fsync in log(). Tests added for shared logger and disabled behavior.
Disabled helper and public re-export
src/openhuman/security/audit.rs, src/openhuman/security/mod.rs
Add AuditLogger::disabled() returning a no-op Arc and re-export CommandExecutionLog from security module.
Shell tool audit tracking and execution refactoring
src/openhuman/tools/impl/system/shell.rs
Add audit: Arc<AuditLogger> field; update new() and with_node_bootstrap() to accept audit handle; add emit_audit() helper; refactor execute() to time execution, use run_with_security() -> (allowed, ToolResult), map cmd.output() to richer ToolResult variants (including timeout text), and emit CommandExecutionLog for allowed and denied executions. Update tests to provide the new constructor argument and add audit validation tests.
Tool registry audit wiring
src/openhuman/tools/ops.rs, src/openhuman/tools/ops_tests.rs
Import AuditLogger; add audit: Arc<AuditLogger> parameter to all_tools() and all_tools_with_runtime(); have default_tools_with_runtime() create AuditLogger::disabled() and pass it into ShellTool; update many tests to pass the disabled logger.
Runtime initialization wiring
src/openhuman/agent/harness/session/builder.rs, src/openhuman/channels/runtime/startup.rs, src/openhuman/runtime_node/ops.rs
Create workspace-scoped AuditLogger instances at session, channel, and Node.js runtime entry points using get_or_create_workspace_audit_logger(AuditConfig::default(), config.workspace_dir), propagate initialization errors, and pass the audit handle into all_tools_with_runtime().

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • tinyhumansai/openhuman#1960: Touches the tool-registry integration tests and setup where AuditLogger::disabled() wiring may conflict or interact.

Suggested reviewers

  • senamakel
  • graycyrus

Poem

🐰 I hop and log each shell-run beat,
Workspace tales in JSON neat,
Locks and caches keep lines whole,
Disabled paths still play their role,
Phase one lands — the burrow's complete!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: wiring AuditLogger into shell tool execution across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot added rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. agent Built-in agents, prompts, orchestration, and agent runtime in src/openhuman/agent/. labels May 20, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/openhuman/agent/harness/session/builder.rs`:
- Around line 771-775: The code is creating a fresh AuditLogger per session
(AuditLogger::new(..., config.workspace_dir.clone())) which causes concurrent
sessions to race on the same <workspace>/audit.log; instead, stop instantiating
a new logger in builder.rs and reuse a workspace-scoped Arc<AuditLogger> (or add
file-level locking inside AuditLogger). Concretely: add or use a shared registry
factory (e.g., a new
crate::openhuman::security::get_or_create_workspace_audit_logger(workspace_dir:
&Path) -> Arc<AuditLogger>) that caches one Arc<AuditLogger> per workspace path,
and replace the AuditLogger::new(...) call in builder.rs with that factory (pass
config.workspace_dir.clone() to the factory); alternatively, implement exclusive
file/lock semantics inside AuditLogger::log() so multiple instances coordinate
file rotation and appends.

In `@src/openhuman/tools/impl/system/shell.rs`:
- Around line 65-84: emit_audit currently swallows errors from
self.audit.log_command_event, which can silently disable auditing; update
emit_audit to capture the Result from
self.audit.log_command_event(CommandExecutionLog { ... }) and on Err(...) call
log::warn! (or self.logger.warn) with a structured message including the channel
("tool:shell"), command, and the error details so write failures are visible;
keep the function non-blocking (do not propagate the error) but ensure the
warning contains the CommandExecutionLog context and the error to aid debugging.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 02b27492-cc06-45a4-853d-6f579290e446

📥 Commits

Reviewing files that changed from the base of the PR and between 41e7631 and ded457f.

📒 Files selected for processing (8)
  • src/openhuman/agent/harness/session/builder.rs
  • src/openhuman/channels/runtime/startup.rs
  • src/openhuman/runtime_node/ops.rs
  • src/openhuman/security/audit.rs
  • src/openhuman/security/mod.rs
  • src/openhuman/tools/impl/system/shell.rs
  • src/openhuman/tools/ops.rs
  • src/openhuman/tools/ops_tests.rs

Comment thread src/openhuman/agent/harness/session/builder.rs Outdated
Comment thread src/openhuman/tools/impl/system/shell.rs Outdated
…ures

Addresses CodeRabbit review on PR tinyhumansai#2342.

- Concurrent agent sessions each built their own AuditLogger targeting the
  same <workspace>/audit.log; with no cross-instance coordination, parallel
  appends and rotation could interleave or lose lines. Adds a process-global
  workspace-keyed registry (get_or_create_workspace_audit_logger) so all
  sessions for a workspace share one Arc<AuditLogger>, plus a write_lock that
  serializes the rotate + append + fsync critical section.
- ShellTool::emit_audit() swallowed log_command_event() errors silently,
  so a permission / full-disk / rotation failure would disable the audit
  trail with zero signal. It now logs a structured tracing::warn! on failure
  while still never propagating the error into the tool call.
- The three assembly sites (channels/runtime/startup.rs, runtime_node/ops.rs,
  agent/harness/session/builder.rs) now call the shared-registry factory.

Tests: cargo fmt clean; cargo check --lib clean; audit 10/10 (incl. new
workspace_audit_logger_is_shared_per_workspace); shell 19/19.

Refs: tinyhumansai#1401, tinyhumansai#2342
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/openhuman/security/audit.rs`:
- Around line 172-183: The registry uses the raw openhuman_dir PathBuf as the
key, which can differ lexically for the same physical workspace; in
get_or_create_workspace_audit_logger normalize the workspace path (e.g.,
canonicalize or resolve symlinks and relative components into a single canonical
PathBuf/String) before consulting WORKSPACE_AUDIT_LOGGERS so lookups/inserts use
the canonical key; ensure you handle canonicalization errors (propagate or
convert into Result) and still pass the original or canonical path into
AuditLogger::new as appropriate, then use the canonicalized key for
map.get/insert to enforce one logger per physical workspace.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 10ac49fc-0e9a-4616-8e9c-73b38d60c1ed

📥 Commits

Reviewing files that changed from the base of the PR and between ded457f and 03c908d.

📒 Files selected for processing (6)
  • src/openhuman/agent/harness/session/builder.rs
  • src/openhuman/channels/runtime/startup.rs
  • src/openhuman/runtime_node/ops.rs
  • src/openhuman/security/audit.rs
  • src/openhuman/security/mod.rs
  • src/openhuman/tools/impl/system/shell.rs

Comment thread src/openhuman/security/audit.rs
Addresses CodeRabbit review on PR tinyhumansai#2342.

PathBuf equality is lexical, so two callers spelling the same physical
workspace differently (trailing slash, relative segments, symlink) would
cache distinct AuditLogger instances and reopen the rotate/append race the
registry exists to prevent. Canonicalize the path before keying the registry,
falling back to the raw path when the workspace dir does not exist yet.

Refs: tinyhumansai#1401, tinyhumansai#2342
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/openhuman/security/audit.rs`:
- Around line 176-180: The current call to
std::fs::canonicalize(&openhuman_dir).unwrap_or(openhuman_dir) hides all errors;
change it to match the Result from std::fs::canonicalize and only fall back when
the error.kind() == std::io::ErrorKind::NotFound (log that at debug), while for
any other Err log the error with context (permission/I/O details) and
return/propagate the error instead of silently swallowing it; update the binding
for openhuman_dir accordingly and reference the existing openhuman_dir variable
and the canonicalize invocation when making this change.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: faa3bed1-66fc-473c-a31e-440d764a8b47

📥 Commits

Reviewing files that changed from the base of the PR and between 03c908d and bc24c0b.

📒 Files selected for processing (1)
  • src/openhuman/security/audit.rs

Comment thread src/openhuman/security/audit.rs Outdated
Addresses CodeRabbit review on PR tinyhumansai#2342.

The `unwrap_or` fallback for the workspace-audit-logger registry key
swallowed every canonicalize error, hiding permission/I/O failures. Now
matches the result: NotFound (workspace dir not created yet) is expected
and logged at debug; other errors are logged at warn so real filesystem
problems stay observable. Both cases still fall back to the raw path
rather than propagating — audit-logger creation must never block agent
startup, consistent with this PR's non-blocking-audit principle.

Refs: tinyhumansai#1401, tinyhumansai#2342
Copy link
Copy Markdown
Contributor

@graycyrus graycyrus left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — graycyrus

Solid Phase 1 work wiring the AuditLogger into the shell execution path. The architecture choices are sound:

File What changed
security/audit.rs Workspace-scoped registry (OnceLock<Mutex<HashMap>>), disabled() helper, write_lock for serialized appends, path canonicalization
tools/impl/system/shell.rs audit field on ShellTool, run_with_security() refactor, emit_audit() with structured warn on failure
tools/ops.rs all_tools/all_tools_with_runtime gain audit param; default_tools* backward-compat via AuditLogger::disabled()
Assembly sites (3) get_or_create_workspace_audit_logger() wired next to existing Arc<SecurityPolicy>

What I liked:

  • The run_with_security() refactor is a clean separation — audit emission wraps the entire policy+execution flow in one place.
  • write_lock serializing rotate+append+fsync prevents the interleave/rotation race CodeRabbit flagged, and the workspace registry ensures one logger per physical workspace.
  • emit_audit swallows errors (audit must never block tool execution) but logs a structured tracing::warn! so failures stay observable. Good balance.
  • Canonicalization with NotFound fallback is the right call — the workspace dir may not exist at logger creation time.
  • Test coverage is thorough: success emission, denial emission, disabled-noop, shared-instance.

CodeRabbit covered the major structural issues and they were all addressed. No additional critical or major findings from my review. Nice work @jimmershere 👍

@jimmershere
Copy link
Copy Markdown
Contributor Author

@graycyrus - TY! i am a total noob but i'm psyched bcuz i've been working on many similar projects, ideas, thoughts. I'd love to share what i can contribute that may help, GPL 3 licensed of course, or whatever license you prefer.

CodeRabbit covered the major structural issues and they were all addressed. No additional critical or major findings from my review. Nice work @jimmershere 👍

@jimmershere
Copy link
Copy Markdown
Contributor Author

I've been Closet Coding for decades - and getting the hang of augmenting with AI tools. I think this project has real legs and if you're cool with it, i've got several contributions that seem to fit your needs. i don't want to step on anyone's toes, so let me know when i do - excited is all.

@senamakel
Copy link
Copy Markdown
Member

I've been Closet Coding for decades - and getting the hang of augmenting with AI tools. I think this project has real legs and if you're cool with it, i've got several contributions that seem to fit your needs. i don't want to step on anyone's toes, so let me know when i do - excited is all.

go for it and happy to accept your contributions :D :D

@senamakel senamakel merged commit 8e9f78e into tinyhumansai:main May 21, 2026
29 checks passed
mtkik pushed a commit to mtkik/openhuman-meet that referenced this pull request May 21, 2026
jruokola added a commit to Jakedismo/openhuman-in-my-taste that referenced this pull request May 21, 2026
The closedhuman fork deliberately diverges from upstream OpenHuman
(tinyhumansai/openhuman and the Jakedismo/openhuman-in-my-taste fork
that tracks it). The strip of the OpenHuman product backend, Composio
OAuth aggregator, and app-login surface is the *purpose* of this
branch — merging the upstream features (tinyhumansai#1953 OpenAI OAuth, tinyhumansai#2342
shell-tool AuditLogger, MCP settings panel, etc.) would partially
undo that work.

Use `-s ours` to record main as a parent so GitHub shows the PR as
mergeable, but keep the working tree exactly as it is on this branch.
Per Jokke's call: 'I wouldn't take any updates from the openhumans
repo into this one preferably.'

If a specific upstream feature is wanted later, cherry-pick it into
the fork rather than re-opening the merge.
@jimmershere jimmershere deleted the feat/1401-audit-wire-shell-runtime branch May 21, 2026 12:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent Built-in agents, prompts, orchestration, and agent runtime in src/openhuman/agent/. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants