Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/openhuman-app/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions crates/openhuman-core/src/modules/browser_task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ pub fn start_request(config: &Config, task: &BrowserTask) -> StartTaskRequest {
allow_destructive: false,
browser_endpoint: None,
headed: !config.browser.headless,
browser_executable: None,
browser_profile: None,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Forward the persistent profile to browser tasks

When an operator selects profile_mode = "persistent" and supplies profile_path, this unconditional None is the only profile value sent on StartTask (the module-level configuration in computer_config.rs carries only browser.executable). Consequently browser action=task cannot reuse the configured cookies and logins even though normal sessions honor the same setting in open_session_with_origin; populate browser_profile from the validated path in persistent mode. OpenHuman owns applying this host configuration at the adapter boundary.

AGENTS.md reference: AGENTS.md:L526-L529

Useful? React with 👍 / 👎.

},
budget: TaskBudget {
max_actions: Some(task.max_actions),
Expand Down
2 changes: 2 additions & 0 deletions crates/openhuman-core/src/modules/browser_task_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ fn start_request_confines_the_task_to_the_browser_under_host_policy() {
assert_eq!(request.constraints.payment, PaymentMode::StopAtPayment);
assert!(!request.constraints.allow_destructive);
assert!(request.constraints.headed);
assert!(request.constraints.browser_executable.is_none());
assert!(request.constraints.browser_profile.is_none());
assert_eq!(request.budget.max_actions, Some(12));
assert_eq!(request.budget.max_elapsed_ms, Some(90_000));
assert_eq!(request.budget.max_rescues, Some(2));
Expand Down
50 changes: 40 additions & 10 deletions scripts/__tests__/check-openhuman-rust-layout.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ import path from "node:path";
import test from "node:test";
import { fileURLToPath } from "node:url";

const repoRoot = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
const repoRoot = path.join(
path.dirname(fileURLToPath(import.meta.url)),
"..",
"..",
);
const scriptRel = path.join("scripts", "ci", "check-openhuman-rust-layout.mjs");
const scriptSource = fs.readFileSync(path.join(repoRoot, scriptRel), "utf8");
const SRC = "crates/openhuman-core/src";
Expand All @@ -31,13 +35,24 @@ const lines = (n) => "//\n".repeat(n);
*/
function run(files, pins = []) {
const entries = pins.map(([file, limit]) => [`${SRC}/${file}`, limit]);
assert.match(scriptSource, PINS_RE, "fixture: the gate's pin list was not found");
assert.match(
scriptSource,
PINS_RE,
"fixture: the gate's pin list was not found",
);
const source = scriptSource.replace(
PINS_RE,
`const LEGACY_LIMIT_ENTRIES = ${JSON.stringify(entries)};`,
);
const root = fs.mkdtempSync(path.join(os.tmpdir(), "openhuman-rust-layout-"));
for (const dir of [SRC, "crates/openhuman-cli", "tests", "examples", "scripts/ci"])
for (const dir of [
SRC,
"crates/openhuman-cli",
"tests",
"examples",
"scripts/ci",
"scripts/lib",
])
fs.mkdirSync(path.join(root, dir), { recursive: true });
fs.writeFileSync(path.join(root, "crates/openhuman-core/Cargo.toml"), "");
fs.writeFileSync(path.join(root, "crates/openhuman-cli/Cargo.toml"), "");
Expand All @@ -47,13 +62,22 @@ function run(files, pins = []) {
fs.writeFileSync(abs, lines(n));
}
fs.writeFileSync(path.join(root, scriptRel), source);
const result = spawnSync(process.execPath, [scriptRel], { cwd: root, encoding: "utf8" });
fs.copyFileSync(
path.join(repoRoot, "scripts", "lib", "root-rust-targets.mjs"),
path.join(root, "scripts", "lib", "root-rust-targets.mjs"),
);
const result = spawnSync(process.execPath, [scriptRel], {
cwd: root,
encoding: "utf8",
});
fs.rmSync(root, { recursive: true, force: true });
return { status: result.status, out: `${result.stdout}${result.stderr}` };
}

test("passes at exactly the limit and at exactly a pin", () => {
const { status, out } = run({ "a.rs": 750, "big.rs": 900 }, [["big.rs", 900]]);
const { status, out } = run({ "a.rs": 750, "big.rs": 900 }, [
["big.rs", 900],
]);
assert.equal(status, 0, out);
});

Expand Down Expand Up @@ -90,13 +114,19 @@ test("enforces the limit under core/, which used to be pruned by name", () => {
test("a pinned file that shrank must lower its pin", () => {
const { status, out } = run({ "big.rs": 850 }, [["big.rs", 900]]);
assert.equal(status, 1);
assert.match(out, /big\.rs: 850 lines, below its legacy pin 900; lower the pin to 850/);
assert.match(
out,
/big\.rs: 850 lines, below its legacy pin 900; lower the pin to 850/,
);
});

test("a pinned file that fits the limit must drop its pin", () => {
const { status, out } = run({ "big.rs": 700 }, [["big.rs", 900]]);
assert.equal(status, 1);
assert.match(out, /big\.rs: 700 lines now fits the 750-line limit; remove its legacy exception/);
assert.match(
out,
/big\.rs: 700 lines now fits the 750-line limit; remove its legacy exception/,
);
});

test("a file pinned twice fails, because a Map keeps only the last pin", () => {
Expand All @@ -109,9 +139,9 @@ test("a file pinned twice fails, because a Map keeps only the last pin", () => {
});

test("the real pin list has no duplicate entry", () => {
const files = [...scriptSource.match(PINS_RE)[0].matchAll(/"(crates\/[^"]+\.rs)"/g)].map(
(m) => m[1],
);
const files = [
...scriptSource.match(PINS_RE)[0].matchAll(/"(crates\/[^"]+\.rs)"/g),
].map((m) => m[1]);
assert.ok(files.length > 0, "fixture: no pins parsed");
assert.equal(new Set(files).size, files.length);
});
2 changes: 1 addition & 1 deletion vendor/tinyagents
Submodule tinyagents updated 27 files
+1 −1 crates/tinyagents-harness/src/agent_loop/README.md
+47 −15 crates/tinyagents-harness/src/agent_loop/mod_tests.rs
+5 −8 crates/tinyagents-harness/src/agent_loop/model_call.rs
+23 −8 crates/tinyagents-harness/src/agent_loop/stream_idle_timeout_tests.rs
+11 −6 crates/tinyagents-harness/src/error.rs
+30 −0 crates/tinyagents-harness/src/error_tests.rs
+30 −5 crates/tinyagents-harness/src/middleware/library/mod_tests.rs
+11 −3 crates/tinyagents-harness/src/middleware/library/resilience.rs
+3 −1 crates/tinyagents-harness/src/middleware/library/types.rs
+3 −0 crates/tinyagents-harness/src/retry/README.md
+9 −0 crates/tinyagents-harness/src/retry/failover.rs
+21 −1 crates/tinyagents-harness/src/retry/failover_tests.rs
+4 −0 crates/tinyagents-harness/src/retry/mod.rs
+9 −0 crates/tinyagents-harness/src/retry/mod_tests.rs
+8 −1 crates/tinyagents-harness/src/retry/types.rs
+10 −0 crates/tinyagents-harness/src/runtime/agent.rs
+15 −0 crates/tinyagents-harness/src/runtime/mod_tests.rs
+18 −4 crates/tinyagents-harness/src/terminal.rs
+28 −0 crates/tinyagents-harness/src/terminal_tests.rs
+3 −1 crates/tinyagents-orchestration/src/subagent/policy.rs
+22 −0 crates/tinyagents-orchestration/src/subagent/policy_tests.rs
+2 −0 crates/tinyagents-session/src/transcript/README.md
+29 −1 crates/tinyagents-session/src/transcript/spend.rs
+18 −0 crates/tinyagents-session/src/transcript/spend_tests.rs
+2 −0 docs/modules/harness/limits-retry.md
+1 −1 docs/modules/harness/runtime.md
+1 −1 vendor/tinytools
2 changes: 1 addition & 1 deletion vendor/tinycomputer
Submodule tinycomputer updated 96 files
+1 −0 Cargo.lock
+4 −0 Cargo.toml
+3 −0 crates/tinycomputer-browser/Cargo.toml
+3 −20 crates/tinycomputer-browser/src/convert/convert_tests/session_tests.rs
+6 −34 crates/tinycomputer-browser/src/convert/session.rs
+21 −1 crates/tinycomputer-browser/src/error/error_tests.rs
+51 −7 crates/tinycomputer-browser/src/error/mod.rs
+4 −2 crates/tinycomputer-browser/src/fake/mod.rs
+1 −0 crates/tinycomputer-browser/src/lib.rs
+237 −0 crates/tinycomputer-browser/src/origins/mod.rs
+204 −0 crates/tinycomputer-browser/src/origins/origins_tests.rs
+6 −0 crates/tinycomputer-browser/src/reply/mod.rs
+10 −0 crates/tinycomputer-browser/src/reply/reply_tests.rs
+165 −3 crates/tinycomputer-browser/src/sessions/mod.rs
+119 −21 crates/tinycomputer-browser/src/sessions/page.rs
+1 −0 crates/tinycomputer-browser/src/sessions/sessions_tests.rs
+51 −0 crates/tinycomputer-browser/src/sessions/sessions_tests/lifecycle_tests.rs
+647 −0 crates/tinycomputer-browser/src/sessions/sessions_tests/origins_tests.rs
+2 −25 crates/tinycomputer-browser/src/surface/card.rs
+281 −0 crates/tinycomputer-browser/src/surface/cover.rs
+26 −6 crates/tinycomputer-browser/src/surface/cursor.rs
+6 −5 crates/tinycomputer-browser/src/surface/location.rs
+4 −1 crates/tinycomputer-browser/src/surface/mod.rs
+21 −0 crates/tinycomputer-browser/src/surface/operations.rs
+73 −16 crates/tinycomputer-browser/src/surface/sight/sight.js
+2 −0 crates/tinycomputer-browser/src/surface/sight/sight_tests.rs
+169 −1 crates/tinycomputer-browser/src/surface/sight/sight_tests/live_calendar_tests.rs
+269 −0 crates/tinycomputer-browser/src/surface/sight/sight_tests/live_cover_tests.rs
+155 −0 crates/tinycomputer-browser/src/surface/sight/sight_tests/live_day_label_tests.rs
+2 −0 crates/tinycomputer-browser/src/surface/surface_tests.rs
+259 −0 crates/tinycomputer-browser/src/surface/surface_tests/cover_tests.rs
+20 −0 crates/tinycomputer-browser/src/surface/surface_tests/operations_tests.rs
+135 −0 crates/tinycomputer-browser/src/surface/surface_tests/origins_tests.rs
+13 −4 crates/tinycomputer-browser/src/surface/uncover.rs
+13 −1 crates/tinycomputer-bus/src/agent/agent_tests.rs
+18 −2 crates/tinycomputer-bus/src/agent/types/request.rs
+13 −5 crates/tinycomputer-bus/src/browser/session/types.rs
+4 −1 crates/tinycomputer-bus/src/flow/guide.md
+3 −3 crates/tinycomputer-bus/src/version/mod.rs
+6 −2 crates/tinycomputer-bus/src/version/version_tests.rs
+20 −0 crates/tinycomputer-core/src/surface/mod.rs
+2 −0 crates/tinycomputer-core/src/surface/surface_tests/delivery_tests.rs
+126 −18 crates/tinycomputer-engine/src/agentic/flow/act/uncover.rs
+20 −1 crates/tinycomputer-engine/src/agentic/flow/action.rs
+44 −5 crates/tinycomputer-engine/src/agentic/flow/enter/open.rs
+149 −0 crates/tinycomputer-engine/src/agentic/flow/flow_tests/do_loop_tests.rs
+70 −0 crates/tinycomputer-engine/src/agentic/flow/flow_tests/enter_tests.rs
+189 −2 crates/tinycomputer-engine/src/agentic/flow/flow_tests/picker_tests.rs
+74 −10 crates/tinycomputer-engine/src/agentic/flow/flow_tests/screens.rs
+75 −1 crates/tinycomputer-engine/src/agentic/flow/flow_tests/simulator.rs
+35 −0 crates/tinycomputer-engine/src/agentic/flow/flow_tests/step_kinds_tests.rs
+5 −0 crates/tinycomputer-engine/src/agentic/flow/mod.rs
+12 −0 crates/tinycomputer-engine/src/agentic/flow/run.rs
+69 −17 crates/tinycomputer-engine/src/agentic/flow/steps/date.rs
+25 −9 crates/tinycomputer-engine/src/agentic/flow/steps/launch.rs
+3 −1 crates/tinycomputer-engine/src/agentic/flow/steps/mod.rs
+72 −3 crates/tinycomputer-engine/src/agentic/flow/steps/reveal.rs
+5 −1 crates/tinycomputer-engine/src/rescue/mod.rs
+70 −9 crates/tinycomputer-engine/src/task/controller.rs
+13 −5 crates/tinycomputer-engine/src/task/describe.rs
+24 −1 crates/tinycomputer-engine/src/task/interpret.rs
+12 −1 crates/tinycomputer-engine/src/task/task_tests/describe_tests.rs
+55 −0 crates/tinycomputer-engine/src/task/task_tests/rescue_tests.rs
+120 −0 crates/tinycomputer-engine/src/task/task_tests/start_tests.rs
+8 −0 crates/tinycomputer-engine/src/workspace/mod.rs
+28 −0 crates/tinycomputer-engine/src/workspace/workspace_tests.rs
+2 −2 crates/tinycomputer-skills/schemas/start_task.schema.json
+2 −2 crates/tinycomputer-skills/skills/tinycomputer/SKILL.md
+2 −0 crates/tinycomputer/src/tinybus_module/runner.rs
+54 −0 crates/tinycomputer/src/tinybus_module/tinybus_module_tests/tasks_tests.rs
+1 −1 crates/tinycomputer/tests/public_api_tests.rs
+16 −8 docs/crates/tinycomputer-browser/errors.md
+51 −0 docs/crates/tinycomputer-browser/interacting.md
+59 −10 docs/crates/tinycomputer-browser/sessions.md
+3 −1 docs/crates/tinycomputer-browser/sight.md
+3 −1 docs/crates/tinycomputer-bus/agent-and-tasks.md
+1 −1 docs/crates/tinycomputer-bus/browser.md
+8 −8 docs/crates/tinycomputer-bus/versioning.md
+8 −5 docs/crates/tinycomputer-core/surfaces-and-screens.md
+9 −1 docs/crates/tinycomputer-engine/flow/filling-forms.md
+4 −1 docs/crates/tinycomputer-engine/flow/step-kinds.md
+18 −8 docs/crates/tinycomputer-engine/flow/the-do-loop.md
+10 −2 docs/crates/tinycomputer-engine/tasks.md
+1 −0 docs/crates/tinycomputer-engine/workspace.md
+7 −2 docs/crates/tinycomputer-skills/walking-the-schemas.md
+3 −1 docs/crates/tinycomputer/configuration.md
+12 −2 docs/giving-it-a-task.md
+18 −8 docs/safety-and-privacy.md
+4 −2 docs/technical/architecture.md
+4 −4 docs/technical/decision-loops.md
+6 −1 docs/technical/decision-thresholds.md
+27 −0 docs/technical/specs/browser-sight.md
+4 −1 docs/technical/specs/desktop-module-contract.md
+5 −0 docs/technical/specs/task-rescue.md
+13 −4 docs/technical/specs/unified-agent.md
+29 −4 docs/technical/tasks.md
2 changes: 1 addition & 1 deletion vendor/tinyhumans-sdk
2 changes: 1 addition & 1 deletion vendor/tinymcp
Submodule tinymcp updated 64 files
+41 −2 Cargo.lock
+2 −0 Cargo.toml
+36 −0 README.md
+10 −2 crates/tinymcp-bus/src/agent_tools/mod.rs
+112 −0 crates/tinymcp-bus/src/agent_tools/mod_envelope_tests.rs
+134 −2 crates/tinymcp-bus/src/agent_tools/types.rs
+34 −0 crates/tinymcp-bus/src/config/mod_tests.rs
+20 −0 crates/tinymcp-bus/src/config/types.rs
+6 −0 crates/tinymcp-bus/src/errors/mod.rs
+13 −5 crates/tinymcp-bus/src/lib.rs
+4 −3 crates/tinymcp-bus/src/transport/mod.rs
+93 −0 crates/tinymcp-bus/src/transport/mod_tests.rs
+100 −3 crates/tinymcp-bus/src/transport/types.rs
+22 −0 crates/tinymcp-bus/src/ui/mod.rs
+60 −0 crates/tinymcp-bus/src/ui/mod_tests.rs
+161 −0 crates/tinymcp-bus/src/ui/types.rs
+6 −3 crates/tinymcp-bus/src/version/mod.rs
+4 −4 crates/tinymcp-bus/src/version/mod_tests.rs
+6 −0 crates/tinymcp/Cargo.toml
+4 −0 crates/tinymcp/src/config_servers/mod.rs
+156 −0 crates/tinymcp/src/config_servers/mod_ui_tests.rs
+70 −1 crates/tinymcp/src/config_servers/types.rs
+29 −0 crates/tinymcp/src/error/mod.rs
+9 −0 crates/tinymcp/src/error/mod_tests.rs
+12 −10 crates/tinymcp/src/lib.rs
+4 −0 crates/tinymcp/src/registry/connections/mod.rs
+32 −0 crates/tinymcp/src/registry/connections/mod_tests.rs
+109 −0 crates/tinymcp/src/registry/connections/mod_ui_tests.rs
+107 −11 crates/tinymcp/src/registry/connections/types.rs
+30 −10 crates/tinymcp/src/registry/oauth/endpoint_guard.rs
+20 −1 crates/tinymcp/src/registry/oauth/endpoint_guard_tests.rs
+58 −0 crates/tinymcp/src/registry/ops/install.rs
+68 −1 crates/tinymcp/src/registry/ops/mod_tests.rs
+15 −4 crates/tinymcp/src/registry/ops/types.rs
+26 −1 crates/tinymcp/src/registry/store/mod_tests.rs
+4 −0 crates/tinymcp/src/registry/store/schema.rs
+43 −3 crates/tinymcp/src/registry/store/types.rs
+37 −10 crates/tinymcp/src/tools/bridge.rs
+6 −1 crates/tinymcp/src/tools/bridge_outcome_tests.rs
+189 −0 crates/tinymcp/src/tools/envelope_tests.rs
+4 −1 crates/tinymcp/src/tools/mod.rs
+3 −0 crates/tinymcp/src/tools/mod_tests.rs
+16 −1 crates/tinymcp/src/tools/result.rs
+2 −2 crates/tinymcp/src/tools/tool.rs
+18 −1 crates/tinymcp/src/transport/http/discovery.rs
+178 −11 crates/tinymcp/src/transport/http/mod.rs
+111 −0 crates/tinymcp/src/transport/http/mod_tests.rs
+174 −0 crates/tinymcp/src/transport/http/mod_ui_tests.rs
+3 −0 crates/tinymcp/src/transport/mod.rs
+46 −3 crates/tinymcp/src/transport/render.rs
+91 −0 crates/tinymcp/src/transport/render_tests.rs
+63 −0 crates/tinymcp/src/transport/resources.rs
+107 −0 crates/tinymcp/src/transport/resources_tests.rs
+93 −5 crates/tinymcp/src/transport/stdio/mod.rs
+173 −0 crates/tinymcp/src/transport/stdio/mod_ui_tests.rs
+117 −0 crates/tinymcp/src/transport/ui_fixture.rs
+180 −0 crates/tinymcp/src/ui/links.rs
+128 −0 crates/tinymcp/src/ui/links_tests.rs
+38 −0 crates/tinymcp/src/ui/mod.rs
+77 −0 crates/tinymcp/src/ui/policy.rs
+92 −0 crates/tinymcp/src/ui/policy_tests.rs
+456 −0 crates/tinymcp/src/ui/resolve.rs
+239 −0 crates/tinymcp/src/ui/resolve_tests.rs
+24 −0 crates/tinymcp/tests/registry_catalog_guards.rs
2 changes: 1 addition & 1 deletion vendor/tinymemory
2 changes: 1 addition & 1 deletion vendor/tinyruntime
Submodule tinyruntime updated 1 files
+2 −2 Cargo.lock
2 changes: 1 addition & 1 deletion vendor/tinyskills
Submodule tinyskills updated 2 files
+2 −2 Cargo.lock
+1 −1 Cargo.toml
Loading