Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
a81eef5
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
ea5ceba
chore(registry): update tinyconnectors to 0.11.1 and tinymemory to 1.…
senamakel Oct 1, 2026
9e57d3d
chore(ci): update tinymemory module to v1.22.0
senamakel Oct 1, 2026
89d4521
chore(memory): bump artifact capabilities pin to 1.22.0
senamakel Oct 1, 2026
6e56ed2
chore(deps): update tinyconnectors and tinymemory crate versions
senamakel Oct 1, 2026
2fa69bf
chore(deps): update tinyconnectors and tinymemory crate versions
senamakel Oct 1, 2026
f3d5474
Merge remote-tracking branch 'upstream/main' into fu-final-repin
senamakel Oct 1, 2026
2d0d07d
chore(deps): update tinyagents subproject commit
senamakel Oct 1, 2026
b4fff81
feat(agent): add typed TurnTimeoutBound to preserve timeout reason th…
senamakel Oct 1, 2026
7bdad0d
chore(scripts): remove externalize-inline-tests script
senamakel Oct 1, 2026
6491b38
fix(scripts): correct test for externalize-inline
senamakel Oct 1, 2026
ef3d179
test(externalize-inline-tests): correct expected line count in brace …
senamakel Oct 1, 2026
c93f8e1
fix(hosted_error): make error conversion and module public for cross-…
senamakel Oct 1, 2026
9b34817
fix(scripts): skip docs directory when externalizing inline tests
senamakel Oct 1, 2026
c6feab7
refactor(vendor): extract inline test modules into separate files
senamakel Oct 1, 2026
62b3a59
chore(scripts): remove externalize-inline-tests script
senamakel Oct 1, 2026
cfcbbac
fix(scripts): correct test for externalize-inline to handle inline co…
senamakel Oct 1, 2026
60dff79
feat(scripts): handle nested inline test modules in externalize-inlin…
senamakel Oct 1, 2026
358ef51
test(externalize-inline-tests): handle nested inline test modules ins…
senamakel Oct 1, 2026
1a18b1d
fix(scripts): skip deleted files in externalize-inline-tests
senamakel Oct 1, 2026
8a5f8e7
fix(scripts): avoid name collision for nested test modules
senamakel Oct 1, 2026
ed9d9ec
chore(vendor): add CLAUDE.md for motosan-ai-oauth
senamakel Oct 1, 2026
7f77e46
feat(scripts): put bin crate root tests in a subdirectory to avoid Ca…
senamakel Oct 1, 2026
cf8cfb0
docs(AGENTS.md): document Rust unit test layout conventions
senamakel Oct 1, 2026
318ee2e
chore(deps): update tinyagents submodule
senamakel Oct 1, 2026
b34c273
fix(agent): handle empty message content in conversion
senamakel Oct 1, 2026
98a0a56
fix(agent): handle empty message content in conversion
senamakel Oct 1, 2026
4432fc0
chore: files changed AGENTS.md,vendor/motosan-ai-oauth/Cargo.lock,ven…
senamakel Oct 1, 2026
59384be
fix(message_convert): pass full message to user_row
senamakel Oct 1, 2026
24b3078
chore(deps): update tinyjuice subproject commit
senamakel Oct 1, 2026
6de68b6
chore(scripts): update externalize-inline-tests to place test files i…
senamakel Oct 1, 2026
c870ef5
feat(scripts): write nested test modules to the directory rustc implies
senamakel Oct 1, 2026
b1d810c
feat(message_convert): preserve verbatim text when storing user messa…
senamakel Oct 1, 2026
0765656
fix(agent): handle missing session messages during import
senamakel Oct 1, 2026
d9d8447
chore(vendor): pin submodules with inline tests extracted
senamakel Oct 1, 2026
c11d051
fix(session_host): handle missing runtime session gracefully
senamakel Oct 1, 2026
8e2bae7
fix(agent): handle missing multimodal config gracefully
senamakel Oct 1, 2026
21ccf91
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
c029f54
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
ea10564
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
8730cbd
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
3bd3426
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
09a0994
chore: drop unrelated files swept in by the auto-commit hook
senamakel Oct 1, 2026
54797b5
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
8b6c095
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
0a2f0f3
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
781ca0f
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
2435c8f
fix(learning): read facets through the memory engine the user chose
YellowSnnowmann Oct 1, 2026
b436159
fix(brain): show a loading state while the memory graph loads
YellowSnnowmann Oct 1, 2026
d60e2fd
feat(composio): add direct tool execution with HTTP transport and err…
senamakel Oct 1, 2026
44538ca
fix(composio): handle missing credential fields gracefully
senamakel Oct 1, 2026
ec61dc7
fix(connectors): handle missing module client in composio integration
senamakel Oct 1, 2026
1f13475
fix(composio): remove unused direct client module
senamakel Oct 1, 2026
a52d506
feat(composio): expose module transport config for connectors
senamakel Oct 1, 2026
338f86c
fix(transcript_compat_tests): update test expectations for tinyagents…
senamakel Oct 1, 2026
0a5fe77
feat(composio): pass config to direct-mode connection functions
senamakel Oct 1, 2026
99ac9b1
fix(composio): remove unused import and re-export methods
senamakel Oct 1, 2026
c78663a
feat(tests): enable pinned connector for composio tools direct e2e test
senamakel Oct 1, 2026
735bef3
fix(composio): correct test assertion for empty response handling
senamakel Oct 1, 2026
71c5e7d
fix(composio): correct test assertion for network error handling
senamakel Oct 1, 2026
460f4a3
feat(agent): flatten image parts into text markers for provider requests
senamakel Oct 1, 2026
b783c9e
fix(transcript): correct test module name for typed transcript compat…
senamakel Oct 1, 2026
1284427
chore(composio): add test files for client and module client
senamakel Oct 1, 2026
36cce0b
fix: correct test assertion for message conversion
senamakel Oct 1, 2026
57b8b94
test(connectors): add test for proxy policy propagation to module config
senamakel Oct 1, 2026
cadf850
test(agent): add round-trip tests for typed tool rows and image parts
senamakel Oct 1, 2026
fa9b2c4
fix(agent): correct session host runtime session test
senamakel Oct 1, 2026
5ef965c
fix(network_tests): correct test assertions for network error handling
senamakel Oct 1, 2026
621d7e3
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
b6addcb
chore(deps): update vendor/tinyconnectors subproject commit
senamakel Oct 1, 2026
67d7e3a
chore(deps): update tinyconnectors dependencies from 0.11.1 to 0.12.0
senamakel Oct 1, 2026
2a38dfa
test(session-host): add test for live image turn persistence and resume
senamakel Oct 1, 2026
ade4ccb
chore(deps): update tinyagents submodule
senamakel Oct 1, 2026
a99a652
chore(modules): re-pin tinymemory to v1.22.1
YellowSnnowmann Oct 1, 2026
dee00c7
chore(deps): update tinyconnectors from 0.11.1 to 0.12.1
senamakel Oct 1, 2026
b0d1c10
fix(runtime_session): handle missing session host in runtime session
senamakel Oct 1, 2026
0f82a7e
fix(core): reorder import to resolve module visibility
senamakel Oct 1, 2026
b5ed704
fix(runtime_session): simplify last user message lookup
senamakel Oct 1, 2026
84dbefb
chore(deps): bump tinyconnectors crates from 0.12.0 to 0.12.1
senamakel Oct 1, 2026
c177324
fix(ci): correct line count for runtime session layout exception
senamakel Oct 1, 2026
fc1164a
test(typed-transcript-compat): add test for live image turn request b…
senamakel Oct 1, 2026
e6d5e94
fix(session_host): remove provider-bound image flattening shim
senamakel Oct 1, 2026
42c5a4e
fix(composio): correct test assertion for tool execution response
senamakel Oct 1, 2026
fe58685
chore(composio): reformat chained method calls for consistency
senamakel Oct 1, 2026
fca720c
fix(tests): update golden fixture for image user session compat
senamakel Oct 1, 2026
57e488f
fix(connectors): correct test module path for composio network tests
senamakel Oct 1, 2026
4b2662b
fix(learning): follow an engine switch with no context serving the wo…
YellowSnnowmann Oct 1, 2026
49000c4
chore(app): move the app lockfile to tinymemory v1.22.1
YellowSnnowmann Oct 1, 2026
8c9966f
chore(vendor): restore tinycomputer pin
senamakel Oct 1, 2026
acffb35
Merge remote-tracking branch 'upstream/main' into tests-to-files
senamakel Oct 1, 2026
5d65c47
chore(vendor): pin merged submodule branches
senamakel Oct 1, 2026
fd892e2
fix(e2e): refuse a web bundle older than its sources
obchain Oct 1, 2026
e56bbd4
chore(vendor): pin tinywallet inline-test extraction
senamakel Oct 1, 2026
4e93a4e
fix(memory): retry an expired fallback when resolving the current bin…
YellowSnnowmann Oct 1, 2026
07f8de6
Merge pull request #6899 from obchain/fix/5919-stale-bundle-guard
senamakel Oct 1, 2026
7b9e3f2
Merge pull request #6892 from YellowSnnowmann/fix/6718-learning-bindi…
senamakel Oct 1, 2026
09c704f
Merge upstream/main into fu-composio-bus; repin vendor to merged modu…
senamakel Oct 1, 2026
555cd71
Merge pull request #6897 from senamakel/fu-composio-bus
senamakel Oct 1, 2026
6617452
chore(modules): re-pin tinymemory to v1.22.2
YellowSnnowmann Oct 1, 2026
fa8ea08
Merge branch 'pr-6889' into try-6889
senamakel Oct 1, 2026
89be254
Merge pull request #6889 from senamakel/fu-timeout-bound-tag
senamakel Oct 1, 2026
d0b235b
Merge pull request #6901 from YellowSnnowmann/chore/6718-repin-tinyme…
YellowSnnowmann Oct 1, 2026
cc26269
Merge upstream/main into fu-typed-image-blocks; repin vendor to merge…
senamakel Oct 1, 2026
9ebdd88
Merge pull request #6895 from senamakel/fu-typed-image-blocks
senamakel Oct 1, 2026
9900bc5
Merge upstream/main into tests-to-files; repin vendor to merged modul…
senamakel Oct 1, 2026
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
8 changes: 4 additions & 4 deletions .github/workflows/ci-full.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ jobs:
# and leave a stale digest that only fails after the download. Both values
# are the ubuntu-22.04-x86_64 row of `crates/openhuman-core/src/modules/registry.rs`,
# which is the authoritative pin — copy them from there, never recompute.
memory_version="1.21.1"
memory_sha256="f208b1bf05e52af4ef7a9902d656827c471aa0a50aa3015ddb0ef9058e524c53"
memory_version="1.22.2"
memory_sha256="89f1da9f53e939263f3a7d9f4c6c19b52951bde308a9beb6efedc2b6c272163e"
module_root="/opt/openhuman-test-modules/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
memory_dir="$module_root/tinymemory"
juice_dir="$module_root/tinyjuice"
Expand Down Expand Up @@ -333,8 +333,8 @@ jobs:
# tinybus validates every directory ancestor. GitHub mounts the
# checkout as the host runner uid while this container runs as root,
# so keep native fixtures in a root-owned, ephemeral tree.
memory_version="1.21.1"
memory_sha256="f208b1bf05e52af4ef7a9902d656827c471aa0a50aa3015ddb0ef9058e524c53"
memory_version="1.22.2"
memory_sha256="89f1da9f53e939263f3a7d9f4c6c19b52951bde308a9beb6efedc2b6c272163e"
module_root="/opt/openhuman-test-modules/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
memory_dir="$module_root/tinymemory"
juice_dir="$module_root/tinyjuice"
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/e2e-playwright.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ jobs:
# tinybus validates every directory ancestor. GitHub mounts the
# checkout as the host runner uid while this container runs as root,
# so keep native fixtures in a root-owned, ephemeral tree.
memory_version="1.21.1"
memory_sha256="f208b1bf05e52af4ef7a9902d656827c471aa0a50aa3015ddb0ef9058e524c53"
memory_version="1.22.2"
memory_sha256="89f1da9f53e939263f3a7d9f4c6c19b52951bde308a9beb6efedc2b6c272163e"
module_root="/opt/openhuman-test-modules/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
memory_dir="$module_root/tinymemory"
juice_dir="$module_root/tinyjuice"
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/e2e-reusable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -168,8 +168,8 @@ jobs:
# and leave a stale digest that only fails after the download. Both values
# are the ubuntu-22.04-x86_64 row of `crates/openhuman-core/src/modules/registry.rs`,
# which is the authoritative pin — copy them from there, never recompute.
memory_version="1.21.1"
memory_sha256="f208b1bf05e52af4ef7a9902d656827c471aa0a50aa3015ddb0ef9058e524c53"
memory_version="1.22.2"
memory_sha256="89f1da9f53e939263f3a7d9f4c6c19b52951bde308a9beb6efedc2b6c272163e"
module_root="/opt/openhuman-test-modules/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
memory_dir="$module_root/tinymemory"
memory_archive="$memory_dir/tinymemory-module-${memory_version}-ubuntu-22.04-x86_64.tar.gz"
Expand Down Expand Up @@ -373,8 +373,8 @@ jobs:
# and leave a stale digest that only fails after the download. Both values
# are the ubuntu-22.04-x86_64 row of `crates/openhuman-core/src/modules/registry.rs`,
# which is the authoritative pin — copy them from there, never recompute.
memory_version="1.21.1"
memory_sha256="f208b1bf05e52af4ef7a9902d656827c471aa0a50aa3015ddb0ef9058e524c53"
memory_version="1.22.2"
memory_sha256="89f1da9f53e939263f3a7d9f4c6c19b52951bde308a9beb6efedc2b6c272163e"
module_root="/opt/openhuman-test-modules/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
memory_dir="$module_root/tinymemory"
connectors_dir="$module_root/tinyconnectors"
Expand Down Expand Up @@ -487,8 +487,8 @@ jobs:
# fixture outside the checkout owned by the host runner.
# Version and digest are the ubuntu-22.04-x86_64 registry pin; do
# not derive a replacement checksum from a local build.
memory_version="1.21.1"
memory_sha256="f208b1bf05e52af4ef7a9902d656827c471aa0a50aa3015ddb0ef9058e524c53"
memory_version="1.22.2"
memory_sha256="89f1da9f53e939263f3a7d9f4c6c19b52951bde308a9beb6efedc2b6c272163e"
juice_version="0.5.0"
juice_sha256="94c8998c830d9454560c00055187198a598eefaf5be51bcecdcd194a66f3b388"
module_root="/opt/openhuman-test-modules/${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,6 @@ diff-coverage.md
# Local/self-hosted CI run output (never commit)
ci-out/
ci-out-ex63/

# Cargo build output inside the in-tree motosan-ai-oauth crate
vendor/motosan-ai-oauth/target/
11 changes: 11 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,17 @@ coverage must be at least 80 percent.

- Frontend unit tests are colocated as `*.test.ts` or `*.test.tsx` under
`app/src/`. Use Vitest and test behavior rather than implementation.
- Rust unit tests are never inline. Put them in a sibling `<module>_tests.rs`
(`mod_tests.rs` beside a `mod.rs`) declared at the bottom of the module with
`#[cfg(test)]` and `#[path = "<module>_tests.rs"]` above `mod tests;`. The file
starts with `use super::*;` and carries no `#[cfg(test)]` of its own. Never name
one `test.rs`, `tests.rs` or `<module>_test.rs`, and never write an inline
`#[cfg(test)] mod tests { ... }` (`pnpm rust:layout` fails on an inline module
and on `test.rs`/`tests.rs`; it does not yet catch `<module>_test.rs`). The same
rule binds every `vendor/` submodule: `node scripts/externalize-inline-tests.mjs
<repo-root> --write` converts one mechanically, and a crate root directly in
`src/bin/` keeps its tests in `src/bin/<stem>/` because Cargo builds any `.rs`
placed straight in `src/bin/` as a binary.
- Rust domain tests live beside their modules. Use
`scripts/test-rust-with-mock.sh` for tests that need the shared mock backend.
- JSON-RPC behavior belongs in Rust E2E tests, commonly
Expand Down
113 changes: 107 additions & 6 deletions Cargo.lock

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

35 changes: 35 additions & 0 deletions app/scripts/e2e-web-session.sh
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,41 @@ if [ "$BUILT_CORE_PORT" != "$OPENHUMAN_CORE_PORT" ]; then
exit 1
fi

# Refuse a bundle older than the sources it was built from (#5919).
#
# The session serves the prebuilt `dist-web`, so editing `app/src` and re-running
# changes nothing in the browser: the spec runs against the PREVIOUS bundle and
# passes, which makes a revert-proof or a fault injection prove nothing at all.
# The marker is written after `build:web` returns, so anything newer than it is a
# source change this bundle does not contain. `-quit` stops at the first hit, so
# this is a stat walk rather than a hash of the tree, and directories are scanned
# too: a file added, removed or renamed after the build shows up as a newer
# directory even when no surviving file is newer.
#
# A missing input is an error rather than a skipped check. `find` on a path that
# does not exist reports nothing, so a renamed input would silently turn this
# gate off and leave the stale bundle served again.
STALE_SOURCE=""
for bundle_input in src public index.html vite.config.ts; do
input_path="$APP_DIR/$bundle_input"
if [ ! -e "$input_path" ]; then
echo "ERROR: bundle input $input_path does not exist, so staleness cannot be checked." >&2
echo " Update the input list in $(basename "$0") to match the current layout." >&2
exit 1
fi
if [ -z "$STALE_SOURCE" ]; then
STALE_SOURCE="$(find "$input_path" -newer "$E2E_BUNDLE_MARKER" -print -quit)"
fi
done
if [ -n "$STALE_SOURCE" ]; then
echo "ERROR: $APP_DIR/dist-web is older than the sources it was built from." >&2
echo " Newer than the bundle: $STALE_SOURCE" >&2
echo " The bundle does not carry that change, so the specs would run against" >&2
echo " the previous one and pass." >&2
echo " Rebuild first: pnpm --filter openhuman-app test:e2e:web:build" >&2
exit 1
fi

export OPENHUMAN_CORE_BIN="$E2E_WEB_CORE_TARGET_DIR/debug/openhuman-core"
if [ ! -x "$OPENHUMAN_CORE_BIN" ]; then
echo "ERROR: standalone core binary is missing at $OPENHUMAN_CORE_BIN. Run pnpm --filter openhuman-app test:e2e:web:build first." >&2
Expand Down
13 changes: 12 additions & 1 deletion app/src/pages/Brain.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import SettingsTabbedPage from '../components/settings/layout/SettingsTabbedPage
import MemoryEngineErrorAlert from '../components/settings/panels/MemoryEngineErrorAlert';
import { classifyMemoryEngineError } from '../components/settings/panels/memoryEngineUtils';
import { Alert, AlertDescription, Card } from '../components/ui';
import { CenteredLoadingState } from '../components/ui/LoadingState';
import { useT } from '../lib/i18n/I18nContext';
import { useCoreState } from '../providers/CoreStateProvider';
import type { ToastNotification } from '../types/intelligence';
Expand Down Expand Up @@ -421,7 +422,17 @@ export default function Brain() {
/>
) : error !== null ? (
<MemoryEngineErrorAlert error={error} fallbackText={t('brain.error')} />
) : null}
) : (
// The first load can take seconds — a hosted engine
// builds the graph from its derived layers — and an
// empty canvas meanwhile reads as a broken page.
<div role="status" data-testid="brain-graph-loading">
<CenteredLoadingState
label={t('workspace.loadingGraph')}
className="h-[640px] rounded-lg border border-line-subtle bg-surface-muted/40"
/>
</div>
)}
</div>
</MemoryFamilyGate>
)}
Expand Down
22 changes: 22 additions & 0 deletions app/src/pages/__tests__/Brain.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,28 @@ describe('Brain page', () => {
});
});

it('shows a loading state, not an empty canvas, until the graph arrives', async () => {
let resolveGraph!: (graph: ReturnType<typeof makeGraph>) => void;
graphExportMock.mockReturnValue(
new Promise(resolve => {
resolveGraph = resolve;
})
);
await act(async () => {
renderWithProviders(<Brain />, { initialEntries: ['/?tab=graph'] });
});
expect(screen.getByTestId('brain-graph-loading')).toHaveTextContent('workspace.loadingGraph');
expect(screen.queryByTestId('memory-graph')).not.toBeInTheDocument();

await act(async () => {
resolveGraph(makeGraph(2));
});
await waitFor(() => {
expect(screen.getByTestId('memory-graph')).toHaveTextContent('nodes:2');
});
expect(screen.queryByTestId('brain-graph-loading')).not.toBeInTheDocument();
});

it('renders empty-state graph when there are no nodes', async () => {
graphExportMock.mockResolvedValue(makeGraph(0));
await act(async () => {
Expand Down
Loading
Loading