Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
0857c98
refactor(subconscious): replace task evaluator with agent-per-tick model
senamakel May 31, 2026
c1780f6
refactor(ui): simplify subconscious tab for agent-per-tick model
senamakel May 31, 2026
0df4a8b
fix: update remaining test files for agent-per-tick model
senamakel May 31, 2026
e60a3d5
style: apply prettier + cargo fmt formatting
senamakel May 31, 2026
9b76fef
Merge remote-tracking branch 'upstream/main' into pr/3079
senamakel Jun 1, 2026
845a215
feat(subconscious): wire up real agent harness with tool access
senamakel Jun 1, 2026
776fca2
feat(subconscious): add tiered SubconsciousMode (off/simple/aggressive)
senamakel Jun 1, 2026
03b4676
feat(ui): add tiered mode selector to subconscious tab
senamakel Jun 1, 2026
a656b56
fix(subconscious): add subconscious_mode to heartbeat RPC schema
senamakel Jun 1, 2026
06c82c7
feat(ui): add frequency slider to subconscious tab
senamakel Jun 1, 2026
b296a03
fix(inference): surface actionable error when Managed route fails wit…
senamakel-droid Jun 1, 2026
aa91c66
fix(memory/safety): exclude bare-phone patterns from strict PII rejec…
oxoxDev Jun 1, 2026
ea1a5b8
test: green Rust Core Coverage (stale assertions + env-race serializa…
sanil-23 Jun 1, 2026
8a6a253
fix(composio): complete connection-disconnect cleanup (config entry +…
sanil-23 Jun 1, 2026
de85d1f
feat(analytics): wire product event tracking (#3123)
senamakel Jun 2, 2026
cb4b897
refactor(agent): unwire eager 7-day memory-tree digest from turn loop…
sanil-23 Jun 2, 2026
0257f09
fix: resolve merge conflict in subconscious store.rs
senamakel Jun 2, 2026
68ecb69
fix: address CodeRabbit review feedback
senamakel Jun 2, 2026
ad85d00
test: add useSubconscious hook tests for coverage gate
senamakel Jun 2, 2026
461d28b
fix: add missing afterEach import in useSubconscious test
senamakel Jun 2, 2026
3e33e12
style: format useSubconscious test with prettier
senamakel Jun 2, 2026
bfd73ee
fix(subconscious): track agent failures separately from empty ticks
senamakel Jun 2, 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
11 changes: 11 additions & 0 deletions app/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,17 @@ VITE_SKILLS_GITHUB_REPO=tinyhumansai/openhuman-skills
# Only anonymous page views and feature-engagement events are sent — no PII.
VITE_GA_MEASUREMENT_ID=

# [optional] OpenPanel analytics project. Leave client id blank to disable.
# The API URL should include `/api` and must accept this browser/client id.
VITE_OPENPANEL_CLIENT_ID=e9c996d5-497f-4eec-9bde-630019ad525b
VITE_OPENPANEL_API_URL=https://panel.tinyhumans.ai/api
Comment thread
senamakel marked this conversation as resolved.

# [optional] Analytics version metadata. Defaults to the frontend package
# version when unset; CI/release jobs may override if these ever diverge.
# VITE_OPENHUMAN_BINARY_VERSION=0.57.4
# VITE_OPENHUMAN_CORE_CARGO_VERSION=0.57.4
# VITE_OPENHUMAN_TAURI_CARGO_VERSION=0.57.4

# [optional] Sentry DSN for error reporting (leave blank to disable)
VITE_SENTRY_DSN=

Expand Down
1 change: 1 addition & 0 deletions app/scripts/e2e-web-session.sh
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ fi

export OPENHUMAN_CORE_TOKEN="$PW_CORE_RPC_TOKEN"
export OPENHUMAN_TELEGRAM_BOT_API_BASE="http://127.0.0.1:${E2E_MOCK_PORT}"
export RUST_MIN_STACK="${RUST_MIN_STACK:-16777216}"

"$OPENHUMAN_CORE_BIN" run --host 127.0.0.1 --port "$OPENHUMAN_CORE_PORT" \
>"$OPENHUMAN_WORKSPACE/core.log" 2>&1 &
Expand Down
28 changes: 5 additions & 23 deletions app/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,21 @@
}
],
"security": {
"csp": "default-src 'self' 'unsafe-inline' data: blob: https: wss: ipc: http://ipc.localhost http://127.0.0.1:* http://localhost:*; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval'; img-src 'self' data: blob: https:; connect-src 'self' ipc: http://ipc.localhost http://127.0.0.1:* http://localhost:* http: ws://127.0.0.1:* ws://localhost:* ws: https: wss: data: blob:; frame-src 'self' https: data: blob:"
"csp": "default-src 'self' 'unsafe-inline' data: blob: https: wss: ipc: http://ipc.localhost http://127.0.0.1:* http://localhost:*; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval' https://www.googletagmanager.com; img-src 'self' data: blob: https:; connect-src 'self' ipc: http://ipc.localhost http://127.0.0.1:* http://localhost:* http: ws://127.0.0.1:* ws://localhost:* ws: https: wss: data: blob: https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com; frame-src 'self' https: data: blob:"
},
"macOSPrivateApi": true
},
"bundle": {
"active": true,
"targets": [
"app",
"dmg",
"deb",
"nsis",
"msi",
"appimage"
],
"targets": ["app", "dmg", "deb", "nsis", "msi", "appimage"],
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"resources": [
"../../src/openhuman/agent/prompts",
"recipes/**/*"
],
"resources": ["../../src/openhuman/agent/prompts", "recipes/**/*"],
"linux": {
"deb": {
"depends": [
Expand All @@ -66,9 +56,7 @@
"minimumSystemVersion": "10.15",
"entitlements": "entitlements.sidecar.plist",
"infoPlist": "Info.plist",
"dmg": {
"background": "./images/background-dmg.png"
}
"dmg": { "background": "./images/background-dmg.png" }
}
},
"plugins": {
Expand All @@ -79,12 +67,6 @@
"https://github.com/tinyhumansai/openhuman/releases/latest/download/latest.json"
]
},
"deep-link": {
"desktop": {
"schemes": [
"openhuman"
]
}
}
"deep-link": { "desktop": { "schemes": ["openhuman"] } }
}
}
17 changes: 16 additions & 1 deletion app/src/components/BottomTabBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom';

import { useT } from '../lib/i18n/I18nContext';
import { useCoreState } from '../providers/CoreStateProvider';
import { trackEvent } from '../services/analytics';
import { selectCompanionSessionActive } from '../store/companionSlice';
import { useAppSelector } from '../store/hooks';
import { selectUnreadCount } from '../store/notificationSlice';
Expand Down Expand Up @@ -174,6 +175,20 @@ const BottomTabBar = () => {
return location.pathname === path;
};

const activeTab = tabs.find(tab => isActive(tab.path));

const handleTabClick = (tab: (typeof tabs)[number], active: boolean) => {
if (!active) {
trackEvent('tab_bar_change', {
from_tab: activeTab?.id ?? 'unknown',
to_tab: tab.id,
from_path: location.pathname,
to_path: tab.path,
});
}
navigate(tab.path);
};

return (
// pointer-events-none on the full-width shell so transparent areas (e.g.
// beside the centered nav pill) do not steal clicks from sticky footers
Expand Down Expand Up @@ -214,7 +229,7 @@ const BottomTabBar = () => {
<button
key={tab.id}
data-walkthrough={walkthroughAttr[tab.id]}
onClick={() => navigate(tab.path)}
onClick={() => handleTabClick(tab, active)}
className={`group relative flex items-center px-2 py-2 rounded-sm text-sm transition-colors duration-500 ease-[cubic-bezier(0.22,1,0.36,1)] cursor-pointer ${
active
? 'bg-white dark:bg-neutral-800 text-stone-900 dark:text-neutral-100 font-semibold shadow-sm'
Expand Down
26 changes: 25 additions & 1 deletion app/src/components/__tests__/BottomTabBar.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
* [#1123] Covers the walkthroughAttr object added for the Joyride walkthrough.
*/
import { configureStore } from '@reduxjs/toolkit';
import { render, screen } from '@testing-library/react';
import { fireEvent, render, screen } from '@testing-library/react';
import { Provider } from 'react-redux';
import { MemoryRouter } from 'react-router-dom';
import { beforeEach, describe, expect, it, vi } from 'vitest';
Expand All @@ -27,6 +27,7 @@ vi.mock('../../utils/config', async importOriginal => {
});

vi.mock('../../utils/accountsFullscreen', () => ({ isAccountsFullscreen: vi.fn(() => false) }));
vi.mock('../../services/analytics', () => ({ trackEvent: vi.fn() }));

// ── Helpers ────────────────────────────────────────────────────────────────

Expand Down Expand Up @@ -158,4 +159,27 @@ describe('BottomTabBar', () => {
expect(shell).toHaveClass('pointer-events-none');
expect(shell?.querySelector('nav')).toHaveClass('pointer-events-auto');
});

it('tracks tab changes when a different tab is clicked', async () => {
const { trackEvent } = await import('../../services/analytics');
await renderBottomTabBar('/home');

fireEvent.click(screen.getByRole('button', { name: 'Chat' }));

expect(trackEvent).toHaveBeenCalledWith('tab_bar_change', {
from_tab: 'home',
to_tab: 'chat',
from_path: '/home',
to_path: '/chat',
});
});

it('does not track when the active tab is clicked again', async () => {
const { trackEvent } = await import('../../services/analytics');
await renderBottomTabBar('/home');

fireEvent.click(screen.getByRole('button', { name: 'Home' }));

expect(trackEvent).not.toHaveBeenCalled();
});
});
17 changes: 16 additions & 1 deletion app/src/components/__tests__/DefaultRedirect.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,22 @@ import { describe, expect, it, vi } from 'vitest';

import DefaultRedirect from '../DefaultRedirect';

vi.mock('../../utils/config', () => ({ DEV_FORCE_ONBOARDING: false }));
vi.mock('../../utils/config', () => ({
APP_BINARY_VERSION: '0.0.0-test',
APP_ENVIRONMENT: 'test',
APP_VERSION: '0.0.0-test',
BUILD_SHA: 'test',
CORE_CARGO_VERSION: '0.0.0-test',
DEV_FORCE_ONBOARDING: false,
GA_MEASUREMENT_ID: undefined,
IS_DEV: true,
OPENPANEL_API_URL: 'https://panel.tinyhumans.ai/api',
OPENPANEL_CLIENT_ID: undefined,
SENTRY_DSN: undefined,
SENTRY_RELEASE: 'openhuman@test',
SENTRY_SMOKE_TEST: false,
TAURI_CARGO_VERSION: '0.0.0-test',
}));

const mockUseCoreState = vi.fn();
vi.mock('../../providers/CoreStateProvider', () => ({ useCoreState: () => mockUseCoreState() }));
Expand Down
13 changes: 13 additions & 0 deletions app/src/components/daemon/__tests__/ServiceBlockingGate.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,20 @@ vi.mock('../../../utils/openUrl', () => ({
}));

vi.mock('../../../utils/config', () => ({
APP_BINARY_VERSION: '0.0.0-test',
APP_ENVIRONMENT: 'test',
APP_VERSION: '0.0.0-test',
BUILD_SHA: 'test',
CORE_CARGO_VERSION: '0.0.0-test',
GA_MEASUREMENT_ID: undefined,
IS_DEV: true,
LATEST_APP_DOWNLOAD_URL: 'https://github.com/tinyhumansai/openhuman/releases/latest',
OPENPANEL_API_URL: 'https://panel.tinyhumans.ai/api',
OPENPANEL_CLIENT_ID: undefined,
SENTRY_DSN: undefined,
SENTRY_RELEASE: 'openhuman@test',
SENTRY_SMOKE_TEST: false,
TAURI_CARGO_VERSION: '0.0.0-test',
}));

vi.mock('../../../providers/CoreStateProvider', () => ({ useCoreState: () => mockUseCoreState() }));
Expand Down
Loading
Loading