Releases: Jovancoding/Network-AI
Release list
v5.15.1 - Security: ClaudeHookBridge & SandboxPolicy matcher bypass fixes
v5.15.1 - Security Patch
Fixes two high-severity vulnerabilities reported against the v5.14.0/v5.15.0 ecosystem-expansion and context-composer features shipped in the last two releases. Both are validator/executor representation mismatches (CWE-436, CWE-863) - a security gate matched one string form while the actual executor ran a different, derived form.
GHSA-743h-jr5x-mpcr - ClaudeHookBridge deny-pattern bypass via truncation before the security decision (High)
extractTarget() truncated the string evaluated against denyPatterns/allowPatterns to 500 characters, while Claude Code always executes the complete, untruncated tool input. Dangerous content positioned past byte 500 (trivially achievable via leading padding) was invisible to the operator's hard-deny list yet still ran. In the default observe mode, denyPatterns is the sole hard block, so this was a complete bypass.
Fixed: deny/allow pattern matching now runs against the full, untruncated target (extractFullTarget()). A new maxTargetLength option (default 65,536 chars) denies oversized targets outright instead of matching against them, closing the bypass and bounding regex evaluation cost. Truncation (truncateForDisplay()) is applied only afterward, for audit-log/reason-text display.
GHSA-9v4f-j8cv-fhxw - SandboxPolicy blocklist/approval-gate bypass via quote/whitespace mismatch (High)
isCommandAllowed's blocklist/allowlist glob, requiresApproval, and assessRisk matched the raw, quote-and-whitespace-preserving command string, while the executor tokenizes the command (stripping quotes, collapsing whitespace) before spawn(..., { shell: false }). A compromised/constrained agent could quote a destructive command (rm -rf '/') to defeat the blocklist's flagship recursive-delete entry, or quote a gated command (git "push" origin main) to skip the human approval gate - both executing identically to their unquoted form. Same validator/executor mismatch class as GHSA-qw6v-5fcf-5666, on a distinct code path that fix did not cover.
Fixed: isCommandAllowed, requiresApproval, and assessRisk now all match against a canonicalized form (parseCommandLine -> argv.join(' ')) - the exact representation the executor runs - via a new shared canonicalize() helper. requiresApproval/assessRisk fail closed (require approval / assess high risk) when a command cannot be safely canonicalized.
Testing
- New
test-phase20.ts(35 assertions) reproduces both published PoCs verbatim, plus oversized-target fail-closed behavior, audit-display truncation, a whitespace-variant bypass check, and normal-command non-regression checks. - Full suite: 3,638 tests passing across 41 suites;
tsc --noEmitclean.
Docs
Version bump across all 17 tracked files, including two that had drifted stale across the last two releases (BENCHMARKS.md, AUDIT_LOG_SCHEMA.md). THREAT_MODEL.md Security Controls Summary table updated with both new mitigations.
v5.15.0 - Context Signal-Over-Noise: ContextComposer + context_pack/blackboard_search MCP tools
v5.15.0 — Context Signal-Over-Noise
Agents have large context windows, but their effective reasoning window is smaller: irrelevant, stale, or noisy context degrades output quality long before the hard token limit ("context rot"). This release makes curated context a first-class primitive.
ContextComposer (lib/context-composer.ts)
Token-budgeted, relevance-ranked context assembly for any LLM call:
- Ranking — every candidate entry is scored by relevance (pluggable BYOE
SemanticRankerwith a deterministic lexical-overlap fallback) x recency (exponential half-life decay) x scope affinity (ContextThrottlertag semantics). - Hard token budget — enforced via the new zero-dependency
estimateTokens()heuristic; over-budget items are excluded with reasons. - Pinned sources — task-critical instructions and Layer-3 project context always lead the pack.
- Staleness — TTL-expired entries are dropped automatically.
- Position-aware layout — strongest items placed first and last ("lost in the middle" mitigation), serpentine ordering in between.
- Full observability — included/excluded lists with per-item scores, token costs, and budget utilization.
createSemanticMemoryRanker()adapts an existingSemanticMemory;ContextComposer.fromSnapshot()converts blackboard snapshots.
Two new MCP tools (lib/mcp-tools-context.ts, registered by default — 24 tools total)
context_pack— "give me everything relevant to task X in <= N tokens": one call returns a curated, ranked, budget-enforced context brief from the agent's scoped blackboard snapshot. Use instead ofblackboard_list+ manyblackboard_readcalls.blackboard_search— ranked top-K search over blackboard entries; semantic when aSemanticMemoryis wired, lexical otherwise (mode reported in the response).
Works out of the box in Claude Code, OpenAI Codex, Gemini CLI, Cursor, and any other MCP client.
Testing
- New
test-phase19.ts(78 assertions): token estimation, ranking/budget/pinning/staleness/serpentine layout, semantic-ranker integration + failure fallback, both MCP tools including scoped snapshots and argument validation. - Full suite: 3,603 tests passing across 40 suites;
tsc --noEmitclean.
Docs
- README: context feature bullet, MCP tools list, test table, Gemini CLI callout, AGENTS.md row.
- Consistency sweep: stale test counts fixed in CONTRIBUTING.md and SUPPLY_CHAIN.md;
claude-project-prompt.mdbanner updated; SECURITY.md supported-versions tables move 5.15.x to current.
v5.14.0 - Ecosystem Expansion: Gemini, OpenAI Responses, Claude Agent SDK, Claude Code hooks, MCP elicitation, A2A server
v5.14.0 — Ecosystem Expansion
Making Network-AI the neutral coordination layer for every major agent ecosystem: Claude, OpenAI, Gemini, and OpenClaw.
New Adapters (29 → 32)
GeminiAdapter— Google Gemini Developer API (AI Studio) as swarm agents: BYOC@google/genai-compatible client or built-in fetch withGEMINI_API_KEY; system instructions, generation config, thinking budgets. Complements the enterpriseVertexAIAdapter.OpenAIResponsesAdapter— OpenAI Responses API (POST /v1/responses), the successor to the deprecated Assistants API: instructions,max_output_tokens, temperature, and reasoning-effort control (minimal/low/medium/high).ClaudeAgentSDKAdapter— runs full Claude Agent SDK agentic loops (query()) as swarm agents, strictly BYOC: surfaces session id, turn count, cost, and usage; streams intermediate messages viaonMessage.
Cross-Vendor Governance
ClaudeHookBridge+network-ai hookCLI (lib/claude-hooks.ts) — gate any hook-capable coding agent (Claude Code PreToolUse/PostToolUse) through AuthGuardian.observemode audits every tool call todata/hooks_audit.jsonl;enforcemode maps tools to resource types (Bash ->SHELL_EXEC, Write/Edit ->FILE_SYSTEM, WebFetch/mcp__*->EXTERNAL_SERVICE) and requires a weighted permission grant.--deny/--allowpatterns take precedence. Config template:examples/claude-code-hooks.json.- MCP elicitation (
lib/mcp-elicitation.ts) — approval prompts rendered natively inside the MCP client (Claude Code, Codex, Gemini CLI, Cursor):StdioElicitationChannel+createElicitationApprovalCallback()adapt the round-trip into anApprovalCallbackforApprovalGate— fail-closed on decline, cancel, timeout, and transport errors. A2AServer(lib/a2a-server.ts) — expose the orchestrator as a Google A2A (Agent2Agent) agent: Agent Card at/.well-known/agent.jsonplustasks/send/tasks/get/tasks/cancelJSON-RPC; optional Bearer secret (fail closed), 127.0.0.1 default bind, body-size caps.
New Install Surfaces
- Gemini CLI extension —
gemini extensions install https://github.com/Jovancoding/Network-AI(newgemini-extension.json+GEMINI.mdcontext file). - Claude Code plugin slash commands —
/network-ai:status,/network-ai:budget,/network-ai:audit,/network-ai:blackboard. AGENTS.md— cross-vendor agent instructions (Codex, Gemini CLI, Cursor, Factory, and other AGENTS.md-compatible tools).server.json— MCP Registry manifest (io.github.jovancoding/network-ai).
Testing
- New
test-phase18.ts(85 assertions): hook bridge observe/enforce/deny-allow/parsing, elicitation channel routing + fail-closed approval mapping, A2A server card/tasks/auth/eviction. - Adapter suite grows to 271 assertions with the three new adapters.
- Full suite: 3,525 tests passing across 39 suites;
tsc --noEmitclean.
v5.13.4 - Security: ApprovalInbox + APSAdapter fail-closed fixes
Security Fixes
GHSA-m4jg-6w3q-gm86 — ApprovalInbox read routes unauthenticated + wildcard CORS (High, CWE-862, CWE-352)
The v5.12.2 secret / checkAuth() gate covered only the two mutating routes (POST /approve, POST /deny), leaving GET /, GET /stats, GET /sse, and GET /:id unauthenticated even when a secret was configured, disclosing queued high-risk action content. The handler also hardcoded Access-Control-Allow-Origin: *.
Fixed:
checkAuth()now gates the entirerouteRequest()pipeline before route dispatch, covering every route uniformly.- Removed the hardcoded wildcard CORS header; added
allowedOrigins?: string[]option onApprovalInboxOptions— no CORS header is sent unless the request Origin exactly matches an allowlisted entry.
Reported by sec-reex via private security advisory.
GHSA-3jf7-33vc-hgf4 — APSAdapter default local verifier accepts any non-empty signature (High, CWE-347, CVSS 8.6)
With the default verificationMode: 'local' and no caller-supplied verifySignature callback (the documented canonical setup), verifyDelegation() treated any non-empty string as a valid cryptographic signature, allowing a forged delegation to obtain a signed SHELL_EXEC permission-grant token with no authentication.
Fixed:
initialize()now throws ifverificationModeislocal(the default) and noverifySignaturecallback is configured.verifyDelegation()'s fallback now returnsfalseinstead of a length check, failing closed as defense in depth.
Also fixed
- SkillSpector Intent-Code Divergence in
scripts/blackboard.pyheader comment (env-scoped data dir I/O documentation).
Testing: 3,388/3,388 tests passing across 38 suites, tsc --noEmit clean.
v5.13.3 - ClawHub publish script + SkillSpector YARA fix
What's changed
Fixed
- SkillSpector YARA
agent_skill_mcp_tool_poisoning_metadata— Reworded the audit-log privacy note inSKILL.mdthat was triggering the exfiltration sub-rule. No functional change; VirusTotal 64/64 clean. - CodeQL
js/redundant-operation(alert #178) — Split an&&-chained double-call toRetryBudget.tryConsume()intest-phase15.tsinto two explicit assertions. - ClawHub display name — Corrected to "Network-AI" (a temp staging directory name leaked as the display name in the first patch publish).
Added
npm run clawhub:publish— New publish script (scripts/clawhub-publish.js) that automates the ClawHub staging workaround required since CLI v0.23+. Reads version fromskill.json, pulls git provenance automatically, always publishes with--name "Network-AI", and cleans up after itself.npm run clawhub:publish npm run clawhub:publish -- --changelog "what changed" npm run clawhub:publish -- --dry-run
Patch release — no API or behaviour changes. All 3,373 tests pass.
v5.13.0 — Model-Interaction Lifecycle Governance
What''s changed
Network-AI now governs the layer most agent frameworks leave open: how an agent talks to the model. When a frontier model declines a request with a classifier refusal, Network-AI absorbs the refusal → fallback → billing chain and presents one governed, budgeted, audited call. 104 new tests; full suite 3,373 passing across 37 suites.
Added — Model-Interaction Lifecycle Governance (Tier 1)
GovernedModelGateway— detectstop_reason:refusal, audit which classifier fired, route to a fallback model, redeem the fallback-credit token. Provider-agnostic; distinct fromAdapterRegistry.fallbackChain(adapter-health failover).ModelBudget— per-model USD accounting with cache-read/write distinction and fallback-credit repricing;accountIterations()for server-sideusage.iterations. Never sums tokens across models.RefusalTelemetry— a refusal is an HTTP 200, invisible to error-rate monitoring; recorded as a discrete non-error signal with anunservedRefusalCountgap to alert on.AnthropicMessagesAdapter— dependency-free (BYOC) Anthropic Messages binding that drives the gateway.
Added — Orchestration Resilience (Tier 2)
RetryBudget— per-request (not per-session) retry accounting.EffortPolicy— turns theeffortcost lever into a policy object (per-agent ceilings + justification gating).- Per-sub-agent fallback —
FanOutFanInsteps andTeamRunnertasks each carry their own fallback agent and retry budget. Default paths unchanged.
Added — Thinking Lifecycle + Compliance (Tier 3)
ThinkingBlockManager— keep thinking blocks unchanged on the same model; strip them on a cross-model fallback (kept when redeeming a credit); guard prompts againstreasoning_extractionrefusals.- OWASP Agentic AI Top 10 (2026) matrix — all 10 risks mapped to deterministic engine controls, verifiable via
verifyOwaspCoverage().
Changed
- README lifecycle-governance section + OWASP coverage table; ARCHITECTURE/SKILL positioning; AUDIT_LOG_SCHEMA
model.*events. - Version 5.12.7 → 5.13.0.
Full changelog: https://github.com/Jovancoding/Network-AI/blob/main/CHANGELOG.md
v5.12.7 — ClawHub bundle hygiene: comment.txt leak fixed + clawhub:check guard
What's changed
This release fixes the root cause behind the recurring NVIDIA SkillSpector findings on ClawHub and adds an automated guard so the same class of issue is caught before publishing — not after.
Security
- Recurring SkillSpector finding fixed at the source. The repeating Description-Behavior Mismatch / Context-Inappropriate Capability findings against
McpStreamableServerwere caused bycomment.txt(a draft GitHub-issue note describing the optional HTTP MCP server and its 22 tools) being bundled into the published ClawHub skill. The v5.12.4 attempt to exclude it added the file to.clawignore, but the ClawHub CLI honours.clawhubignore— not.clawignore, and not.gitignore. The exclusion has been moved to the correct file. - Additional bundle leaks closed, including
scripts/*.js, four newer docs,glama.json/Dockerfile/.mcp.json/tsconfig.esm.json, several stray directories, and — most importantly —data/(audit log, grant tokens, signing key),.env,.env.*and*.log.
Added
scripts/clawhub-check.js+npm run clawhub:check— a bundle-hygiene guard that parses.clawhubignore, replicates the exclusion ClawHub applies, and asserts the surviving file set equals the intended Python-skill allowlist. It hard-fails on secrets/logs and on any unexpected file or directory. On its first run it immediately caughtdata/leaking into the bundle.
Changed
SKILL.md— the twoMcpStreamableServerSkillSpector rows are now marked Resolved with the real root cause and the new guard documented as the durable control.RELEASING.md— Step 9 now runsnpm run clawhub:checkand requires a PASS beforeclawhub publish.- Version bump 5.12.6 → 5.12.7.
Full changelog: https://github.com/Jovancoding/Network-AI/blob/main/CHANGELOG.md
v5.12.6 — CodeQL security fixes + QA loop
What's Changed
Security
- CodeQL #177 resolved — Indirect command injection (Medium): scripts/socket-check.js used execSync() with a shell template string containing the user-supplied --version argument. Replaced with spawnSync() + explicit arg array (shell: false) so no shell interpolation occurs. Added SEMVER_RE validation to reject non-semver input early. Windows
px.cmd detection included. - CodeQL #176 resolved — Unused import (Note): removed unused
esolve\ from \import { join, resolve } from 'path'\ in \ est-phase13.ts:11. - CodeQL #175 resolved — Unused import (Note): removed unused \join\ from \import { join, dirname, resolve } from 'path'\ in \lib/phase-pipeline.ts:15.
Added
- *\scripts/codeql-check.js* — GitHub Code Scanning alert monitor. Queries the GitHub API via \gh api, categorises alerts as blocking (\error/\warning) or informational (
ote), exits 1 if any blocking alert is open. Run via
pm run codeql:check. - *
pm run codeql:check* — wired into \package.json\ scripts.
Changed
- \SKILL.md\ Security Scan Findings — 3 new SkillSpector by-design entries: McpStreamableServer Description-Behavior Mismatch (Medium 94%), MCP control surface Context-Inappropriate Capability (Medium 90%), _load_signing_key()\ token minting Context-Inappropriate Capability (Medium 92%). All documented with disclosed controls.
- *\RELEASING.md* (local-only) — new Step 7:
pm run codeql:check\ gate before publishing; Step 9 updated with correct \clawhub publish\ syntax + SkillSpector review guidance.
QA loop — how it works now
\
Push feature → CI runs CodeQL (~2 min)
→ npm run codeql:check # exits 1 if any error/warning alert open
→ npm run socket:check # exits 1 if gptSecurity/debugAccess present
→ clawhub publish # triggers SkillSpector re-scan (NVIDIA)
→ check Versions tab # new findings → triage into SKILL.md table
\\
Full changelog: https://github.com/Jovancoding/Network-AI/blob/main/CHANGELOG.md
v5.12.5 — Supply-chain security hardening
What's Changed
Security
- Remove gptSecurity alert: Replaced String.fromCharCode(101,118,97,108) obfuscation pattern in lib/blackboard-validator.ts with a named constant EVAL_FN = 'eval'. Socket.dev's AI classifier no longer flags this as a potential security risk.
- Remove debugAccess alert: Same root cause — the char-code construction was the only trigger in the codebase. Gone with the constant refactor.
- Explicit policy gate at shell exec call sites (�in/console.ts):
untime.policy.isCommandAllowed() checked before
untime.exec() in both interactive and pipe-mode paths, reducing AI-heuristic surface. - Remove redundant
equire('path').sep in lib/agent-runtime.ts — sep is already imported at module top level.
Documentation
- SUPPLY_CHAIN.md: Added sections 5a (shell execution surface) and 5b (telemetry surface), documenting all controls around shellAccess/shellExec alerts and confirming zero-telemetry default.
Tooling
- scripts/socket-check.js: New supply-chain score monitor. Runs \socket package shallow, labels alerts as [FIXABLE]/[expected]/[review], exits non-zero if fixable alerts remain.
- *
pm run socket:check* / **
pm run socket:check:local**: Wired into \package.json. - \RELEASING.md\ Step 9: Post-publish Socket score verification added to the release checklist.
Score impact
| Alert | Before (5.12.4) | After (5.12.5) |
|---|---|---|
| gptSecurity (medium) | present | removed |
| debugAccess (low) | present | removed |
| recentlyPublished (medium) | present | present (auto-expires ~30d) |
| networkAccess / shellAccess / envVars / filesystemAccess / urlStrings | present | present (intentional, documented) |
Supply Chain Score: 75 → ~80 (climbs further to ~85 when
ecentlyPublished\ expires)
Full Changelog: https://github.com/dragoscv/network-ai/compare/v5.12.4...v5.12.5
v5.12.4 - SkillSpector triage & Socket.dev scan gap
v5.12.4 — SkillSpector triage, SKILL.md trigger hardening, Socket.dev scan gap
A hardening and triage release targeting ClawHub SkillSpector findings from v5.12.3 and a Socket.dev scan gap in the dual CJS+ESM build. No breaking changes; all 3,269 tests across 33 suites pass.
Security
- SkillSpector findings resolved. Added
.clawignoreto excludecomment.txtfrom ClawHub packages — the file (an in-progress draft note) was inadvertently included in 5.12.3 viaclawhub publish .and its McpStreamableServer bridge-pattern description triggered Description-Behavior Mismatch (High, 93%) and Context-Inappropriate Capability (Medium, 88%) findings. - SKILL.md trigger hardening. Replaced the broad "When to Use This Skill" bullet list with explicit Use/Do-NOT-Use sections, resolving Vague Triggers (Medium, 81%). Shell execution, agent spawning, and MCP server startup are now explicitly called out as out-of-scope for the Python skill bundle.
Changed
- Socket.dev triage gap closed. Added 9 missing entries from the 5.12.3 scan: declaration-file false positives (
dist/adapters/a2a-adapter.d.ts,dist/lib/approval-inbox.d.ts), three ESM adapter mirrors (aps-adapter.js,hermes-adapter.js,rlm-adapter.js), and four shell-access entries for example and bootstrap scripts. networkAccess 59 → 64, shellAccess 6 → 10.
Install
npm install [email protected]