agent-wire-cli 0.2.3__tar.gz → 0.2.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent_wire_cli-0.2.5/.claude-plugin/marketplace.json +14 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.github/dependabot.yml +4 -1
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.github/workflows/ci.yml +11 -13
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.github/workflows/codeql.yml +1 -1
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.github/workflows/release.yml +5 -4
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.github/workflows/security.yml +7 -7
- agent_wire_cli-0.2.5/CHANGELOG.md +55 -0
- agent_wire_cli-0.2.5/DOCUMENTATION.md +112 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/PKG-INFO +108 -40
- agent_wire_cli-0.2.5/PRIVACY.md +54 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/README.md +104 -38
- agent_wire_cli-0.2.5/SECURITY.md +63 -0
- agent_wire_cli-0.2.5/SUPPORT.md +6 -0
- agent_wire_cli-0.2.5/TERMS.md +17 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/gemini_extension.json +1 -1
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/hermes_skill.md +1 -1
- agent_wire_cli-0.2.5/plugin/.claude-plugin/plugin.json +77 -0
- agent_wire_cli-0.2.5/plugin/.mcp.json +17 -0
- agent_wire_cli-0.2.5/plugin/LICENSE +21 -0
- agent_wire_cli-0.2.5/plugin/README.md +27 -0
- agent_wire_cli-0.2.5/plugin/agents/wire-worker.md +21 -0
- agent_wire_cli-0.2.5/plugin/assets/agent-wire-logo.png +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5/plugin}/skills/agent-wire/SKILL.md +1 -1
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/pyproject.toml +10 -2
- agent_wire_cli-0.2.5/skills/agent-wire/SKILL.md +45 -0
- agent_wire_cli-0.2.5/src/agent_wire/__init__.py +1 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/base.py +7 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/github.py +6 -2
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/reddit.py +2 -2
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/web.py +2 -2
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/hubs.py +2 -2
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/publishing.py +2 -2
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/douyin_tiktok.py +10 -3
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/cli.py +152 -4
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/codemode/sandbox.py +32 -8
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/compression/bm25_slicer.py +38 -9
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/config.py +3 -0
- agent_wire_cli-0.2.5/src/agent_wire/firewall/inbound_shield.py +329 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/firewall/outbound_privacy.py +28 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/firewall/ssrf_guard.py +5 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/media/audio_transcriber.py +6 -1
- agent_wire_cli-0.2.5/src/agent_wire/selftest/__init__.py +175 -0
- agent_wire_cli-0.2.5/src/agent_wire/selftest/checks.py +373 -0
- agent_wire_cli-0.2.5/src/agent_wire/selftest/fakes.py +131 -0
- agent_wire_cli-0.2.5/src/agent_wire/selftest/live.py +108 -0
- agent_wire_cli-0.2.5/src/agent_wire/selftest/scenarios.py +235 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/server.py +73 -34
- agent_wire_cli-0.2.5/src/agent_wire/shield/__init__.py +91 -0
- agent_wire_cli-0.2.5/src/agent_wire/shield/demo.html +30 -0
- agent_wire_cli-0.2.5/src/agent_wire/shield/demo.py +39 -0
- agent_wire_cli-0.2.5/src/agent_wire/shield/detect.py +84 -0
- agent_wire_cli-0.2.5/src/agent_wire/shield/events.py +136 -0
- agent_wire_cli-0.2.5/src/agent_wire/shield/ledger.py +99 -0
- agent_wire_cli-0.2.5/src/agent_wire/shield/notify.py +107 -0
- agent_wire_cli-0.2.5/tests/conftest.py +24 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_channels_new.py +16 -1
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_channels_tier2_3.py +14 -16
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_codemode.py +28 -3
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_config.py +7 -0
- agent_wire_cli-0.2.5/tests/test_directory_compliance.py +53 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_firewall_outbound.py +20 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_installer.py +27 -5
- agent_wire_cli-0.2.5/tests/test_selftest.py +85 -0
- agent_wire_cli-0.2.5/tests/test_shield.py +252 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/uv.lock +17 -13
- agent_wire_cli-0.2.3/.claude-plugin/marketplace.json +0 -14
- agent_wire_cli-0.2.3/.claude-plugin/plugin.json +0 -26
- agent_wire_cli-0.2.3/.github/scripts/mcp_smoke.py +0 -36
- agent_wire_cli-0.2.3/SECURITY.md +0 -40
- agent_wire_cli-0.2.3/src/agent_wire/__init__.py +0 -1
- agent_wire_cli-0.2.3/src/agent_wire/firewall/inbound_shield.py +0 -116
- agent_wire_cli-0.2.3/tests/conftest.py +0 -62
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.gitignore +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/.mcp.json +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/LICENSE +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/agents/wire-worker.md +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-banner-light.png +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-banner-light.svg +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-banner.png +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-banner.svg +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-logo-transparent.png +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-logo-transparent.svg +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-logo.png +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/assets/agent-wire-logo.svg +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/antigravity_mcp.json +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/codex.toml +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/cursor_rule.mdc +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/peridot_local.json +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/manifests/windsurf_rules.md +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/__main__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/auth/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/auth/browser_paths.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/auth/cookie_vault.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/auth/rate_limiter.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/cache/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/cache/ring_buffer.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/cache/sqlite_ledger.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/hackernews.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/rss.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/search.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/stackoverflow.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/wikipedia.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/x_twitter.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier1_global/youtube.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/archive_bypass.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/arxiv_papers.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/devto.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/fediverse.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/linkedin.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/markets.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/meta_social.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/news.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/polymarket.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier2_pro/stocktwits.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/bilibili.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/boss_zhipin.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/v2ex.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/wechat.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/xiaohongshu.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/xiaoyuzhou.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/xueqiu.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/channels/tier3_regional/zhihu.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/codemode/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/codemode/api.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/compression/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/compression/anchor_slicer.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/compression/dam_formatter.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/compression/url_compactor.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/engine/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/engine/challenge.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/engine/errors.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/engine/http_pool.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/engine/stealth_browser.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/engine/waterfall.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/firewall/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/installers/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/installers/client_installer.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/media/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/media/subtitle_cleaner.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/models.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/brief.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/briefing.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/cluster.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/engine.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/library.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/planner.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/scoring.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/store.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/research/watch.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/router.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/verify/__init__.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/src/agent_wire/verify/citations.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_auth.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_bm25_slicer.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_channels_tier1.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_citations.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_codemode_bench.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_compression.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_firewall_inbound.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_models.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_research.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_ring_buffer.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_server.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_ssrf_guard.py +0 -0
- {agent_wire_cli-0.2.3 → agent_wire_cli-0.2.5}/tests/test_waterfall_routing.py +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "agent-wire",
|
|
3
|
+
"description": "Agent Wire by uncoalesced: live web, search and platform reads for AI agents from one local MCP server, compressed and shielded against prompt injection.",
|
|
4
|
+
"owner": {
|
|
5
|
+
"name": "uncoalesced"
|
|
6
|
+
},
|
|
7
|
+
"plugins": [
|
|
8
|
+
{
|
|
9
|
+
"name": "agent-wire",
|
|
10
|
+
"source": "./plugin",
|
|
11
|
+
"description": "Live web, search and platform reads for agents, compressed and shielded against prompt injection."
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
version: 2
|
|
2
2
|
updates:
|
|
3
3
|
# Python dependencies in uv.lock. Security fixes come as separate PRs straight away
|
|
4
|
-
# (Dependabot security updates); this keeps routine upgrades to one weekly batch.
|
|
4
|
+
# (Dependabot security updates); this keeps routine upgrades to one weekly batch. Routine
|
|
5
|
+
# upgrades wait 7 days after a release, so a hijacked version is usually pulled before we take it.
|
|
5
6
|
- package-ecosystem: uv
|
|
6
7
|
directory: /
|
|
7
8
|
target-branch: dev
|
|
@@ -13,6 +14,8 @@ updates:
|
|
|
13
14
|
patterns: ["*"]
|
|
14
15
|
update-types: [minor, patch]
|
|
15
16
|
open-pull-requests-limit: 5
|
|
17
|
+
cooldown:
|
|
18
|
+
default-days: 7
|
|
16
19
|
|
|
17
20
|
# Actions are pinned to commit SHAs; this bumps the SHA and the version comment together.
|
|
18
21
|
- package-ecosystem: github-actions
|
|
@@ -17,16 +17,16 @@ jobs:
|
|
|
17
17
|
runs-on: ubuntu-latest
|
|
18
18
|
timeout-minutes: 10
|
|
19
19
|
steps:
|
|
20
|
-
- uses: actions/checkout@
|
|
20
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
21
21
|
with:
|
|
22
22
|
persist-credentials: false
|
|
23
|
-
- uses: astral-sh/setup-uv@
|
|
23
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
24
24
|
- name: Lockfile matches pyproject.toml
|
|
25
25
|
run: uv lock --check
|
|
26
26
|
- name: Install
|
|
27
27
|
run: uv sync --extra dev --locked
|
|
28
28
|
- name: Ruff lint
|
|
29
|
-
run: uv run ruff check src tests
|
|
29
|
+
run: uv run ruff check src tests
|
|
30
30
|
- name: Ruff format
|
|
31
31
|
run: uv run ruff format --check .
|
|
32
32
|
- name: No temp-dir writes in the package
|
|
@@ -44,10 +44,10 @@ jobs:
|
|
|
44
44
|
runs-on: ${{ matrix.os }}
|
|
45
45
|
timeout-minutes: 20
|
|
46
46
|
steps:
|
|
47
|
-
- uses: actions/checkout@
|
|
47
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
48
48
|
with:
|
|
49
49
|
persist-credentials: false
|
|
50
|
-
- uses: astral-sh/setup-uv@
|
|
50
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
51
51
|
with:
|
|
52
52
|
python-version: ${{ matrix.python }}
|
|
53
53
|
- name: Install
|
|
@@ -59,10 +59,10 @@ jobs:
|
|
|
59
59
|
runs-on: ubuntu-latest
|
|
60
60
|
timeout-minutes: 10
|
|
61
61
|
steps:
|
|
62
|
-
- uses: actions/checkout@
|
|
62
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
63
63
|
with:
|
|
64
64
|
persist-credentials: false
|
|
65
|
-
- uses: astral-sh/setup-uv@
|
|
65
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
66
66
|
- name: Build sdist and wheel
|
|
67
67
|
run: uv build
|
|
68
68
|
- name: Package metadata renders on PyPI
|
|
@@ -93,10 +93,10 @@ jobs:
|
|
|
93
93
|
runs-on: ${{ matrix.os }}
|
|
94
94
|
timeout-minutes: 15
|
|
95
95
|
steps:
|
|
96
|
-
- uses: actions/checkout@
|
|
96
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
97
97
|
with:
|
|
98
98
|
persist-credentials: false
|
|
99
|
-
- uses: astral-sh/setup-uv@
|
|
99
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
100
100
|
with:
|
|
101
101
|
python-version: ${{ matrix.python }}
|
|
102
102
|
- name: Build wheel
|
|
@@ -109,8 +109,6 @@ jobs:
|
|
|
109
109
|
out=$(uvx --python ${{ matrix.python }} --from "$whl" wire run -e "return 6 * 7")
|
|
110
110
|
echo "$out"
|
|
111
111
|
grep -q '^42$' <<<"$out"
|
|
112
|
-
- name: MCP
|
|
112
|
+
- name: Self-test (every subsystem, MCP over stdio in both modes, no network)
|
|
113
113
|
shell: bash
|
|
114
|
-
run:
|
|
115
|
-
uv run --isolated --no-project --python ${{ matrix.python }}
|
|
116
|
-
--with "$(ls dist/*.whl)" python .github/scripts/mcp_smoke.py
|
|
114
|
+
run: uvx --python ${{ matrix.python }} --from "$(ls dist/*.whl)" wire selftest
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
contents: read
|
|
28
28
|
security-events: write # upload results to the Security tab
|
|
29
29
|
steps:
|
|
30
|
-
- uses: actions/checkout@
|
|
30
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
31
31
|
with:
|
|
32
32
|
persist-credentials: false
|
|
33
33
|
- uses: github/codeql-action/init@9b3254085494b55a0f7c4c2b3d2d52cc712ce370 # v4.39.1
|
|
@@ -15,10 +15,10 @@ jobs:
|
|
|
15
15
|
runs-on: ubuntu-latest
|
|
16
16
|
timeout-minutes: 20
|
|
17
17
|
steps:
|
|
18
|
-
- uses: actions/checkout@
|
|
18
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
19
19
|
with:
|
|
20
20
|
persist-credentials: false
|
|
21
|
-
- uses: astral-sh/setup-uv@
|
|
21
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
22
22
|
with:
|
|
23
23
|
enable-cache: false # never build a release from a cache another run could have written
|
|
24
24
|
- name: Tag matches the package version
|
|
@@ -27,9 +27,10 @@ jobs:
|
|
|
27
27
|
test "v$v" = "${GITHUB_REF_NAME}" || { echo "tag ${GITHUB_REF_NAME} != v$v"; exit 1; }
|
|
28
28
|
- run: uv sync --extra dev --locked
|
|
29
29
|
- run: uv run pytest -q
|
|
30
|
+
- run: uv run wire selftest
|
|
30
31
|
- run: uv build
|
|
31
32
|
- run: uvx twine check --strict dist/*
|
|
32
|
-
- uses: actions/upload-artifact@
|
|
33
|
+
- uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
|
|
33
34
|
with:
|
|
34
35
|
name: dist
|
|
35
36
|
path: dist/
|
|
@@ -42,7 +43,7 @@ jobs:
|
|
|
42
43
|
permissions:
|
|
43
44
|
id-token: write # PyPI trusted publishing
|
|
44
45
|
steps:
|
|
45
|
-
- uses: actions/download-artifact@
|
|
46
|
+
- uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
|
|
46
47
|
with:
|
|
47
48
|
name: dist
|
|
48
49
|
path: dist/
|
|
@@ -21,10 +21,10 @@ jobs:
|
|
|
21
21
|
runs-on: ubuntu-latest
|
|
22
22
|
timeout-minutes: 10
|
|
23
23
|
steps:
|
|
24
|
-
- uses: actions/checkout@
|
|
24
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
25
25
|
with:
|
|
26
26
|
persist-credentials: false
|
|
27
|
-
- uses: astral-sh/setup-uv@
|
|
27
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
28
28
|
- name: Export the lockfile
|
|
29
29
|
run: uv export --frozen --no-hashes --all-extras --no-emit-project -o requirements-audit.txt
|
|
30
30
|
- name: pip-audit
|
|
@@ -35,10 +35,10 @@ jobs:
|
|
|
35
35
|
runs-on: ubuntu-latest
|
|
36
36
|
timeout-minutes: 10
|
|
37
37
|
steps:
|
|
38
|
-
- uses: actions/checkout@
|
|
38
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
39
39
|
with:
|
|
40
40
|
persist-credentials: false
|
|
41
|
-
- uses: astral-sh/setup-uv@
|
|
41
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
42
42
|
- name: bandit
|
|
43
43
|
run: uvx bandit==1.9.4 -r src -ll
|
|
44
44
|
|
|
@@ -47,10 +47,10 @@ jobs:
|
|
|
47
47
|
runs-on: ubuntu-latest
|
|
48
48
|
timeout-minutes: 10
|
|
49
49
|
steps:
|
|
50
|
-
- uses: actions/checkout@
|
|
50
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
51
51
|
with:
|
|
52
52
|
persist-credentials: false
|
|
53
|
-
- uses: astral-sh/setup-uv@
|
|
53
|
+
- uses: astral-sh/setup-uv@68559e99cc807c1eb7e9238fd43a15bba460eec2 # v10.3.3
|
|
54
54
|
- name: zizmor
|
|
55
55
|
run: uvx zizmor==1.31.1 --format plain .github/workflows
|
|
56
56
|
env:
|
|
@@ -62,7 +62,7 @@ jobs:
|
|
|
62
62
|
runs-on: ubuntu-latest
|
|
63
63
|
timeout-minutes: 10
|
|
64
64
|
steps:
|
|
65
|
-
- uses: actions/checkout@
|
|
65
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
66
66
|
with:
|
|
67
67
|
persist-credentials: false
|
|
68
68
|
- uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5.0.0
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to agent-wire (`agent-wire-cli` on PyPI, the `agent-wire` Claude plugin).
|
|
4
|
+
|
|
5
|
+
## 0.2.5 (2026-11-15)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **`wire selftest`.** Checks every subsystem in one offline run, and a guard fails the run on any network attempt. It covers:
|
|
9
|
+
- all 31 channels, on canned responses
|
|
10
|
+
- the inbound and outbound firewalls, and the SSRF guard
|
|
11
|
+
- Shield Alerts and the alert ledger
|
|
12
|
+
- compression, the delta buffer and the route ledger
|
|
13
|
+
- the cookie vault and Code Mode
|
|
14
|
+
- research and `wire_cite`
|
|
15
|
+
- the 11 client installers
|
|
16
|
+
- the MCP server, in-process and over stdio
|
|
17
|
+
|
|
18
|
+
`--live` adds one real request per channel (Reddit with no API key) and counts shield false positives on the 16 README benchmark pages. `--only` and `--json` narrow and format the run. CI and the release workflow run the offline check.
|
|
19
|
+
- **Shield Alerts.** Stripped hidden prompt injections, forged delimiters and refused outbound requests are reported to you out of band: a desktop notification, a stderr line, and a trusted `[WIRE SHIELD | ...]` line ahead of the quoted content. Alerts are kept in a hash-chained `alerts.db`. New commands: `wire alerts`, `show`, `tail`, `verify`, `demo`.
|
|
20
|
+
- **Root policy documents:** `PRIVACY.md`, `TERMS.md`, `DOCUMENTATION.md`, `SUPPORT.md`.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **The Claude plugin now lives in `plugin/`.** It launches the published package with `uvx agent-wire-cli==0.2.5 serve`.
|
|
24
|
+
- Optional credentials come from the plugin's `userConfig`, marked sensitive. Each one is sent only to its own service.
|
|
25
|
+
- The plugin never shells out to `gh`.
|
|
26
|
+
- **`WIRE_HOME` prefers `CLAUDE_PLUGIN_DATA`,** so plugin updates keep your data.
|
|
27
|
+
- **`rookiepy` is now the `[browser-cookies]` extra,** and `wire_status` no longer looks at browser profiles.
|
|
28
|
+
- **Server tool descriptions describe the tools only.** When-to-use guidance stays in the skill, whose description no longer tells the model to act "automatically".
|
|
29
|
+
- **Setting a transcription API key turns transcription on.** This is what the plugin's `transcribe_api_key` option implied all along. `WIRE_TRANSCRIBE=0` still turns it off.
|
|
30
|
+
- **Token counting falls back to an approximation** when the tokenizer file can't be downloaded on first run, so reads keep working offline.
|
|
31
|
+
- **The lock moves dnspython to 2.9.2 and opentelemetry-api to 1.45.2** (CVE-2026-128089, CVE-2026-126360; both are transitive dependencies through fastmcp).
|
|
32
|
+
- **`joserfc>=1.8.0` is required** (GHSA-jpxq-7h8p-2q76, GHSA-9pg5-8c7x-5hfx). agent-wire itself never parses JWS or JWE.
|
|
33
|
+
- **The HTTP/SSE transport binds `127.0.0.1` explicitly.**
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- **Hidden-text stripping now catches:**
|
|
37
|
+
- text hidden by the page's own stylesheet (`.x{display:none}`, `#id{visibility:hidden}`)
|
|
38
|
+
- text hidden by the `sr-only`, `visually-hidden`, `hidden` and `d-none` classes
|
|
39
|
+
- text hidden with `clip`, `clip-path`, a transparent color, or off-screen `top`/`right`/`margin`
|
|
40
|
+
- **Invisible characters written as HTML entities** (`󠁁`, `​`) are now removed after parsing.
|
|
41
|
+
|
|
42
|
+
### Measured
|
|
43
|
+
- **Attack corpus:** 12 of 12 hiding techniques detected and stripped.
|
|
44
|
+
- **Benign corpus:** 0 alerts across 9 cases.
|
|
45
|
+
- **`wire selftest --live`, 2026-11-15:**
|
|
46
|
+
- **Benchmark pages:** none raised an alert, over two runs (16 of 16 read on the first; on the second, the Cloudflare challenge page needed the stealth browser, so 15 were read).
|
|
47
|
+
- **Channels:** 26 of 31 answered with no keys or logins, including Reddit.
|
|
48
|
+
- **Skipped (5):**
|
|
49
|
+
- Zhihu and Boss Zhipin need a login or the stealth browser.
|
|
50
|
+
- TikTok's oEmbed refused the probe.
|
|
51
|
+
- Xiaohongshu and Xiaoyuzhou have no stable public URL to probe.
|
|
52
|
+
|
|
53
|
+
## Earlier releases
|
|
54
|
+
|
|
55
|
+
See the [GitHub releases page](https://github.com/uncoalesced/agent-wire/releases).
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Agent Wire documentation
|
|
2
|
+
|
|
3
|
+
Agent Wire by uncoalesced is a local MCP server that gives AI agents live web pages, web search and platform reads. On PyPI it's `agent-wire-cli`, the shell command is `wire`, and the Claude plugin is `agent-wire`. The [README](README.md) covers the same ground with benchmarks and background; this page is the reference.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
You need [uv](https://docs.astral.sh/uv/).
|
|
8
|
+
|
|
9
|
+
- **Claude Code plugin:** `/plugin install agent-wire --marketplace uncoalesced/agent-wire`. It starts `uvx agent-wire-cli==<version> serve` and asks for optional keys when you enable it.
|
|
10
|
+
- **Any other client:** `uvx agent-wire-cli install --client auto` finds the agent clients on your machine (Claude Code, Claude Desktop, Codex, Cursor, Windsurf, VS Code, Roo, Gemini CLI, Hermes, Antigravity, Peridot), shows what it will write, and asks first. `--client <name>`, `--dry-run`, `--global` and `--project PATH` narrow it down.
|
|
11
|
+
- **By hand:** run `uvx agent-wire-cli serve` as a stdio MCP server.
|
|
12
|
+
|
|
13
|
+
Optional extras: `agent-wire-cli[stealth]` (headless browser for Cloudflare-protected pages and the `wire auth login` window), `agent-wire-cli[browser-cookies]` (import a login from Chrome, Edge or Brave), `agent-wire-cli[local-whisper]` (local podcast transcription).
|
|
14
|
+
|
|
15
|
+
## Tools
|
|
16
|
+
|
|
17
|
+
| Tool | What it does |
|
|
18
|
+
|---|---|
|
|
19
|
+
| `wire_read(urls, query, section, include_comments, max_tokens, force)` | Reads up to 10 URLs. `query` keeps the parts that answer it; `#L10-L50` and `#heading` anchors work. A page read again returns only what changed. |
|
|
20
|
+
| `wire_search(query, platforms, limit, sort, auto_expand_top, max_tokens)` | Searches the web or specific platforms and reads the top hits in the same call. |
|
|
21
|
+
| `wire_feed(platform, target, sort, limit)` | A subreddit, an `@user` timeline, GitHub trending, an arXiv category, a stock watchlist, an RSS feed. |
|
|
22
|
+
| `wire_me(platform, target, limit)` | Your own posts, likes, bookmarks, notifications or stats, through a session you saved. |
|
|
23
|
+
| `wire_research(topic, days, ...)` | One cited brief of what people said about a topic in the last N days, an "A vs B" comparison, or what's trending. |
|
|
24
|
+
| `wire_cite(text, check_quotes)` | Opens every link in a text and reports dead, archived-only, bot-blocked and soft-404 pages, quotes missing from their page, and `[[UNSOURCED]]` claims. |
|
|
25
|
+
| `wire_run(code, max_tokens)` | Code Mode: one sandboxed JavaScript script that calls `wire.read/search/feed/research/cite` and returns only what the script returns. |
|
|
26
|
+
| `wire_status(refresh)` | Channels, saved logins, route cache and alert counts. |
|
|
27
|
+
|
|
28
|
+
Every result starts with a `[WIRE | ...]` line, then any `[WIRE SHIELD | ...]` alert lines, then the page content inside an `[UNTRUSTED_EXTERNAL_DATA]` block. Everything inside that block is quoted material from the web, not instructions.
|
|
29
|
+
|
|
30
|
+
How an agent should use the tools (when to call each one, citation rules) is in the skill and rule files the installer writes: [`skills/agent-wire/SKILL.md`](skills/agent-wire/SKILL.md), and the Cursor, Windsurf and Hermes files in [`manifests/`](manifests/).
|
|
31
|
+
|
|
32
|
+
## Logins
|
|
33
|
+
|
|
34
|
+
Most sites need no login. For your own account (`wire_me`) and login-only sites:
|
|
35
|
+
|
|
36
|
+
- `wire auth login <site>` opens a login window (needs the `[stealth]` extra) and saves that site's cookies to an encrypted vault.
|
|
37
|
+
- `wire auth login <site> --from-browser` copies that one site's cookies from a browser you're signed in to. Firefox works out of the box; Chrome, Edge and Brave need `[browser-cookies]`.
|
|
38
|
+
- `wire auth list` shows saved sites (names only); `wire auth logout <site>` forgets one.
|
|
39
|
+
|
|
40
|
+
A saved login is sent only to its own site, only on GET or HEAD requests, never to account pages such as messages, settings or billing, and never across a redirect.
|
|
41
|
+
|
|
42
|
+
## Configuration
|
|
43
|
+
|
|
44
|
+
| Setting | Effect |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `WIRE_HOME` | Where agent-wire keeps its files. The Claude plugin uses its plugin data folder. |
|
|
47
|
+
| `GITHUB_TOKEN` | Higher GitHub rate limits and `wire_me github`. Outside the plugin, `gh auth token` is used if set up; `WIRE_NO_GH_CLI=1` turns that off. |
|
|
48
|
+
| `REDDIT_CLIENT_ID`, `REDDIT_CLIENT_SECRET` | Reddit's official app login, for networks where anonymous access is blocked. |
|
|
49
|
+
| `WIRE_SEARXNG_URL`, `EXA_API_KEY` | Extra web search engines. |
|
|
50
|
+
| `WIRE_TRANSCRIBE=1` (+ `WIRE_TRANSCRIBE_API_KEY`, `_URL`, `_MODEL`) | Podcast transcription, locally or through an OpenAI-compatible API. Setting `WIRE_TRANSCRIBE_API_KEY` alone also turns it on; `WIRE_TRANSCRIBE=0` turns it off. |
|
|
51
|
+
| `WIRE_ALLOW_PRIVATE=1` | Let reads reach private and internal addresses. Off by default. |
|
|
52
|
+
| `WIRE_SHIELD_NOTIFY=0` | No desktop notifications for alerts. |
|
|
53
|
+
| `WIRE_SHIELD_VERBOSE=1` | Also record every routine removal (hidden menus, zero-width spaces) in the alert ledger. |
|
|
54
|
+
|
|
55
|
+
In the Claude plugin, the keys are plugin settings (`userConfig`) stored in Claude Code's secure storage, and the plugin never reads credentials from your machine.
|
|
56
|
+
|
|
57
|
+
## Shield Alerts
|
|
58
|
+
|
|
59
|
+
agent-wire removes text a human reader can't see before the model reads a page, and refuses requests a page may have steered. Shield Alerts tells you when that happened, without relying on the model to mention it: a hijacked or distracted agent could leave the warning out.
|
|
60
|
+
|
|
61
|
+
**What raises an alert.**
|
|
62
|
+
|
|
63
|
+
| Tier | Examples | What you get |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| info | A hidden menu, a cookie banner, a zero-width space, a fake chat token in a comment | A counter in `wire_status`. Recorded in full only with `WIRE_SHIELD_VERBOSE=1`. |
|
|
66
|
+
| alert | Hidden text that reads like an instruction to an AI ("ignore previous instructions", "you are now", chat tokens, tool names, "don't tell the user", "send the API keys to"); text smuggled in Unicode tag characters; a forged end-of-data marker; visible text that names agent-wire's tools, asks the model to hide something from you, or asks it to send secrets somewhere | Notification, stderr line, header line, ledger row |
|
|
67
|
+
| high | A refused request: a private or internal address, a non-web URL scheme, a logged-in request that would write or reach an account page | Same, worded as a refused request |
|
|
68
|
+
|
|
69
|
+
Visible text is judged more strictly than hidden text. A security article that quotes "ignore previous instructions" in plain view is not an attack on you and raises nothing; the same words hidden with CSS do.
|
|
70
|
+
|
|
71
|
+
**What each alert says it did.** `stripped` (removed before the model saw it), `escaped` (neutralized in place), `refused` (never sent), `flagged-only` (visible text: it stays in the quoted content, marked as untrusted, because removing visible text would censor the page).
|
|
72
|
+
|
|
73
|
+
**Where alerts go.**
|
|
74
|
+
|
|
75
|
+
1. `WIRE_HOME/alerts.db`, one row per alert, chained by SHA-256 so edits are detectable (`wire alerts verify`).
|
|
76
|
+
2. A desktop notification (Windows toast, macOS Notification Center, Linux `notify-send`). At most one per site per minute and five per minute overall. It never contains page text.
|
|
77
|
+
3. A `[wire-shield] ...` line on stderr, which some clients show as server logs.
|
|
78
|
+
4. A `[WIRE SHIELD | ...]` line in the tool result, after the `[WIRE | ...]` line and before the untrusted block, so the model can tell you too. It never contains page text either.
|
|
79
|
+
|
|
80
|
+
**Commands.**
|
|
81
|
+
|
|
82
|
+
- `wire alerts`: recent alerts, newest first (`--all` adds info events).
|
|
83
|
+
- `wire alerts show <id>`: everything recorded about one alert: the URL (query values removed), where on the page it was (an element path such as `body > article > div.promo-note`), the caught text (up to 120 characters, secrets scrubbed, control characters removed) and any decoded hidden text.
|
|
84
|
+
- `wire alerts tail`: print new alerts as they arrive.
|
|
85
|
+
- `wire alerts verify`: check the ledger's hash chain.
|
|
86
|
+
- `wire alerts demo`: run the shield on a bundled page with three hidden attacks and one honest quote, offline, and show what the model receives.
|
|
87
|
+
|
|
88
|
+
**Limits.** Locations are element paths, not line numbers: the HTML parser doesn't keep source positions. Only `<style>` blocks inside the page are applied, and only simple `.class`, `#id` and `tag.class` selectors outside `@media` and similar blocks; the common hiding classes (`sr-only`, `visually-hidden`, `hidden`, `d-none`, `invisible`) are recognised by name, unless a responsive class such as `md:block` or `d-lg-block` shows the element again. Detection rules are patterns, so a novel phrasing in visible text may not be flagged; hidden text is removed either way.
|
|
89
|
+
|
|
90
|
+
## Citations
|
|
91
|
+
|
|
92
|
+
Write `[[UNSOURCED]]` after a claim with no source, and run `wire_cite` on an answer before sending it. It reports `OK`, `DEAD`, `ARCHIVED` (with the Wayback copy), `SOFT_404`, `BLOCKED`, `QUOTE_MISSING`, and links agent-wire never returned this session.
|
|
93
|
+
|
|
94
|
+
## Code Mode
|
|
95
|
+
|
|
96
|
+
`wire serve --code-mode` exposes only `wire_run` and `wire_status`. Scripts run in a QuickJS sandbox with no filesystem, network, timers or modules, and with memory, CPU, wall-clock and call limits. They can't reach `wire_me`.
|
|
97
|
+
|
|
98
|
+
## Transports
|
|
99
|
+
|
|
100
|
+
`wire serve` uses stdio. `--transport http` or `sse` binds to `127.0.0.1` only and has no authentication; don't expose it to other machines.
|
|
101
|
+
|
|
102
|
+
## Self-test
|
|
103
|
+
|
|
104
|
+
`wire selftest` checks every subsystem in one run, offline: all 31 channels on canned responses, the inbound and outbound firewalls, the SSRF guard, Shield Alerts and the ledger, compression, the delta buffer and route ledger, the cookie vault, Code Mode, research, `wire_cite`, the client installers, and the MCP server in-process and over stdio. A guard blocks the network for the whole run and reports any attempt as a failure.
|
|
105
|
+
|
|
106
|
+
- `wire selftest --live`: one real request per channel, keyless Reddit, and the shield false-positive count on the 16 README benchmark pages. Channels that need a login or the stealth browser are reported as skipped, not failed.
|
|
107
|
+
- `wire selftest --only mcp` (or `shield`, `reddit`, any group or channel): run part of it.
|
|
108
|
+
- `wire selftest --json`: results as JSON. Exit code 1 when a check fails.
|
|
109
|
+
|
|
110
|
+
## Policies and help
|
|
111
|
+
|
|
112
|
+
[Privacy Policy](PRIVACY.md) · [Terms of Use](TERMS.md) · [Support](SUPPORT.md) · [Security](SECURITY.md) · [License](LICENSE)
|