Commit Graph

3952 Commits

Author SHA1 Message Date
diegosouzapw
319f52b988 feat(activity): add /dashboard/activity timeline page + ActivityFeed (B/F4) 2026-05-27 22:01:01 -03:00
diegosouzapw
6a19882646 feat(compliance): support level=high filter in audit-log API (B/F4) 2026-05-27 22:00:56 -03:00
diegosouzapw
fb54bcd994 feat(audit): add timeline helpers (groupByDay + relativeTime) (B/F4) 2026-05-27 22:00:51 -03:00
diegosouzapw
4a97b419ae test(mcp): unit tests for agentSkillTools 2026-05-27 21:58:22 -03:00
diegosouzapw
a7a093d066 feat(mcp): register read:catalog scope + add tools to MCP_TOOLS array 2026-05-27 21:58:18 -03:00
diegosouzapw
d96e74bc15 feat(mcp): add agentSkillTools (list/get/coverage) for agent-skills discovery 2026-05-27 21:58:14 -03:00
diegosouzapw
fb0ac17835 test(playground): improve branch coverage to 100% for codeExport and promptImprover
Add tests for default branch paths (model/prompt/stream falsy), completions
params branch, search with model set, web.fetch depth=0, reversed markers
in parseImprovedContent. All new production files reach 100% branch coverage.
2026-05-27 21:57:34 -03:00
diegosouzapw
d1d0ddda0f test(agent-skills): unit tests for generator + scripts smoke
20 tests covering:
- dry-run produces report without writing (filesystem unchanged)
- apply writes SKILL.md for API and CLI skills with correct sections
- apply writes all 42 skills when no filter
- idempotency: second run reports 0 generated, all unchanged
- prune dry-run detects orphans without deleting
- prune apply deletes orphan dirs, preserves catalog dirs
- marker preservation: custom block survives regeneration
- buildSkillMarkdown: valid shape, no escape errors, correct sections per category
- onlyIds filter limits generation
- report shape validation

Also adds gray-matter as dependency (per plan prerequisite check).
2026-05-27 21:55:01 -03:00
diegosouzapw
ca41880bb3 feat(agent-skills): add CLI wrapper scripts/skills/generate-agent-skills.mjs
Implements the CLI wrapper for the generator:
- --apply flag: enables write mode (default: dry-run)
- --prune flag: enables orphan detection/deletion
- --only=<id1,id2>: filters to specific skill IDs
- --json flag: structured JSON output
- Exit codes: 0 success, 1 error, 2 dry-run detected pending changes (CI)
- Human-readable table output with Generated/Unchanged/Pruned/Orphans/Errors summary
- Dynamic import via tsx/esm runtime; falls back to module.register() if needed
2026-05-27 21:54:50 -03:00
diegosouzapw
f86e905efb feat(agent-skills): add generator with idempotent skill md generation + prune
Implements src/lib/agentSkills/generator.ts (§3.4 contract):
- generateAgentSkills(opts): idempotent, dryRun:true default, prune:false default
- buildSkillMarkdown(skillId, sources): generates frontmatter + API/CLI body
- API body: Visão geral + Autenticação + Endpoints (with curl) + Payloads
- CLI body: Visão geral + Instalação rápida + Subcomandos (with flags + examples)
- Prune: detects orphans in skills/{id}/ not in catalog; deletes in apply mode
- Marker preservation: <!-- skill:custom-start --> ... <!-- skill:custom-end -->
- Generated comment: per D24 spec
2026-05-27 21:54:42 -03:00
diegosouzapw
b7efba4727 test(agent-skills): unit tests for REST routes with sanitization assertions
16 tests covering all 5 endpoints:
- GET /agent-skills: 42 total, category/area filters, invalid category → 400
- GET /agent-skills/[id]: found api+cli skills, unknown → 404
- GET /agent-skills/[id]/raw: unknown → 404, valid → 200/502/500 (network-tolerant)
- GET /agent-skills/coverage: SkillCoverage shape (api.total=22, cli.total=20)
- POST /generate: no auth → 401/403, invalid body → 400, no generator → 503

Hard Rule #12 verified explicitly in every error case: error.message must
not match /\bat \/|\bat file:\/\// (no stack trace exposure). Final test
collects all error paths and asserts sanitization in a single sweep.
2026-05-27 21:49:32 -03:00
diegosouzapw
ccda3cf0f0 feat(agent-skills): add POST /generate with management auth + dryRun default
Implements POST /api/agent-skills/generate (F4):

- Requires management auth via requireManagementAuth (same pattern as
  usage/combo-health-dashboard and other management routes)
- Validates body via GenerateBodySchema (dryRun defaults true, prune
  defaults false — safe preview mode)
- Dynamic import of @/lib/agentSkills/generator so the route coexists
  before F3 (generator.ts) is merged; returns 503 if module unavailable
- Hard Rule #12: all error paths use buildErrorBody (400/401/403/503/500)
- Hard Rule #7: Zod validates both JSON parse and schema shape
2026-05-27 21:49:21 -03:00
diegosouzapw
d1160120c0 feat(agent-skills): add REST GET endpoints (list, get, raw, coverage)
Implements four read-only endpoints for the Agent Skills REST API (F4):

- GET /api/agent-skills — catalog with ?category= and ?area= filters,
  returns { skills, count, coverage }
- GET /api/agent-skills/[id] — single skill by canonical ID (404 if absent)
- GET /api/agent-skills/[id]/raw — SKILL.md as text/markdown with
  Cache-Control: public, max-age=3600; 502 on GitHub fallback failure
- GET /api/agent-skills/coverage — SkillCoverage (filesystem vs catalog)

All routes: export const dynamic = "force-dynamic" (filesystem reads),
error responses via buildErrorBody (Hard Rule #12), Zod input validation
(Hard Rule #7). coverage/route.ts force-added to git because .gitignore
matches the directory name "coverage/" — this is an API route, not a
report directory.
2026-05-27 21:49:12 -03:00
diegosouzapw
754806e0f8 test(a2a): unit tests for listCapabilities + Agent Card route
Adds 6 tests for executeListCapabilities (§3.7 shape, 42-skill IDs in markdown,
coverage bounds, ISO datetime, handler registration) and 5 tests for the Agent
Card route (6 skills total, list-capabilities presence + tags + examples, all
original 5 skills preserved). All 11 pass.
2026-05-27 21:49:03 -03:00
diegosouzapw
c91decf543 feat(a2a): register list-capabilities in A2A_SKILL_HANDLERS + Agent Card
Adds "list-capabilities" entry to A2A_SKILL_HANDLERS in taskExecution.ts
(dynamic import pattern, consistent with the 5 existing skills) and adds
the 6th skill entry to /.well-known/agent.json with tags [discovery, capabilities]
and example questions for agent discovery.
2026-05-27 21:48:57 -03:00
diegosouzapw
6bad368dcb feat(a2a): add list-capabilities skill with markdown table of 42 skills
Implements executeListCapabilities() which calls getCatalog() + computeCoverage()
from the agentSkills catalog (F1/F2) and returns a markdown table covering all
42 skills (22 API + 20 CLI) with ID, name, category, area, endpoints/commands,
and raw SKILL.md URL, matching the §3.7 result contract.
2026-05-27 21:48:50 -03:00
diegosouzapw
75b3e916bc test(inspector): unit tests for F4 inspector core (7 specs) 2026-05-27 21:44:53 -03:00
diegosouzapw
c5f697dbc6 feat(inspector): add harExport (F4) 2026-05-27 21:44:46 -03:00
diegosouzapw
62f2fdc4c1 feat(inspector): add httpProxyServer + systemProxyConfig + agentBridgeHook (F4) 2026-05-27 21:44:42 -03:00
diegosouzapw
482cfbcdad feat(inspector): add buffer, sseMerger, conversationNormalizer, llmMetadataExtractor (F4) 2026-05-27 21:44:37 -03:00
diegosouzapw
c1952db4cb feat(cli-tools): add /api/cli-tools/all-statuses batch endpoint + mtime cache + DRY checkToolConfigStatus (plan 14 F2)
- Extract checkToolConfigStatus() from /api/cli-tools/status/route.ts → src/lib/cliTools/checkToolConfigStatus.ts (DRY, sentinel comment, optional configPathOverride for tests)
- Create batchStatusCache.ts singleton in-memory Map<toolId,{mtimeMs,result}> (getCached/setCached/invalidate/clearCache)
- Create /api/cli-tools/all-statuses GET route: auth via requireCliToolsAuth, iterates CLI_TOOLS, Promise.allSettled per tool, timeout 5s, mtime-based cache, endpoint extraction, lastConfiguredAt merge, buildErrorBody on error path
- Update /api/cli-tools/status/route.ts to import from new module (no behavior change)
- 27 unit tests (batch-status-cache + check-tool-config-status) + 8 integration tests (all-statuses-route) — all passing
2026-05-27 21:43:44 -03:00
diegosouzapw
a0e9535769 feat(mitm): manager writes targets.json + agent status (F3)
Two additions to src/mitm/manager.ts:

1. writeTargetsJson(targets?) — persists the static ALL_TARGETS
   registry to <DATA_DIR>/mitm/targets.json. server.cjs reads this
   file at boot and extends its baseline TARGET_HOSTS set so the
   full AgentBridge target catalog is intercepted alongside the
   historical antigravity hosts.

2. getAllAgentsStatus() — read-only aggregate of every registered
   target plus its current installation detection result, used by
   the AgentBridge dashboard.

startMitm() now invokes writeTargetsJson() before any DNS/cert work;
write failures are logged but never block startup.
2026-05-27 21:43:10 -03:00
diegosouzapw
4d5328dca4 feat(mitm): hook server.cjs to load dynamic targets.json (F3)
server.cjs now reads <DATA_DIR>/mitm/targets.json at startup and
adds the listed hostnames to TARGET_HOSTS. The antigravity baseline
remains hard-coded so existing installs continue to work even if
targets.json is missing or malformed (loader catches all errors and
returns 0).

All additions are marked with // T-A-F3: comments to make the
forward-port-only changes easy to audit.
2026-05-27 21:36:43 -03:00
diegosouzapw
6347cbfe5d feat(mitm): add detection modules for 8 agents (F3)
Filesystem-only installation probes for antigravity, kiro, copilot,
codex, cursor, zed, claude-code, and open-code. detectAgent(id)
dispatcher returns {installed, path?} without ever spawning a shell
or interpolating runtime paths (Hard Rule #13).

Trae has no detector — its entry in the dispatch table returns
{installed: false} until upstream viability is confirmed.
2026-05-27 21:31:46 -03:00
diegosouzapw
304dcac4cc feat(mitm): add targets index with resolveTarget + routeConnection (F3)
ALL_TARGETS aggregates the nine MitmTarget descriptors in canonical
order. resolveTarget(hostname) does a case-insensitive exact-match
lookup against each target.hosts list. routeConnection(hostname,
userBypass) returns {kind: bypass|target|passthrough} per plan 11
§4.6 precedence: default+user bypass > known target host > passthrough.
2026-05-27 21:31:39 -03:00
diegosouzapw
bed254954c feat(mitm): add remaining targets (cursor/zed/claudeCode/openCode/trae) (F3)
Declarative MitmTarget descriptors for the remaining agent identities:
- cursor: api2.cursor.sh, OpenAI Chat Completions
- zed: api.zed.dev, OpenAI Chat Completions
- claude-code: api.anthropic.com, Anthropic Messages format
- open-code: opencode.ai, OpenAI Chat Completions
- trae: viability=investigating, host trae.invalid placeholder

All entries point at lazy dynamic imports of their respective
handlers in src/mitm/handlers/<id>.ts (F3 handlers commit).
2026-05-27 21:31:33 -03:00
diegosouzapw
316e3b39f3 feat(mitm): add handler base + 9 concrete agent handlers (F3)
Implements MitmHandlerBase abstract class with shared concerns
(request body capture, secret masking, router forwarding, SSE
piping, Traffic Inspector hooks via dynamic import) plus concrete
handlers for antigravity, kiro, copilot, codex, cursor, zed,
claude-code, open-code, and trae (stub for investigating viability).

Each concrete handler maps request body model field to a configured
target, forwards to OmniRoute router, and pipes back SSE.

Targets antigravity and kiro updated to the new MitmTarget shape
while preserving legacy MITM_PROFILE export aliases.
2026-05-27 21:31:26 -03:00
diegosouzapw
6c7242cca3 test(playground): add test coverage for codeExport, promptImprover, schemas, markdown
- playground-code-export.test.ts: 20 tests, table-driven per endpoint×language,
  security invariants ($OMNIROUTE_API_KEY present, no real keys)
- playground-prompt-improver.test.ts: 19 tests (buildImproveChatBody 6 scenarios,
  parseImprovedContent 8 cases, schema validation 5 cases)
- playground-schemas.test.ts: 20 tests round-trip for all Zod schemas
- search-tools-schemas.test.ts: 19 tests (SearchProviderCatalogItem/Response/ScrapeResult)
- markdown-message.test.tsx: 8 vitest tests (code block, table, list, link, XSS safety)
Total: 86 tests, all passing
2026-05-27 21:29:18 -03:00
diegosouzapw
1a99f0058e feat(playground): add MarkdownMessage component with react-markdown
Renders markdown safely using react-markdown ^10.1.0. Supports code blocks
(pre/code fallback — no syntax highlighter), tables, lists, links, headings,
blockquotes. Script tags appear as literal text (not executed) by default
react-markdown behavior — no XSS possible (D15, §17.3).
2026-05-27 21:29:10 -03:00
diegosouzapw
52c2d1cb75 feat(schemas): add shared playground and searchTools Zod schemas
Adds PlaygroundPresetRowSchema, PlaygroundPresetCreateSchema,
PlaygroundPresetUpdateSchema, PlaygroundPresetListItemSchema,
ToolDefinitionSchema, StructuredOutputSchema, StreamMetricsSchema
(src/shared/schemas/playground.ts) and SearchProviderCatalogItemSchema,
SearchProviderCatalogResponseSchema, ScrapeResultSchema
(src/shared/schemas/searchTools.ts). All z.record() calls use the
Zod v4 two-argument form z.record(z.string(), z.any()) (§17.1).
2026-05-27 21:29:04 -03:00
diegosouzapw
3c3a02ed42 feat(playground): add types.ts with static provider pricing table
Re-exports all playground types and adds static MODEL_PRICING_TABLE with
8-10 popular models labeled (estimated) for client-side cost estimation (D13).
Exports getModelPricing and getProviderPricing helpers.
2026-05-27 21:28:57 -03:00
diegosouzapw
bda03ce5dc feat(playground): add promptImprover.ts meta-prompt helpers
Adds META_SYSTEM_PROMPT, ImprovePromptRequestSchema, buildImproveChatBody,
and parseImprovedContent for the Prompt Improver feature (D8). Handles
system-only, prompt-only, and both-present scenarios with <<SYSTEM>>/<<PROMPT>>
markers.
2026-05-27 21:28:52 -03:00
diegosouzapw
25613e6176 feat(playground): add codeExport.ts generator (curl/python/typescript)
Implements the shared codeExport.ts foundation for the Playground Studio.
Generates curl/python/typescript snippets for all 10 endpoints (chat.completions,
completions, embeddings, images, audio.transcriptions, audio.speech, moderations,
rerank, search, web.fetch). Always uses $OMNIROUTE_API_KEY placeholder (D11).
2026-05-27 21:28:47 -03:00
diegosouzapw
f27911fd4a feat(batch): add NewBatchWizard (4-step modal: destination, input, validate, cost) + tests (F4) 2026-05-27 21:27:50 -03:00
diegosouzapw
44b248314b merge(F8): move skills→omni-skills + split into 8 components + inspector 2026-05-27 21:26:38 -03:00
diegosouzapw
f730161c74 merge(F2): catalog source 42 entries + parsers OpenAPI/CLI 2026-05-27 21:26:37 -03:00
diegosouzapw
b1a127a732 test(omni-skills): unit tests for OmniSkillsPageClient and components
46 structural/source-pattern tests covering: file structure, page.tsx server
component contract, PageClient 4-tab wiring, OmniSkillCard accessibility,
SkillInspectorPane 4 sub-tabs + API fetches, OmniSkillsList split layout,
OmniExecutionsTab columns, OmniSandboxTab config values,
OmniMarketplaceTab dual-provider logic, and E2E path update.
2026-05-27 21:24:15 -03:00
diegosouzapw
33c9b2b96c test(omni-skills): update e2e path /dashboard/skills → /dashboard/omni-skills 2026-05-27 21:24:10 -03:00
diegosouzapw
99ccc35b93 refactor(omni-skills): split monolithic page into PageClient + 6 components
Extract the 870-line page.tsx into OmniSkillsPageClient (state + orchestration)
and 6 focused components: OmniSkillCard, OmniSkillsList, SkillInspectorPane,
OmniExecutionsTab, OmniSandboxTab, OmniMarketplaceTab.

- SkillsConceptCard variant="omni" rendered at top of page
- 4 tabs (skills/executions/sandbox/marketplace) preserved
- Skills tab uses 12-col split grid with SkillInspectorPane (4 sub-tabs)
- SkillInspectorPane: schema/handler/executions/sandbox sub-tabs, mode buttons,
  uninstall, per-skill execution fetch
2026-05-27 21:24:06 -03:00
diegosouzapw
dfd2182c41 refactor(omni-skills): move dashboard/skills → dashboard/omni-skills
Rename the page route from /dashboard/skills to /dashboard/omni-skills
to align with the task-15 F8 redesign plan. The server component wrapper
is reduced to a 5-line delegator, removing the prior 870-line monolith.
2026-05-27 21:23:55 -03:00
diegosouzapw
b9e5d940a4 merge: F6 QuotaStore core (sqlite + redis drivers + fairShare + planResolver + burnRate + saturation) 2026-05-27 21:14:01 -03:00
diegosouzapw
fb519b2002 feat(translator): add StreamTransformerAccordion (F5)
- Refactor of StreamTransformerMode wrapped in Collapsible with lazy-render
- Preserves rawSse input, transform button, MiniStat output, copy
- POST /api/translator/transform-stream reused unchanged
- D7 lazy-render
2026-05-27 20:50:51 -03:00
diegosouzapw
de7c0c6bba feat(translator): add CompressionPreviewAccordion (F7)
- Extracted Compression Preview from PlaygroundMode lines 506-584 into standalone accordion
- Wrapped in Collapsible with lazy-render (D7): content only mounts after first open
- Accepts inputContent via prop (lifted from TranslateTab in F9) or shows empty-state hint
- POST /api/compression/preview unchanged; error path sanitized (no stack-trace leak)
- 33 Vitest tests covering smoke, lazy-render guard, mode select, fetch dispatch, result grid, error path
2026-05-27 20:46:55 -03:00
diegosouzapw
d7372dea3f feat(translator): add MonitorTab (F8)
- Refactor of LiveMonitorMode with paridade
- ADD: monitorOriginHint header explaining event origin
- ADD: empty state with CTA 'Ir para Translate' (onGoToTranslate)
- Preserves 3s polling /api/translator/history, auto-refresh toggle, stats, table
- cleanup useEffect preserved
2026-05-27 20:40:31 -03:00
diegosouzapw
22123013be test(quota): cover fairShare 10 scenarios + burnRate + planResolver + saturationSignals + storeFactory (B/F6) 2026-05-27 20:39:09 -03:00
diegosouzapw
d5d9b5c839 test(quota): cover redisQuotaStore mock (gated by RUN_QUOTA_REDIS_INT) (B/F6) 2026-05-27 20:38:57 -03:00
diegosouzapw
c647f854e8 test(quota): cover sqlite store concurrency + sliding window rotation (B/F6) 2026-05-27 20:38:49 -03:00
diegosouzapw
4d825ad482 feat(quota): add saturationSignals reader with 30s cache and fail-open (B/F6) 2026-05-27 20:38:41 -03:00
diegosouzapw
23f5b6f8b8 feat(quota): add planResolver (DB override > known catalog > empty) (B/F6) 2026-05-27 20:38:33 -03:00
diegosouzapw
c3c0817c3b feat(quota): add burnRate EMA estimator and time-to-exhaustion (B/F6) 2026-05-27 20:38:25 -03:00