@cogenta/core 0.1.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 (193) hide show
  1. package/dist/cache/entry.d.ts +32 -0
  2. package/dist/cache/entry.d.ts.map +1 -0
  3. package/dist/cache/entry.js +72 -0
  4. package/dist/cache/entry.js.map +1 -0
  5. package/dist/cache/file.d.ts +16 -0
  6. package/dist/cache/file.d.ts.map +1 -0
  7. package/dist/cache/file.js +191 -0
  8. package/dist/cache/file.js.map +1 -0
  9. package/dist/cache/index.d.ts +20 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +25 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/cache/memory.d.ts +11 -0
  14. package/dist/cache/memory.d.ts.map +1 -0
  15. package/dist/cache/memory.js +89 -0
  16. package/dist/cache/memory.js.map +1 -0
  17. package/dist/cache/redis.d.ts +54 -0
  18. package/dist/cache/redis.d.ts.map +1 -0
  19. package/dist/cache/redis.js +167 -0
  20. package/dist/cache/redis.js.map +1 -0
  21. package/dist/cache/types.d.ts +37 -0
  22. package/dist/cache/types.d.ts.map +1 -0
  23. package/dist/cache/types.js +2 -0
  24. package/dist/cache/types.js.map +1 -0
  25. package/dist/config/define-config.d.ts +19 -0
  26. package/dist/config/define-config.d.ts.map +1 -0
  27. package/dist/config/define-config.js +20 -0
  28. package/dist/config/define-config.js.map +1 -0
  29. package/dist/config/env.d.ts +30 -0
  30. package/dist/config/env.d.ts.map +1 -0
  31. package/dist/config/env.js +139 -0
  32. package/dist/config/env.js.map +1 -0
  33. package/dist/config/index.d.ts +7 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +5 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/config/load-config.d.ts +30 -0
  38. package/dist/config/load-config.d.ts.map +1 -0
  39. package/dist/config/load-config.js +83 -0
  40. package/dist/config/load-config.js.map +1 -0
  41. package/dist/config/resolve-config.d.ts +14 -0
  42. package/dist/config/resolve-config.d.ts.map +1 -0
  43. package/dist/config/resolve-config.js +146 -0
  44. package/dist/config/resolve-config.js.map +1 -0
  45. package/dist/config/schema.d.ts +68 -0
  46. package/dist/config/schema.d.ts.map +1 -0
  47. package/dist/config/schema.js +75 -0
  48. package/dist/config/schema.js.map +1 -0
  49. package/dist/config/types.d.ts +126 -0
  50. package/dist/config/types.d.ts.map +1 -0
  51. package/dist/config/types.js +6 -0
  52. package/dist/config/types.js.map +1 -0
  53. package/dist/db/dialect.d.ts +64 -0
  54. package/dist/db/dialect.d.ts.map +1 -0
  55. package/dist/db/dialect.js +147 -0
  56. package/dist/db/dialect.js.map +1 -0
  57. package/dist/db/drizzle.d.ts +35 -0
  58. package/dist/db/drizzle.d.ts.map +1 -0
  59. package/dist/db/drizzle.js +128 -0
  60. package/dist/db/drizzle.js.map +1 -0
  61. package/dist/db/index.d.ts +28 -0
  62. package/dist/db/index.d.ts.map +1 -0
  63. package/dist/db/index.js +30 -0
  64. package/dist/db/index.js.map +1 -0
  65. package/dist/db/mysql.d.ts +39 -0
  66. package/dist/db/mysql.d.ts.map +1 -0
  67. package/dist/db/mysql.js +224 -0
  68. package/dist/db/mysql.js.map +1 -0
  69. package/dist/db/postgres.d.ts +47 -0
  70. package/dist/db/postgres.d.ts.map +1 -0
  71. package/dist/db/postgres.js +174 -0
  72. package/dist/db/postgres.js.map +1 -0
  73. package/dist/db/sqlite.d.ts +41 -0
  74. package/dist/db/sqlite.d.ts.map +1 -0
  75. package/dist/db/sqlite.js +213 -0
  76. package/dist/db/sqlite.js.map +1 -0
  77. package/dist/db/types.d.ts +71 -0
  78. package/dist/db/types.d.ts.map +1 -0
  79. package/dist/db/types.js +2 -0
  80. package/dist/db/types.js.map +1 -0
  81. package/dist/drivers/index.d.ts +5 -0
  82. package/dist/drivers/index.d.ts.map +1 -0
  83. package/dist/drivers/index.js +3 -0
  84. package/dist/drivers/index.js.map +1 -0
  85. package/dist/drivers/registry.d.ts +27 -0
  86. package/dist/drivers/registry.d.ts.map +1 -0
  87. package/dist/drivers/registry.js +162 -0
  88. package/dist/drivers/registry.js.map +1 -0
  89. package/dist/drivers/types.d.ts +59 -0
  90. package/dist/drivers/types.d.ts.map +1 -0
  91. package/dist/drivers/types.js +2 -0
  92. package/dist/drivers/types.js.map +1 -0
  93. package/dist/errors/codes.d.ts +8 -0
  94. package/dist/errors/codes.d.ts.map +1 -0
  95. package/dist/errors/codes.js +201 -0
  96. package/dist/errors/codes.js.map +1 -0
  97. package/dist/errors/cogenta-error.d.ts +38 -0
  98. package/dist/errors/cogenta-error.d.ts.map +1 -0
  99. package/dist/errors/cogenta-error.js +31 -0
  100. package/dist/errors/cogenta-error.js.map +1 -0
  101. package/dist/errors/index.d.ts +5 -0
  102. package/dist/errors/index.d.ts.map +1 -0
  103. package/dist/errors/index.js +3 -0
  104. package/dist/errors/index.js.map +1 -0
  105. package/dist/id.d.ts +5 -0
  106. package/dist/id.d.ts.map +1 -0
  107. package/dist/id.js +82 -0
  108. package/dist/id.js.map +1 -0
  109. package/dist/index.d.ts +12 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +12 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/logger/index.d.ts +5 -0
  114. package/dist/logger/index.d.ts.map +1 -0
  115. package/dist/logger/index.js +4 -0
  116. package/dist/logger/index.js.map +1 -0
  117. package/dist/logger/logger.d.ts +10 -0
  118. package/dist/logger/logger.d.ts.map +1 -0
  119. package/dist/logger/logger.js +108 -0
  120. package/dist/logger/logger.js.map +1 -0
  121. package/dist/logger/redact.d.ts +12 -0
  122. package/dist/logger/redact.d.ts.map +1 -0
  123. package/dist/logger/redact.js +96 -0
  124. package/dist/logger/redact.js.map +1 -0
  125. package/dist/logger/types.d.ts +32 -0
  126. package/dist/logger/types.d.ts.map +1 -0
  127. package/dist/logger/types.js +3 -0
  128. package/dist/logger/types.js.map +1 -0
  129. package/dist/media/format-sniff.d.ts +22 -0
  130. package/dist/media/format-sniff.d.ts.map +1 -0
  131. package/dist/media/format-sniff.js +77 -0
  132. package/dist/media/format-sniff.js.map +1 -0
  133. package/dist/media/index.d.ts +5 -0
  134. package/dist/media/index.d.ts.map +1 -0
  135. package/dist/media/index.js +4 -0
  136. package/dist/media/index.js.map +1 -0
  137. package/dist/media/store.d.ts +13 -0
  138. package/dist/media/store.d.ts.map +1 -0
  139. package/dist/media/store.js +211 -0
  140. package/dist/media/store.js.map +1 -0
  141. package/dist/media/types.d.ts +70 -0
  142. package/dist/media/types.d.ts.map +1 -0
  143. package/dist/media/types.js +2 -0
  144. package/dist/media/types.js.map +1 -0
  145. package/dist/migrations/index.d.ts +4 -0
  146. package/dist/migrations/index.d.ts.map +1 -0
  147. package/dist/migrations/index.js +2 -0
  148. package/dist/migrations/index.js.map +1 -0
  149. package/dist/migrations/migrator.d.ts +18 -0
  150. package/dist/migrations/migrator.d.ts.map +1 -0
  151. package/dist/migrations/migrator.js +247 -0
  152. package/dist/migrations/migrator.js.map +1 -0
  153. package/dist/migrations/types.d.ts +63 -0
  154. package/dist/migrations/types.d.ts.map +1 -0
  155. package/dist/migrations/types.js +2 -0
  156. package/dist/migrations/types.js.map +1 -0
  157. package/dist/queue/bullmq.d.ts +119 -0
  158. package/dist/queue/bullmq.d.ts.map +1 -0
  159. package/dist/queue/bullmq.js +391 -0
  160. package/dist/queue/bullmq.js.map +1 -0
  161. package/dist/queue/database.d.ts +17 -0
  162. package/dist/queue/database.d.ts.map +1 -0
  163. package/dist/queue/database.js +242 -0
  164. package/dist/queue/database.js.map +1 -0
  165. package/dist/queue/index.d.ts +7 -0
  166. package/dist/queue/index.d.ts.map +1 -0
  167. package/dist/queue/index.js +4 -0
  168. package/dist/queue/index.js.map +1 -0
  169. package/dist/queue/types.d.ts +61 -0
  170. package/dist/queue/types.d.ts.map +1 -0
  171. package/dist/queue/types.js +2 -0
  172. package/dist/queue/types.js.map +1 -0
  173. package/dist/storage/index.d.ts +14 -0
  174. package/dist/storage/index.d.ts.map +1 -0
  175. package/dist/storage/index.js +17 -0
  176. package/dist/storage/index.js.map +1 -0
  177. package/dist/storage/key.d.ts +12 -0
  178. package/dist/storage/key.d.ts.map +1 -0
  179. package/dist/storage/key.js +43 -0
  180. package/dist/storage/key.js.map +1 -0
  181. package/dist/storage/local.d.ts +23 -0
  182. package/dist/storage/local.d.ts.map +1 -0
  183. package/dist/storage/local.js +204 -0
  184. package/dist/storage/local.js.map +1 -0
  185. package/dist/storage/s3.d.ts +54 -0
  186. package/dist/storage/s3.d.ts.map +1 -0
  187. package/dist/storage/s3.js +240 -0
  188. package/dist/storage/s3.js.map +1 -0
  189. package/dist/storage/types.d.ts +45 -0
  190. package/dist/storage/types.d.ts.map +1 -0
  191. package/dist/storage/types.js +2 -0
  192. package/dist/storage/types.js.map +1 -0
  193. package/package.json +82 -0
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Every error Cogenta throws carries one of these codes. They are a public API:
3
+ * callers branch on them, logs are aggregated by them, and translations key off
4
+ * them. Adding a code is a minor version; changing the meaning of one is major.
5
+ */
6
+ export const ERROR_CODES = [
7
+ // Configuration
8
+ 'CONFIG_INVALID',
9
+ 'CONFIG_NOT_FOUND',
10
+ 'CONFIG_LOAD_FAILED',
11
+ 'CONFIG_SECRET_IN_FILE',
12
+ // Drivers
13
+ 'DRIVER_UNKNOWN',
14
+ 'DRIVER_DUPLICATE',
15
+ 'DRIVER_UNAVAILABLE',
16
+ 'DRIVER_INIT_FAILED',
17
+ // Data
18
+ 'DB_UNREACHABLE',
19
+ 'DB_DIALECT_UNSUPPORTED',
20
+ 'MIGRATION_FAILED',
21
+ 'MIGRATION_IRREVERSIBLE',
22
+ 'MIGRATION_LOCKED',
23
+ 'MIGRATION_CHECKSUM_MISMATCH',
24
+ 'MIGRATION_DESTRUCTIVE',
25
+ // Content schema
26
+ 'SCHEMA_INVALID',
27
+ // Content
28
+ 'CONTENT_NOT_FOUND',
29
+ 'CONTENT_INVALID',
30
+ 'CONTENT_CONFLICT',
31
+ 'CONTENT_SLUG_INVALID',
32
+ 'CONTENT_SLUG_TAKEN',
33
+ 'CONTENT_ROUTE_INVALID',
34
+ 'CONTENT_REDIRECT_LOOP',
35
+ 'CONTENT_SCHEDULE_INVALID',
36
+ 'CONTENT_READ_ONLY',
37
+ // Blocks
38
+ 'BLOCK_UNKNOWN',
39
+ 'BLOCK_INVALID',
40
+ 'BLOCK_DEFINITION_INVALID',
41
+ 'BLOCK_MIGRATION_FAILED',
42
+ // Rendering — skins. A skin is refused, never repaired: contract D freezes the
43
+ // token set precisely so that a generated skin either passes or is rejected.
44
+ 'SKIN_TOKEN_MISSING',
45
+ 'SKIN_TOKEN_UNKNOWN',
46
+ 'SKIN_TOKEN_INVALID',
47
+ 'SKIN_CONTRAST_INSUFFICIENT',
48
+ 'SKIN_SCALE_NOT_MONOTONIC',
49
+ 'SKIN_MOTION_NOT_REDUCED',
50
+ // Themes
51
+ 'THEME_NOT_FOUND',
52
+ 'THEME_INVALID',
53
+ 'THEME_BLOCK_MISSING',
54
+ 'THEME_IMPORT_FORBIDDEN',
55
+ 'THEME_SIGNATURE_INVALID',
56
+ // Rendering — the content API a theme reads through (ADR-0016)
57
+ 'CONTENT_API_FAILED',
58
+ // Rendering — in-process fallback `cogenta serve` uses until a real Astro
59
+ // build exists (no image pipeline is wired into that fallback yet)
60
+ 'THEME_IMAGE_UNSUPPORTED',
61
+ // Rendering — build targets. A target that cannot honour a declared runtime
62
+ // need refuses the build; it never degrades silently (ADR-0004).
63
+ 'BUILD_TARGET_UNKNOWN',
64
+ 'BUILD_RUNTIME_UNSATISFIED',
65
+ // Access
66
+ 'FORBIDDEN',
67
+ 'UNAUTHENTICATED',
68
+ 'PREVIEW_TOKEN_INVALID',
69
+ 'PREVIEW_TOKEN_EXPIRED',
70
+ 'QUERY_INVALID',
71
+ // Auth
72
+ 'AUTH_PASSWORD_INVALID',
73
+ 'AUTH_INVALID_CREDENTIALS',
74
+ 'AUTH_TOTP_INVALID',
75
+ 'AUTH_TOTP_REQUIRED',
76
+ 'AUTH_WEBAUTHN_FAILED',
77
+ 'AUTH_SESSION_INVALID',
78
+ 'AUTH_SESSION_EXPIRED',
79
+ 'AUTH_RATE_LIMITED',
80
+ 'AUTH_MFA_REQUIRED',
81
+ 'AUTH_USER_EXISTS',
82
+ 'AUTH_USER_NOT_FOUND',
83
+ 'AUTH_ROLE_UNKNOWN',
84
+ 'AUDIT_CHAIN_BROKEN',
85
+ // Media
86
+ 'MEDIA_NOT_FOUND',
87
+ 'MEDIA_INVALID',
88
+ 'MEDIA_TYPE_REJECTED',
89
+ // Infrastructure
90
+ 'CACHE_FAILED',
91
+ 'QUEUE_FAILED',
92
+ 'STORAGE_FAILED',
93
+ // Agents — LLM provider adapters (L4)
94
+ 'PROVIDER_UNKNOWN',
95
+ 'PROVIDER_REQUEST_FAILED',
96
+ 'PROVIDER_RESPONSE_INVALID',
97
+ 'PROVIDER_RATE_LIMITED',
98
+ 'PROVIDER_TIMEOUT',
99
+ // Agents — tool registry (L4)
100
+ 'TOOL_DEFINITION_INVALID',
101
+ 'TOOL_DUPLICATE',
102
+ 'TOOL_UNKNOWN',
103
+ 'TOOL_INPUT_INVALID',
104
+ 'TOOL_OUTPUT_INVALID',
105
+ 'TOOL_CALL_REJECTED',
106
+ // Agents — core tools (L4)
107
+ 'HTTP_FETCH_DOMAIN_DENIED',
108
+ // Agents — autonomy and approval (L4)
109
+ 'APPROVAL_REQUEST_UNKNOWN',
110
+ // Agents — reversibility (L4)
111
+ 'RECEIPT_UNKNOWN',
112
+ 'RECEIPT_ALREADY_REVERTED',
113
+ 'RECEIPT_NOT_REVERTIBLE',
114
+ // Agents — sub-agents (L4)
115
+ 'AGENT_SUBAGENT_UNKNOWN',
116
+ 'AGENT_SUBAGENT_TOOLS_NOT_SUBSET',
117
+ // Agents — skills (L4)
118
+ 'SKILL_UNKNOWN',
119
+ 'SKILL_DEFINITION_INVALID',
120
+ // Agents — memory (L4)
121
+ 'AGENT_APPROVAL_NOT_DECIDED',
122
+ // MCP client (L4)
123
+ 'MCP_CLIENT_REMOTE_ERROR',
124
+ 'MCP_CLIENT_TOOL_FAILED',
125
+ // Agents — privacy (L4)
126
+ 'PRIVACY_NO_DATA_LEAVES_VIOLATION',
127
+ // Agents — agent format and registry (L5)
128
+ 'AGENT_DEFINITION_INVALID',
129
+ 'AGENT_UNKNOWN',
130
+ // Agents — evaluation (L5)
131
+ 'EVAL_THRESHOLD_NOT_MET',
132
+ // Agents-builtin — security agent (L5)
133
+ 'SECURITY_OSV_QUERY_FAILED',
134
+ 'SECURITY_EPSS_QUERY_FAILED',
135
+ 'SECURITY_DEPENDENCY_NOT_FOUND',
136
+ // Agents-builtin — performance agent (L5)
137
+ 'PERFORMANCE_CRUX_QUERY_FAILED',
138
+ // create-cogenta — blueprints (L9)
139
+ 'BLUEPRINT_REGISTRY_CORRUPT',
140
+ // create-cogenta — AI skin generation (L9)
141
+ 'SKIN_GENERATION_RESPONSE_NOT_JSON',
142
+ // Import — WordPress WXR (L9)
143
+ 'IMPORT_WXR_PARSE_FAILED',
144
+ 'IMPORT_WXR_UNSAFE_DOCUMENT',
145
+ // create-cogenta — playground reset (L9)
146
+ 'PLAYGROUND_BLUEPRINT_UNKNOWN',
147
+ // Channels — adapter registry (L6)
148
+ 'CHANNEL_UNKNOWN',
149
+ 'CHANNEL_DUPLICATE',
150
+ // Channels — identity linking (L6 task 2)
151
+ 'CHANNEL_LINK_CODE_INVALID',
152
+ // Channels — inbound command routing (L6 task 3)
153
+ 'CHANNEL_COMMAND_DUPLICATE',
154
+ // Channels — Telegram adapter (L6 task 4)
155
+ 'CHANNEL_TELEGRAM_API_ERROR',
156
+ // Channels — message formats (L6 task 6)
157
+ 'CHANNEL_MESSAGE_INVALID',
158
+ // Channels — notification preferences (L6 task 7)
159
+ 'CHANNEL_PREFERENCES_INVALID',
160
+ // Channels — email adapter (L6 task 8)
161
+ 'CHANNEL_EMAIL_TRANSPORT_ERROR',
162
+ 'CHANNEL_EMAIL_INBOUND_UNSUPPORTED',
163
+ // Channels — Slack adapter (L6 task 9)
164
+ 'CHANNEL_SLACK_API_ERROR',
165
+ // Channels — Discord adapter (L6 task 10)
166
+ 'CHANNEL_DISCORD_API_ERROR',
167
+ // Channels — generic signed webhook (L6 task 11)
168
+ 'CHANNEL_WEBHOOK_SIGNATURE_INVALID',
169
+ 'CHANNEL_WEBHOOK_EXPIRED',
170
+ 'CHANNEL_WEBHOOK_REPLAY_DETECTED',
171
+ 'CHANNEL_WEBHOOK_DELIVERY_FAILED',
172
+ 'CHANNEL_WEBHOOK_INBOUND_UNSUPPORTED',
173
+ // Plugins — manifest schema and validation (L7 task 1)
174
+ 'PLUGIN_MANIFEST_INVALID',
175
+ // Plugins — resolution and loading (L7 task 2)
176
+ 'PLUGIN_SOURCE_NOT_FOUND',
177
+ 'PLUGIN_MANIFEST_FILE_NOT_FOUND',
178
+ 'PLUGIN_MANIFEST_LOAD_FAILED',
179
+ 'PLUGIN_MANIFEST_EXPORT_INVALID',
180
+ // Plugins — isolated worker execution (L7 task 3)
181
+ 'PLUGIN_WORKER_TIMEOUT',
182
+ 'PLUGIN_WORKER_CRASHED',
183
+ 'PLUGIN_WORKER_RUNTIME_ERROR',
184
+ // Plugins — capability-gated SDK (L7 task 4)
185
+ 'PLUGIN_CAPABILITY_REFUSED',
186
+ // Plugins — resource limits, kill and disable (L7 task 6)
187
+ 'PLUGIN_DISABLED',
188
+ // Plugins — signature and verification (L7 task 9)
189
+ 'PLUGIN_SIGNATURE_MISSING',
190
+ 'PLUGIN_SIGNATURE_INVALID',
191
+ // Fleet — site-side telemetry emission (L8 task 2)
192
+ 'FLEET_TELEMETRY_FORBIDDEN_FIELD',
193
+ // Fleet — rollout campaigns (L8 task 7)
194
+ 'FLEET_CAMPAIGN_NOT_FOUND',
195
+ 'FLEET_CAMPAIGN_STATE_CORRUPT',
196
+ // Fleet — per-site rollback (L8 task 8)
197
+ 'FLEET_ROLLBACK_NO_PRIOR_VERSION',
198
+ // Catch-all, deliberately last and deliberately rare.
199
+ 'INTERNAL',
200
+ ];
201
+ //# sourceMappingURL=codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/errors/codes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { ErrorCode } from './codes.js';
2
+ export interface CogentaErrorOptions {
3
+ /** Stable, machine-readable code. Never derived from the message. */
4
+ readonly code: ErrorCode;
5
+ /** What failed and why, in one sentence, aimed at a human. */
6
+ readonly message: string;
7
+ /** What the user should do about it. Required for anything a user can hit. */
8
+ readonly hint?: string;
9
+ /** The underlying error, kept for debugging. */
10
+ readonly cause?: unknown;
11
+ /**
12
+ * Structured context for logs. Opt-in per call site, which is what keeps
13
+ * secrets out of it: nothing is ever copied here automatically (rule R7).
14
+ */
15
+ readonly details?: Readonly<Record<string, unknown>>;
16
+ }
17
+ export interface SerialisedCogentaError {
18
+ readonly name: 'CogentaError';
19
+ readonly code: ErrorCode;
20
+ readonly message: string;
21
+ readonly hint: string | undefined;
22
+ readonly details: Readonly<Record<string, unknown>> | undefined;
23
+ }
24
+ /**
25
+ * The only error class library code throws. A bare `throw new Error("…")` is
26
+ * forbidden in Cogenta: it gives the caller nothing to branch on and the user
27
+ * nothing to act on.
28
+ */
29
+ export declare class CogentaError extends Error {
30
+ readonly code: ErrorCode;
31
+ readonly hint: string | undefined;
32
+ readonly details: Readonly<Record<string, unknown>> | undefined;
33
+ constructor(options: CogentaErrorOptions);
34
+ /** Structured form for logging. The stack is deliberately left out. */
35
+ toJSON(): SerialisedCogentaError;
36
+ }
37
+ export declare function isCogentaError(value: unknown): value is CogentaError;
38
+ //# sourceMappingURL=cogenta-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cogenta-error.d.ts","sourceRoot":"","sources":["../../src/errors/cogenta-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CACrD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;CAChE;AAED;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IAE/D,YAAY,OAAO,EAAE,mBAAmB,EAMvC;IAED,uEAAuE;IACvE,MAAM,IAAI,sBAAsB,CAQ/B;CACF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The only error class library code throws. A bare `throw new Error("…")` is
3
+ * forbidden in Cogenta: it gives the caller nothing to branch on and the user
4
+ * nothing to act on.
5
+ */
6
+ export class CogentaError extends Error {
7
+ code;
8
+ hint;
9
+ details;
10
+ constructor(options) {
11
+ super(options.message, options.cause === undefined ? undefined : { cause: options.cause });
12
+ this.name = 'CogentaError';
13
+ this.code = options.code;
14
+ this.hint = options.hint;
15
+ this.details = options.details;
16
+ }
17
+ /** Structured form for logging. The stack is deliberately left out. */
18
+ toJSON() {
19
+ return {
20
+ name: 'CogentaError',
21
+ code: this.code,
22
+ message: this.message,
23
+ hint: this.hint,
24
+ details: this.details,
25
+ };
26
+ }
27
+ }
28
+ export function isCogentaError(value) {
29
+ return value instanceof CogentaError;
30
+ }
31
+ //# sourceMappingURL=cogenta-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cogenta-error.js","sourceRoot":"","sources":["../../src/errors/cogenta-error.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAW;IACf,IAAI,CAAoB;IACxB,OAAO,CAA+C;IAE/D,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QAC1F,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAChC,CAAC;IAED,uEAAuE;IACvE,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAA;IACH,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAA;AACtC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { ErrorCode } from './codes.js';
2
+ export { ERROR_CODES } from './codes.js';
3
+ export type { CogentaErrorOptions, SerialisedCogentaError } from './cogenta-error.js';
4
+ export { CogentaError, isCogentaError } from './cogenta-error.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,YAAY,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AACrF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { ERROR_CODES } from './codes.js';
2
+ export { CogentaError, isCogentaError } from './cogenta-error.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
package/dist/id.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare function newId(now?: () => number): string;
2
+ export declare function isUuidV7(value: string): boolean;
3
+ /** The millisecond an id was minted, readable without a database round-trip. */
4
+ export declare function timestampOf(id: string): number;
5
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAkCA,wBAAgB,KAAK,CAAC,GAAG,GAAE,MAAM,MAAiB,GAAG,MAAM,CAoC1D;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9C"}
package/dist/id.js ADDED
@@ -0,0 +1,82 @@
1
+ import { randomFillSync } from 'node:crypto';
2
+ /**
3
+ * UUIDv7 generation, per ADR-0015: every content id is minted by the
4
+ * application, never by the database.
5
+ *
6
+ * Node exposes `randomUUID`, which is v4 only — there is no v7 in the standard
7
+ * library as of Node 24 — so the layout below is written out by hand against
8
+ * RFC 9562 §5.7 rather than pulling in a dependency for sixteen bytes (rule R9).
9
+ *
10
+ * 0..5 unix timestamp in milliseconds, big-endian, 48 bits
11
+ * 6..7 version (7) in the high nibble, then a 12-bit sequence counter
12
+ * 8 variant (0b10) in the two high bits, then 6 random bits
13
+ * 9..15 random, 56 bits
14
+ *
15
+ * v4 is not an option here: random ids fragment a B-tree index on insert, and
16
+ * the write cost grows with the table. v7 sorts by creation time, so new rows
17
+ * land at the end of the index.
18
+ */
19
+ const MAX_SEQUENCE = 0xfff;
20
+ /**
21
+ * Ids minted inside the same millisecond stay ordered because the 12-bit
22
+ * `rand_a` field is used as a counter (RFC 9562 §6.2, "monotonic random"
23
+ * method 1). Without it, two rows created in the same tick sort at random —
24
+ * which breaks pagination by id, the very reason for choosing v7.
25
+ */
26
+ let lastTimestamp = -1;
27
+ let sequence = 0;
28
+ /** Random bytes for the low 62 bits. Refilled per call, never reused. */
29
+ const randomBytes = new Uint8Array(8);
30
+ export function newId(now = Date.now) {
31
+ const timestamp = now();
32
+ if (timestamp === lastTimestamp) {
33
+ sequence += 1;
34
+ if (sequence > MAX_SEQUENCE) {
35
+ // More than 4096 ids in one millisecond: borrow from the next one rather
36
+ // than emit a duplicate. Time-ordering is preserved, the clock is not.
37
+ lastTimestamp += 1;
38
+ sequence = 0;
39
+ }
40
+ }
41
+ else {
42
+ // A clock that steps backwards must not produce ids that sort before rows
43
+ // already written, so the last timestamp only ever moves forward.
44
+ lastTimestamp = timestamp > lastTimestamp ? timestamp : lastTimestamp + 1;
45
+ sequence = 0;
46
+ }
47
+ randomFillSync(randomBytes);
48
+ const bytes = new Uint8Array(16);
49
+ const millis = lastTimestamp;
50
+ bytes[0] = Math.floor(millis / 2 ** 40) & 0xff;
51
+ bytes[1] = Math.floor(millis / 2 ** 32) & 0xff;
52
+ bytes[2] = Math.floor(millis / 2 ** 24) & 0xff;
53
+ bytes[3] = Math.floor(millis / 2 ** 16) & 0xff;
54
+ bytes[4] = Math.floor(millis / 2 ** 8) & 0xff;
55
+ bytes[5] = millis & 0xff;
56
+ bytes[6] = 0x70 | ((sequence >>> 8) & 0x0f);
57
+ bytes[7] = sequence & 0xff;
58
+ bytes[8] = 0x80 | ((randomBytes[0] ?? 0) & 0x3f);
59
+ for (let index = 9; index < 16; index += 1) {
60
+ bytes[index] = randomBytes[index - 8] ?? 0;
61
+ }
62
+ return formatUuid(bytes);
63
+ }
64
+ const HEX = Array.from({ length: 256 }, (_, byte) => byte.toString(16).padStart(2, '0'));
65
+ function formatUuid(bytes) {
66
+ let text = '';
67
+ for (let index = 0; index < 16; index += 1) {
68
+ if (index === 4 || index === 6 || index === 8 || index === 10)
69
+ text += '-';
70
+ text += HEX[bytes[index] ?? 0];
71
+ }
72
+ return text;
73
+ }
74
+ const UUID_V7_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
75
+ export function isUuidV7(value) {
76
+ return UUID_V7_PATTERN.test(value);
77
+ }
78
+ /** The millisecond an id was minted, readable without a database round-trip. */
79
+ export function timestampOf(id) {
80
+ return Number.parseInt(id.slice(0, 8) + id.slice(9, 13), 16);
81
+ }
82
+ //# sourceMappingURL=id.js.map
package/dist/id.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,YAAY,GAAG,KAAK,CAAA;AAE1B;;;;;GAKG;AACH,IAAI,aAAa,GAAG,CAAC,CAAC,CAAA;AACtB,IAAI,QAAQ,GAAG,CAAC,CAAA;AAEhB,yEAAyE;AACzE,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;AAErC,MAAM,UAAU,KAAK,CAAC,GAAG,GAAiB,IAAI,CAAC,GAAG;IAChD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAA;IAEvB,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;QAChC,QAAQ,IAAI,CAAC,CAAA;QACb,IAAI,QAAQ,GAAG,YAAY,EAAE,CAAC;YAC5B,yEAAyE;YACzE,uEAAuE;YACvE,aAAa,IAAI,CAAC,CAAA;YAClB,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,0EAA0E;QAC1E,kEAAkE;QAClE,aAAa,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAA;QACzE,QAAQ,GAAG,CAAC,CAAA;IACd,CAAC;IAED,cAAc,CAAC,WAAW,CAAC,CAAA;IAE3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,aAAa,CAAA;IAC5B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IAC9C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IAC9C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IAC9C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IAC9C,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;IAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAA;IACxB,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC3C,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAChD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,GAAG,GAAsB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CACrE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CACnC,CAAA;AAED,SAAS,UAAU,CAAC,KAAiB;IACnC,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE;YAAE,IAAI,IAAI,GAAG,CAAA;QAC1E,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,eAAe,GAAG,uEAAuE,CAAA;AAE/F,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACpC,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,12 @@
1
+ export * from './cache/index.js';
2
+ export * from './config/index.js';
3
+ export * from './db/index.js';
4
+ export * from './drivers/index.js';
5
+ export * from './errors/index.js';
6
+ export * from './id.js';
7
+ export * from './logger/index.js';
8
+ export * from './media/index.js';
9
+ export * from './migrations/index.js';
10
+ export * from './queue/index.js';
11
+ export * from './storage/index.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export * from './cache/index.js';
2
+ export * from './config/index.js';
3
+ export * from './db/index.js';
4
+ export * from './drivers/index.js';
5
+ export * from './errors/index.js';
6
+ export * from './id.js';
7
+ export * from './logger/index.js';
8
+ export * from './media/index.js';
9
+ export * from './migrations/index.js';
10
+ export * from './queue/index.js';
11
+ export * from './storage/index.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ export { createLogger } from './logger.js';
2
+ export { REDACTED, redact } from './redact.js';
3
+ export type { EmittedLogLevel, LogDestination, LogFields, Logger, LoggerOptions, LogLevel, LogRecord, } from './types.js';
4
+ export { LOG_LEVELS } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,4 @@
1
+ export { createLogger } from './logger.js';
2
+ export { REDACTED, redact } from './redact.js';
3
+ export { LOG_LEVELS } from './types.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,10 @@
1
+ import type { Logger, LoggerOptions } from './types.js';
2
+ /**
3
+ * Structured NDJSON logger. One JSON object per line, never free text: logs are
4
+ * read by machines first and humans second.
5
+ *
6
+ * Every record passes through redaction, so a secret that slipped into a field
7
+ * does not reach the output (rule R7).
8
+ */
9
+ export declare function createLogger(options?: LoggerOptions): Logger;
10
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIV,MAAM,EACN,aAAa,EAEd,MAAM,YAAY,CAAA;AA4DnB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkDhE"}
@@ -0,0 +1,108 @@
1
+ import process from 'node:process';
2
+ import { isCogentaError } from '../errors/index.js';
3
+ import { redact } from './redact.js';
4
+ const SEVERITY = {
5
+ debug: 10,
6
+ info: 20,
7
+ warn: 30,
8
+ error: 40,
9
+ silent: Number.POSITIVE_INFINITY,
10
+ };
11
+ /** Reserved by the record structure: a field may never overwrite one of these. */
12
+ const RESERVED = new Set(['time', 'level', 'msg']);
13
+ const writeToStdout = (line) => {
14
+ process.stdout.write(line);
15
+ };
16
+ /**
17
+ * `Error` has non-enumerable properties, so `JSON.stringify` renders it as `{}`.
18
+ * Losing the one field that explains a failure is the classic structured-logging
19
+ * bug; unpack it explicitly instead.
20
+ */
21
+ function serialiseError(value) {
22
+ if (isCogentaError(value))
23
+ return { ...value.toJSON() };
24
+ const serialised = { name: value.name, message: value.message };
25
+ if (value.cause !== undefined) {
26
+ serialised['cause'] = value.cause instanceof Error ? serialiseError(value.cause) : value.cause;
27
+ }
28
+ return serialised;
29
+ }
30
+ function expandErrors(fields) {
31
+ const output = {};
32
+ for (const [key, value] of Object.entries(fields)) {
33
+ output[key] = value instanceof Error ? serialiseError(value) : value;
34
+ }
35
+ return output;
36
+ }
37
+ /**
38
+ * Last line of defence. A logger that throws takes the caller down with it, and
39
+ * an unserialisable field is never worth an outage — drop the field, keep the
40
+ * record, say so.
41
+ */
42
+ function stringify(record) {
43
+ try {
44
+ return JSON.stringify(record, (_key, value) => typeof value === 'bigint' ? value.toString() : value);
45
+ }
46
+ catch {
47
+ return JSON.stringify({
48
+ time: record['time'],
49
+ level: record['level'],
50
+ msg: record['msg'],
51
+ logError: 'fields could not be serialised and were dropped',
52
+ });
53
+ }
54
+ }
55
+ /**
56
+ * Structured NDJSON logger. One JSON object per line, never free text: logs are
57
+ * read by machines first and humans second.
58
+ *
59
+ * Every record passes through redaction, so a secret that slipped into a field
60
+ * does not reach the output (rule R7).
61
+ */
62
+ export function createLogger(options = {}) {
63
+ const level = options.level ?? 'info';
64
+ const destination = options.destination ?? writeToStdout;
65
+ const clock = options.clock ?? (() => new Date());
66
+ const bindings = redact(options.bindings ?? {});
67
+ const threshold = SEVERITY[level];
68
+ function emit(recordLevel, message, fields) {
69
+ if (SEVERITY[recordLevel] < threshold)
70
+ return;
71
+ const safe = fields === undefined ? {} : redact(expandErrors(fields));
72
+ const record = { ...bindings };
73
+ for (const [key, value] of Object.entries(safe)) {
74
+ if (!RESERVED.has(key))
75
+ record[key] = value;
76
+ }
77
+ record['time'] = clock().toISOString();
78
+ record['level'] = recordLevel;
79
+ record['msg'] = message;
80
+ destination(`${stringify(record)}\n`);
81
+ }
82
+ return {
83
+ level,
84
+ debug: (message, fields) => {
85
+ emit('debug', message, fields);
86
+ },
87
+ info: (message, fields) => {
88
+ emit('info', message, fields);
89
+ },
90
+ warn: (message, fields) => {
91
+ emit('warn', message, fields);
92
+ },
93
+ error: (message, fields) => {
94
+ emit('error', message, fields);
95
+ },
96
+ child: (childBindings) => createLogger({
97
+ ...options,
98
+ level,
99
+ destination,
100
+ clock,
101
+ bindings: { ...bindings, ...redact(childBindings) },
102
+ }),
103
+ isLevelEnabled: (candidate) => candidate !== 'silent' &&
104
+ SEVERITY[candidate] >= threshold &&
105
+ threshold !== Number.POSITIVE_INFINITY,
106
+ };
107
+ }
108
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** What replaces a redacted value. Constant so tests and readers can match on it. */
2
+ export declare const REDACTED = "[redacted]";
3
+ /**
4
+ * Returns a copy of `fields` with credentials removed — by field name, by value
5
+ * shape, and inside connection strings.
6
+ *
7
+ * This is belt and braces on top of rule R7: secrets are not supposed to reach a
8
+ * log call in the first place. Defence in depth is warranted because a leaked
9
+ * key in a log file is discovered late, by someone else, and costs a rotation.
10
+ */
11
+ export declare function redact<T extends Record<string, unknown>>(fields: T): Record<string, unknown>;
12
+ //# sourceMappingURL=redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/logger/redact.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,eAAO,MAAM,QAAQ,eAAe,CAAA;AAuFpC;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE5F"}