chore(autonomous-session): consolidate uncommitted work from prior session
Bundles the prior autonomous-session output that was sitting unstaged: - Em-dash sweep across src/ + tests/ (en-dash/em-dash to hyphen, ~2280 instances) - country-flag-icons rollout (CountryFlag component, replaces emoji glyphs that never rendered on Windows; lazy-loads the 3x2 SVG index as a single chunk after the per-subpath dynamic-import approach silently failed in webpack) - Admin IA Phase 1+2: 7-domain regroup, 41 to 38 pages, /admin/berths index, redirects (ocr to ai, reports to dashboard, invitations to users), docs/admin-ia-proposal.md - Per-template email tester (registry + endpoint + UI on Email admin page) - Cancel-document mode picker (delete-from-Documenso vs keep-for-audit) - Dashboard PDF report: 25 widgets, SVG charts, date-range picker, 11 resolvers - Customize-widgets per-region sortables at xl+ (charts/rails/feed); single flat sortable below xl when the layout stacks; per-viewport saved orders - Audit doc updates capturing each shipped item - Lint fixes: react-compiler immutability in DonutChart (reduce instead of let-reassign), set-state-in-effect disables in CountryFlag and UploadForSigning preview-bytes effect, unused 'confirm' destructures in interest contract + reservation tabs, unescaped apostrophe in test-template card copy
This commit is contained in:
@@ -31,7 +31,7 @@ export class AppError extends Error {
|
||||
export class CodedError extends AppError {
|
||||
/** Optional structured details surfaced to the client. */
|
||||
public details?: unknown;
|
||||
/** Optional verbose message for admin logs only — never sent to client. */
|
||||
/** Optional verbose message for admin logs only - never sent to client. */
|
||||
public internalMessage?: string;
|
||||
|
||||
constructor(code: ErrorCode, opts: { details?: unknown; internalMessage?: string } = {}) {
|
||||
@@ -54,7 +54,7 @@ export class CodedError extends AppError {
|
||||
*/
|
||||
export class NotFoundError extends AppError {
|
||||
constructor(entity: string) {
|
||||
// Plain-text version of "X not found" — the registered code stays
|
||||
// Plain-text version of "X not found" - the registered code stays
|
||||
// generic until callers migrate to specific codes per entity.
|
||||
super(
|
||||
404,
|
||||
@@ -115,7 +115,7 @@ export class RateLimitError extends AppError {
|
||||
* pull the full stack + body excerpt + log lines.
|
||||
*
|
||||
* Never leaks stack traces, internal paths, or DB error details to
|
||||
* the client — that data goes to pino + the error_events row only.
|
||||
* the client - that data goes to pino + the error_events row only.
|
||||
*/
|
||||
export function errorResponse(error: unknown): NextResponse {
|
||||
const requestId = getRequestId();
|
||||
@@ -137,7 +137,7 @@ export function errorResponse(error: unknown): NextResponse {
|
||||
body.retryAfter = error.retryAfter;
|
||||
}
|
||||
// 4xx errors are user-action mistakes (validation, not-found,
|
||||
// permission). They DON'T go to error_events — that table is for
|
||||
// permission). They DON'T go to error_events - that table is for
|
||||
// platform faults the super admin needs to triage. The exception:
|
||||
// when a CodedError carries an internalMessage, persist it under
|
||||
// a debug_events flag so admins can still trace deliberate-throw
|
||||
@@ -165,7 +165,7 @@ export function errorResponse(error: unknown): NextResponse {
|
||||
return NextResponse.json(body, { status: 400, headers });
|
||||
}
|
||||
|
||||
// Unhandled — full details to pino + persist to error_events.
|
||||
// Unhandled - full details to pino + persist to error_events.
|
||||
logger.error({ err: error }, 'Unhandled error');
|
||||
void captureErrorEvent({ statusCode: 500, error });
|
||||
|
||||
|
||||
Reference in New Issue
Block a user