Commit Graph

2599 Commits

Author SHA1 Message Date
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
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
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
diegosouzapw
9905d92244 feat(quota): add fairShare work-conserving algorithm (multi-dimension, generous/strict modes, cap-absolute) (B/F6) 2026-05-27 20:38:18 -03:00
diegosouzapw
67548034be feat(quota): add storeFactory with setting/env-driven driver selection (B/F6) 2026-05-27 20:38:11 -03:00
diegosouzapw
4bb44b10d3 feat(quota): add redisQuotaStore (optional driver, gated by ioredis availability) (B/F6) 2026-05-27 20:38:02 -03:00
diegosouzapw
ca85652bab feat(quota): add sqliteQuotaStore with sliding window counter and per-key mutex (B/F6) 2026-05-27 20:37:51 -03:00
diegosouzapw
8a10b3ecd8 feat(quota): add QuotaStore facade and types re-export (B/F6) 2026-05-27 20:37:44 -03:00
diegosouzapw
0a95372746 feat(agent-skills): add openapiParser and cliRegistryParser
openapiParser.ts:
- parseOpenapi(): reads docs/reference/openapi.yaml via js-yaml (already a dep)
  and returns { paths: Map<METHOD+path, OpenapiPath>, areas: Map<SkillArea, ops[]> }
- PATH_AREA_MAP maps 30+ path prefixes to SkillArea values
- getEndpointsForArea(area): convenience helper returning 'METHOD /path' strings

cliRegistryParser.ts:
- parseCliRegistry(): reads all bin/cli/commands/*.mjs via fs.readdirSync
  and regex-parses .command(), .description(), .option() calls
- FILE_FAMILY_MAP maps 40+ file basenames to CLI SkillArea families
- getCommandsForFamily(family): convenience helper for catalog consumers
- Does NOT import Commander.js modules to avoid side-effects (D15)
2026-05-27 20:31:55 -03:00
diegosouzapw
a0cc22be73 feat(agent-skills): add catalog.ts with getCatalog/filter/coverage/fetch helpers
Implements the catalog.ts public API defined in §3.3 of the master plan:
- getCatalog(): AgentSkill[] — returns 42 entries, lazy-cached in module scope
- getSkillById(id): AgentSkill | null — lookup by canonical ID
- filterCatalog(opts): AgentSkill[] — filter by category and/or area
- computeCoverage(): SkillCoverage — reads skills/ dir and counts SKILL.md present
- refreshCatalog(): void — invalidates cache (used by tests + generator)
- fetchSkillMarkdown(id): Promise<SkillMarkdown> — reads local fs first,
  falls back to GitHub raw fetch with 1h Next.js cache (for F4 /raw route)

API_SKILL_IDS and CLI_SKILL_IDS exported as readonly string arrays (D28 order).
Single source of truth for all consumers (REST routes, MCP, A2A).
2026-05-27 20:31:44 -03:00
diegosouzapw
78de1d2455 feat(agent-skills): expand catalog source to 42 entries (22 API + 20 CLI)
Replace 18-entry hardcoded AGENT_SKILLS array with 42-entry CURATED_SKILLS
covering all areas listed in D28 of the master plan. Each curated entry
has id, name, description, category, area, icon, and optional flags.

Adds backward-compatible AGENT_SKILLS alias (deprecated) that maps curated
entries to the old AgentSkill shape with empty endpoints/cliCommands arrays
so the existing /dashboard/agent-skills page continues to work until F7
rewrites it.

Imports AgentSkill, SkillArea, SkillCategory types from src/lib/agentSkills/types.ts
(F1 single source of truth) instead of redeclaring locally.
2026-05-27 20:31:31 -03:00
diegosouzapw
8dbd0a9d1c feat(translator): add TestBenchAccordion (F6)
- Refactor of TestBenchMode wrapped in Collapsible with lazy-render (D7)
- Preserves 8 scenarios, runAll, per-scenario re-run, pass/fail badges, compatibility report
- Reuses useProviderOptions + useAvailableModels (D12)
- POST /api/translator/translate + /api/translator/send unchanged
- Hard Rule #12: error display uses err.message only (no stack trace)
- 17 Vitest tests: smoke render, lazy-render guard, Run All 8 fetches,
  results running→pass, per-scenario re-run, error sanitization
2026-05-27 20:27:51 -03:00
diegosouzapw
150fe98ddd feat(batch): add UploadFileModal + Used by column + Concept card on /batch/files (F5)
- Create UploadFileModal: drag/drop + click-to-pick, .jsonl + 512MB validation, purpose=batch upload, D14 error sanitization, Escape key handler
- Modify files/page.tsx: integrate FilesConceptCard (F3) + Upload toolbar button + UploadFileModal wired to fetchAll refresh
- Modify FilesListTab.tsx: add "Used by" column (D12 — derives related batches client-side), download button per row, delete button with canDelete guard (terminal-only or no related batches), colspan updated 6→8
- Create UploadFileModal.test.tsx (9 tests, all passing): render, invalid ext, valid .jsonl, >512MB (size property mock), upload 200 → onUploaded, upload 500 → sanitized error, Escape→onClose, drag-drop, sanitization assert (no /home/ in alert text)
2026-05-27 20:25:43 -03:00
diegosouzapw
bb200cd0ba Merge branch 'feat/translator-friendly-concept-card-F2' into refactor/pages-v3-19-translator-friendly-redesign 2026-05-27 19:56:38 -03:00
diegosouzapw
c0db545811 chore(i18n): pt-BR + en keys for activity, costsSection, logsGroup, systemGroup, costsOverview (B/F3)
Add new sidebar i18n keys without removing existing ones (back-compat B11/B12):
- sidebar.activity / sidebar.activitySubtitle
- sidebar.logsGroup
- sidebar.systemGroup
- sidebar.costsOverview / sidebar.costsOverviewSubtitle
Existing sidebar.costs, sidebar.costsSection, sidebar.costsSubtitle preserved.
2026-05-27 19:51:40 -03:00
diegosouzapw
e98ba91928 refactor(sidebar): split Monitoring into Logs/Audit/System groups + Activity at top (B/F3)
- MONITORING_ITEMS reduced to single `activity` item at `/dashboard/activity`
- New LOGS_GROUP (logs/logs-proxy/logs-console) extracted from flat monitoring items
- New SYSTEM_GROUP (health/runtime) extracted from flat monitoring items
- AUDIT_GROUP preserved unchanged
- Monitoring section children: [...MONITORING_ITEMS, LOGS_GROUP, AUDIT_GROUP, SYSTEM_GROUP]
- COSTS_PARAMS_GROUP removed from monitoring section (items migrate to COSTS_ITEMS)
- `activity` added to HIDEABLE_SIDEBAR_ITEM_IDS; `logs-activity` preserved for back-compat (B11)
- Updated existing sidebar-visibility.test.ts to match new monitoring item structure
2026-05-27 19:51:30 -03:00
diegosouzapw
193bf1a766 feat(cli-tools): extend catalog with category/vendor/acpSpawnable/baseUrlSupport + new entries (plan 14 F1)
- Add CliCatalogEntrySchema (Zod) + CliCatalogEntry type + CliCatalogSchema in src/shared/schemas/cliCatalog.ts
- Add ToolBatchStatus + ToolBatchStatusMap interfaces in src/shared/types/cliBatchStatus.ts
- Re-export cliBatchStatus from src/shared/types/index.ts
- Extend all CLI_TOOLS entries with 4 new fields: category, vendor, acpSpawnable, baseUrlSupport
- Add 13 new entries: roo, jcode, deepseek-tui, smelt, pi (code), aider, forge,
  gemini-cli, cursor-cli (code), goose, interpreter, warp, agent-deck (agent)
- Remove windsurf and amp (MITM backlog plan 11, D17)
- Result: 19 visible code entries + 6 agent entries (D15 cardinality)
- Add 5 new unit tests: cli-catalog-schema, cli-catalog-counts, cli-catalog-newentries,
  cli-catalog-removed, cli-catalog-acpspawnable
- Update existing tests to align with removed entries
2026-05-27 19:50:38 -03:00
diegosouzapw
269fce6f0b feat(batches): add pure helpers — csvToJsonl, validateJsonl, costEstimator, retryFailed (F2) 2026-05-27 19:42:51 -03:00
diegosouzapw
ddf6b0ef63 merge(F2): DB migrations + modules into Group A parent 2026-05-27 19:41:11 -03:00
diegosouzapw
96b6000f40 feat(schemas): add agentBridge/inspector Zod schemas (F1)
- AgentBridgeStateRow/Mapping/Bypass/ServerAction/Dns/MappingPut/BypassUpsert/UpstreamCaPost schemas
- InspectorCustomHost/SessionStart/SessionPatch/CaptureModeAction/SystemProxy/TlsInterceptToggle/AnnotationPut/ListQuery schemas
2026-05-27 19:39:32 -03:00
diegosouzapw
411a6d85d1 feat(inspector): add types, contextKey, kindDetector (F1)
- InterceptedRequest/LlmMetadata/WsEvent types + InterceptedRequestSchema
- extractSystemPrompt() supports OpenAI/Anthropic/Gemini formats
- computeContextKey() returns 12-hex SHA-256 of system prompt
- detectKind() classifies traffic via 18 host patterns + path + body + UA
- src/lib/inspector/secretMask.ts re-exports maskSecret (plano 12 bridge)
2026-05-27 19:39:26 -03:00
diegosouzapw
898f2f21c4 feat(mitm): add types, masking, passthrough, upstream-trust (F1)
- MitmTarget/AgentId types + MitmTargetSchema (Zod) in src/mitm/types.ts
- maskSecret() with pre-compiled BEARER/SK_KEY/LONG_TOKEN patterns
- sanitizeHeaders() using isForbiddenUpstreamHeaderName denylist + masking
- shouldBypass()/globMatch() — ReDoS-safe string split (no runtime RegExp)
- configureUpstreamCa() sets undici global dispatcher; safe error message (Hard Rule #12)
2026-05-27 19:39:18 -03:00
diegosouzapw
ae0941464f feat(translator): add F1 foundation types, hooks, and i18n keys
- types.ts: FormatId, TranslatorTab, TranslateMode, AdvancedSlug, TranslateDeepLink, TranslateNarratedResult, AdvancedAccordionProps, ExampleTemplate
- useTranslateDeepLink hook (URL ?tab/mode/advanced enum-validated parsing + setTab/setMode/setAdvanced)
- useTranslateSession hook (detect+translate+send orchestration with sanitized errors)
- 52 new i18n keys (en + pt-BR) under namespace 'translator' (ADD-only, no old keys removed)
- 3 unit test files: deeplink (32 tests), session (10 tests), i18n-keys (138 tests)
2026-05-27 19:38:34 -03:00
diegosouzapw
3c50ebce8f merge: F2 DB migrations + modules (pools, consumption, plans) 2026-05-27 19:25:12 -03:00
diegosouzapw
47c0dce062 chore(env): document AgentBridge + Inspector env vars and re-exports (F2) 2026-05-27 19:24:26 -03:00
diegosouzapw
9fcfc2bd0b feat(db): add inspector custom hosts + sessions CRUD modules (F2) 2026-05-27 19:24:22 -03:00
diegosouzapw
45f602606b feat(db): add agentBridge state/mappings/bypass CRUD modules (F2) 2026-05-27 19:24:19 -03:00
diegosouzapw
89d3304a93 feat(db): add migrations 073/074/075 agent_bridge + inspector (F2) 2026-05-27 19:24:14 -03:00
diegosouzapw
612cf63de7 feat(agent-skills): redirect /dashboard/skills -> /dashboard/omni-skills + sidebar reorder 2026-05-27 19:23:32 -03:00
diegosouzapw
aed1bd02d2 feat(agent-skills): add SkillsConceptCard shared component + i18n 2026-05-27 19:23:27 -03:00
diegosouzapw
051ce5e786 feat(agent-skills): add foundation types + Zod schemas 2026-05-27 19:23:20 -03:00
diegosouzapw
e827ac125a feat(translator): add TranslatorConceptCard with flow diagram (F2)
- TranslatorConceptCard: headline, analogy, expandable 'how it works'
- TranslateFlowDiagram: pure HTML/CSS responsive diagram (D10)
- translateOrFallback inline (D19 — no shared fallback file)
- Tooltip on technical terms (D20 a11y: aria-expanded + aria-controls)
2026-05-27 19:15:50 -03:00
diegosouzapw
44e49f635b chore(db): re-export quota modules in localDb (B/F2)
Adds re-export blocks for quotaPools (7 functions), quotaConsumption
(4 functions with gcQuotaConsumption alias), and providerPlans (4
functions with getProviderPlan/listProviderPlans/etc. aliases).
Zero logic added to localDb.ts — Hard Rule #2 maintained.
2026-05-27 19:14:38 -03:00
diegosouzapw
1721cf7b32 feat(db): add providerPlans module with CRUD for per-connection quota plans (B/F2)
Implements getPlan, listPlans, upsertPlan (idempotent ON CONFLICT DO
UPDATE), and deletePlan. Serializes QuotaDimension[] as JSON into
dimensions_json column and parses back on read. Malformed JSON returns
empty dimensions rather than throwing.
2026-05-27 19:14:32 -03:00
diegosouzapw
83790b6c6a feat(db): add quotaConsumption sliding-window counter storage (B/F2)
Implements getBucket, incrementBucket (atomic UPSERT), getPair (curr+prev
for sliding window formula), and gcOlderThan (stale bucket cleanup).
Atomic increment uses INSERT ... ON CONFLICT DO UPDATE — no separate
read-modify-write cycle needed.
2026-05-27 19:14:27 -03:00
diegosouzapw
07d6a17643 feat(db): add quotaPools module with CRUD and allocation management (B/F2)
Implements listPools, getPool, createPool, updatePool, deletePool,
upsertAllocations (replace strategy via transaction), and
listAllocationsForApiKey. All SQL uses prepared statements. Local type
shapes aligned with src/lib/quota/dimensions.ts contract (B13).
2026-05-27 19:14:21 -03:00
diegosouzapw
4f149fb5a3 feat(db): add quota_pools and quota_consumption migrations (B/F2)
Creates migrations 073 (quota_pools + quota_allocations) and 074
(quota_consumption sliding-window counter). Both are idempotent via
CREATE TABLE IF NOT EXISTS and CREATE INDEX IF NOT EXISTS. FK ON DELETE
CASCADE from quota_allocations to quota_pools. Fixes B2 IDs.
2026-05-27 19:14:15 -03:00