Skip to content

Commit f6d2181

Browse files
authored
Merge branch 'staging' into feat/web-gateway-light-theme
2 parents 53986c9 + 2784cef commit f6d2181

111 files changed

Lines changed: 10156 additions & 2285 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.env.example‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ DATABASE_POOL_SIZE=10
1818

1919
# === OpenAI Direct ===
2020
# OPENAI_API_KEY=sk-...
21+
# Reuse Codex CLI auth.json instead of setting OPENAI_API_KEY manually.
22+
# Works with both OpenAI API-key mode and Codex ChatGPT OAuth mode.
23+
# In ChatGPT mode this uses the private `chatgpt.com/backend-api/codex` endpoint.
24+
# LLM_USE_CODEX_AUTH=true
25+
# CODEX_AUTH_PATH=~/.codex/auth.json
2126

2227
# === NEAR AI (Chat Completions API) ===
2328
# Two auth modes:

‎.github/workflows/e2e.yml‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ on:
55
- cron: "0 6 * * 1" # Weekly Monday 6 AM UTC
66
workflow_dispatch:
77
pull_request:
8+
branches:
9+
- main
810
paths:
911
- "src/channels/web/**"
1012
- "tests/e2e/**"
@@ -50,9 +52,11 @@ jobs:
5052
- group: core
5153
files: "tests/e2e/scenarios/test_connection.py tests/e2e/scenarios/test_chat.py tests/e2e/scenarios/test_sse_reconnect.py tests/e2e/scenarios/test_html_injection.py tests/e2e/scenarios/test_csp.py"
5254
- group: features
53-
files: "tests/e2e/scenarios/test_skills.py tests/e2e/scenarios/test_tool_approval.py"
55+
files: "tests/e2e/scenarios/test_skills.py tests/e2e/scenarios/test_tool_approval.py tests/e2e/scenarios/test_webhook.py"
5456
- group: extensions
55-
files: "tests/e2e/scenarios/test_extensions.py tests/e2e/scenarios/test_extension_oauth.py tests/e2e/scenarios/test_telegram_token_validation.py tests/e2e/scenarios/test_wasm_lifecycle.py tests/e2e/scenarios/test_tool_execution.py tests/e2e/scenarios/test_pairing.py tests/e2e/scenarios/test_oauth_credential_fallback.py tests/e2e/scenarios/test_routine_oauth_credential_injection.py"
57+
files: "tests/e2e/scenarios/test_extensions.py tests/e2e/scenarios/test_extension_oauth.py tests/e2e/scenarios/test_telegram_token_validation.py tests/e2e/scenarios/test_telegram_hot_activation.py tests/e2e/scenarios/test_wasm_lifecycle.py tests/e2e/scenarios/test_tool_execution.py tests/e2e/scenarios/test_pairing.py tests/e2e/scenarios/test_mcp_auth_flow.py tests/e2e/scenarios/test_oauth_credential_fallback.py tests/e2e/scenarios/test_routine_oauth_credential_injection.py"
58+
- group: routines
59+
files: "tests/e2e/scenarios/test_owner_scope.py tests/e2e/scenarios/test_routine_event_batch.py"
5660
steps:
5761
- uses: actions/checkout@v6
5862

‎.github/workflows/test.yml‎

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ jobs:
1717
matrix:
1818
include:
1919
- name: all-features
20-
flags: "--features postgres,libsql,html-to-markdown"
20+
# Keep product feature coverage broad without pulling in the
21+
# test-only `integration` feature, which is exercised separately
22+
# in the heavy integration job below.
23+
flags: "--no-default-features --features postgres,libsql,html-to-markdown,bedrock,import"
2124
- name: default
2225
flags: ""
2326
- name: libsql-only
@@ -39,6 +42,26 @@ jobs:
3942
- name: Run Tests
4043
run: cargo test ${{ matrix.flags }} -- --nocapture
4144

45+
heavy-integration-tests:
46+
name: Heavy Integration Tests
47+
runs-on: ubuntu-latest
48+
steps:
49+
- name: Checkout repository
50+
uses: actions/checkout@v6
51+
- name: Install Rust
52+
uses: dtolnay/rust-toolchain@stable
53+
with:
54+
targets: wasm32-wasip2
55+
- uses: Swatinem/rust-cache@v2
56+
with:
57+
key: heavy-integration
58+
- name: Build Telegram WASM channel
59+
run: cargo build --manifest-path channels-src/telegram/Cargo.toml --target wasm32-wasip2 --release
60+
- name: Run thread scheduling integration tests
61+
run: cargo test --no-default-features --features libsql,integration --test e2e_thread_scheduling -- --nocapture
62+
- name: Run Telegram thread-scope regression test
63+
run: cargo test --features integration --test telegram_auth_integration test_private_messages_use_chat_id_as_thread_scope -- --exact
64+
4265
telegram-tests:
4366
name: Telegram Channel Tests
4467
if: >
@@ -65,7 +88,7 @@ jobs:
6588
matrix:
6689
include:
6790
- name: all-features
68-
flags: "--all-features"
91+
flags: "--no-default-features --features postgres,libsql,html-to-markdown,bedrock,import"
6992
- name: default
7093
flags: ""
7194
- name: libsql-only
@@ -149,14 +172,18 @@ jobs:
149172
name: Run Tests
150173
runs-on: ubuntu-latest
151174
if: always()
152-
needs: [tests, telegram-tests, wasm-wit-compat, docker-build, windows-build, version-check, bench-compile]
175+
needs: [tests, heavy-integration-tests, telegram-tests, wasm-wit-compat, docker-build, windows-build, version-check, bench-compile]
153176
steps:
154177
- run: |
155178
# Unit tests must always pass
156179
if [[ "${{ needs.tests.result }}" != "success" ]]; then
157180
echo "Unit tests failed"
158181
exit 1
159182
fi
183+
if [[ "${{ needs.heavy-integration-tests.result }}" != "success" ]]; then
184+
echo "Heavy integration tests failed"
185+
exit 1
186+
fi
160187
# Gated jobs: must pass on promotion PRs / push, skipped on developer PRs
161188
for job in telegram-tests wasm-wit-compat docker-build windows-build version-check bench-compile; do
162189
case "$job" in

‎Cargo.lock‎

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ eula = false
4040
tokio = { version = "1", features = ["full"] }
4141
tokio-stream = { version = "0.1", features = ["sync"] }
4242
futures = "0.3"
43+
eventsource-stream = "0.2"
4344

4445
# HTTP client
4546
reqwest = { version = "0.12", default-features = false, features = ["json", "multipart", "rustls-tls-native-roots", "stream"] }
@@ -221,11 +222,17 @@ postgres = [
221222
"rust_decimal/db-tokio-postgres",
222223
]
223224
libsql = ["dep:libsql"]
225+
# Opt-in feature for especially heavy integration-test targets that run in a
226+
# dedicated CI job instead of the default Rust test matrix.
224227
integration = []
225228
html-to-markdown = ["dep:html-to-markdown-rs", "dep:readabilityrs"]
226229
bedrock = ["dep:aws-config", "dep:aws-sdk-bedrockruntime", "dep:aws-smithy-types"]
227230
import = ["dep:json5", "libsql"]
228231

232+
[[test]]
233+
name = "e2e_thread_scheduling"
234+
required-features = ["libsql", "integration"]
235+
229236
[[test]]
230237
name = "html_to_markdown"
231238
required-features = ["html-to-markdown"]

‎FEATURE_PARITY.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ This document tracks feature parity between IronClaw (Rust implementation) and O
2020
|---------|----------|----------|-------|
2121
| Hub-and-spoke architecture | ✅ | ✅ | Web gateway as central hub |
2222
| WebSocket control plane | ✅ | ✅ | Gateway with WebSocket + SSE |
23-
| Single-user system | ✅ | ✅ | |
23+
| Single-user system | ✅ | ✅ | Explicit instance owner scope for persistent routines, secrets, jobs, settings, extensions, and workspace memory |
2424
| Multi-agent routing | ✅ | ❌ | Workspace isolation per-agent |
25-
| Session-based messaging | ✅ | ✅ | Per-sender sessions |
25+
| Session-based messaging | ✅ | ✅ | Owner scope is separate from sender identity and conversation scope |
2626
| Loopback-first networking | ✅ | ✅ | HTTP binds to 0.0.0.0 but can be configured |
2727

2828
### Owner: _Unassigned_
@@ -66,9 +66,9 @@ This document tracks feature parity between IronClaw (Rust implementation) and O
6666
| CLI/TUI | ✅ | ✅ | - | Ratatui-based TUI |
6767
| HTTP webhook | ✅ | ✅ | - | axum with secret validation |
6868
| REPL (simple) | ✅ | ✅ | - | For testing |
69-
| WASM channels | ❌ | ✅ | - | IronClaw innovation |
69+
| WASM channels | ❌ | ✅ | - | IronClaw innovation; host resolves owner scope vs sender identity |
7070
| WhatsApp | ✅ | ❌ | P1 | Baileys (Web), same-phone mode with echo detection |
71-
| Telegram | ✅ | ✅ | - | WASM channel(MTProto), DM pairing, caption, /start, bot_username, DM topics |
71+
| Telegram | ✅ | ✅ | - | WASM channel(MTProto), DM pairing, caption, /start, bot_username, DM topics, setup-time owner auto-verification, owner-scoped persistence |
7272
| Discord | ✅ | ❌ | P2 | discord.js, thread parent binding inheritance |
7373
| Signal | ✅ | ✅ | P2 | signal-cli daemonPC, SSE listener HTTP/JSON-R, user/group allowlists, DM pairing |
7474
| Slack | ✅ | ✅ | - | WASM tool |

0 commit comments

Comments
 (0)