@cogenta/core 0.3.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +3479 -0
  2. package/dist/config/env.d.ts +21 -0
  3. package/dist/config/env.d.ts.map +1 -1
  4. package/dist/config/env.js +72 -0
  5. package/dist/config/env.js.map +1 -1
  6. package/dist/config/index.d.ts +2 -0
  7. package/dist/config/index.d.ts.map +1 -1
  8. package/dist/config/index.js +1 -0
  9. package/dist/config/index.js.map +1 -1
  10. package/dist/config/load-config.d.ts +9 -0
  11. package/dist/config/load-config.d.ts.map +1 -1
  12. package/dist/config/load-config.js +39 -15
  13. package/dist/config/load-config.js.map +1 -1
  14. package/dist/config/resolve-config.d.ts.map +1 -1
  15. package/dist/config/resolve-config.js +47 -0
  16. package/dist/config/resolve-config.js.map +1 -1
  17. package/dist/config/schema.d.ts +55 -0
  18. package/dist/config/schema.d.ts.map +1 -1
  19. package/dist/config/schema.js +164 -1
  20. package/dist/config/schema.js.map +1 -1
  21. package/dist/config/secret-hygiene.d.ts +55 -0
  22. package/dist/config/secret-hygiene.d.ts.map +1 -0
  23. package/dist/config/secret-hygiene.js +94 -0
  24. package/dist/config/secret-hygiene.js.map +1 -0
  25. package/dist/config/types.d.ts +192 -0
  26. package/dist/config/types.d.ts.map +1 -1
  27. package/dist/config/types.js +4 -0
  28. package/dist/config/types.js.map +1 -1
  29. package/dist/drivers/index.d.ts +1 -1
  30. package/dist/drivers/index.d.ts.map +1 -1
  31. package/dist/drivers/index.js.map +1 -1
  32. package/dist/drivers/registry.d.ts.map +1 -1
  33. package/dist/drivers/registry.js +15 -8
  34. package/dist/drivers/registry.js.map +1 -1
  35. package/dist/drivers/types.d.ts +23 -0
  36. package/dist/drivers/types.d.ts.map +1 -1
  37. package/dist/errors/codes.d.ts +1 -1
  38. package/dist/errors/codes.d.ts.map +1 -1
  39. package/dist/errors/codes.js +259 -0
  40. package/dist/errors/codes.js.map +1 -1
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +2 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/logger/error-log.d.ts +48 -0
  46. package/dist/logger/error-log.d.ts.map +1 -0
  47. package/dist/logger/error-log.js +57 -0
  48. package/dist/logger/error-log.js.map +1 -0
  49. package/dist/logger/index.d.ts +2 -0
  50. package/dist/logger/index.d.ts.map +1 -1
  51. package/dist/logger/index.js +1 -0
  52. package/dist/logger/index.js.map +1 -1
  53. package/dist/media/exif.d.ts +46 -0
  54. package/dist/media/exif.d.ts.map +1 -0
  55. package/dist/media/exif.js +291 -0
  56. package/dist/media/exif.js.map +1 -0
  57. package/dist/media/folder-path.d.ts +16 -0
  58. package/dist/media/folder-path.d.ts.map +1 -0
  59. package/dist/media/folder-path.js +51 -0
  60. package/dist/media/folder-path.js.map +1 -0
  61. package/dist/media/folder-store.d.ts +26 -0
  62. package/dist/media/folder-store.d.ts.map +1 -0
  63. package/dist/media/folder-store.js +361 -0
  64. package/dist/media/folder-store.js.map +1 -0
  65. package/dist/media/index.d.ts +5 -2
  66. package/dist/media/index.d.ts.map +1 -1
  67. package/dist/media/index.js +4 -1
  68. package/dist/media/index.js.map +1 -1
  69. package/dist/media/sql-fragments.d.ts +19 -0
  70. package/dist/media/sql-fragments.d.ts.map +1 -0
  71. package/dist/media/sql-fragments.js +29 -0
  72. package/dist/media/sql-fragments.js.map +1 -0
  73. package/dist/media/store.d.ts +1 -0
  74. package/dist/media/store.d.ts.map +1 -1
  75. package/dist/media/store.js +175 -20
  76. package/dist/media/store.js.map +1 -1
  77. package/dist/media/types.d.ts +148 -0
  78. package/dist/media/types.d.ts.map +1 -1
  79. package/dist/queue/bullmq.d.ts +4 -0
  80. package/dist/queue/bullmq.d.ts.map +1 -1
  81. package/dist/queue/bullmq.js +53 -10
  82. package/dist/queue/bullmq.js.map +1 -1
  83. package/dist/queue/database.d.ts.map +1 -1
  84. package/dist/queue/database.js +32 -11
  85. package/dist/queue/database.js.map +1 -1
  86. package/dist/queue/types.d.ts +19 -0
  87. package/dist/queue/types.d.ts.map +1 -1
  88. package/dist/rate-limit/index.d.ts +21 -0
  89. package/dist/rate-limit/index.d.ts.map +1 -0
  90. package/dist/rate-limit/index.js +25 -0
  91. package/dist/rate-limit/index.js.map +1 -0
  92. package/dist/rate-limit/memory.d.ts +17 -0
  93. package/dist/rate-limit/memory.d.ts.map +1 -0
  94. package/dist/rate-limit/memory.js +61 -0
  95. package/dist/rate-limit/memory.js.map +1 -0
  96. package/dist/rate-limit/redis.d.ts +55 -0
  97. package/dist/rate-limit/redis.d.ts.map +1 -0
  98. package/dist/rate-limit/redis.js +134 -0
  99. package/dist/rate-limit/redis.js.map +1 -0
  100. package/dist/rate-limit/types.d.ts +52 -0
  101. package/dist/rate-limit/types.d.ts.map +1 -0
  102. package/dist/rate-limit/types.js +2 -0
  103. package/dist/rate-limit/types.js.map +1 -0
  104. package/dist/version.d.ts +39 -0
  105. package/dist/version.d.ts.map +1 -0
  106. package/dist/version.js +84 -0
  107. package/dist/version.js.map +1 -0
  108. package/package.json +3 -2
@@ -32,12 +32,25 @@ export const ERROR_CODES = [
32
32
  'CONTENT_SLUG_TAKEN',
33
33
  'CONTENT_ROUTE_INVALID',
34
34
  'CONTENT_REDIRECT_LOOP',
35
+ // The admin's redirect screen (audit follow-up to L10 task 2: the store and
36
+ // its wiring into every public GET existed, but nothing ever let an editor
37
+ // create or remove a row from a browser).
38
+ 'REDIRECT_UNKNOWN',
35
39
  'CONTENT_SCHEDULE_INVALID',
36
40
  'CONTENT_READ_ONLY',
41
+ // Concurrent editing (fiche 02 task 7): a `PATCH` naming `expectedUpdatedAt`
42
+ // is refused when it no longer matches the live row — someone else's write
43
+ // landed first. Detection, not locking: no table, no TTL, no state that
44
+ // outlives the request.
45
+ 'CONTENT_STALE_WRITE',
37
46
  // Trash (`schema@2.0`, ADR-0022). `restrict` is no longer enforced only by
38
47
  // the foreign key: trashing is not a DELETE, so the database cannot refuse.
39
48
  'CONTENT_REFERENCED',
40
49
  'CONTENT_NOT_TRASHED',
50
+ // Editorial workflow (`schema@2.1`, ADR-0027). `reviewState` is orthogonal
51
+ // to `status`, exactly as `deletedAt` is to it since ADR-0022.
52
+ 'CONTENT_WORKFLOW_DISABLED',
53
+ 'CONTENT_REVIEW_TRANSITION_INVALID',
41
54
  // Taxonomies (`schema@2.0`, ADR-0022)
42
55
  'TAXONOMY_UNKNOWN',
43
56
  'TAXONOMY_TERM_NOT_FOUND',
@@ -46,6 +59,16 @@ export const ERROR_CODES = [
46
59
  'TAXONOMY_TOO_DEEP',
47
60
  'TAXONOMY_NOT_HIERARCHICAL',
48
61
  'TAXONOMY_TERM_HAS_CHILDREN',
62
+ // Menus (navigation)
63
+ 'MENU_UNKNOWN',
64
+ 'MENU_NAME_TAKEN',
65
+ 'MENU_LOCATION_TAKEN',
66
+ 'MENU_ITEM_NOT_FOUND',
67
+ 'MENU_ITEM_INVALID',
68
+ 'MENU_CYCLE',
69
+ // Patterns — the page builder's motif/model library (fiche 43 sub-chantier A)
70
+ 'PATTERN_UNKNOWN',
71
+ 'PATTERN_INVALID',
49
72
  // Blocks
50
73
  'BLOCK_UNKNOWN',
51
74
  'BLOCK_INVALID',
@@ -95,14 +118,53 @@ export const ERROR_CODES = [
95
118
  'AUTH_USER_NOT_FOUND',
96
119
  'AUTH_ROLE_UNKNOWN',
97
120
  'AUDIT_CHAIN_BROKEN',
121
+ // Fiche 21: a lookup by id (audit entry detail) found nothing — distinct
122
+ // from `AUDIT_CHAIN_BROKEN`, which means "found it, and it lied".
123
+ 'AUDIT_ENTRY_NOT_FOUND',
124
+ // Auth — self-service password reset over HTTP (L11, forgot-password route)
125
+ 'AUTH_RESET_TOKEN_INVALID',
126
+ // Auth — recovery codes (fiche 18 task 1): the way back in when TOTP itself
127
+ // is unusable.
128
+ 'AUTH_RECOVERY_CODE_INVALID',
129
+ 'AUTH_RECOVERY_CODES_UNAVAILABLE',
130
+ // Auth — account lifecycle (fiche 17: invitations and anonymization)
131
+ // The invitation reuses AUTH_RESET_TOKEN_INVALID for the token itself
132
+ // (same primitive, same failure shape) — these four are the states around
133
+ // it that a reset token was never asked to describe.
134
+ 'AUTH_INVITE_UNAVAILABLE',
135
+ 'AUTH_INVITE_INVALID_STATE',
136
+ 'AUTH_ACCOUNT_ANONYMIZED',
137
+ 'AUTH_ANONYMIZE_CONFIRMATION_MISMATCH',
138
+ // API keys (L13 task 8: machine-to-machine bearer tokens)
139
+ 'API_KEY_INVALID',
140
+ 'API_KEY_REVOKED',
141
+ 'API_KEY_EXPIRED',
142
+ 'API_KEY_NOT_FOUND',
143
+ // API keys — lifecycle and request quota (fiche 20: expiry defaults,
144
+ // rotation, per-key rate limiting).
145
+ 'API_KEY_ROTATION_INVALID',
146
+ 'API_KEY_RATE_LIMITED',
147
+ // API keys — purge and mistaken-revocation recovery (fiche 62 tasks 2-3).
148
+ 'API_KEY_PURGE_INVALID',
149
+ 'API_KEY_RECOVERY_INVALID',
98
150
  // Media
99
151
  'MEDIA_NOT_FOUND',
100
152
  'MEDIA_INVALID',
101
153
  'MEDIA_TYPE_REJECTED',
154
+ // Media folders (fiche 46) — same materialised-path tree shape as
155
+ // taxonomies (ADR-0022), a table internal to the media subsystem rather
156
+ // than a contract A change.
157
+ 'MEDIA_FOLDER_NOT_FOUND',
158
+ 'MEDIA_FOLDER_INVALID',
159
+ 'MEDIA_FOLDER_NAME_TAKEN',
160
+ 'MEDIA_FOLDER_NOT_EMPTY',
161
+ 'MEDIA_FOLDER_CYCLE',
162
+ 'MEDIA_FOLDER_TOO_DEEP',
102
163
  // Infrastructure
103
164
  'CACHE_FAILED',
104
165
  'QUEUE_FAILED',
105
166
  'STORAGE_FAILED',
167
+ 'RATE_LIMIT_FAILED',
106
168
  // Agents — LLM provider adapters (L4)
107
169
  'PROVIDER_UNKNOWN',
108
170
  'PROVIDER_REQUEST_FAILED',
@@ -135,6 +197,28 @@ export const ERROR_CODES = [
135
197
  // MCP client (L4)
136
198
  'MCP_CLIENT_REMOTE_ERROR',
137
199
  'MCP_CLIENT_TOOL_FAILED',
200
+ // MCP server (L20) — "cogenta mcp"
201
+ 'MCP_ACTOR_OPTIONS_CONFLICT',
202
+ 'MCP_ACTOR_USER_NOT_FOUND',
203
+ 'MCP_ACTOR_ROLE_EMPTY',
204
+ // MCP server (L21) — "cogenta mcp --api-key"
205
+ 'MCP_ACTOR_API_KEY_INVALID',
206
+ // MCP client sandboxing floor (fiche 58 task 1bis) — stdio-client.ts's
207
+ // hard per-call timeout, cancellation, process lifecycle and best-effort
208
+ // resource watchdog.
209
+ 'MCP_CLIENT_CALL_TIMEOUT',
210
+ 'MCP_CLIENT_CALL_ABORTED',
211
+ 'MCP_CLIENT_PROCESS_EXITED',
212
+ 'MCP_CLIENT_SPAWN_FAILED',
213
+ 'MCP_CLIENT_CLOSED',
214
+ 'MCP_CLIENT_RESOURCE_EXCEEDED',
215
+ // MCP external connection registry (fiche 58 tasks 2/3) — "MCP Clients"
216
+ // admin screen and its backing store.
217
+ 'MCP_CONNECTION_NOT_FOUND',
218
+ 'MCP_CONNECTION_INVALID',
219
+ 'MCP_CONNECTION_AUTH_INVALID',
220
+ 'MCP_CONNECTION_CONFIRMATION_REQUIRED',
221
+ 'MCP_CONNECTION_TOOL_NOT_DISCOVERED',
138
222
  // Agents — privacy (L4)
139
223
  'PRIVACY_NO_DATA_LEAVES_VIOLATION',
140
224
  // Agents — agent format and registry (L5)
@@ -155,6 +239,14 @@ export const ERROR_CODES = [
155
239
  // Import — WordPress WXR (L9)
156
240
  'IMPORT_WXR_PARSE_FAILED',
157
241
  'IMPORT_WXR_UNSAFE_DOCUMENT',
242
+ // Import — preview/apply/undo, CSV, RSS/Atom (fiche 25)
243
+ 'IMPORT_RUN_NOT_FOUND',
244
+ 'IMPORT_SOURCE_INVALID',
245
+ 'IMPORT_ALREADY_APPLIED',
246
+ 'IMPORT_MAPPING_INVALID',
247
+ 'IMPORT_MEDIA_URL_UNSAFE',
248
+ 'IMPORT_CSV_INVALID',
249
+ 'IMPORT_FEED_INVALID',
158
250
  // create-cogenta — playground reset (L9)
159
251
  'PLAYGROUND_BLUEPRINT_UNKNOWN',
160
252
  // Channels — adapter registry (L6)
@@ -250,12 +342,19 @@ export const ERROR_CODES = [
250
342
  'COMMERCE_REFUND_EXCEEDS_PAYMENT',
251
343
  // Commerce — tax and shipping (L15 task 6)
252
344
  'COMMERCE_TAX_RULE_INVALID',
345
+ // Fiche feedback: editing a rule in place (PATCH), distinct from the
346
+ // "invalid input" code above.
347
+ 'COMMERCE_TAX_RULE_UNKNOWN',
253
348
  'COMMERCE_SHIPPING_METHOD_UNKNOWN',
254
349
  'COMMERCE_SHIPPING_UNAVAILABLE',
255
350
  // Commerce — coupons and promotions (L15 task 7)
256
351
  'COMMERCE_COUPON_NOT_FOUND',
257
352
  'COMMERCE_COUPON_INVALID',
258
353
  'COMMERCE_COUPON_EXHAUSTED',
354
+ // Fiche 53 task 2: a per-customer cap, distinct from the global one above,
355
+ // and a coupon restricted to products none of which are in the basket.
356
+ 'COMMERCE_COUPON_CUSTOMER_EXHAUSTED',
357
+ 'COMMERCE_COUPON_NOT_APPLICABLE',
259
358
  // Commerce — invoices (L15 task 8)
260
359
  'COMMERCE_INVOICE_NOT_FOUND',
261
360
  'COMMERCE_INVOICE_ALREADY_ISSUED',
@@ -263,12 +362,172 @@ export const ERROR_CODES = [
263
362
  // Commerce — subscriptions (L15 task 9)
264
363
  'COMMERCE_SUBSCRIPTION_NOT_FOUND',
265
364
  'COMMERCE_SUBSCRIPTION_INVALID',
365
+ // Commerce — customers, order edits, shipment tracking, credit notes
366
+ // (fiche 52: commandes et clients)
367
+ 'COMMERCE_CUSTOMER_NOT_FOUND',
368
+ 'COMMERCE_ORDER_LOCKED',
369
+ 'COMMERCE_TRACKING_INVALID',
370
+ 'COMMERCE_CREDIT_NOTE_NOT_FOUND',
266
371
  // Agents — vector store driver (L18 task 1/5)
267
372
  'VECTOR_DIMENSION_MISMATCH',
268
373
  'VECTOR_STORE_FAILED',
269
374
  // Agents — writing/assistant tools (L18 tasks 2-8)
270
375
  'ASSIST_UNAVAILABLE',
271
376
  'ASSIST_RESPONSE_INVALID',
377
+ // Agents — assistant usage/budget (fiche 30 task 3)
378
+ 'ASSIST_BUDGET_EXCEEDED',
379
+ // Agents — reference document RAG index (L22 task 4)
380
+ 'ASSIST_DOCUMENT_NOT_FOUND',
381
+ // Marketplace — catalog and one-click install (L17)
382
+ 'MARKETPLACE_ITEM_NOT_FOUND',
383
+ 'MARKETPLACE_KIND_UNSUPPORTED',
384
+ 'MARKETPLACE_ALREADY_INSTALLED',
385
+ 'MARKETPLACE_NOT_INSTALLED',
386
+ 'MARKETPLACE_UPDATE_REQUIRES_APPROVAL',
387
+ // Marketplace — installed extensions management (fiche 29)
388
+ 'MARKETPLACE_ENGINE_INCOMPATIBLE',
389
+ // Analytics — self-hosted, cookie-free page-view analytics (`@cogenta/analytics`)
390
+ 'ANALYTICS_SALT_UNAVAILABLE',
391
+ // Site settings — the editorial key/value store (fiche 23, ADR-0025)
392
+ 'SITE_SETTING_UNKNOWN',
393
+ 'SITE_SETTING_INVALID',
394
+ // Admin theme — the admin's own runtime template + personalisation (L21 task 2)
395
+ 'ADMIN_THEME_TEMPLATE_UNKNOWN',
396
+ 'ADMIN_THEME_INVALID',
397
+ // Health, migrations and maintenance tools (fiche 24)
398
+ 'MAINT_TOOL_UNKNOWN',
399
+ 'MAINT_TOOL_RUN_NOT_FOUND',
400
+ 'MAINT_TOOL_INPUT_INVALID',
401
+ // Export/import/backup/restore (`@cogenta/export`)
402
+ 'EXPORT_FORMAT_INVALID',
403
+ 'EXPORT_PERMISSION_DENIED',
404
+ 'EXPORT_MEDIA_NOT_FOUND',
405
+ 'EXPORT_ENTRY_TOO_LARGE',
406
+ 'BACKUP_CHECKSUM_MISMATCH',
407
+ 'BACKUP_VERSION_UNSUPPORTED',
408
+ 'BACKUP_DECRYPTION_FAILED',
409
+ 'BACKUP_PASSPHRASE_REQUIRED',
410
+ 'RESTORE_NOT_ALLOWED',
411
+ 'RESTORE_CONFLICT',
412
+ // Scheduled tasks — the maintenance clock's admin surface (fiche 28)
413
+ 'SCHEDULER_TASK_UNKNOWN',
414
+ 'SCHEDULER_TASK_DUPLICATE',
415
+ 'SCHEDULER_QUEUE_JOB_NOT_FOUND',
416
+ 'SCHEDULER_QUEUE_JOB_NOT_RETRYABLE',
417
+ // Appearance and theme — DB-stored skin overrides overlaying contract D's
418
+ // file-based skin (fiche 14)
419
+ 'THEME_OVERRIDE_INVALID',
420
+ 'THEME_SKIN_NOT_FOUND',
421
+ 'THEME_NO_PROVIDER',
422
+ 'THEME_EXPORT_NOT_ALLOWED',
423
+ // Comments — contract F, visitor comments (fiche 15, ADR-0025)
424
+ 'COMMENT_NOT_FOUND',
425
+ 'COMMENT_BODY_INVALID',
426
+ 'COMMENT_AUTHOR_INVALID',
427
+ 'COMMENT_TARGET_INVALID',
428
+ 'COMMENT_TARGET_CLOSED',
429
+ 'COMMENT_PARENT_INVALID',
430
+ 'COMMENT_PARENT_TOO_DEEP',
431
+ 'COMMENT_STATUS_INVALID',
432
+ 'COMMENT_RATE_LIMITED',
433
+ 'COMMENT_SPAM_DETECTED',
434
+ // Forms — contract G (ADR-0026, fiche 16): definitions and submissions.
435
+ 'FORM_UNKNOWN',
436
+ 'FORM_NAME_TAKEN',
437
+ 'FORM_DEFINITION_INVALID',
438
+ 'FORM_SUBMISSION_NOT_FOUND',
439
+ 'FORM_SUBMISSION_INVALID',
440
+ 'FORM_DISABLED',
441
+ 'FORM_RATE_LIMITED',
442
+ 'FORM_HONEYPOT_TRIGGERED',
443
+ 'FORM_SUBMITTED_TOO_FAST',
444
+ 'FORM_CONSENT_REQUIRED',
445
+ 'FORM_AUTORESPONDER_RATE_LIMITED',
446
+ // Fiche 47 — logic, steps, files, multi-channel notifications, CAPTCHA.
447
+ 'FORM_FILE_REJECTED',
448
+ 'FORM_CAPTCHA_REQUIRED',
449
+ 'FORM_CAPTCHA_FAILED',
450
+ 'FORM_STEP_INVALID',
451
+ // A package's own `package.json` could not be read to determine its
452
+ // version (`readOwnPackageVersion`) — a broken install, not a user mistake.
453
+ 'PACKAGE_VERSION_UNREADABLE',
454
+ // Update system (L22 task 9): checking npm for a newer @cogenta/core /
455
+ // @cogenta/cli, and applying one with a mandatory restore point first.
456
+ 'UPDATE_CHECK_FAILED',
457
+ 'UPDATE_RESTORE_POINT_FAILED',
458
+ 'UPDATE_APPLY_FAILED',
459
+ 'UPDATE_NOT_AVAILABLE',
460
+ 'UPDATE_CONFIRMATION_REQUIRED',
461
+ 'UPDATE_POLICY_INVALID',
462
+ // Agents — real execution runtime, providers, skills library (L22 task
463
+ // 1/1bis). `AGENT_SKILL_*` are deliberately distinct from the pre-existing
464
+ // `SKILL_UNKNOWN`/`SKILL_DEFINITION_INVALID` above (L7's marketplace skill
465
+ // registry) — a different store for a different concept, see
466
+ // `packages/agents/src/skills/library.ts`'s module comment.
467
+ 'AGENT_DUPLICATE',
468
+ 'AGENT_DISABLED',
469
+ 'AGENT_NO_PROVIDER',
470
+ 'AGENT_BUILTIN_UNDELETABLE',
471
+ 'PROVIDER_NOT_CONFIGURED',
472
+ 'AGENT_SKILL_UNKNOWN',
473
+ 'AGENT_SKILL_DUPLICATE',
474
+ 'AGENT_SKILL_BUILTIN_UNDELETABLE',
475
+ 'AGENT_REGISTRY_READ_ONLY',
476
+ 'AGENT_RUNTIME_UNAVAILABLE',
477
+ // Skill reference folders (fiche 57): `references/`, `scripts/`, `assets/`
478
+ // under a skill's own directory. A path outside those three, or one that
479
+ // tries to escape the skill's directory, is the caller's fault (invalid);
480
+ // a path that names nothing on disk when removing is a plain not-found.
481
+ 'AGENT_SKILL_RESOURCE_INVALID',
482
+ 'AGENT_SKILL_RESOURCE_UNKNOWN',
483
+ // Agent execution loop, migrated onto LangGraph.js (L24 task 1). Thrown
484
+ // only if the graph's own recursion ceiling is hit before `runAgentLoop`'s
485
+ // `max_steps` check has a chance to fire first — a bug in the graph's
486
+ // wiring, never a normal way for a run to end.
487
+ 'AGENT_LOOP_RECURSION_LIMIT',
488
+ // Channels — inbound chat bridge and `cogenta channels` process (L22 task 2)
489
+ 'CHANNEL_PROVIDER_NOT_CONFIGURED',
490
+ // LLM provider catalog (fiche 56): `provider` widened from a closed
491
+ // 3-literal union to a free string, validated at the write boundary
492
+ // instead. A malformed identifier (empty, or not the slug shape a
493
+ // filename can safely be built from) is distinct from a name that is
494
+ // simply not in the built-in catalog and needs an explicit `baseUrl` to
495
+ // be usable as a custom OpenAI-compatible endpoint.
496
+ 'PROVIDER_ID_INVALID',
497
+ 'PROVIDER_CUSTOM_BASE_URL_REQUIRED',
498
+ // Per-provider model tuning (maxOutputTokens/requestTimeoutMs/
499
+ // maxCorrectionAttempts) — an admin-set value outside sane bounds, or not
500
+ // a whole number.
501
+ 'PROVIDER_TUNING_INVALID',
502
+ // Role permission overrides in the database (fiche 63, ADR-0028): a
503
+ // production-applicable surcharge over `cogenta.schema.*`'s `permissions`
504
+ // block, `PermissionLayer` checked before falling back to the file.
505
+ 'ROLE_PERMISSION_TARGET_UNKNOWN',
506
+ 'ROLE_PERMISSION_INVALID',
507
+ 'ROLE_PERMISSION_EXPORT_INVALID',
508
+ // Prompt Settings — fiche 45's shared template library every `assist.*`
509
+ // tool's instruction text reads from, with a fallback to its own
510
+ // hard-coded string when a site was never migrated.
511
+ 'PROMPT_TEMPLATE_UNKNOWN',
512
+ 'PROMPT_TEMPLATE_DUPLICATE',
513
+ 'PROMPT_TEMPLATE_BUILTIN_UNDELETABLE',
514
+ 'PROMPT_TEMPLATE_PLACEHOLDER_UNRESOLVED',
515
+ // A malformed create/update body on `/api/prompt-templates` — kept
516
+ // distinct from `PROMPT_TEMPLATE_UNKNOWN` (an id that does not exist) so
517
+ // the two map to different HTTP statuses (400 vs 404).
518
+ 'PROMPT_TEMPLATE_INVALID',
519
+ // Google Search Console connector (fiche 70 task 4, ADR-0032). Same shape
520
+ // as `AGENT_NO_PROVIDER`/`SITE_PLAN_NO_PROVIDER`: nothing is broken, this
521
+ // installation simply has no OAuth app configured (R1/R2). `NOT_CONNECTED`
522
+ // is a plain "no site has gone through the OAuth flow yet" state, distinct
523
+ // from "the connector isn't offered at all". The three `*_FAILED`/`*_INVALID`
524
+ // codes describe Google's own token/query endpoints refusing a real request
525
+ // — an upstream failure the caller cannot fix by retrying identically.
526
+ 'SEARCH_CONSOLE_NOT_CONFIGURED',
527
+ 'SEARCH_CONSOLE_NOT_CONNECTED',
528
+ 'SEARCH_CONSOLE_STATE_INVALID',
529
+ 'SEARCH_CONSOLE_TOKEN_EXCHANGE_FAILED',
530
+ 'SEARCH_CONSOLE_QUERY_FAILED',
272
531
  // Catch-all, deliberately last and deliberately rare.
273
532
  'INTERNAL',
274
533
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/errors/codes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/errors/codes.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,5 +8,7 @@ export * from './logger/index.js';
8
8
  export * from './media/index.js';
9
9
  export * from './migrations/index.js';
10
10
  export * from './queue/index.js';
11
+ export * from './rate-limit/index.js';
11
12
  export * from './storage/index.js';
13
+ export * from './version.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA"}
package/dist/index.js CHANGED
@@ -8,5 +8,7 @@ export * from './logger/index.js';
8
8
  export * from './media/index.js';
9
9
  export * from './migrations/index.js';
10
10
  export * from './queue/index.js';
11
+ export * from './rate-limit/index.js';
11
12
  export * from './storage/index.js';
13
+ export * from './version.js';
12
14
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The server error journal (fiche 24 task 4).
3
+ *
4
+ * A bounded, in-process ring buffer — not a table. Durability across a
5
+ * restart is not the point: the point is answering "what just went wrong on
6
+ * this 500" from the admin, on a shared host with no access to the process's
7
+ * own stdout. Bounding it ("the N last entries, not everything") is what
8
+ * "purgées" means here — the oldest entry is simply the one a new one
9
+ * evicts, so nothing needs a separate sweep.
10
+ *
11
+ * Every field passes through `redact()` before it is stored, exactly like
12
+ * every other structured log record (rule R7, `AGENTS.md` § Logs) — this is
13
+ * not a second, weaker guarantee, it is the same one applied a second time
14
+ * so a caller that builds an entry by hand (not through `Logger.error`)
15
+ * cannot skip it.
16
+ */
17
+ export interface ErrorLogEntry {
18
+ readonly id: string;
19
+ readonly at: string;
20
+ /** A stable `ErrorCode` when the failure is one of ours, `'INTERNAL'` otherwise. */
21
+ readonly code: string;
22
+ readonly message: string;
23
+ readonly trace: string | undefined;
24
+ /** Free-form context — request path, method — redacted the same as everything else. */
25
+ readonly context: Readonly<Record<string, unknown>> | undefined;
26
+ }
27
+ export interface RecordErrorInput {
28
+ readonly code?: string;
29
+ readonly message: string;
30
+ readonly trace?: string;
31
+ readonly context?: Readonly<Record<string, unknown>>;
32
+ }
33
+ export interface ErrorLog {
34
+ record(input: RecordErrorInput): ErrorLogEntry;
35
+ /** Turns a thrown value into an entry, using its `CogentaError` code when it has one. */
36
+ recordError(error: unknown, context?: Readonly<Record<string, unknown>>): ErrorLogEntry;
37
+ /** Newest first. */
38
+ entries(): readonly ErrorLogEntry[];
39
+ clear(): void;
40
+ }
41
+ export interface ErrorLogOptions {
42
+ /** How many entries survive at once. The (N+1)th record evicts the oldest. */
43
+ readonly capacity?: number;
44
+ readonly now?: () => Date;
45
+ readonly newId?: () => string;
46
+ }
47
+ export declare function createErrorLog(options?: ErrorLogOptions): ErrorLog;
48
+ //# sourceMappingURL=error-log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-log.d.ts","sourceRoot":"","sources":["../../src/logger/error-log.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;CAChE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACrD;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,CAAA;IAC9C,yFAAyF;IACzF,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,aAAa,CAAA;IACvF,oBAAoB;IACpB,OAAO,IAAI,SAAS,aAAa,EAAE,CAAA;IACnC,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CAC9B;AAID,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAuDtE"}
@@ -0,0 +1,57 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { isCogentaError } from '../errors/index.js';
3
+ import { redact } from './redact.js';
4
+ const DEFAULT_CAPACITY = 200;
5
+ export function createErrorLog(options = {}) {
6
+ const capacity = options.capacity ?? DEFAULT_CAPACITY;
7
+ const now = options.now ?? (() => new Date());
8
+ const newId = options.newId ?? randomUUID;
9
+ let buffer = [];
10
+ function record(input) {
11
+ const safe = redact({
12
+ message: input.message,
13
+ trace: input.trace ?? null,
14
+ context: input.context ?? null,
15
+ });
16
+ const entry = {
17
+ id: newId(),
18
+ at: now().toISOString(),
19
+ code: input.code ?? 'INTERNAL',
20
+ message: String(safe['message']),
21
+ trace: typeof safe['trace'] === 'string' ? safe['trace'] : undefined,
22
+ context: safe['context'] !== null && typeof safe['context'] === 'object'
23
+ ? safe['context']
24
+ : undefined,
25
+ };
26
+ buffer.unshift(entry);
27
+ if (buffer.length > capacity)
28
+ buffer = buffer.slice(0, capacity);
29
+ return entry;
30
+ }
31
+ function recordError(error, context) {
32
+ if (isCogentaError(error)) {
33
+ return record({
34
+ code: error.code,
35
+ message: error.message,
36
+ ...(error.stack === undefined ? {} : { trace: error.stack }),
37
+ ...(context === undefined ? {} : { context }),
38
+ });
39
+ }
40
+ const trace = error instanceof Error ? error.stack : undefined;
41
+ return record({
42
+ code: 'INTERNAL',
43
+ message: error instanceof Error ? error.message : String(error),
44
+ ...(trace === undefined ? {} : { trace }),
45
+ ...(context === undefined ? {} : { context }),
46
+ });
47
+ }
48
+ return {
49
+ record,
50
+ recordError,
51
+ entries: () => buffer,
52
+ clear: () => {
53
+ buffer = [];
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=error-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-log.js","sourceRoot":"","sources":["../../src/logger/error-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAqDpC,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B,MAAM,UAAU,cAAc,CAAC,OAAO,GAAoB,EAAE;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAA;IACrD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAS,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAA;IAEzC,IAAI,MAAM,GAAoB,EAAE,CAAA;IAEhC,SAAS,MAAM,CAAC,KAAuB;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;SAC/B,CAAC,CAAA;QACF,MAAM,KAAK,GAAkB;YAC3B,EAAE,EAAE,KAAK,EAAE;YACX,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;YACvB,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,UAAU;YAC9B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,KAAK,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,OAAO,EACL,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ;gBAC7D,CAAC,CAAE,IAAI,CAAC,SAAS,CAAuC;gBACxD,CAAC,CAAC,SAAS;SAChB,CAAA;QACD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACrB,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ;YAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QAChE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,SAAS,WAAW,CAAC,KAAc,EAAE,OAA2C;QAC9E,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC5D,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;aAC9C,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;QAC9D,OAAO,MAAM,CAAC;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC/D,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACzC,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;SAC9C,CAAC,CAAA;IACJ,CAAC;IAED,OAAO;QACL,MAAM;QACN,WAAW;QACX,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM;QACrB,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,GAAG,EAAE,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,3 +1,5 @@
1
+ export type { ErrorLog, ErrorLogEntry, ErrorLogOptions, RecordErrorInput } from './error-log.js';
2
+ export { createErrorLog } from './error-log.js';
1
3
  export { createLogger } from './logger.js';
2
4
  export { REDACTED, redact } from './redact.js';
3
5
  export type { EmittedLogLevel, LogDestination, LogFields, Logger, LoggerOptions, LogLevel, LogRecord, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC9C,YAAY,EACV,eAAe,EACf,cAAc,EACd,SAAS,EACT,MAAM,EACN,aAAa,EACb,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC9C,YAAY,EACV,eAAe,EACf,cAAc,EACd,SAAS,EACT,MAAM,EACN,aAAa,EACb,QAAQ,EACR,SAAS,GACV,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
@@ -1,3 +1,4 @@
1
+ export { createErrorLog } from './error-log.js';
1
2
  export { createLogger } from './logger.js';
2
3
  export { REDACTED, redact } from './redact.js';
3
4
  export { LOG_LEVELS } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAU9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAU9C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A minimal, zero-dependency EXIF reader and GPS scrubber for JPEG originals
3
+ * (fiche 11 task 6).
4
+ *
5
+ * Only what the media library's detail screen and its privacy notice need:
6
+ * camera make/model, the date a photo was taken, its stored orientation, and
7
+ * whether it carries GPS coordinates — never the full EXIF tag set. R9/R10
8
+ * both apply here exactly as they did to `document.extract_text` (L19 task
9
+ * 1): a JPEG's EXIF block is a TIFF structure with a documented, stable
10
+ * layout, small enough to walk by hand without a dependency that would pull
11
+ * in a general-purpose (and much larger) metadata library for four tags.
12
+ *
13
+ * **Why GPS gets stripped, not just hidden.** `docs/lots/11-mediatheque.md`
14
+ * calls out EXIF GPS coordinates as personal data a public image can leak.
15
+ * Unlinking the `GPSInfo` pointer from IFD0 is what every EXIF-aware reader
16
+ * actually follows, but leaves the original bytes recoverable by anyone
17
+ * scanning the file directly — so `stripGpsFromJpeg` also zeroes the GPS
18
+ * IFD's own entries and any external data block a `RATIONAL` value pointed
19
+ * at (latitude/longitude do not fit in the 4 inline bytes of a directory
20
+ * entry, so they live elsewhere in the same TIFF blob).
21
+ */
22
+ export interface ExifGps {
23
+ readonly latitude: number;
24
+ readonly longitude: number;
25
+ }
26
+ export interface ExifData {
27
+ readonly make: string | null;
28
+ readonly model: string | null;
29
+ /** ISO 8601, from `DateTimeOriginal` (Exif sub-IFD) or `DateTime` (IFD0), in that order. */
30
+ readonly takenAt: string | null;
31
+ /** The raw EXIF orientation value (1–8), or null when absent. */
32
+ readonly orientation: number | null;
33
+ readonly gps: ExifGps | null;
34
+ }
35
+ export declare function readExif(bytes: Uint8Array): ExifData | null;
36
+ /**
37
+ * Removes GPS coordinates from a JPEG's EXIF block, in place semantics
38
+ * aside: returns a new buffer, the original is never mutated.
39
+ *
40
+ * Every other EXIF tag (camera, orientation, capture date) is left exactly
41
+ * as it was — this is a location scrub, not a metadata wipe.
42
+ */
43
+ export declare function stripGpsFromJpeg(bytes: Uint8Array): Uint8Array;
44
+ /** Whether a JPEG's EXIF block carries GPS coordinates — the yes/no a privacy notice needs, without the caller having to unpack the whole `ExifData` shape. */
45
+ export declare function hasGpsData(bytes: Uint8Array): boolean;
46
+ //# sourceMappingURL=exif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exif.d.ts","sourceRoot":"","sources":["../../src/media/exif.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,4FAA4F;IAC5F,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;CAC7B;AAiKD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CA0D3D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAiD9D;AAED,+JAA+J;AAC/J,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAGrD"}