Commit Graph

3407 Commits

Author SHA1 Message Date
diegosouzapw
33d826f625 test(audit): update allowlist+icons tests for new actions + add real-actions coverage (B/G3)
- audit-high-level-actions.test.ts: replace old provider.added/combo/apikey assertions
  with new provider.credentials.*, auth.login.*, sync.token.* and settings assertions.
  Count still 26.
- audit-activity-icons.test.ts: replace provider.added spec check with
  provider.credentials.created + auth.login.success spot checks.
- audit-allowlist-real-actions.test.ts (new): strict 1:1 HIGH_LEVEL_ACTIONS <->
  ACTIVITY_ICONS, all 26 real repo actions present, isHighLevelAction/getActivityIcon
  spot assertions.
2026-05-28 12:31:39 -03:00
diegosouzapw
29e79764d4 chore(i18n): pt-BR + en activity.eventVerb keys for real audit actions (B/G3)
Add 22 new keys under activity.eventVerb.* in both pt-BR.json and en.json
corresponding to the new ACTIVITY_ICONS i18nKeyVerb values (providerCredentials*,
authLogin*, authLogoutSuccess, syncToken*, settingsUpdate, settingsUpdateFailed,
serviceRevealApiKey). Existing keys preserved for back-compat.
2026-05-28 12:31:31 -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
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
d899a30777 merge: F10 audit + docs + E2E + final validation 2026-05-28 10:45:01 -03:00
diegosouzapw
fd9c9e0f4c chore(orchestration): finalize Group B audit report (B/F10) 2026-05-28 10:42:47 -03:00
diegosouzapw
b1d07a1604 test(e2e): add group-B specs (activity feed, quota-share, plans config, logs/activity redirect) (B/F10) 2026-05-28 10:42:36 -03:00
diegosouzapw
da1c4fecd9 docs(reference): add openapi paths for /api/quota and audit-log level (B/F10) 2026-05-28 10:42:30 -03:00
diegosouzapw
2b0a92d5f5 docs(architecture): update REPOSITORY_MAP for quota + activity + audit lib (B/F10) 2026-05-28 10:42:26 -03:00
diegosouzapw
9f1fbdebf5 docs(architecture): add MONITORING_SECTIONS.md (B/F10) 2026-05-28 10:42:21 -03:00
diegosouzapw
919043a049 docs(quota): add QUOTA_SHARE.md (algorithm + drivers + UI + env) (B/F10) 2026-05-28 10:42:17 -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
b414df62d5 merge: F9 UI quota-share refactor (DB-backed + Plans page + sidebar + i18n) 2026-05-28 08:29:31 -03:00
diegosouzapw
a4ee78322f test(ui): cover quota-share page, components, hooks, plans config + sidebar (B/F9) 2026-05-28 08:25:05 -03:00
diegosouzapw
c21bfd5a36 chore(i18n): extend quotaShare + add quotaPlans namespace (pt-BR + en) (B/F9) 2026-05-28 08:25:00 -03:00
diegosouzapw
4cb50a733e feat(sidebar): add costs-quota-plans item to Costs section (B/F9) 2026-05-28 08:24:54 -03:00
diegosouzapw
bd2cf82e0a feat(quota-plans): add /dashboard/costs/quota-share/plans page (B/F9) 2026-05-28 08:24:49 -03:00
diegosouzapw
c7ee32186c refactor(quota-share): move pools from localStorage to /api/quota/pools (B/F9) 2026-05-28 08:24:44 -03:00
diegosouzapw
ec876883b2 feat(quota-share): add hooks (usePools + usePoolUsage + useLocalStoragePoolMigration) (B/F9) 2026-05-28 08:24:38 -03:00
diegosouzapw
160f0693f3 feat(quota-share): extract PoolCard + DimensionBar + AllocationTable + BurnRateChart + ConceptCard + Modals (B/F9) 2026-05-28 08:24:32 -03:00
diegosouzapw
07d40ef035 merge: F8 REST quota routes (/api/quota/** + /api/settings/quota-store) 2026-05-28 07:55:00 -03:00
diegosouzapw
37e6570bdb test(integration): cover quota REST routes + error sanitization (B/F8) 2026-05-28 07:50:03 -03:00
diegosouzapw
0107beb86b feat(api): add /api/settings/quota-store driver settings route (B/F8) 2026-05-28 07:49:55 -03:00
diegosouzapw
1e652869d7 feat(api): add /api/quota/preview dry-run route (B/F8) 2026-05-28 07:49:47 -03:00
diegosouzapw
043f3c412b feat(api): add /api/quota/plans CRUD routes (B/F8) 2026-05-28 07:49:38 -03:00
diegosouzapw
9dfea1e7ad feat(api): add /api/quota/pools CRUD + usage routes (B/F8) 2026-05-28 07:49:30 -03:00
diegosouzapw
55add3b6e4 chore(ci): relax coverage gate to 40/40/40/40 in Group B branch
Owner-authorized temporary relaxation to unblock landing of planos 16+22
(Monitoring reorg + Quota Share Engine). Restore to 75/75/75/70 after
Group B catches up coverage in follow-up PR. Critical modules
(fairShare, sqliteQuotaStore, enforce, ...) keep local target >=90%.
2026-05-28 02:37:46 -03:00
diegosouzapw
f211fcf509 merge: F7 enforce wiring (chatCore PRE/POST + combo soft penalty + spendRecorder) 2026-05-27 22:23:33 -03:00
diegosouzapw
c04aec0550 merge: F5 ComplianceTab actor filter + CompressionLogTab namespace fix 2026-05-27 22:23:31 -03:00
diegosouzapw
14436c6051 merge: F4 Activity page + audit-log level=high filter + delete AuditLogTab 2026-05-27 22:23:30 -03:00
diegosouzapw
d78e33858d test(quota): cover enforce 7 scenarios + spendRecorder fail-open (B/F7)
quota-enforce.test.ts — 8 assertions:
  - Scenarios 1/7: fail-open when DB unavailable (no pool, store errors).
  - Scenarios 2-6: generous/strict/soft/burst/cap-absolute via fairShare integration.
  - Extra: Promise.all with multiple inputs always resolves to valid kind shape.
quota-spend-recorder.test.ts — 5 assertions:
  - Fire-and-forget timing, silent no-op for unknown keys, rejection catch,
    no-logger path, usd cost type accepted.
2026-05-27 22:17:44 -03:00
diegosouzapw
891cd0b256 feat(open-sse): apply QUOTA_SOFT_DEPRIORITIZE_FACTOR in combo scoring (B/F7)
Adds exported constant QUOTA_SOFT_DEPRIORITIZE_FACTOR (default 0.7, env override).
Extends AutoProviderCandidate with optional quotaSoftPenalty?: boolean field.
scoreAutoTargets() multiplies score by the factor when quotaSoftPenalty === true,
deprioritizing over-fair-share keys under soft policy without fully blocking them.
2026-05-27 22:17:36 -03:00
diegosouzapw
6d81a048b6 feat(open-sse): wire quotaShare PRE/POST hooks in chatCore handler (B/F7)
PRE-hook (before executor dispatch):
  - Calls enforceQuotaShare via dynamic import (lazy load, fail-open).
  - Returns 429 JSON via buildErrorBody() when decision.kind === 'block' (B25).
  - Sets quotaSoftDeprioritize=true when decision.deprioritize=true (B17).
POST-hook (after successful response):
  - Calls scheduleRecordConsumption for both streaming and non-streaming paths.
  - Fire-and-forget via setImmediate; never blocks the client response (B29).
Both hooks use try/catch outer guards so any unexpected error fails open (B16).
2026-05-27 22:17:28 -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
9607225a16 test(ui): cover ComplianceTab actor filter + CompressionLogTab namespace (B/F5)
- compliance-tab-actor-filter.test.tsx: 4 tests verifying actor input
  presence, initial fetch has no actor param, re-fetch with actor=X
  after typing, and clearFilters does not throw.
- compression-log-namespace.test.tsx: 4 tests verifying that the logs
  namespace is used (not settings), no _MISSING_ sentinels, and all 4
  required keys are covered.
2026-05-27 22:07:30 -03:00
diegosouzapw
1b0f22fbf8 chore(i18n): pt-BR + en compliance.actor + copy compression keys to logs ns (B/F5)
- compliance.actor / compliance.actorPlaceholder added to pt-BR + en
- logs.compressionLogTitle, logs.compressionLogEmpty, logs.tokens copied
  from settings to logs namespace in both locales (original keys kept in
  settings to avoid breaking other components)
2026-05-27 22:06:52 -03:00
diegosouzapw
bec422726b fix(logs): correct CompressionLogTab i18n namespace settings->logs (B/F5)
The component was calling useTranslations("settings") which would cause
key misses once the settings namespace is reorganized. Keys used
(loading, compressionLogTitle, compressionLogEmpty, tokens) are now
sourced from the canonical "logs" namespace.
2026-05-27 22:06:45 -03:00
diegosouzapw
a4200186e2 feat(audit): add actor filter to ComplianceTab (B/F5)
Adds state, fetch param, reset and input+datalist for filtering audit
entries by actor. The actor field is inserted between eventType and
severity in the filter grid. Filter value is sent as ?actor= to the
compliance audit-log API on every change.
2026-05-27 22:06:39 -03:00
diegosouzapw
c45781f0d6 test(audit): cover timeline helpers + audit-log level filter + activity page redirect (B/F4) 2026-05-27 22:01:23 -03:00
diegosouzapw
2cf40cafcc chore(i18n): pt-BR + en activity namespace (eventVerb + filters + relative) (B/F4) 2026-05-27 22:01:16 -03:00
diegosouzapw
ec3aa40aae chore(logs): delete deprecated AuditLogTab.tsx duplicate (B/F4) 2026-05-27 22:01:10 -03:00
diegosouzapw
e75bad3cbf refactor(logs): redirect /dashboard/logs/activity to /dashboard/activity (B/F4) 2026-05-27 22:01:06 -03:00
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
b9e5d940a4 merge: F6 QuotaStore core (sqlite + redis drivers + fairShare + planResolver + burnRate + saturation) 2026-05-27 21:14:01 -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