Commit Graph

993 Commits

Author SHA1 Message Date
diegosouzapw
feb0e983eb fix(memory): activate semantic + hybrid + Qdrant tier-2 in chat hot path
Code review of plan 21 found two functional gaps:

FAIL #1 — toMemoryRetrievalConfig never forwarded the user query, so the
gate `if (config.query && useModernTable)` in retrieval.ts was always
false in the chat hot path. semantic/hybrid silently fell back to
"ORDER BY created_at DESC LIMIT 100", the pre-plan-21 behaviour.
sqlite-vec + RRF only ran in the Playground (retrievePreview, which
takes `query` positionally).

FAIL #2 — Bug #1 was not closed: searchSemanticMemory (Qdrant) was only
imported by /api/settings/qdrant/search, never by retrieval. With
vectorStore="qdrant", engineStatus reported backend="qdrant" but
retrieveMemories/retrievePreview kept using sqlite-vec — the status
diverged from the actual search path.

- settings.ts: toMemoryRetrievalConfig(settings, { query? }) accepts
  and forwards the query.
- chatCore.ts: extracts the last user message from body.messages or
  body.input (Chat + Responses APIs).
- retrieval.ts: adds a Qdrant branch in case "semantic", case "hybrid"
  and retrievePreview; falls through to sqlite-vec on failure or empty
  results so the §7 "degrades to sqlite-vec / FTS5" contract holds.
- engineStatus only reports backend="qdrant" when the user opted in
  (settings.vectorStore === "qdrant") and Qdrant is healthy.
- memories[] tier union includes "qdrant".

331 memory unit tests pass; typecheck:core / typecheck:noimplicit:core /
check:cycles clean.
2026-05-28 21:46:54 -03:00
diegosouzapw
e06d72e270 fix(inspector): set source="custom-host" in agentBridgeHook for custom-host requests (R5-8)
recordRequestStart() now performs a cheap DB lookup (isCustomHost) before
building the InterceptedRequest. Hosts registered in inspector_custom_hosts
with enabled=1 receive source="custom-host" and agent=undefined, so they
appear correctly under the "Custom" profile filter instead of being
silently routed to "agent-bridge" entries.

Added isCustomHost() helper to inspectorCustomHosts.ts and a unit test
covering enabled custom-host, non-custom host, and disabled custom-host cases.
2026-05-28 21:43:36 -03:00
diegosouzapw
59c983e201 feat(inspector): add POST /sessions/[id]/requests to persist live snapshots (R5-5 backend half)
Wires the previously-dead appendSessionRequest() DB function to a new
POST /api/tools/traffic-inspector/sessions/[id]/requests route.
appendSessionRequest now returns the inserted seq so callers can confirm order.
InspectorSessionRequestAppendSchema (1 MB cap) guards the endpoint.
Integration test covers seq increments 1-2-3, requestCount sync, 400/404 paths,
and stack-trace-free error responses.
2026-05-28 21:43:24 -03:00
diegosouzapw
4e58a86cf8 fix(batch): round-2 polish — TS2305 unmask, a11y dialog, BOM stripping, 24h window, Provider column, race guard, banner toast, i18n cleanup
13 fixes from independent round-2 code review:

- B-1: Fix FileRecord wrong import in batch-utils.ts (TS2305 masked by limited typecheck-core scope); include batch-utils.ts + 5 lib/batches/* in tsconfig.typecheck-core.json so future regressions are caught
- A-2: role="dialog" + aria-modal + aria-labelledby on NewBatchWizard + BatchDetailModal panels (a11y consistency with UploadFileModal)
- A-3: "Janela de conclusão de 24h" line in CostEstimateStep (spec §5 explicit)
- A-7: "campos obrigatórios válidos" appended to JsonlValidationStep success summary (spec §5)
- A-9 + B-7: 18 hardcoded UI strings → i18n keys (Size, Refresh/Refreshing, Remove, Uploading, Reading file, Ready, Large file warning, JSONL generated, etc.)
- B-4: Strip UTF-8 BOM in validateJsonl + csvToJsonl (Windows-saved files no longer fail "invalid JSON" cryptically)
- B-5: Remove dead exports WizardStep + BatchProviderConfig from types.ts
- A-1: Add Provider column with derived heuristic (gpt-/o1-/o3-/text-embedding-/dall-e- → OpenAI; claude- → Anthropic; gemini → Gemini; else "—") in BatchListTab (BatchRecord has no provider field, so derivation is display-only)
- A-5: Enter key advances wizard step via data-wizard-next button trigger (skip when focus in INPUT/TEXTAREA/SELECT)
- A-6: Auto-dismiss "Batch {id} criado" banner on /batch page after wizard completes; consumes onCreated id (was discarded as _id)
- B-2: Race guard in InputStep.processFile (early-return if isReading) + drop zone pointer-events-none while reading
- C-tests: 6 new regression tests covering body=[] Array.isArray guard, BOM stripping, alias-match pricing path, (partial) suffix on expired_with_failures, -50% inline badge on Cost column, Provider column derivation per family

Side fix: narrow Record<string,unknown> child navigation in csvToJsonl.ts:135 to silence TS2322 once file is in typecheck scope.

22 new i18n keys (filesListSizeColumn, batchListProviderColumn/Unknown/BatchCreated/Dismiss/Refreshing/Refresh, uploadFileModalRemove/Uploading, wizardInputReading/Ready/LargeFileLabel/CsvJsonlReady/LargeFileWarning, wizardCostWindow24h, wizardValidationFieldsOk) added in en.json + pt-BR.json and propagated to 40 locales via fill-missing-from-en.mjs.
2026-05-28 18:33:31 -03:00
diegosouzapw
c89d27ada6 refactor(playground): expand endpoint contract to 13 endpoints (D4-rev2)
Expands PlaygroundEndpoint type in src/lib/playground/codeExport.ts from 10 to
13 endpoints, adding `responses`, `video`, `music` to mirror the actual
OmniRoute API surface (/v1/responses, /v1/videos/generations,
/v1/music/generations).

This closes the divergence flagged in code review #2 between the contract
fixed by D4 (§3.1 of master-plan-group-C) and the dropdown values used in
ApiTab. The Monaco editor (ApiTab) keeps its own independent endpoint state
(D14) — this only aligns the codeExport-driven Export Code path used by the
Chat/Compare/Build/Scrape tabs.

Changes:
- codeExport.ts: PlaygroundEndpoint type expanded, PlaygroundStateSchema enum
  updated, endpointToPath map updated, buildBody switch gains case branches
  for responses/video/music with sensible defaults.
- StudioConfigPane.tsx: ENDPOINT_OPTIONS gains 3 new entries.
- playground-code-export.test.ts: endpointToPath assertion updated to 13
  endpoints, +6 new tests for responses/video/music (security invariants +
  defaults branches).

Also covers Gap 4 from review #2 (moderations/completions/web.fetch already
in the dropdown via the existing contract — confirmed by this audit).

Refs: _tasks/features-v3.8.6/refactorpages/_orchestration/master-plan-group-C.md
2026-05-28 17:19:48 -03:00
diegosouzapw
907075f704 feat(db,inspector): add snapshotSession + restore hookBufferUpdate spec contract (M1+M2)
- Add `snapshotSession(sessionId)` to inspectorSessions.ts per master-plan §3.8:
  returns parsed InterceptedRequest[] in seq order, or null for non-existent sessions.
  Silently skips rows that fail InterceptedRequestSchema validation (defensive).
- Restore canonical no-arg form of `MitmHandlerBase.hookBufferUpdate(intercepted)`
  per master-plan §3.5: when opts is omitted, derive completion fields from
  the intercepted object itself (status/responseHeaders/responseBody/responseSize/
  *LatencyMs) rather than no-op'ing. Extended opts form preserved for legacy callers.
- Update Zod record() calls in InterceptedRequestSchema to current (key,value) signature.
- Add 3 unit tests for snapshotSession (happy path / non-existent / silent skip).
- Add 2 unit tests for hookBufferUpdate (no-arg form + extended opts form).
2026-05-28 17:07:01 -03:00
diegosouzapw
c73a90134b feat(agent-skills): rewrite generator templates to English (GAP-D - template change) 2026-05-28 13:55:32 -03:00
diegosouzapw
8f0beb99a0 refactor(audit): align ACTIVITY_ICONS 1:1 with new allowlist (B/G3)
Replace all icon specs to match the new 26 real action names. Every entry in
HIGH_LEVEL_ACTIONS now has a corresponding ACTIVITY_ICONS spec with appropriate
Material Symbols icon and i18nKeyVerb key. Old entries (provider.added, auth.login,
etc.) removed since those actions are no longer in the allowlist.
2026-05-28 12:31:24 -03:00
diegosouzapw
22aa276b3c Merge branch 'feat/playground-hooks-F5' into refactor/pages-v3-C-playground-search-tools 2026-05-28 12:31:20 -03:00
diegosouzapw
b1e64480d2 Merge branch 'feat/playground-search-db-F2' into refactor/pages-v3-C-playground-search-tools 2026-05-28 12:31:18 -03:00
diegosouzapw
8771e7232e refactor(audit): align HIGH_LEVEL_ACTIONS with real logAuditEvent emitters (B/G3)
Replace the old "clean naming" allowlist (provider.added, auth.login, etc.) with
the 26 real action strings emitted by logAuditEvent calls in the codebase
(provider.credentials.*, auth.login.*, settings.update, sync.token.*, etc.).
Activity feed was empty because HIGH_LEVEL_ACTIONS used invented names that
never matched any real audit event.
2026-05-28 12:31:17 -03:00
diegosouzapw
cc243a9d47 fix(memory): defensive markNeedsReindex + drain setImmediate in legacy tests
- store.ts: wrap markMemoryNeedsReindex in safeMarkNeedsReindex helper that swallows
  errors when the DB is no longer available (e.g. test teardown after the parent
  promise resolved). Prevents fire-and-forget vector upserts from triggering
  unhandledRejection in tests.
- memory-store.test.ts: drain setImmediate in afterEach/after hooks so pending
  vector upsert tasks settle before DATA_DIR is removed.
- memory-settings.test.ts: extend deepEqual expected shape with the 7 new fields
  introduced by plan 21 F5 (embeddingSource, embeddingProviderModel,
  transformersEnabled, staticEnabled, rerankEnabled, rerankProviderModel,
  vectorStore).
2026-05-28 11:02:25 -03:00
diegosouzapw
5b56704538 fix(quota): audit-discovered stale eslint-disable in planResolver + sidebar-costs-section test drift (B/F10) 2026-05-28 10:42:12 -03:00
diegosouzapw
edaa05783d fix(memory): correct operator precedence in listEmbeddingProviders hasKey check (TS18047)
The previous expression was parsed as (A && B && C) || D, allowing D to evaluate
with creds possibly null. Wrap (apiKey || accessToken) in parens so creds-narrowing
covers the whole disjunction.
2026-05-28 10:06:47 -03:00
diegosouzapw
8f6651d053 feat(memory): rewire retrieval/store/settings/summarization + reindex (plan 21 F5)
- retrieval.ts — semantic/hybrid usa vectorStore quando disponível; degrada para FTS5 transparente
- retrieval.ts — adiciona retrievePreview() (dry-run para Playground) e engineStatus()
- retrieval.ts — rerank opcional via provider configurado (D13)
- store.ts — createMemory/updateMemory geram vetor best-effort; deleteMemory sincroniza vec + Qdrant (D15)
- settings.ts — 7 campos novos (embeddingSource, embeddingProviderModel, transformersEnabled, staticEnabled, rerankEnabled, rerankProviderModel, vectorStore) com defaults
- summarization.ts — summarizeMemoriesOlderThan exposta para uso manual (D19)
- reindex.ts (novo) — runReindexBatch processa fila lazy de backfill (D21)
- 9 testes unitários adicionados; testes F1-F4 sem regressão
2026-05-28 08:27:28 -03:00
diegosouzapw
bdaa045d5d merge(F4): vector store (sqlite-vec + hybrid RRF) 2026-05-28 01:26:16 -03:00
diegosouzapw
c16ce8a9e1 feat(api): traffic-inspector hosts + capture-modes + tls routes (F6) 2026-05-28 01:24:20 -03:00
diegosouzapw
5508dc4e3c feat(memory): add sqlite-vec vector store with hybrid RRF search (plan 21 F4)
Implements VectorStore interface contract from master plan 21 §3.4:
- sqlite-vec v0.1.9 extension loaded via createRequire (ESM compat)
- vec0 virtual table with FLOAT[N] dimensions driven by EmbeddingResolution
- Upsert via DELETE+INSERT (vec0 does not support INSERT OR REPLACE)
- BigInt rowids required by vec0 v0.1.9 for primary key insertion
- Hybrid RRF (k=60) fusing FTS5 + vector KNN via UNION ALL + GROUP BY
- FTS join on m.memory_id = fts.rowid (migration 023 bridge column)
- VECTOR_STORE_DISABLE_VEC=true test seam for null-extension path
- sanitizeErrorMessage in 3 error paths (Hard Rule #12)
- Raw SQL exception documented in header comment (Hard Rule #5 §D5)
- 27 unit tests across 5 files; all lint/typecheck/cycles checks pass
2026-05-28 01:22:38 -03:00
diegosouzapw
02bc079ef9 feat(memory): add embedding layer — remote/static/transformers/cache (plan 21 F3)
Implements the multi-source embedding layer for the Memory Engine Redesign (plan 21).
Adds 5 production modules under src/lib/memory/embedding/:
- cache.ts: LRU+TTL in-memory cache (max=1000, TTL=5min, sha256 keyed)
- remote.ts: delegates to createEmbeddingResponse(), maps HTTP 401/403→no_key, 429→rate_limited, AbortError→timeout; all errors via sanitizeErrorMessage()
- staticPotion.ts: download-once potion-base-8M (JS-only WordPiece tokenizer + mean pooling, no WASM)
- transformersLocal.ts: lazy await import('@huggingface/transformers') singleton pipeline (Xenova/all-MiniLM-L6-v2, q8)
- index.ts: resolveEmbeddingSource (pure, sync), embed (cached dispatch), listEmbeddingProviders, invalidateEmbeddingCache

Also adds @huggingface/transformers and sqlite-vec to dependencies, and registers
@huggingface/transformers in next.config.mjs serverExternalPackages (D8/D25).

6 unit test files: cache (9), resolve (14), remote (10), static-potion (13), transformers (6), list-providers (8) — all 60 tests green.
2026-05-28 00:40:56 -03:00
diegosouzapw
2f92399e23 feat(playground): add streamMetrics pure function 2026-05-27 23:59:23 -03:00
diegosouzapw
bb312062ea merge(F2): db migrations + memoryVec + localDb re-export 2026-05-27 23:26:22 -03:00
diegosouzapw
b9f93a5c07 feat(memory): add migration 073, memoryVec CRUD module, and localDb re-export (plan 21 F2)
- 073_memory_vec.sql: creates memory_vec_meta singleton table (active_dim,
  embedding_signature, last_reset_at, vec_loaded) and adds needs_reindex column
  to memories table with a partial index; idempotent via CREATE IF NOT EXISTS +
  INSERT OR IGNORE + migration runner's duplicate-column-name guard
- src/lib/db/memoryVec.ts: implements 6 CRUD functions per §3.8 contract
  (getMemoryVecMeta, setMemoryVecMeta, markMemoryNeedsReindex,
  markAllMemoriesNeedReindex, getMemoryReindexQueue, countMemoryReindexPending)
- src/lib/localDb.ts: adds re-export block for the 6 functions (Hard Rule #2)
- .env.example: documents 7 new MEMORY_* env vars per §3.9
- tests/unit/memory-vec-meta.test.ts: 7 tests (meta get/set, migration idempotency)
- tests/unit/memory-needs-reindex.test.ts: 12 tests (mark/unmark, markAll, queue)
2026-05-27 23:16:05 -03:00
diegosouzapw
5dd75be1b9 test(batch): add integration tests + sanitization asserts + coverage gap fillers (F9)
- Add tests/unit/batches-f9-helpers.test.ts (19 tests, top-level for c8 coverage gate)
  covering uncovered branches: alias-match pricing, blank CSV rows, body.input/prompt paths,
  non-object JSON lines, invalid Anthropic params, body-is-array validation
- Add tests/unit/dashboard/batch/concept-cards.test.tsx (16 tests)
  covering BatchConceptCard + FilesConceptCard: render, toggle, localStorage hydration, sanitization
- Add tests/unit/dashboard/batch/list-regression.test.tsx (15 tests)
  covering BatchListTab + FilesListTab: render N items, Remove-completed flow,
  status/purpose filter, loading/empty states, sanitization
- Add tests/unit/dashboard/batch/sanitization.test.tsx (8 tests)
  covering NewBatchWizard + UploadFileModal + useBatchActions: each error path
  asserts zero stack-trace/path leakage into the UI (D14 / Hard Rule #12)
- Fix bug in validateJsonl.ts: body=array was not caught as invalid
  (typeof array === "object" is true — add Array.isArray guard, 1-line fix)

Local src/lib/batches/ coverage: 100% stmts / 93.7% branches / 100% funcs / 100% lines.
Global coverage gate: 75.96% stmts / 71.97% branches / 75.52% funcs (all above 75/75/75/70).
2026-05-27 23:14:17 -03:00
diegosouzapw
6236b604ec feat(memory): add shared foundation types, Zod schemas, and roundtrip tests (plan 21 F1)
- src/lib/memory/embedding/types.ts — EmbeddingSource, EmbeddingProviderListing, EmbeddingResolution, EmbeddingResult, EmbeddingError (verbatim §3.1)
- src/shared/schemas/memory.ts — 7 Zod schemas (MemorySettingsExtended, MemoryUpdatePut, RetrievePreview, MemoryReindex, MemorySummarize, EmbeddingProviderListing, MemoryEngineStatus, RetrievePreviewResult) + z.infer types (verbatim §3.2)
- src/shared/schemas/qdrant.ts — 4 Zod schemas (QdrantSettings, QdrantSettingsUpdate, QdrantSearch, QdrantHealthResult) + z.infer types (verbatim §3.3)
- tests/unit/memory-schemas-roundtrip.test.ts — 34 assertions (≥22 required); all pass
2026-05-27 22:54:18 -03:00
diegosouzapw
f211fcf509 merge: F7 enforce wiring (chatCore PRE/POST + combo soft penalty + spendRecorder) 2026-05-27 22:23:33 -03:00
diegosouzapw
0e357a9cc7 merge(F6): integrate W3 frente F6 into base 2026-05-27 22:17:24 -03:00
diegosouzapw
0181348cee feat(quota): add spendRecorder fire-and-forget wrapper (B/F7)
scheduleRecordConsumption() wraps recordConsumption() in setImmediate so it
never adds latency to the client response path. Errors are caught and logged
via pino warn but NEVER propagated to the caller (B29 fail-open contract).
2026-05-27 22:17:16 -03:00
diegosouzapw
d80e1b63eb feat(quota): add enforce.ts (enforceQuotaShare + recordConsumption) (B/F7)
Implements the quota share enforcement gate and consumption recorder:
- enforceQuotaShare(): PRE-request check that returns allow/block/deprioritize
  based on fair-share algorithm, saturation signals, and pool allocations.
- recordConsumption(): POST-response tracker that increments per-key counters
  for each active plan dimension.
Both functions fail-open per B16/B29: any infra error → allow + warn log.
2026-05-27 22:17:10 -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
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
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
c5f697dbc6 feat(inspector): add harExport (F4) 2026-05-27 21:44:46 -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
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
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
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