AKA Security — We secure agent harnesses at the source. AI Traffic Control (ai-tc) is an open-source control plane for coding agents.
> /plugin marketplace add akasecurity/ai-tc> /plugin install aka@ai-tc
FAQ
ai-tc is a Claude Code plugin with 1 hand-picked skill for security work, indexed on Flowy. Install it with the command on its page. It includes write-detection-rule. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Repo: akasecurity/ai-tc
AKA Security — We secure agent harnesses at the source.
AI Traffic Control (ai-tc) is an open-source control plane for coding agents. It watches an agent session's traffic (prompts, tool calls, responses, file reads), scans each event against your rule packs, and decides what happens next: monitor, warn, redact, block, or a manual exception. Secrets and regulated data like PCI, PHI, and PII are caught locally: live detection and enforcement never send them to a model or a third party. The one exception is the opt-in /aka:setup calibration, which does send what its history scan finds to the model API to be rated.1
Every event in a session runs through one control point before it takes effect:
prompt · tool call · response · file read → ai-tc policy engine → monitor · warn · redact · block · exception
Prompts and tool inputs are checked before they reach the model; tool outputs and file reads are checked after it responds. Each event is scanned against your installed rule packs, every match becomes a finding (rule id, category, severity, matched span), and policy decides the outcome. Everything is logged.
Detection is mostly regex, patterns shaped like an AWS access key, an email address, or a bank routing number, which covers most secrets and PII since they have a predictable shape. A smaller set of rules match on keyword, and some regex matches run through a validator, such as a Luhn checksum for card numbers or a Shannon-entropy check for high-entropy secrets, to cut false positives.
A finding resolves to one of five outcomes:
| Outcome | What happens |
|---|---|
| Monitor | Logged only. Every rule ships active here, so nothing is enforced until you promote it. |
| Warn | Surfaces a warning in the session; the content still goes through unchanged. |
| Redact | The matched value is replaced in place before it reaches the model. Tool inputs and outputs only, not prompt text. |
| Block | The prompt or tool call is stopped, with a message explaining what fired. |
| Exception | A manually granted, exact-value override that lets one specific match through despite its rule's policy. |
Promote any detection from monitor to warn, redact, or block from the dashboard, per rule or per category.
| Term | What it is |
|---|---|
| Event | A prompt, response, tool call, or file read captured from an agent session. |
| Finding | A rule match produced by the detection engine against an event. |
| Rule | A JSON file describing what to detect: a keyword list, a regex pattern, or a validator. |
| Rule pack | A directory of rules and their fixtures with a manifest.json. |
| Policy | The decision about what to do when a rule or category fires. |
| Plugin | The harness extension that intercepts sessions. One package, used by Claude Code and Claude Desktop. |
ai-tc keeps what it records in a local SQLite store at ~/.aka/data/aka.db, with your settings beside it under ~/.aka/settings. There is no database server to run and no schema to manage — the CLI, the plugin, and the dashboard all read and write that one file.
That store is a running log of your agent sessions: prompts, responses, tool calls. Only the spans a rule flags are masked; the rest is kept verbatim and unencrypted, so aka.db builds up a full local record of what your agent saw. On macOS and Linux the store directories are created owner-only (0700) and the files are written 0600. Those permissions are the only at-rest control there is, and they do nothing on Windows.
SECURITY.md has the full picture — every file the store spans, what to do on Windows, and how to report a vulnerability.
ai-tc installs as a plugin through the AKA marketplace.
In Claude Code:
/plugin marketplace add akasecurity/marketplace
/plugin install ai-tc@akasecurity
Claude Desktop is supported too; the installation guide covers both. ai-tc runs locally alongside your agent. There's no backend to stand up, and no scanning happens off your machine.1
Full documentation, architecture, and the built-in detection catalog live at akasecurity.github.io/ai-tc-docs.
Detection and enforcement run locally — no AKA server, no account, and no built-in network client (the source uses no fetch). Three narrow paths do reach the network, all through child processes: package-manager installs/updates (npm/claude), the plugin's npm audit signatures supply-chain check, and the opt-in /aka:setup calibration. That last one is the only path that carries your data: to rate false positives and severity, its judge step sends what an initial history scan finds — for each finding, the raw unmasked value including any secret, roughly 120 characters of the surrounding transcript text on either side (re-scanned before it goes, so every secret the rules detect in that window is masked, including the finding's own value where it appears there), the finding's rule, category, severity, masked value and confidence, and a sequential counter the model echoes back so its verdict can be matched to the finding — to the model API through the claude CLI. The source file's path is not sent. That's the same model provider your agent already uses, reached with your own credentials, and it takes two separate opt-ins: one to read your history at all, and a second, distinct grant to send what was found. Without that second grant the judge does not run. Each is revocable on its own under the dashboard's Settings, which stops future scans — data already sent cannot be recalled. Separately, and not one of the three: the aka CLI dispatches an unrecognized subcommand git-style, so aka <name> runs an aka-<name> program from your own PATH (POSIX only; a built-in always wins). That program is yours, not ours — ai-tc does not bundle, pin or verify it — so whether it reaches the network is its business, not something this project can describe. ↩ ↩2
.akaignore
.claude-plugin/
marketplace.json
.editorconfig
.gitattributes
.github/
audit-waivers.json
CODEOWNERS
dependabot.yml
ISSUE_TEMPLATE/
bug_report.yml
config.yml
feature_request.yml
rule_false_positive.yml
PULL_REQUEST_TEMPLATE.md
secret_scanning.yml
workflows/
audit.yml
build-binaries.yml
ci.yml
codeql.yml
dependabot-major-guard.yml
internal-path-guard.yml
release-binaries.yml
release-cli.yml
release-plugin.yml
release-rules.yml
.gitignore
.npmrc
.nvmrc
.prettierignore
.prettierrc
assets/
banner.svg
CLAUDE.md
cli/
.gitignore
eslint.config.mjs
eslint.scripts.config.mjs
package.json
README.md
scripts/
archive-sea.mjs
bundle-web-ui.mjs
devtools-stub.mjs
normalize-sqlite.mjs
package-sea.mjs
sea/
boot.cjs
entry.cjs
smoke-dashboard.mjs
smoke-sea.mjs
sea-config.json
src/
cli.ts
command-manifest.ts
commands/
check-updates.ts
completion.ts
dashboard.ts
detections.ts
exception.ts
init.ts
plugins.ts
scan.test.ts
scan.ts
stats.ts
tui.tsx
update.ts
vault.ts
lib/
args.ts
duration.ts
external-dispatch.ts
open-url.ts
prompter.ts
tokens.ts
main.ts
tui/
bars.ts
Dashboard.tsx
report.ts
theme.ts
test/
commands/
completion.test.ts
dashboard.test.ts
detections.test.ts
exception-reveal.test.ts
exception.test.ts
init.test.ts
stats.test.ts
vault.test.ts
helpers/
no-echo.test.ts
no-echo.ts
lib/
duration.test.ts
external-dispatch.test.ts
prompter.test.ts
main.test.ts
tsconfig.json
tsup.config.ts
tsup.sea.config.ts
vitest.config.ts
CODE_OF_CONDUCT.md
commitlint.config.mjs
CONTRIBUTING.md
eslint.root.config.mjs
lefthook.yml
LICENSE
package.json
packages/
dashboard-ui/
eslint.config.mjs
package.json
src/
activity/
ActivitySummaryStripView.tsx
ActivityTokenUsageView.tsx
atoms.tsx
AuditTimelineView.tsx
format.ts
HarnessSelect.tsx
meta.ts
SessionDetailView.tsx
SessionListView.tsx
data-shares/
atoms.tsx
DataShareDetailView.tsx
DataSharesTableView.tsx
meta.ts
NeedsReviewStripView.tsx
types.ts
detections/
atoms.tsx
DetectionDetailView.tsx
DetectionsListView.tsx
MatcherModal.tsx
meta.ts
PolicyPicker.tsx
ProvenanceBlock.tsx
UpdateModal.tsx
exceptions/
AddExceptionForm.tsx
ApproveExceptionDialog.tsx
atoms.tsx
BlockedLedgerView.tsx
BlockedWindowSelect.tsx
ExceptionDetailView.tsx
ExceptionsTableView.tsx
meta.ts
RotateKeyDialog.tsx
findings/
ActionTag.tsx
FindingDetailView.tsx
FindingsTableView.tsx
FindingsToolbarView.tsx
meta.ts
ProviderChips.tsx
index.ts
inventory/
AssetDetail.tsx
chips.tsx
data.ts
FileDetailDrawer.tsx
HarnessOverview.tsx
Ico.tsx
icons.ts
InventoryNav.tsx
ProjectPane.tsx
lib/
colors.ts
icons.ts
numberFormat.ts
relativeTime.ts
timeRanges.ts
policies/
PoliciesView.tsx
security/
EnforcementCardView.tsx
FindingsOverTimeCardView.tsx
format.ts
meta.ts
MttrTrendCardView.tsx
RecentlyResolvedCardView.tsx
recommendations.ts
RecommendedActionsCardView.tsx
ScanCoverageCardView.tsx
SeverityCardView.tsx
TopSourcesCardView.tsx
widget-shared.tsx
settings/
WorkspaceSettingsFormView.tsx
shared/
charts.tsx
DetailFields.tsx
icons.tsx
PageHead.tsx
Provider.tsx
ScrubbedValue.tsx
StatTile.tsx
TimeRangeSelect.tsx
widget-state.tsx
updates/
AvailablePluginsCardView.tsx
UpdateStatusCardView.tsx
vault/
atoms.tsx
DerefAuditTableView.tsx
VaultInventoryView.tsx
VaultReuseView.tsx
test/
detections/
meta.test.ts
exceptions/
fingerprint-egress.test.tsx
meta.test.ts
views.test.tsx
findings/
meta.test.ts
inventory/
bar-and-accent.test.ts
data.test.ts
lib/
relativeTime.test.ts
timeRanges.test.ts
security/
format.test.ts
meta.test.ts
recommendations.test.ts
settings/
WorkspaceSettingsFormView.test.ts
shared/
ScrubbedValue.test.tsx
vault/
views.test.tsx
tsconfig.json
vitest.config.ts
detections/
eslint.config.mjs
package.json
src/
egress/
extract.ts
fixtures/
ip-extraction.json
manifests.json
method-inference.json
registry-resolution.json
snippet-redaction.json
url-extraction.json
manifests.ts
registry.ts
resolve.ts
engine.ts
escape-regexp.ts
index.ts
mask.ts
matchers/
keyword.ts
limits.ts
regex.ts
pointer-shield.ts
posture/
config-posture.ts
fixtures/
hook-conflict.json
hook-external-egress.json
hook-unknown.json
security/
redos-probe.ts
tabular.ts
types.ts
validators/
entropy.ts
luhn.ts
test/
egress/
extract.test.ts
manifests.test.ts
registry.test.ts
resolve.test.ts
engine.test.ts
helpers/
rules.ts
mask.test.ts
matchers/
keyword.test.ts
regex.test.ts
pointer-shield.test.ts
posture/
config-posture.test.ts
security/
redos-probe.test.ts
redos.test.ts
unicode.test.ts
tabular.test.ts
tsconfig.json
turbo.json
vitest.config.ts
eslint-config/
eslint.config.mjs
eslint.guard.config.mjs
package.json
src/
index.js
react.js
test/
claude-md.test.js
effective-config.test.js
helpers/
claude-md.js
lint-invocations.js
product-worker.js
inline-disables.test.js
no-network-runtime.test.js
no-network.test.js
required-checks.test.js
tonal-ink-tokens.test.js
tsconfig.json
vitest.config.ts
extract/
eslint.config.mjs
package.json
README.md
src/
csv.ts
index.ts
test/
csv.test.ts
tsconfig.json
vitest.config.ts
local-ops/
eslint.config.mjs
package.json
src/
apply.ts
claude-plugin.ts
egress-record.ts
exec.ts
fs-scan.ts
guarded-scan.ts
index.ts
project-inventory.test.ts
project-inventory.ts
registry.ts
self-exec.test.ts
self-exec.ts
semver.ts
update-cache.ts
update-render.ts
updates.ts
test/
apply.test.ts
egress-e2e.test.ts
egress-record.test.ts
fixtures/
egress-corpus/
Api.csproj
build.gradle
Cargo.toml
composer.json
Gemfile
go.mod
package-lock.json
package.json
packages/
nested/
package.json
pom.xml
README.md
requirements.txt
services/
go/
main.go
src/
app.ts
intra.ts
partner.ts
pay.py
transfer.rb
vendor/
lib/
client.rb
fs-scan.test.ts
guarded-scan.test.ts
helpers/
crashing-scan-worker.ts
semver.test.ts
update-cache.test.ts
updates.test.ts
tsconfig.json
vitest.config.ts
persistence/
eslint.config.mjs
package.json
src/
database.ts
db/
... 997 more© 2026 Flowy · Free and open source
Built for Claude Code · Not affiliated with Anthropic