@cyanautomation/kaseki-agent 1.53.4 → 1.54.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.
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-service.d.ts","sourceRoot":"","sources":["../src/kaseki-api-service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACzH,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAG3G,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,CAAC;AAEjE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,uBAExD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAGzD"}
1
+ {"version":3,"file":"kaseki-api-service.d.ts","sourceRoot":"","sources":["../src/kaseki-api-service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAmB,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACzH,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAU3G,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,CAAC;AAEjE;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,uBAExD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAGzD"}
@@ -9,6 +9,7 @@ import { generateOpenAPISpec } from './openapi-spec-generator.js';
9
9
  import { initializeSetup, assertSupportedNodeVersion, ensureTemplateInitialized } from './kaseki-api/setup-orchestrator.js';
10
10
  import { bootstrapServices, gracefulShutdown } from './kaseki-api/service-bootstrapper.js';
11
11
  import { ContainerPreflightDiagnostics, logContainerPreflightResults } from './startup/container-preflight.js';
12
+ import { initSentry, sentryRequestHandler, sentryErrorHandler, captureException, flushSentry, } from './sentry-integration.js';
12
13
  export { assertSupportedNodeVersion, ensureTemplateInitialized };
13
14
  /**
14
15
  * Legacy wrapper for gracefulShutdown to maintain backwards compatibility
@@ -25,6 +26,12 @@ export function ensureResultsDir(resultsDir) {
25
26
  */
26
27
  async function main() {
27
28
  const logger = createEventLogger('kaseki-api');
29
+ // Initialize Sentry for error tracking and monitoring
30
+ initSentry();
31
+ logger.debug('Sentry initialized', {
32
+ enabled: process.env.SENTRY_DSN ? 'true' : 'false',
33
+ environment: process.env.SENTRY_ENVIRONMENT || 'development',
34
+ });
28
35
  // Phase 3: Auto-initialize setup (Node version and template directory)
29
36
  const templateDir = process.env.KASEKI_TEMPLATE_DIR || '/agents/kaseki-template';
30
37
  await initializeSetup(templateDir);
@@ -88,6 +95,8 @@ async function main() {
88
95
  // Create Express app
89
96
  const app = express();
90
97
  app.use(express.json());
98
+ // Mount Sentry request handler to track incoming requests
99
+ app.use(sentryRequestHandler());
91
100
  // Generate OpenAPI specification
92
101
  const openApiSpec = generateOpenAPISpec();
93
102
  // Mount Swagger UI documentation
@@ -105,6 +114,8 @@ async function main() {
105
114
  const apiRouter = createApiRouter(scheduler, config, idempotencyStore, preFlightValidator, artifactCache);
106
115
  app.use('/api', apiRouter);
107
116
  app.use('/', apiRouter);
117
+ // Mount Sentry error handler to capture errors in routes and middleware
118
+ app.use(sentryErrorHandler());
108
119
  // Start server
109
120
  const onListening = () => {
110
121
  const displayHost = config.host || 'localhost';
@@ -125,16 +136,22 @@ async function main() {
125
136
  ? app.listen(config.port, config.host, onListening)
126
137
  : app.listen(config.port, onListening);
127
138
  // Graceful shutdown
128
- const shutdown = () => gracefulShutdown({ server, scheduler, webhookManager, idempotencyStore });
139
+ const shutdown = async () => {
140
+ await gracefulShutdown({ server, scheduler, webhookManager, idempotencyStore });
141
+ // Flush any pending Sentry events before process exit
142
+ await flushSentry(2000);
143
+ };
129
144
  process.on('SIGTERM', () => void shutdown());
130
145
  process.on('SIGINT', () => void shutdown());
131
146
  // Catch unhandled errors
132
147
  process.on('uncaughtException', (err) => {
133
148
  logger.error('Uncaught exception:', { error: String(err), stack: err instanceof Error ? err.stack : undefined });
149
+ captureException(err, { type: 'uncaughtException' });
134
150
  process.exit(1);
135
151
  });
136
152
  process.on('unhandledRejection', (reason) => {
137
153
  logger.error('Unhandled rejection:', { reason: String(reason) });
154
+ captureException(reason, { type: 'unhandledRejection' });
138
155
  process.exit(1);
139
156
  });
140
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-service.js","sourceRoot":"","sources":["../src/kaseki-api-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kaseki-api-service.js","sourceRoot":"","sources":["../src/kaseki-api-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-web.d.ts","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAy+BjC,wBAAgB,eAAe,IAAI,MAAM,CAQxC"}
1
+ {"version":3,"file":"kaseki-api-web.d.ts","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAsqCjC,wBAAgB,eAAe,IAAI,MAAM,CAQxC"}
@@ -5,18 +5,40 @@ const controllerPage = String.raw `<!doctype html>
5
5
  <meta charset="utf-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1">
7
7
  <title>Kaseki Task Console</title>
8
+ <link rel="preconnect" href="https://fonts.googleapis.com">
9
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
10
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;700&display=swap">
8
11
  <style>
9
12
  :root {
10
- color-scheme: light;
11
- --bg: #f4f1ea;
12
- --panel: #fffdf8;
13
- --ink: #1e2628;
14
- --muted: #566568;
15
- --line: #cbd4cf;
16
- --focus: #146b6d;
17
- --accent: #b84b2d;
18
- --ok: #0c6951;
19
- --bad: #a6332a;
13
+ color-scheme: dark;
14
+
15
+ /* Surfaces — tonal layering, no drop shadows */
16
+ --bg: #10141a;
17
+ --surface-low: #181c22;
18
+ --surface: #1c2026;
19
+ --surface-high: #262a31;
20
+ --surface-highest: #31353c;
21
+
22
+ /* Text */
23
+ --ink: #dfe2eb;
24
+ --muted: #bac9cc;
25
+
26
+ /* Borders */
27
+ --line: #3b494c;
28
+ --line-strong: #849396;
29
+
30
+ /* Cyan — primary action */
31
+ --focus: #00daf3;
32
+ --focus-bright: #00e5ff;
33
+ --focus-text: #c3f5ff;
34
+
35
+ /* Status */
36
+ --ok: #2ff801;
37
+ --ok-text: #d7ffc5;
38
+ --bad: #ffb4ab;
39
+ --bad-bg: #93000a;
40
+
41
+ /* Spacing */
20
42
  --space-1: 8px;
21
43
  --space-2: 12px;
22
44
  --space-3: 16px;
@@ -24,16 +46,20 @@ const controllerPage = String.raw `<!doctype html>
24
46
  --control-gap: var(--space-2);
25
47
  --control-min-height: 42px;
26
48
  --control-pad: var(--space-2) var(--space-3);
49
+
50
+ /* Fonts */
51
+ --font-ui: 'Hanken Grotesk', system-ui, sans-serif;
52
+ --font-mono: 'JetBrains Mono', 'Courier New', monospace;
27
53
  }
28
54
  * { box-sizing: border-box; letter-spacing: 0; }
29
55
  body {
30
56
  margin: 0;
31
57
  background: var(--bg);
32
58
  color: var(--ink);
33
- font: 16px/1.5 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
59
+ font: 16px/1.5 var(--font-ui);
34
60
  }
35
61
  .header-bar {
36
- background: var(--panel);
62
+ background: var(--surface-low);
37
63
  border-bottom: 1px solid var(--line);
38
64
  padding: var(--space-3) var(--space-3);
39
65
  display: flex;
@@ -43,8 +69,12 @@ const controllerPage = String.raw `<!doctype html>
43
69
  }
44
70
  .header-bar h1 {
45
71
  margin: 0;
46
- font-size: clamp(24px, 4vw, 32px);
47
- line-height: 1.2;
72
+ font-size: clamp(18px, 3vw, 24px);
73
+ font-family: var(--font-ui);
74
+ font-weight: 700;
75
+ letter-spacing: -0.02em;
76
+ line-height: 1.3;
77
+ color: var(--focus-text);
48
78
  }
49
79
  .header-bar-title {
50
80
  display: flex;
@@ -55,9 +85,21 @@ const controllerPage = String.raw `<!doctype html>
55
85
  min-width: 200px;
56
86
  max-width: 300px;
57
87
  width: auto;
58
- padding: 10px 11px;
88
+ background: var(--surface-highest);
89
+ border: none;
90
+ border-bottom: 1px solid var(--line-strong);
91
+ border-radius: 4px 4px 0 0;
92
+ color: var(--ink);
93
+ font-family: var(--font-ui);
59
94
  font-size: 14px;
95
+ padding: 10px 11px;
96
+ min-height: var(--control-min-height);
60
97
  }
98
+ .header-token-input:focus {
99
+ outline: none;
100
+ border-bottom: 2px solid var(--focus);
101
+ }
102
+ .header-token-input::placeholder { color: var(--muted); }
61
103
  @media (max-width: 767px) {
62
104
  .header-token-input {
63
105
  min-width: 160px;
@@ -67,26 +109,47 @@ const controllerPage = String.raw `<!doctype html>
67
109
  .status-indicator {
68
110
  display: inline-flex;
69
111
  align-items: center;
70
- justify-content: center;
71
- width: 12px;
72
- height: 12px;
112
+ gap: 5px;
113
+ padding: 2px 8px;
114
+ border-radius: 9999px;
115
+ font-family: var(--font-mono);
116
+ font-size: 11px;
117
+ font-weight: 700;
118
+ letter-spacing: 0.05em;
119
+ text-transform: uppercase;
120
+ background: color-mix(in srgb, var(--muted) 15%, transparent);
121
+ color: var(--muted);
122
+ flex-shrink: 0;
123
+ }
124
+ .status-indicator::before {
125
+ content: '';
126
+ display: inline-block;
127
+ width: 6px;
128
+ height: 6px;
73
129
  border-radius: 50%;
74
- background: var(--muted);
130
+ background: currentColor;
75
131
  flex-shrink: 0;
76
132
  }
133
+ .status-indicator::after { content: 'Idle'; }
77
134
  .status-indicator.running {
78
- background: #e8b923;
79
- animation: pulse 1s ease-in-out infinite;
135
+ background: color-mix(in srgb, var(--focus) 15%, transparent);
136
+ color: var(--focus-bright);
80
137
  }
138
+ .status-indicator.running::after { content: 'Running'; }
139
+ .status-indicator.running::before { animation: pulse 1s ease-in-out infinite; }
81
140
  .status-indicator.completed {
82
- background: var(--ok);
141
+ background: color-mix(in srgb, var(--ok) 15%, transparent);
142
+ color: var(--ok);
83
143
  }
144
+ .status-indicator.completed::after { content: 'Done'; }
84
145
  .status-indicator.failed {
85
- background: var(--bad);
146
+ background: color-mix(in srgb, var(--bad) 20%, transparent);
147
+ color: var(--bad);
86
148
  }
149
+ .status-indicator.failed::after { content: 'Failed'; }
87
150
  @keyframes pulse {
88
151
  0%, 100% { opacity: 1; }
89
- 50% { opacity: 0.6; }
152
+ 50% { opacity: 0.4; }
90
153
  }
91
154
  main {
92
155
  display: grid;
@@ -97,12 +160,18 @@ const controllerPage = String.raw `<!doctype html>
97
160
  padding: var(--space-3);
98
161
  }
99
162
  h1, h2 { margin: 0; }
100
- h2 { font-size: clamp(20px, 2.2vw, 24px); line-height: 1.2; }
101
- p { color: var(--muted); font-size: 16px; line-height: 1.5; margin: var(--space-1) 0 0; }
163
+ h2 {
164
+ font-family: var(--font-ui);
165
+ font-size: clamp(17px, 2.2vw, 20px);
166
+ font-weight: 600;
167
+ line-height: 1.4;
168
+ color: var(--ink);
169
+ }
170
+ p { color: var(--muted); font-size: 14px; line-height: 1.5; margin: var(--space-1) 0 0; }
102
171
  .panel {
103
- background: var(--panel);
172
+ background: var(--surface-low);
104
173
  border: 1px solid var(--line);
105
- border-radius: 8px;
174
+ border-radius: 4px;
106
175
  padding: var(--space-4);
107
176
  }
108
177
  header, form, .stack, fieldset { display: grid; gap: var(--space-3); }
@@ -110,32 +179,58 @@ const controllerPage = String.raw `<!doctype html>
110
179
  section.panel { display: grid; gap: var(--space-3); }
111
180
  fieldset {
112
181
  border: 1px solid var(--line);
113
- border-radius: 8px;
182
+ border-radius: 4px;
114
183
  margin: 0;
115
184
  padding: var(--space-3);
116
185
  }
117
- legend { font-weight: 650; padding: 0 var(--space-1); }
186
+ legend {
187
+ font-family: var(--font-mono);
188
+ font-size: 11px;
189
+ font-weight: 700;
190
+ letter-spacing: 0.05em;
191
+ text-transform: uppercase;
192
+ color: var(--muted);
193
+ padding: 0 var(--space-1);
194
+ }
118
195
  .form-fields { display: grid; gap: var(--space-3); }
119
196
  .form-field { display: grid; gap: var(--space-1); }
120
- .form-field > label { font-size: 14px; font-weight: 650; line-height: 1.35; }
121
- .field-helper { color: var(--muted); font-size: 14px; line-height: 1.5; }
122
- .field-error { color: var(--bad); font-size: 14px; line-height: 1.4; min-height: 1em; }
197
+ .form-field > label {
198
+ font-family: var(--font-mono);
199
+ font-size: 11px;
200
+ font-weight: 700;
201
+ letter-spacing: 0.05em;
202
+ text-transform: uppercase;
203
+ color: var(--muted);
204
+ line-height: 1.35;
205
+ }
206
+ .field-helper { color: var(--muted); font-family: var(--font-ui); font-size: 13px; line-height: 1.5; }
207
+ .field-error { color: var(--bad); font-family: var(--font-ui); font-size: 13px; line-height: 1.4; min-height: 1em; }
123
208
  input, textarea, select, button {
124
- border: 1px solid #99aaa5;
125
- border-radius: 6px;
209
+ box-sizing: border-box;
126
210
  color: inherit;
127
211
  font: inherit;
128
212
  }
129
213
  input, textarea, select {
130
- background: #fff;
214
+ background: var(--surface-highest);
215
+ border: none;
216
+ border-bottom: 1px solid var(--line-strong);
217
+ border-radius: 4px 4px 0 0;
218
+ color: var(--ink);
219
+ font-family: var(--font-ui);
220
+ font-size: 14px;
131
221
  min-height: var(--control-min-height);
132
222
  padding: 10px 11px;
133
223
  width: 100%;
134
224
  }
225
+ input::placeholder, textarea::placeholder { color: var(--muted); }
135
226
  textarea { min-height: 140px; resize: vertical; }
136
- input:focus, textarea:focus, select:focus, button:focus {
137
- outline: 3px solid color-mix(in srgb, var(--focus) 35%, transparent);
138
- outline-offset: 1px;
227
+ input:focus, textarea:focus, select:focus {
228
+ outline: none;
229
+ border-bottom: 2px solid var(--focus);
230
+ }
231
+ button:focus {
232
+ outline: 2px solid var(--focus);
233
+ outline-offset: 2px;
139
234
  }
140
235
  .grid, .checks, .action-row, .run-status, .summary-grid, .link-grid { display: grid; gap: var(--control-gap); }
141
236
  .grid, .checks, .action-row, .run-status, .summary-grid, .link-grid { grid-template-columns: minmax(0, 1fr); }
@@ -157,22 +252,35 @@ const controllerPage = String.raw `<!doctype html>
157
252
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
158
253
  }
159
254
  .summary-card {
160
- background: #f7faf8;
255
+ background: var(--surface);
161
256
  border: 1px solid var(--line);
162
- border-radius: 8px;
257
+ border-radius: 4px;
163
258
  display: grid;
164
259
  gap: 4px;
165
260
  min-height: 76px;
166
261
  padding: var(--space-2);
167
262
  }
168
- .summary-label { color: var(--muted); font-size: 13px; font-weight: 650; }
169
- .summary-value { color: var(--ink); font-size: 18px; font-weight: 700; overflow-wrap: anywhere; }
263
+ .summary-label {
264
+ color: var(--muted);
265
+ font-family: var(--font-mono);
266
+ font-size: 11px;
267
+ font-weight: 700;
268
+ letter-spacing: 0.05em;
269
+ text-transform: uppercase;
270
+ }
271
+ .summary-value {
272
+ color: var(--ink);
273
+ font-family: var(--font-mono);
274
+ font-size: 16px;
275
+ font-weight: 700;
276
+ overflow-wrap: anywhere;
277
+ }
170
278
  .summary-value.ok { color: var(--ok); }
171
279
  .summary-value.bad { color: var(--bad); }
172
280
  .run-links {
173
- background: #f7faf8;
281
+ background: var(--surface);
174
282
  border: 1px solid var(--line);
175
- border-radius: 8px;
283
+ border-radius: 4px;
176
284
  display: grid;
177
285
  gap: var(--space-2);
178
286
  padding: var(--space-3);
@@ -181,46 +289,94 @@ const controllerPage = String.raw `<!doctype html>
181
289
  .link-grid { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
182
290
  .link-grid a {
183
291
  align-items: center;
184
- background: #eef2ee;
185
- border: 1px solid #99aaa5;
186
- border-radius: 6px;
292
+ background: transparent;
293
+ border: 1px solid var(--line);
294
+ border-radius: 4px;
187
295
  color: var(--ink);
188
296
  display: inline-flex;
189
- font-weight: 650;
297
+ font-family: var(--font-ui);
298
+ font-weight: 600;
190
299
  justify-content: center;
191
300
  min-height: var(--control-min-height);
192
301
  padding: var(--control-pad);
193
302
  text-decoration: none;
303
+ transition: border-color 0.15s, color 0.15s;
304
+ }
305
+ .link-grid a:hover {
306
+ border-color: var(--focus);
307
+ color: var(--focus-text);
308
+ }
309
+ .panel-section-label {
310
+ display: block;
311
+ font-family: var(--font-mono);
312
+ font-size: 11px;
313
+ font-weight: 700;
314
+ letter-spacing: 0.05em;
315
+ text-transform: uppercase;
316
+ color: var(--muted);
194
317
  }
195
318
  button {
196
- background: var(--ink);
197
- color: #fff;
319
+ background: transparent;
320
+ border: 1px solid var(--line);
321
+ border-radius: 4px;
322
+ color: var(--ink);
198
323
  cursor: pointer;
324
+ font-family: var(--font-ui);
325
+ font-size: 14px;
326
+ font-weight: 600;
199
327
  min-height: var(--control-min-height);
200
328
  padding: var(--control-pad);
329
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
330
+ }
331
+ button:hover:not(:disabled) {
332
+ border-color: var(--focus);
333
+ color: var(--focus-text);
334
+ }
335
+ button.secondary {
336
+ background: transparent;
337
+ color: var(--ink);
338
+ border-color: var(--line);
339
+ }
340
+ button.secondary:hover:not(:disabled) {
341
+ border-color: var(--focus);
342
+ color: var(--focus-text);
343
+ }
344
+ button.run {
345
+ background: var(--focus-bright);
346
+ border-color: var(--focus-bright);
347
+ color: #00363d;
348
+ font-weight: 700;
201
349
  }
202
- button.secondary { background: #eef2ee; color: var(--ink); }
203
- button.run { background: var(--accent); }
204
- button:disabled { cursor: wait; opacity: .65; }
350
+ button.run:hover:not(:disabled) {
351
+ background: var(--focus-text);
352
+ border-color: var(--focus-text);
353
+ color: #001f24;
354
+ }
355
+ button:disabled { cursor: wait; opacity: .5; }
205
356
  .toolbar-button { white-space: nowrap; }
206
357
  .response-panel {
207
- background: #172022;
208
- border: 1px solid #2e3a3d;
209
- border-radius: 8px;
358
+ background: var(--bg);
359
+ border: 1px solid var(--line);
360
+ border-radius: 4px;
210
361
  display: grid;
211
362
  grid-template-rows: auto auto minmax(0, 1fr);
212
363
  min-height: 300px;
213
364
  overflow: hidden;
214
365
  }
215
366
  .response-meta {
216
- border-bottom: 1px solid #2e3a3d;
217
- color: #b9c8c3;
218
- font-size: 14px;
367
+ border-bottom: 1px solid var(--line);
368
+ color: var(--muted);
369
+ font-family: var(--font-mono);
370
+ font-size: 11px;
371
+ font-weight: 700;
372
+ letter-spacing: 0.05em;
373
+ text-transform: uppercase;
219
374
  margin: 0;
220
375
  padding: var(--space-2) var(--space-3);
221
376
  }
222
377
  .response-summary {
223
- border-bottom: 1px solid #2e3a3d;
378
+ background: var(--surface-low);
379
+ border-bottom: 1px solid var(--line);
224
380
  display: grid;
225
381
  gap: var(--space-2);
226
382
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
@@ -233,19 +389,26 @@ const controllerPage = String.raw `<!doctype html>
233
389
  min-width: 0;
234
390
  }
235
391
  .response-summary-label {
236
- color: #9db0aa;
237
- font-size: 12px;
238
- font-weight: 650;
392
+ color: var(--muted);
393
+ font-family: var(--font-mono);
394
+ font-size: 11px;
395
+ font-weight: 700;
396
+ letter-spacing: 0.05em;
397
+ text-transform: uppercase;
239
398
  }
240
399
  .response-summary-value {
241
- color: #eef7f2;
242
- font-size: 14px;
400
+ color: var(--ink);
401
+ font-family: var(--font-mono);
402
+ font-size: 13px;
243
403
  font-weight: 700;
244
404
  overflow-wrap: anywhere;
245
405
  }
246
406
  .response-log {
247
407
  align-self: start;
248
- color: #e4eee9;
408
+ color: var(--ink);
409
+ font-family: var(--font-mono);
410
+ font-size: 13px;
411
+ line-height: 1.6;
249
412
  margin: 0;
250
413
  min-height: 0;
251
414
  overflow: auto;
@@ -253,8 +416,13 @@ const controllerPage = String.raw `<!doctype html>
253
416
  white-space: pre-wrap;
254
417
  word-break: break-word;
255
418
  }
256
- .response-log.empty { color: #9db0aa; }
257
- #state { color: var(--muted); min-height: 22px; }
419
+ .response-log.empty { color: var(--muted); }
420
+ #state {
421
+ color: var(--muted);
422
+ font-family: var(--font-mono);
423
+ font-size: 12px;
424
+ min-height: 22px;
425
+ }
258
426
  #state.ok { color: var(--ok); }
259
427
  #state.bad { color: var(--bad); }
260
428
  @media (min-width: 768px) {
@@ -275,29 +443,36 @@ const controllerPage = String.raw `<!doctype html>
275
443
  }
276
444
  .tabs-nav {
277
445
  display: flex;
278
- gap: var(--space-2);
279
- border-bottom: 2px solid var(--line);
446
+ gap: 0;
447
+ border-bottom: 1px solid var(--line);
280
448
  margin-bottom: var(--space-3);
281
449
  }
282
450
  .tabs-nav button {
283
451
  background: transparent;
284
452
  border: none;
453
+ border-bottom: 2px solid transparent;
285
454
  color: var(--muted);
286
455
  cursor: pointer;
287
- font-size: 16px;
288
- font-weight: 600;
456
+ font-family: var(--font-mono);
457
+ font-size: 11px;
458
+ font-weight: 700;
459
+ letter-spacing: 0.05em;
460
+ text-transform: uppercase;
289
461
  padding: var(--space-2) var(--space-3);
290
- border-bottom: 3px solid transparent;
291
- margin-bottom: -2px;
292
- transition: color 0.2s, border-color 0.2s;
462
+ margin-bottom: -1px;
463
+ min-height: auto;
464
+ transition: color 0.15s, border-color 0.15s;
465
+ }
466
+ .tabs-nav button:hover:not(:disabled) {
467
+ color: var(--ink);
468
+ border-color: transparent;
293
469
  }
294
- .tabs-nav button:hover { color: var(--ink); }
295
470
  .tabs-nav button.active {
296
- color: var(--focus);
471
+ color: var(--focus-text);
297
472
  border-bottom-color: var(--focus);
298
473
  }
299
474
  .tabs-nav button:focus {
300
- outline: 3px solid color-mix(in srgb, var(--focus) 35%, transparent);
475
+ outline: 2px solid var(--focus);
301
476
  outline-offset: 2px;
302
477
  }
303
478
  .tab-content {
@@ -311,46 +486,60 @@ const controllerPage = String.raw `<!doctype html>
311
486
  gap: var(--space-3);
312
487
  }
313
488
  .health-check-button {
314
- background: var(--focus);
315
- color: #fff;
489
+ background: var(--surface);
490
+ color: var(--ink);
316
491
  padding: var(--space-3);
317
- border-radius: 8px;
318
- border: none;
492
+ border-radius: 4px;
493
+ border: 1px solid var(--line);
319
494
  cursor: pointer;
495
+ font-family: var(--font-ui);
496
+ font-size: 14px;
320
497
  font-weight: 600;
321
- min-height: 100px;
498
+ min-height: 80px;
322
499
  display: flex;
323
500
  flex-direction: column;
324
501
  align-items: center;
325
502
  justify-content: center;
326
- gap: var(--space-2);
327
- transition: background 0.2s, opacity 0.2s;
503
+ gap: var(--space-1);
504
+ transition: border-color 0.15s, color 0.15s;
505
+ }
506
+ .health-check-button:hover:not(:disabled) {
507
+ border-color: var(--focus);
508
+ color: var(--focus-text);
328
509
  }
329
- .health-check-button:hover:not(:disabled) { background: #1a5d5f; }
330
- .health-check-button:disabled { opacity: 0.65; cursor: wait; }
510
+ .health-check-button:disabled { opacity: 0.5; cursor: wait; }
331
511
  .health-check-button:focus {
332
- outline: 3px solid color-mix(in srgb, var(--focus) 35%, transparent);
512
+ outline: 2px solid var(--focus);
333
513
  outline-offset: 1px;
334
514
  }
515
+ .hc-label {
516
+ font-family: var(--font-mono);
517
+ font-size: 11px;
518
+ font-weight: 700;
519
+ letter-spacing: 0.05em;
520
+ text-transform: uppercase;
521
+ }
335
522
  .health-check-status {
336
523
  display: inline-flex;
337
524
  align-items: center;
338
525
  justify-content: center;
339
- width: 24px;
340
- height: 24px;
341
- font-size: 12px;
526
+ width: 20px;
527
+ height: 20px;
528
+ font-family: var(--font-mono);
529
+ font-size: 13px;
342
530
  }
343
531
  .health-check-status.spinner::after {
344
532
  content: '⟳';
345
533
  display: inline-block;
346
534
  animation: spin 1s linear infinite;
535
+ color: var(--focus);
347
536
  }
348
537
  @keyframes spin {
349
538
  from { transform: rotate(0deg); }
350
539
  to { transform: rotate(360deg); }
351
540
  }
352
- .health-check-status.ok::before { content: '✓'; }
353
- .health-check-status.bad::before { content: '✕'; }
541
+ .health-check-status.ok::before { content: '✓'; color: var(--ok); }
542
+ .health-check-status.bad::before { content: '✕'; color: var(--bad); }
354
543
  @media (max-width: 767px) {
355
544
  .action-row.run-actions > .run { order: 1; }
356
545
  .response-panel { min-height: 40vh; }
@@ -381,10 +570,10 @@ const controllerPage = String.raw `<!doctype html>
381
570
  <p>Run diagnostics to verify the Kaseki API controller is operating correctly.</p>
382
571
  </div>
383
572
  <div class="health-checks-grid">
384
- <button class="health-check-button" data-probe="/health" type="button">Health<span class="health-check-status" data-status="health"></span></button>
385
- <button class="health-check-button" data-probe="/ready" type="button">Readiness<span class="health-check-status" data-status="readiness"></span></button>
386
- <button class="health-check-button" data-probe="/api/preflight" data-auth="true" type="button">Preflight<span class="health-check-status" data-status="preflight"></span></button>
387
- <button class="health-check-button" id="status-check" type="button">Check status<span class="health-check-status" data-status="status"></span></button>
573
+ <button class="health-check-button" data-probe="/health" type="button"><span class="hc-label">Health</span><span class="health-check-status" data-status="health"></span></button>
574
+ <button class="health-check-button" data-probe="/ready" type="button"><span class="hc-label">Readiness</span><span class="health-check-status" data-status="readiness"></span></button>
575
+ <button class="health-check-button" data-probe="/api/preflight" data-auth="true" type="button"><span class="hc-label">Preflight</span><span class="health-check-status" data-status="preflight"></span></button>
576
+ <button class="health-check-button" id="status-check" type="button"><span class="hc-label">Check Status</span><span class="health-check-status" data-status="status"></span></button>
388
577
  </div>
389
578
  <div class="summary-grid" id="health-summary" aria-live="polite">
390
579
  <div class="summary-card">
@@ -409,7 +598,7 @@ const controllerPage = String.raw `<!doctype html>
409
598
  <input id="run-id" placeholder="Filled after a run is submitted">
410
599
  </div>
411
600
  <div class="run-links" id="runs-list-panel">
412
- <strong>Recent runs</strong>
601
+ <strong class="panel-section-label">Recent runs</strong>
413
602
  <div class="action-row controller-actions">
414
603
  <button class="secondary toolbar-button" id="refresh-runs" type="button">Refresh runs</button>
415
604
  </div>
@@ -475,7 +664,7 @@ const controllerPage = String.raw `<!doctype html>
475
664
  <h2 id="responses-heading">Responses</h2>
476
665
  </div>
477
666
  <div class="run-links" id="run-links" hidden>
478
- <strong>Run follow-through</strong>
667
+ <strong class="panel-section-label">Run follow-through</strong>
479
668
  <div class="link-grid">
480
669
  <button class="secondary toolbar-button" data-run-action="status" type="button">Status</button>
481
670
  <button class="secondary toolbar-button" data-run-action="events" type="button">Events</button>
@@ -1000,7 +1189,7 @@ const controllerPage = String.raw `<!doctype html>
1000
1189
  export function createWebRouter() {
1001
1190
  const router = Router();
1002
1191
  router.get(['/', '/ui'], (_req, res) => {
1003
- res.set('Content-Security-Policy', "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; object-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'");
1192
+ res.set('Content-Security-Policy', "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; object-src 'none'; style-src 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; script-src 'unsafe-inline'");
1004
1193
  res.set('Referrer-Policy', 'no-referrer');
1005
1194
  res.type('html').send(controllerPage);
1006
1195
  });
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-web.js","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAq+BhC,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,2JAA2J,CAAC,CAAC;QAChM,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"kaseki-api-web.js","sourceRoot":"","sources":["../src/kaseki-api-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkqChC,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrC,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,4NAA4N,CAAC,CAAC;QACjQ,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Sentry Integration Module
3
+ *
4
+ * Initializes and configures Sentry for error tracking and monitoring
5
+ * of the Kaseki API service.
6
+ *
7
+ * Environment Variables:
8
+ * - SENTRY_DSN: Data Source Name for Sentry (required for integration)
9
+ * - SENTRY_ENVIRONMENT: Environment (development, staging, production)
10
+ * - SENTRY_RELEASE: Release version for tracking (auto-detected if not set)
11
+ * - SENTRY_SAMPLE_RATE: Transaction sample rate (0.0 - 1.0)
12
+ * - SENTRY_ENABLED: Explicitly enable/disable Sentry (default: auto-detect from DSN)
13
+ *
14
+ * Release Detection (in order of precedence):
15
+ * 1. SENTRY_RELEASE environment variable
16
+ * 2. Git describe output (e.g., v1.2.3, v1.2.3-5-g1a2b3c)
17
+ * 3. Package.json version
18
+ */
19
+ import * as Sentry from '@sentry/node';
20
+ import { Request, Response, NextFunction } from 'express';
21
+ interface SentryConfig {
22
+ dsn?: string;
23
+ environment?: string;
24
+ release?: string;
25
+ sampleRate?: number;
26
+ enabled?: boolean;
27
+ }
28
+ /**
29
+ * Initialize Sentry with configuration from environment variables.
30
+ * Can be called multiple times safely - only initializes once.
31
+ *
32
+ * @param customConfig - Optional custom configuration overrides
33
+ */
34
+ export declare function initSentry(customConfig?: Partial<SentryConfig>): void;
35
+ /**
36
+ * Get the Express error handler middleware.
37
+ * Should be mounted after all other middleware and route handlers.
38
+ */
39
+ export declare function sentryErrorHandler(): any;
40
+ /**
41
+ * Legacy function for request handler - no-op since express integration handles it.
42
+ * Kept for compatibility with the API service integration.
43
+ */
44
+ export declare function sentryRequestHandler(): (req: Request, res: Response, next: NextFunction) => void;
45
+ /**
46
+ * Capture an exception with additional context.
47
+ * Useful for errors that don't propagate through Express middleware.
48
+ *
49
+ * @param error - The error to report
50
+ * @param context - Additional context data
51
+ */
52
+ export declare function captureException(error: unknown, context?: Record<string, unknown>): void;
53
+ /**
54
+ * Add a breadcrumb for debugging.
55
+ * Breadcrumbs are automatically captured for HTTP requests and other events.
56
+ *
57
+ * @param message - Breadcrumb message
58
+ * @param category - Breadcrumb category (e.g., 'auth', 'validation', 'database')
59
+ * @param level - Severity level
60
+ * @param data - Additional data
61
+ */
62
+ export declare function addBreadcrumb(message: string, category: string, level?: Sentry.SeverityLevel, data?: Record<string, unknown>): void;
63
+ /**
64
+ * Set user context for error reporting.
65
+ *
66
+ * @param userId - Unique identifier for the user/client
67
+ * @param email - User email (optional)
68
+ * @param username - Username (optional)
69
+ * @param ipAddress - IP address (optional)
70
+ */
71
+ export declare function setUserContext(userId: string, { email, username, ipAddress }?: {
72
+ email?: string;
73
+ username?: string;
74
+ ipAddress?: string;
75
+ }): void;
76
+ /**
77
+ * Clear user context (e.g., on logout).
78
+ */
79
+ export declare function clearUserContext(): void;
80
+ /**
81
+ * Set tags for error context and filtering.
82
+ * Tags are indexed and can be used for filtering in the Sentry dashboard.
83
+ *
84
+ * @param tags - Object with tag key-value pairs
85
+ */
86
+ export declare function setTags(tags: Record<string, string>): void;
87
+ /**
88
+ * Set extra context data.
89
+ * Extra data is not indexed and should be used for large data objects.
90
+ *
91
+ * @param context - Object with context data
92
+ */
93
+ export declare function setExtraContext(context: Record<string, unknown>): void;
94
+ /**
95
+ * Flush pending events to Sentry.
96
+ * Should be called during graceful shutdown to ensure all events are sent.
97
+ *
98
+ * @param timeoutMs - Timeout in milliseconds (default: 2000)
99
+ * @returns Promise that resolves when events are flushed or timeout occurs
100
+ */
101
+ export declare function flushSentry(timeoutMs?: number): Promise<boolean>;
102
+ /**
103
+ * Check if Sentry is initialized and enabled.
104
+ */
105
+ export declare function isSentryEnabled(): boolean;
106
+ export {};
107
+ //# sourceMappingURL=sentry-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-integration.d.ts","sourceRoot":"","sources":["../src/sentry-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAsDD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CA8CrE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,GAAG,CAExC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAEhG;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAaxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAM,CAAC,aAAsB,EACpC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI,CAWN;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7F,IAAI,CAWN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAMvC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAQ1D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQtE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAM5E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Sentry Integration Module
3
+ *
4
+ * Initializes and configures Sentry for error tracking and monitoring
5
+ * of the Kaseki API service.
6
+ *
7
+ * Environment Variables:
8
+ * - SENTRY_DSN: Data Source Name for Sentry (required for integration)
9
+ * - SENTRY_ENVIRONMENT: Environment (development, staging, production)
10
+ * - SENTRY_RELEASE: Release version for tracking (auto-detected if not set)
11
+ * - SENTRY_SAMPLE_RATE: Transaction sample rate (0.0 - 1.0)
12
+ * - SENTRY_ENABLED: Explicitly enable/disable Sentry (default: auto-detect from DSN)
13
+ *
14
+ * Release Detection (in order of precedence):
15
+ * 1. SENTRY_RELEASE environment variable
16
+ * 2. Git describe output (e.g., v1.2.3, v1.2.3-5-g1a2b3c)
17
+ * 3. Package.json version
18
+ */
19
+ import * as Sentry from '@sentry/node';
20
+ import { expressIntegration } from '@sentry/node';
21
+ import { spawnSync } from 'child_process';
22
+ let isInitialized = false;
23
+ /**
24
+ * Get the release version for Sentry.
25
+ * Uses this precedence:
26
+ * 1. SENTRY_RELEASE environment variable
27
+ * 2. Git describe (latest tag or commit hash)
28
+ * 3. Package.json version
29
+ *
30
+ * @returns Release version string, or undefined if not available
31
+ */
32
+ function detectReleaseVersion() {
33
+ // 1. Check explicit environment variable
34
+ if (process.env.SENTRY_RELEASE) {
35
+ return process.env.SENTRY_RELEASE;
36
+ }
37
+ // 2. Try git describe to get latest tag/version
38
+ try {
39
+ const result = spawnSync('git', ['describe', '--tags', '--always'], {
40
+ encoding: 'utf-8',
41
+ stdio: ['pipe', 'pipe', 'ignore'],
42
+ timeout: 1000,
43
+ });
44
+ if (result.status === 0 && result.stdout) {
45
+ return result.stdout.trim();
46
+ }
47
+ }
48
+ catch {
49
+ // Git not available or command failed, fall through
50
+ }
51
+ // 3. Try git rev-parse HEAD (commit hash) as fallback
52
+ try {
53
+ const result = spawnSync('git', ['rev-parse', 'HEAD'], {
54
+ encoding: 'utf-8',
55
+ stdio: ['pipe', 'pipe', 'ignore'],
56
+ timeout: 1000,
57
+ });
58
+ if (result.status === 0 && result.stdout) {
59
+ const hash = result.stdout.trim();
60
+ return hash.substring(0, 8); // Use first 8 chars of commit hash
61
+ }
62
+ }
63
+ catch {
64
+ // Git not available, continue
65
+ }
66
+ // 4. Return undefined - Sentry will handle the missing release
67
+ return undefined;
68
+ }
69
+ /**
70
+ * Initialize Sentry with configuration from environment variables.
71
+ * Can be called multiple times safely - only initializes once.
72
+ *
73
+ * @param customConfig - Optional custom configuration overrides
74
+ */
75
+ export function initSentry(customConfig) {
76
+ if (isInitialized) {
77
+ return;
78
+ }
79
+ const dsn = customConfig?.dsn || process.env.SENTRY_DSN;
80
+ const enabled = customConfig?.enabled !== undefined
81
+ ? customConfig.enabled
82
+ : process.env.SENTRY_ENABLED === 'true' || process.env.SENTRY_ENABLED === '1' || !!dsn;
83
+ if (!enabled) {
84
+ return;
85
+ }
86
+ if (!dsn) {
87
+ console.warn('⚠️ Sentry is enabled but SENTRY_DSN is not set. Sentry will be disabled. ' +
88
+ 'Set SENTRY_DSN environment variable to enable error reporting.');
89
+ return;
90
+ }
91
+ // Detect release version dynamically
92
+ const releaseVersion = customConfig?.release || detectReleaseVersion();
93
+ const config = {
94
+ dsn,
95
+ environment: customConfig?.environment || process.env.SENTRY_ENVIRONMENT || 'production',
96
+ release: releaseVersion,
97
+ tracesSampleRate: customConfig?.sampleRate || parseFloat(process.env.SENTRY_SAMPLE_RATE || '0.1'),
98
+ integrations: [
99
+ expressIntegration(),
100
+ ],
101
+ // Capture breadcrumbs for debugging
102
+ maxBreadcrumbs: 100,
103
+ // Do not send errors if we're in test environment
104
+ beforeSend: (event) => {
105
+ if (process.env.JEST_WORKER_ID) {
106
+ return null;
107
+ }
108
+ return event;
109
+ },
110
+ };
111
+ Sentry.init(config);
112
+ isInitialized = true;
113
+ }
114
+ /**
115
+ * Get the Express error handler middleware.
116
+ * Should be mounted after all other middleware and route handlers.
117
+ */
118
+ export function sentryErrorHandler() {
119
+ return Sentry.expressErrorHandler();
120
+ }
121
+ /**
122
+ * Legacy function for request handler - no-op since express integration handles it.
123
+ * Kept for compatibility with the API service integration.
124
+ */
125
+ export function sentryRequestHandler() {
126
+ return (_req, _res, next) => next();
127
+ }
128
+ /**
129
+ * Capture an exception with additional context.
130
+ * Useful for errors that don't propagate through Express middleware.
131
+ *
132
+ * @param error - The error to report
133
+ * @param context - Additional context data
134
+ */
135
+ export function captureException(error, context) {
136
+ if (!isInitialized) {
137
+ return;
138
+ }
139
+ Sentry.withScope((scope) => {
140
+ if (context) {
141
+ Object.entries(context).forEach(([key, value]) => {
142
+ scope.setContext(key, value);
143
+ });
144
+ }
145
+ Sentry.captureException(error);
146
+ });
147
+ }
148
+ /**
149
+ * Add a breadcrumb for debugging.
150
+ * Breadcrumbs are automatically captured for HTTP requests and other events.
151
+ *
152
+ * @param message - Breadcrumb message
153
+ * @param category - Breadcrumb category (e.g., 'auth', 'validation', 'database')
154
+ * @param level - Severity level
155
+ * @param data - Additional data
156
+ */
157
+ export function addBreadcrumb(message, category, level = 'info', data) {
158
+ if (!isInitialized) {
159
+ return;
160
+ }
161
+ Sentry.addBreadcrumb({
162
+ message,
163
+ category,
164
+ level,
165
+ data,
166
+ });
167
+ }
168
+ /**
169
+ * Set user context for error reporting.
170
+ *
171
+ * @param userId - Unique identifier for the user/client
172
+ * @param email - User email (optional)
173
+ * @param username - Username (optional)
174
+ * @param ipAddress - IP address (optional)
175
+ */
176
+ export function setUserContext(userId, { email, username, ipAddress } = {}) {
177
+ if (!isInitialized) {
178
+ return;
179
+ }
180
+ Sentry.setUser({
181
+ id: userId,
182
+ email,
183
+ username,
184
+ ip_address: ipAddress,
185
+ });
186
+ }
187
+ /**
188
+ * Clear user context (e.g., on logout).
189
+ */
190
+ export function clearUserContext() {
191
+ if (!isInitialized) {
192
+ return;
193
+ }
194
+ Sentry.setUser(null);
195
+ }
196
+ /**
197
+ * Set tags for error context and filtering.
198
+ * Tags are indexed and can be used for filtering in the Sentry dashboard.
199
+ *
200
+ * @param tags - Object with tag key-value pairs
201
+ */
202
+ export function setTags(tags) {
203
+ if (!isInitialized) {
204
+ return;
205
+ }
206
+ Object.entries(tags).forEach(([key, value]) => {
207
+ Sentry.setTag(key, value);
208
+ });
209
+ }
210
+ /**
211
+ * Set extra context data.
212
+ * Extra data is not indexed and should be used for large data objects.
213
+ *
214
+ * @param context - Object with context data
215
+ */
216
+ export function setExtraContext(context) {
217
+ if (!isInitialized) {
218
+ return;
219
+ }
220
+ Object.entries(context).forEach(([key, value]) => {
221
+ Sentry.setExtra(key, value);
222
+ });
223
+ }
224
+ /**
225
+ * Flush pending events to Sentry.
226
+ * Should be called during graceful shutdown to ensure all events are sent.
227
+ *
228
+ * @param timeoutMs - Timeout in milliseconds (default: 2000)
229
+ * @returns Promise that resolves when events are flushed or timeout occurs
230
+ */
231
+ export async function flushSentry(timeoutMs = 2000) {
232
+ if (!isInitialized) {
233
+ return Promise.resolve(true);
234
+ }
235
+ return Sentry.close(timeoutMs);
236
+ }
237
+ /**
238
+ * Check if Sentry is initialized and enabled.
239
+ */
240
+ export function isSentryEnabled() {
241
+ return isInitialized;
242
+ }
243
+ //# sourceMappingURL=sentry-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-integration.js","sourceRoot":"","sources":["../src/sentry-integration.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status-response-builder.d.ts","sourceRoot":"","sources":["../../src/utils/status-response-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD;;;GAGG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,aAAa,CAAC;gBAFd,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,YAAA;IAGxD;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc;IA6BrC,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,eAAe;IA4DvB,OAAO,CAAC,mBAAmB;IAiF3B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,eAAe;CAiBxB"}
1
+ {"version":3,"file":"status-response-builder.d.ts","sourceRoot":"","sources":["../../src/utils/status-response-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD;;;GAGG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,aAAa,CAAC;gBAFd,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,YAAA;IAGxD;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc;IA6BrC,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,eAAe;IA4DvB,OAAO,CAAC,mBAAmB;IAgF3B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,yBAAyB;IAYjC,OAAO,CAAC,eAAe;CAiBxB"}
@@ -169,9 +169,8 @@ export class StatusResponseBuilder {
169
169
  }
170
170
  }
171
171
  catch {
172
- // If reading progress.jsonl fails, can't calculate progress
173
- response.taskProgressPercent = undefined;
174
- return;
172
+ // If reading progress.jsonl fails, continue with allStages set
173
+ // We'll use metadata.stages if available
175
174
  }
176
175
  }
177
176
  // Use stages from metadata if available (preferred for terminal states)
@@ -1 +1 @@
1
- {"version":3,"file":"status-response-builder.js","sourceRoot":"","sources":["../../src/utils/status-response-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status-response-builder.js","sourceRoot":"","sources":["../../src/utils/status-response-builder.ts"],"names":[],"mappings":"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"}
package/kaseki-agent.sh CHANGED
@@ -4360,6 +4360,27 @@ run_github_operations() {
4360
4360
  local pr_title pr_body pr_response pr_url pr_number pr_http_status pr_draft_json
4361
4361
  pr_title="$(derive_pr_title)"
4362
4362
  pr_body="$(build_pr_body)"
4363
+ local pr_body_compact
4364
+ pr_body_compact="$(printf '%s' "$pr_body" | tr -d '[:space:]')"
4365
+ if [ -z "$pr_body_compact" ]; then
4366
+ local fallback_timestamp fallback_validation_status
4367
+ fallback_timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
4368
+ fallback_validation_status="unknown"
4369
+ fallback_validation_status="$([ "$VALIDATION_EXIT" -eq 0 ] && printf 'passed' || printf 'failed (exit %s)' "$VALIDATION_EXIT")"
4370
+ pr_body=$(cat <<EOF
4371
+ ## Summary
4372
+ - Automated PR body fallback was used because generated body was empty after sanitization.
4373
+
4374
+ ## Validation
4375
+ - Post-agent validation: $fallback_validation_status
4376
+ - Publish mode: ${KASEKI_PUBLISH_MODE:-pr}
4377
+
4378
+ ## Run metadata
4379
+ - Generated at (UTC): $fallback_timestamp
4380
+ EOF
4381
+ )
4382
+ printf 'WARN: build_pr_body returned empty content after sanitization; using fallback PR body.\n' | tee -a /results/git-push.log >&2
4383
+ fi
4363
4384
  if is_pr_draft_mode; then
4364
4385
  pr_draft_json=true
4365
4386
  else
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanautomation/kaseki-agent",
3
- "version": "1.53.4",
3
+ "version": "1.54.0",
4
4
  "description": "Admin/helper/doctor toolbox and local API client for Kaseki diagnostics, setup, and API-backed coding-agent task workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -78,6 +78,7 @@
78
78
  "type-check:type-tests": "tsc -p tsconfig.type-tests.json"
79
79
  },
80
80
  "dependencies": {
81
+ "@sentry/node": "^10.54.0",
81
82
  "enquirer": "^2.4.1",
82
83
  "express": "^4.18.2",
83
84
  "swagger-ui-express": "^5.0.1",