Skip to content

Commit 0aea6f3

Browse files
committed
Merge remote-tracking branch 'origin/staging' into codex/telegram-hot-activation-tests
# Conflicts: # src/extensions/manager.rs
2 parents 2be585a + c79754d commit 0aea6f3

78 files changed

Lines changed: 5213 additions & 703 deletions

Some content is hidden

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

.github/workflows/code_style.yml

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -86,37 +86,13 @@ jobs:
8686
uses: actions/checkout@v6
8787
with:
8888
fetch-depth: 0
89+
- uses: actions/setup-python@v5
90+
with:
91+
python-version: "3.12"
8992
- name: Check for .unwrap(), .expect(), assert!() in production code
9093
run: |
9194
BASE="${{ github.event.pull_request.base.sha }}"
92-
# Get added lines in .rs files (production only, exclude tests/)
93-
ADDED=$(git diff "$BASE"...HEAD -- 'src/**/*.rs' 'crates/**/*.rs' \
94-
| grep -E '^\+[^+]' || true)
95-
96-
if [ -z "$ADDED" ]; then
97-
echo "No production Rust changes detected."
98-
exit 0
99-
fi
100-
101-
# Match panic-inducing patterns, excluding test code and safety suppressions
102-
VIOLATIONS=$(echo "$ADDED" \
103-
| grep -E '\.(unwrap|expect)\(|[^_]assert(_eq|_ne)?!' \
104-
| grep -Ev 'debug_assert|// safety:|#\[cfg\(test\)\]|#\[test\]|mod tests' \
105-
|| true)
106-
107-
if [ -n "$VIOLATIONS" ]; then
108-
echo "::error::Found .unwrap(), .expect(), or assert!() in production code."
109-
echo "Production code must use proper error handling instead of panicking."
110-
echo "Suppress false positives with an inline '// safety: <reason>' comment."
111-
echo ""
112-
echo "$VIOLATIONS" | head -20
113-
echo ""
114-
COUNT=$(echo "$VIOLATIONS" | wc -l | tr -d ' ')
115-
echo "Total: $COUNT violation(s)"
116-
exit 1
117-
fi
118-
119-
echo "OK: No panic-inducing calls in changed production code."
95+
python3 scripts/check_no_panics.py --base "$BASE" --head HEAD
12096
12197
# Roll-up job for branch protection
12298
code-style:

.github/workflows/e2e.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
- group: features
5353
files: "tests/e2e/scenarios/test_skills.py tests/e2e/scenarios/test_tool_approval.py"
5454
- group: extensions
55-
files: "tests/e2e/scenarios/test_extensions.py tests/e2e/scenarios/test_extension_oauth.py tests/e2e/scenarios/test_wasm_lifecycle.py tests/e2e/scenarios/test_tool_execution.py tests/e2e/scenarios/test_pairing.py"
55+
files: "tests/e2e/scenarios/test_extensions.py tests/e2e/scenarios/test_extension_oauth.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"
5656
steps:
5757
- uses: actions/checkout@v6
5858

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414

1515
target/
1616

17+
# Python
18+
__pycache__/
19+
*.pyc
20+
1721
# Benchmark results (local runs, not committed)
1822
bench-results/
1923

Cargo.lock

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

build.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,15 @@ fn embed_registry_catalog(root: &Path) {
132132
// No registry dir: write empty catalog
133133
fs::write(
134134
&out_path,
135-
r#"{"tools":[],"channels":[],"bundles":{"bundles":{}}}"#,
135+
r#"{"tools":[],"channels":[],"mcp_servers":[],"bundles":{"bundles":{}}}"#,
136136
)
137137
.unwrap();
138138
return;
139139
}
140140

141141
let mut tools = Vec::new();
142142
let mut channels = Vec::new();
143+
let mut mcp_servers = Vec::new();
143144

144145
// Collect tool manifests
145146
let tools_dir = registry_dir.join("tools");
@@ -153,6 +154,12 @@ fn embed_registry_catalog(root: &Path) {
153154
collect_json_files(&channels_dir, &mut channels);
154155
}
155156

157+
// Collect MCP server manifests
158+
let mcp_servers_dir = registry_dir.join("mcp-servers");
159+
if mcp_servers_dir.is_dir() {
160+
collect_json_files(&mcp_servers_dir, &mut mcp_servers);
161+
}
162+
156163
// Read bundles
157164
let bundles_path = registry_dir.join("_bundles.json");
158165
let bundles_raw = if bundles_path.is_file() {
@@ -163,9 +170,10 @@ fn embed_registry_catalog(root: &Path) {
163170

164171
// Build the combined JSON
165172
let catalog = format!(
166-
r#"{{"tools":[{}],"channels":[{}],"bundles":{}}}"#,
173+
r#"{{"tools":[{}],"channels":[{}],"mcp_servers":[{}],"bundles":{}}}"#,
167174
tools.join(","),
168175
channels.join(","),
176+
mcp_servers.join(","),
169177
bundles_raw,
170178
);
171179

crates/ironclaw_safety/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ rust-version = "1.92"
66
description = "Prompt injection defense, input validation, secret leak detection, and safety policy enforcement"
77
authors = ["NEAR AI <[email protected]>"]
88
license = "MIT OR Apache-2.0"
9+
homepage = "https://github.com/nearai/ironclaw"
10+
repository = "https://github.com/nearai/ironclaw"
11+
publish = false
12+
13+
[package.metadata.dist]
14+
dist = false
915

1016
[dependencies]
1117
aho-corasick = "1"

registry/channels/discord.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "discord",
33
"display_name": "Discord Channel",
44
"kind": "channel",
5-
"version": "0.2.1",
5+
"version": "0.2.0",
66
"wit_version": "0.3.0",
77
"description": "Talk to your agent in Discord",
88
"keywords": [

registry/mcp-servers/asana.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "asana",
3+
"display_name": "Asana",
4+
"kind": "mcp_server",
5+
"description": "Connect to Asana for task management, projects, and team coordination",
6+
"keywords": ["tasks", "projects", "management", "team"],
7+
"url": "https://mcp.asana.com/v2/mcp",
8+
"auth": "dcr"
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "cloudflare",
3+
"display_name": "Cloudflare",
4+
"kind": "mcp_server",
5+
"description": "Connect to Cloudflare for DNS, Workers, KV, and infrastructure management",
6+
"keywords": ["cdn", "dns", "workers", "hosting", "infrastructure"],
7+
"url": "https://mcp.cloudflare.com/mcp",
8+
"auth": "dcr"
9+
}

registry/mcp-servers/intercom.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "intercom",
3+
"display_name": "Intercom",
4+
"kind": "mcp_server",
5+
"description": "Connect to Intercom for customer messaging, support, and engagement",
6+
"keywords": ["support", "customers", "messaging", "chat", "helpdesk"],
7+
"url": "https://mcp.intercom.com/mcp",
8+
"auth": "dcr"
9+
}

0 commit comments

Comments
 (0)