@cyanautomation/kaseki-agent 1.62.1 → 1.64.1

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 (55) hide show
  1. package/dist/config/ConfigManager.d.ts +4 -4
  2. package/dist/kaseki-api/npm-version.d.ts +19 -0
  3. package/dist/kaseki-api/npm-version.d.ts.map +1 -0
  4. package/dist/kaseki-api/npm-version.js +43 -0
  5. package/dist/kaseki-api/npm-version.js.map +1 -0
  6. package/dist/kaseki-api/service-bootstrapper.d.ts.map +1 -1
  7. package/dist/kaseki-api/service-bootstrapper.js +41 -7
  8. package/dist/kaseki-api/service-bootstrapper.js.map +1 -1
  9. package/dist/kaseki-api/startup-health-reporter.d.ts +30 -0
  10. package/dist/kaseki-api/startup-health-reporter.d.ts.map +1 -0
  11. package/dist/kaseki-api/startup-health-reporter.js +174 -0
  12. package/dist/kaseki-api/startup-health-reporter.js.map +1 -0
  13. package/dist/kaseki-api/startup-summary-artifact.d.ts +29 -0
  14. package/dist/kaseki-api/startup-summary-artifact.d.ts.map +1 -0
  15. package/dist/kaseki-api/startup-summary-artifact.js +63 -0
  16. package/dist/kaseki-api/startup-summary-artifact.js.map +1 -0
  17. package/dist/kaseki-api-routes.d.ts.map +1 -1
  18. package/dist/kaseki-api-routes.js +49 -0
  19. package/dist/kaseki-api-routes.js.map +1 -1
  20. package/dist/kaseki-api-service.d.ts.map +1 -1
  21. package/dist/kaseki-api-service.js +45 -2
  22. package/dist/kaseki-api-service.js.map +1 -1
  23. package/dist/kaseki-api-types.d.ts +58 -0
  24. package/dist/kaseki-api-types.d.ts.map +1 -1
  25. package/dist/startup/checklist-renderer.d.ts +71 -0
  26. package/dist/startup/checklist-renderer.d.ts.map +1 -0
  27. package/dist/startup/checklist-renderer.js +174 -0
  28. package/dist/startup/checklist-renderer.js.map +1 -0
  29. package/dist/startup/container-preflight.d.ts +4 -0
  30. package/dist/startup/container-preflight.d.ts.map +1 -1
  31. package/dist/startup/container-preflight.js +37 -8
  32. package/dist/startup/container-preflight.js.map +1 -1
  33. package/dist/startup/event-categorizer.d.ts +49 -0
  34. package/dist/startup/event-categorizer.d.ts.map +1 -0
  35. package/dist/startup/event-categorizer.js +118 -0
  36. package/dist/startup/event-categorizer.js.map +1 -0
  37. package/dist/startup/preflight-summary.d.ts +26 -0
  38. package/dist/startup/preflight-summary.d.ts.map +1 -0
  39. package/dist/startup/preflight-summary.js +106 -0
  40. package/dist/startup/preflight-summary.js.map +1 -0
  41. package/dist/startup/progress-tracker.d.ts +75 -0
  42. package/dist/startup/progress-tracker.d.ts.map +1 -0
  43. package/dist/startup/progress-tracker.js +115 -0
  44. package/dist/startup/progress-tracker.js.map +1 -0
  45. package/dist/startup/timing-formatter.d.ts +58 -0
  46. package/dist/startup/timing-formatter.d.ts.map +1 -0
  47. package/dist/startup/timing-formatter.js +99 -0
  48. package/dist/startup/timing-formatter.js.map +1 -0
  49. package/kaseki-agent.sh +54 -168
  50. package/package.json +1 -1
  51. package/scripts/collect-feedback.js +12 -9
  52. package/scripts/docker-entrypoint.sh +2 -0
  53. package/scripts/kaseki-setup-host.sh +96 -36
  54. package/scripts/scouting-allowlist.js +229 -0
  55. package/scripts/startup-checks.sh +78 -2
@@ -180,14 +180,14 @@ declare const ConfigSchema: z.ZodObject<{
180
180
  port?: number | undefined;
181
181
  base_url?: string | undefined;
182
182
  key?: string | undefined;
183
- log_level?: "error" | "debug" | "info" | "warn" | undefined;
183
+ log_level?: "error" | "info" | "debug" | "warn" | undefined;
184
184
  max_concurrent_runs?: number | undefined;
185
185
  }, {
186
186
  keys?: string[] | undefined;
187
187
  port?: number | undefined;
188
188
  base_url?: string | undefined;
189
189
  key?: string | undefined;
190
- log_level?: "error" | "debug" | "info" | "warn" | undefined;
190
+ log_level?: "error" | "info" | "debug" | "warn" | undefined;
191
191
  max_concurrent_runs?: number | undefined;
192
192
  }>>;
193
193
  directories: z.ZodOptional<z.ZodObject<{
@@ -294,7 +294,7 @@ declare const ConfigSchema: z.ZodObject<{
294
294
  port?: number | undefined;
295
295
  base_url?: string | undefined;
296
296
  key?: string | undefined;
297
- log_level?: "error" | "debug" | "info" | "warn" | undefined;
297
+ log_level?: "error" | "info" | "debug" | "warn" | undefined;
298
298
  max_concurrent_runs?: number | undefined;
299
299
  } | undefined;
300
300
  directories?: {
@@ -371,7 +371,7 @@ declare const ConfigSchema: z.ZodObject<{
371
371
  port?: number | undefined;
372
372
  base_url?: string | undefined;
373
373
  key?: string | undefined;
374
- log_level?: "error" | "debug" | "info" | "warn" | undefined;
374
+ log_level?: "error" | "info" | "debug" | "warn" | undefined;
375
375
  max_concurrent_runs?: number | undefined;
376
376
  } | undefined;
377
377
  directories?: {
@@ -0,0 +1,19 @@
1
+ /**
2
+ * NPM Version Detection
3
+ *
4
+ * Detects the npm version installed in the container.
5
+ * Falls back gracefully to 'unknown' if detection fails.
6
+ *
7
+ * @returns npm version string (e.g., "10.2.4") or "unknown" on failure
8
+ */
9
+ /**
10
+ * Get the installed npm version
11
+ *
12
+ * Uses process.versions.npm first (fast, no subprocess),
13
+ * falls back to `npm --version` command if that's unavailable,
14
+ * and gracefully returns 'unknown' if both fail.
15
+ *
16
+ * @returns Promise<string> - npm version or 'unknown'
17
+ */
18
+ export declare function getNpmVersion(): Promise<string>;
19
+ //# sourceMappingURL=npm-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-version.d.ts","sourceRoot":"","sources":["../../src/kaseki-api/npm-version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;GAQG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAyBrD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * NPM Version Detection
3
+ *
4
+ * Detects the npm version installed in the container.
5
+ * Falls back gracefully to 'unknown' if detection fails.
6
+ *
7
+ * @returns npm version string (e.g., "10.2.4") or "unknown" on failure
8
+ */
9
+ import { execSync } from 'child_process';
10
+ /**
11
+ * Get the installed npm version
12
+ *
13
+ * Uses process.versions.npm first (fast, no subprocess),
14
+ * falls back to `npm --version` command if that's unavailable,
15
+ * and gracefully returns 'unknown' if both fail.
16
+ *
17
+ * @returns Promise<string> - npm version or 'unknown'
18
+ */
19
+ export async function getNpmVersion() {
20
+ // Try process.versions.npm first (should be available in Node.js with npm)
21
+ // This is fast and requires no subprocess
22
+ if (process.versions.npm) {
23
+ return process.versions.npm;
24
+ }
25
+ // Fallback: try `npm --version` command
26
+ try {
27
+ const version = execSync('npm --version', {
28
+ encoding: 'utf-8',
29
+ stdio: ['pipe', 'pipe', 'pipe'],
30
+ timeout: 5000,
31
+ }).trim();
32
+ // Validate it looks like a version (basic sanity check)
33
+ if (version && /^\d+\.\d+\.\d+/.test(version)) {
34
+ return version;
35
+ }
36
+ }
37
+ catch {
38
+ // npm command failed or timed out; silently fall through
39
+ }
40
+ // Graceful fallback: don't break startup, just indicate version is unknown
41
+ return 'unknown';
42
+ }
43
+ //# sourceMappingURL=npm-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-version.js","sourceRoot":"","sources":["../../src/kaseki-api/npm-version.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,2EAA2E;IAC3E,0CAA0C;IAC1C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC9B,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE;YACxC,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,wDAAwD;QACxD,IAAI,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;IAED,2EAA2E;IAC3E,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"service-bootstrapper.d.ts","sourceRoot":"","sources":["../../src/kaseki-api/service-bootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,WAAW,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,SAAS,EAAE,YAAY,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC1C,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAgF/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDxE"}
1
+ {"version":3,"file":"service-bootstrapper.d.ts","sourceRoot":"","sources":["../../src/kaseki-api/service-bootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,WAAW,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,SAAS,EAAE,YAAY,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC1C,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,oBAAoB,CAAC,CAoH/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDxE"}
@@ -20,47 +20,77 @@ const logger = createEventLogger('service-bootstrapper');
20
20
  * @throws Error with context if any service initialization fails
21
21
  */
22
22
  export async function bootstrapServices(config) {
23
+ const bootstrapStartTime = performance.now();
23
24
  logger.info('Starting service bootstrap');
24
25
  const cleanupTasks = [];
26
+ const componentTimings = [];
25
27
  try {
26
28
  // 1. Create artifact cache (no dependencies)
29
+ const cacheStartTime = performance.now();
27
30
  logger.info('Initializing ResultCache');
28
31
  const artifactCache = new ResultCache({
29
32
  maxEntries: config.artifactCacheMaxEntries,
30
33
  ttlMs: config.artifactCacheTtlMs,
31
34
  maxFileBytes: config.artifactCacheMaxFileBytes,
32
35
  });
33
- logger.info('ResultCache initialized');
36
+ const cacheDuration = performance.now() - cacheStartTime;
37
+ componentTimings.push({ name: 'ResultCache', durationMs: cacheDuration });
38
+ logger.info(`ResultCache initialized (${cacheDuration.toFixed(1)}ms)`);
34
39
  cleanupTasks.push({
35
40
  name: 'ResultCache',
36
41
  run: () => artifactCache.clearAll(),
37
42
  });
38
43
  // 2. Create webhook manager (depends on: resultsDir)
44
+ const webhookStartTime = performance.now();
39
45
  logger.info('Initializing WebhookManager');
40
46
  const webhookManager = new WebhookManager(config.resultsDir);
41
- logger.info('WebhookManager initialized');
47
+ const webhookDuration = performance.now() - webhookStartTime;
48
+ componentTimings.push({ name: 'WebhookManager', durationMs: webhookDuration });
49
+ logger.info(`WebhookManager initialized (${webhookDuration.toFixed(1)}ms)`);
42
50
  cleanupTasks.push({
43
51
  name: 'WebhookManager',
44
52
  run: () => webhookManager.shutdown(),
45
53
  });
46
54
  // 3. Create idempotency store (depends on: resultsDir)
55
+ const idempotencyStartTime = performance.now();
47
56
  logger.info('Initializing IdempotencyStore');
48
57
  const idempotencyStore = new IdempotencyStore(config.resultsDir, 24);
49
- logger.info('IdempotencyStore initialized');
58
+ const idempotencyDuration = performance.now() - idempotencyStartTime;
59
+ componentTimings.push({ name: 'IdempotencyStore', durationMs: idempotencyDuration });
60
+ logger.info(`IdempotencyStore initialized (${idempotencyDuration.toFixed(1)}ms)`);
50
61
  cleanupTasks.push({
51
62
  name: 'IdempotencyStore',
52
63
  run: () => idempotencyStore.shutdown(),
53
64
  });
54
65
  // 4. Create pre-flight validator (no dependencies)
66
+ const validatorStartTime = performance.now();
55
67
  logger.info('Initializing PreFlightValidator');
56
68
  const preFlightValidator = new PreFlightValidator();
57
- logger.info('PreFlightValidator initialized');
69
+ const validatorDuration = performance.now() - validatorStartTime;
70
+ componentTimings.push({ name: 'PreFlightValidator', durationMs: validatorDuration });
71
+ logger.info(`PreFlightValidator initialized (${validatorDuration.toFixed(1)}ms)`);
58
72
  // 5. Create scheduler (depends on: config, webhookManager, artifactCache)
73
+ const schedulerStartTime = performance.now();
59
74
  logger.info('Initializing JobScheduler');
60
75
  const scheduler = new JobScheduler(config, webhookManager, artifactCache);
61
76
  await scheduler.ready();
62
- logger.info('JobScheduler initialized');
63
- logger.info('Service bootstrap complete');
77
+ const schedulerDuration = performance.now() - schedulerStartTime;
78
+ componentTimings.push({ name: 'JobScheduler', durationMs: schedulerDuration });
79
+ logger.info(`JobScheduler initialized (${schedulerDuration.toFixed(1)}ms)`);
80
+ // Detect slow components and warn
81
+ const slowComponentThreshold = 1000; // 1 second
82
+ const slowComponents = componentTimings.filter(c => c.durationMs > slowComponentThreshold);
83
+ if (slowComponents.length > 0) {
84
+ logger.warn('Slow component initialization detected during bootstrap:', {
85
+ slowComponents: slowComponents.map(c => `${c.name} (${c.durationMs.toFixed(1)}ms)`),
86
+ });
87
+ }
88
+ const totalBootstrapDuration = performance.now() - bootstrapStartTime;
89
+ logger.info('Service bootstrap complete', {
90
+ totalDurationMs: totalBootstrapDuration.toFixed(1),
91
+ componentCount: componentTimings.length,
92
+ components: componentTimings,
93
+ });
64
94
  return {
65
95
  artifactCache,
66
96
  webhookManager,
@@ -85,7 +115,11 @@ export async function bootstrapServices(config) {
85
115
  }
86
116
  }
87
117
  const errorMessage = err instanceof Error ? err.message : String(err);
88
- logger.error('Failed to bootstrap services', { error: errorMessage });
118
+ const totalBootstrapDuration = performance.now() - bootstrapStartTime;
119
+ logger.error('Failed to bootstrap services', {
120
+ error: errorMessage,
121
+ durationMs: totalBootstrapDuration.toFixed(1),
122
+ });
89
123
  throw new Error(`Service bootstrap failed: ${errorMessage}`, {
90
124
  cause: err,
91
125
  });
@@ -1 +1 @@
1
- {"version":3,"file":"service-bootstrapper.js","sourceRoot":"","sources":["../../src/kaseki-api/service-bootstrapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-bootstrapper.js","sourceRoot":"","sources":["../../src/kaseki-api/service-bootstrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Startup Health Reporter
3
+ *
4
+ * Consolidates bootstrap timing, preflight checks, and environment data
5
+ * into a unified health report for external monitoring and user visibility
6
+ */
7
+ import type { PreflightCheck, StartupHealthReport, StartupIssue } from '../kaseki-api-types';
8
+ /**
9
+ * Categorizes preflight check failures into startup issues
10
+ * Groups by severity and includes remediation information
11
+ *
12
+ * @param checks - Array of preflight check results
13
+ * @returns Array of StartupIssue objects categorized by severity
14
+ */
15
+ export declare function categorizeStartupIssues(checks: PreflightCheck[]): StartupIssue[];
16
+ /**
17
+ * Generates a unified startup health report
18
+ *
19
+ * @param bootstrapDurationMs - Time to bootstrap all services
20
+ * @param preflightDurationMs - Time to run preflight checks
21
+ * @param preflight Checks - Array of preflight check results
22
+ * @param componentTimings - Map of component name to duration in ms
23
+ * @returns StartupHealthReport with consolidated health data
24
+ */
25
+ export declare function generateStartupHealthReport(bootstrapDurationMs: number, preflightDurationMs: number, preflightChecks: PreflightCheck[], componentTimings?: Record<string, number>): StartupHealthReport;
26
+ /**
27
+ * Converts health report to human-readable markdown
28
+ */
29
+ export declare function healthReportToMarkdown(report: StartupHealthReport): string;
30
+ //# sourceMappingURL=startup-health-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-health-reporter.d.ts","sourceRoot":"","sources":["../../src/kaseki-api/startup-health-reporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7F;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CAgBhF;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,MAAM,EAC3B,eAAe,EAAE,cAAc,EAAE,EACjC,gBAAgB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAC5C,mBAAmB,CAsDrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAuD1E"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Startup Health Reporter
3
+ *
4
+ * Consolidates bootstrap timing, preflight checks, and environment data
5
+ * into a unified health report for external monitoring and user visibility
6
+ */
7
+ /**
8
+ * Categorizes preflight check failures into startup issues
9
+ * Groups by severity and includes remediation information
10
+ *
11
+ * @param checks - Array of preflight check results
12
+ * @returns Array of StartupIssue objects categorized by severity
13
+ */
14
+ export function categorizeStartupIssues(checks) {
15
+ const failedChecks = checks.filter(check => !check.ok);
16
+ return failedChecks.map(check => {
17
+ const severity = determineSeverity(check.name);
18
+ const autoFixable = isAutoFixable(check.name);
19
+ return {
20
+ severity,
21
+ component: check.name,
22
+ detail: check.detail || 'Check failed',
23
+ remediation: check.remediation,
24
+ autoFixable,
25
+ timestamp: new Date().toISOString(),
26
+ };
27
+ });
28
+ }
29
+ /**
30
+ * Determines severity level based on check type
31
+ */
32
+ function determineSeverity(checkName) {
33
+ const blockingChecks = [
34
+ 'setup-completeness',
35
+ 'secrets-readable',
36
+ 'checkout-exists',
37
+ ];
38
+ if (blockingChecks.includes(checkName)) {
39
+ return 'blocking';
40
+ }
41
+ // Most preflight checks are warnings (non-blocking)
42
+ return 'warning';
43
+ }
44
+ /**
45
+ * Determines if an issue can be auto-fixed
46
+ */
47
+ function isAutoFixable(checkName) {
48
+ const autoFixableChecks = ['git-safe-directory'];
49
+ return autoFixableChecks.includes(checkName);
50
+ }
51
+ /**
52
+ * Generates a unified startup health report
53
+ *
54
+ * @param bootstrapDurationMs - Time to bootstrap all services
55
+ * @param preflightDurationMs - Time to run preflight checks
56
+ * @param preflight Checks - Array of preflight check results
57
+ * @param componentTimings - Map of component name to duration in ms
58
+ * @returns StartupHealthReport with consolidated health data
59
+ */
60
+ export function generateStartupHealthReport(bootstrapDurationMs, preflightDurationMs, preflightChecks, componentTimings = {}) {
61
+ const issues = categorizeStartupIssues(preflightChecks);
62
+ // Build component timing info
63
+ const components = {};
64
+ const slowComponentThreshold = 1000; // 1 second
65
+ for (const [name, durationMs] of Object.entries(componentTimings)) {
66
+ const status = durationMs > slowComponentThreshold ? 'warning' : 'ok';
67
+ const reason = durationMs > slowComponentThreshold ? 'slow_init' : undefined;
68
+ components[name] = {
69
+ name,
70
+ durationMs,
71
+ status,
72
+ ...(reason && { reason }),
73
+ };
74
+ }
75
+ // Build preflight check summary
76
+ const preflight = {};
77
+ const passedChecks = preflightChecks.filter(c => c.ok);
78
+ for (const check of preflightChecks) {
79
+ preflight[check.name] = {
80
+ ok: check.ok,
81
+ ...(check.elapsedMs && { elapsedMs: check.elapsedMs }),
82
+ ...(check.detail && { detail: check.detail }),
83
+ };
84
+ }
85
+ const totalMs = bootstrapDurationMs + preflightDurationMs;
86
+ // Determine overall status
87
+ const blockingIssues = issues.filter(i => i.severity === 'blocking');
88
+ const status = blockingIssues.length > 0 ? 'error' : issues.length > 0 ? 'degraded' : 'ok';
89
+ return {
90
+ timestamp: new Date().toISOString(),
91
+ status,
92
+ summary: {
93
+ passed: passedChecks.length,
94
+ warnings: issues.filter(i => i.severity === 'warning').length,
95
+ blocking: blockingIssues.length,
96
+ },
97
+ timing: {
98
+ bootstrapMs: Math.round(bootstrapDurationMs),
99
+ preflightMs: Math.round(preflightDurationMs),
100
+ totalMs: Math.round(totalMs),
101
+ },
102
+ components: components,
103
+ preflight,
104
+ issues,
105
+ };
106
+ }
107
+ /**
108
+ * Converts health report to human-readable markdown
109
+ */
110
+ export function healthReportToMarkdown(report) {
111
+ const lines = [];
112
+ lines.push('# Startup Health Report\n');
113
+ lines.push(`**Status:** ${getStatusEmoji(report.status)} ${report.status.toUpperCase()}\n`);
114
+ lines.push('## Summary');
115
+ lines.push(`- Passed: ${report.summary.passed}`);
116
+ lines.push(`- Warnings: ${report.summary.warnings}`);
117
+ lines.push(`- Blocking Issues: ${report.summary.blocking}\n`);
118
+ lines.push('## Timing');
119
+ lines.push(`- Bootstrap: ${report.timing.bootstrapMs}ms`);
120
+ lines.push(`- Preflight: ${report.timing.preflightMs}ms`);
121
+ lines.push(`- **Total: ${report.timing.totalMs}ms**\n`);
122
+ if (Object.keys(report.components).length > 0) {
123
+ lines.push('## Components');
124
+ for (const [name, timing] of Object.entries(report.components)) {
125
+ const icon = timing.status === 'warning' ? '⚠️' : '✓';
126
+ lines.push(`${icon} ${name} (${timing.durationMs.toFixed(1)}ms)`);
127
+ if (timing.reason) {
128
+ lines.push(` └─ ${timing.reason}`);
129
+ }
130
+ }
131
+ lines.push('');
132
+ }
133
+ if (report.issues.length > 0) {
134
+ lines.push('## Issues\n');
135
+ for (const issue of report.issues) {
136
+ const severityIcon = issue.severity === 'blocking'
137
+ ? '🔴'
138
+ : issue.severity === 'warning'
139
+ ? '🟡'
140
+ : '🔵';
141
+ lines.push(`${severityIcon} **${issue.component}** (${issue.severity})`);
142
+ lines.push(` ${issue.detail}`);
143
+ if (issue.remediation) {
144
+ lines.push(` → Fix: \`${issue.remediation}\``);
145
+ }
146
+ if (issue.autoFixable) {
147
+ lines.push(' → Auto-fixable: Yes');
148
+ }
149
+ lines.push('');
150
+ }
151
+ }
152
+ else {
153
+ lines.push('## Issues\n');
154
+ lines.push('✓ No issues found\n');
155
+ }
156
+ lines.push(`_Generated: ${report.timestamp}_`);
157
+ return lines.join('\n');
158
+ }
159
+ /**
160
+ * Get emoji for status
161
+ */
162
+ function getStatusEmoji(status) {
163
+ switch (status) {
164
+ case 'ok':
165
+ return '✅';
166
+ case 'degraded':
167
+ return '⚠️';
168
+ case 'error':
169
+ return '❌';
170
+ default:
171
+ return '❓';
172
+ }
173
+ }
174
+ //# sourceMappingURL=startup-health-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-health-reporter.js","sourceRoot":"","sources":["../../src/kaseki-api/startup-health-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Startup Summary Artifact Writer
3
+ *
4
+ * Writes startup health reports to JSON and markdown artifacts
5
+ * Caches in memory for API endpoint access
6
+ */
7
+ import type { StartupHealthReport } from '../kaseki-api-types';
8
+ /**
9
+ * Write startup health report to artifacts directory
10
+ *
11
+ * Writes two files:
12
+ * - startup-health-report.json (structured for parsing)
13
+ * - startup-summary.md (human-readable)
14
+ *
15
+ * @param resultsDir - Directory to write artifacts to
16
+ * @param report - Health report to write
17
+ * @throws Error if write fails
18
+ */
19
+ export declare function writeStartupHealthArtifacts(resultsDir: string, report: StartupHealthReport): void;
20
+ /**
21
+ * Get cached startup health report (populated after startup)
22
+ * Returns null if not yet generated
23
+ */
24
+ export declare function getCachedStartupHealthReport(): StartupHealthReport | null;
25
+ /**
26
+ * Clear cached report (for testing)
27
+ */
28
+ export declare function clearCachedStartupHealthReport(): void;
29
+ //# sourceMappingURL=startup-summary-artifact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-summary-artifact.d.ts","sourceRoot":"","sources":["../../src/kaseki-api/startup-summary-artifact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAO/D;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,mBAAmB,GAC1B,IAAI,CA2BN;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,mBAAmB,GAAG,IAAI,CAEzE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,IAAI,CAErD"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Startup Summary Artifact Writer
3
+ *
4
+ * Writes startup health reports to JSON and markdown artifacts
5
+ * Caches in memory for API endpoint access
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { createEventLogger } from '../logger.js';
10
+ import { healthReportToMarkdown } from './startup-health-reporter.js';
11
+ const logger = createEventLogger('startup-artifacts');
12
+ let cachedHealthReport = null;
13
+ /**
14
+ * Write startup health report to artifacts directory
15
+ *
16
+ * Writes two files:
17
+ * - startup-health-report.json (structured for parsing)
18
+ * - startup-summary.md (human-readable)
19
+ *
20
+ * @param resultsDir - Directory to write artifacts to
21
+ * @param report - Health report to write
22
+ * @throws Error if write fails
23
+ */
24
+ export function writeStartupHealthArtifacts(resultsDir, report) {
25
+ try {
26
+ // Ensure directory exists
27
+ fs.mkdirSync(resultsDir, { recursive: true });
28
+ // Write JSON
29
+ const jsonPath = path.join(resultsDir, 'startup-health-report.json');
30
+ fs.writeFileSync(jsonPath, JSON.stringify(report, null, 2), 'utf-8');
31
+ logger.debug('Wrote startup health report (JSON)', { filePath: jsonPath });
32
+ // Write Markdown
33
+ const markdown = healthReportToMarkdown(report);
34
+ const mdPath = path.join(resultsDir, 'startup-summary.md');
35
+ fs.writeFileSync(mdPath, markdown, 'utf-8');
36
+ logger.debug('Wrote startup health report (Markdown)', { filePath: mdPath });
37
+ // Cache for API access
38
+ cachedHealthReport = report;
39
+ logger.debug('Cached startup health report in memory');
40
+ }
41
+ catch (err) {
42
+ const errorMsg = err instanceof Error ? err.message : String(err);
43
+ logger.error('Failed to write startup health artifacts', {
44
+ error: errorMsg,
45
+ resultsDir,
46
+ });
47
+ throw new Error(`Failed to write startup artifacts: ${errorMsg}`);
48
+ }
49
+ }
50
+ /**
51
+ * Get cached startup health report (populated after startup)
52
+ * Returns null if not yet generated
53
+ */
54
+ export function getCachedStartupHealthReport() {
55
+ return cachedHealthReport;
56
+ }
57
+ /**
58
+ * Clear cached report (for testing)
59
+ */
60
+ export function clearCachedStartupHealthReport() {
61
+ cachedHealthReport = null;
62
+ }
63
+ //# sourceMappingURL=startup-summary-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-summary-artifact.js","sourceRoot":"","sources":["../../src/kaseki-api/startup-summary-artifact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;AAEtD,IAAI,kBAAkB,GAA+B,IAAI,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAAkB,EAClB,MAA2B;IAE3B,IAAI,CAAC;QACH,0BAA0B;QAC1B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,aAAa;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;QACrE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE3E,iBAAiB;QACjB,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAC3D,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,uBAAuB;QACvB,kBAAkB,GAAG,MAAM,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;YACvD,KAAK,EAAE,QAAQ;YACf,UAAU;SACX,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B;IAC1C,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC5C,kBAAkB,GAAG,IAAI,CAAC;AAC5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"kaseki-api-routes.d.ts","sourceRoot":"","sources":["../src/kaseki-api-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAWlE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAY5D,OAAO,EAAE,eAAe,EAAkB,MAAM,qBAAqB,CAAC;AAWtE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAK7C,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwoB5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AA+gBjE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,eAAe,EACvB,gBAAgB,EAAE,gBAAgB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,cAIX,GACD,MAAM,CAwhBR"}
1
+ {"version":3,"file":"kaseki-api-routes.d.ts","sourceRoot":"","sources":["../src/kaseki-api-routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmC,MAAM,SAAS,CAAC;AAWlE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAY5D,OAAO,EAAE,eAAe,EAAkB,MAAM,qBAAqB,CAAC;AAWtE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAO7C,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwoB5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AA+gBjE;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,eAAe,EACvB,gBAAgB,EAAE,gBAAgB,EAClC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,cAIX,GACD,MAAM,CA2kBR"}
@@ -22,6 +22,8 @@ import { createGitHubIssuesRoutes } from './routes/github-issues-routes.js';
22
22
  import { ResultCache } from './result-cache.js';
23
23
  import { validateGitHubAppPrivateKey } from './github-app-private-key.js';
24
24
  import { metricsRegistry } from './metrics.js';
25
+ import { getCachedStartupHealthReport } from './kaseki-api/startup-summary-artifact.js';
26
+ import { healthReportToMarkdown } from './kaseki-api/startup-health-reporter.js';
25
27
  // Re-export UTF-8 helpers for backward compatibility
26
28
  export { decodeUtf8TailSafely, tailLogByLines } from './utils/utf8-helpers.js';
27
29
  const TEMPLATE_REMEDIATION = 'Run scripts/kaseki-activate.sh --controller bootstrap.';
@@ -980,6 +982,53 @@ export function createApiRouter(scheduler, config, idempotencyStore, preFlightVa
980
982
  }
981
983
  res.status(response.status === 'error' ? 503 : 200).json(response);
982
984
  });
985
+ /**
986
+ * GET /api/startup-health — Unified startup health report (Phase 4)
987
+ * Returns consolidated health status with bootstrap timing, preflight checks, and component status
988
+ */
989
+ router.get('/startup-health', (_req, res) => {
990
+ try {
991
+ const report = getCachedStartupHealthReport();
992
+ if (!report) {
993
+ res.status(404).json({
994
+ error: 'startup-health-not-available',
995
+ detail: 'Startup health report not yet generated. Check back after service initialization.',
996
+ });
997
+ return;
998
+ }
999
+ res.status(200).json(report);
1000
+ }
1001
+ catch (err) {
1002
+ logger.error('Failed to retrieve startup health report', {
1003
+ error: err instanceof Error ? err.message : String(err),
1004
+ });
1005
+ res.status(500).json({
1006
+ error: 'health-report-error',
1007
+ detail: 'Failed to retrieve startup health report',
1008
+ });
1009
+ }
1010
+ });
1011
+ /**
1012
+ * GET /api/startup-health/markdown — Startup health report in markdown format
1013
+ * Human-readable summary for logs and documentation
1014
+ */
1015
+ router.get('/startup-health/markdown', (_req, res) => {
1016
+ try {
1017
+ const report = getCachedStartupHealthReport();
1018
+ if (!report) {
1019
+ res.status(404).type('text/markdown').send('# Startup Health Report\n\nReport not yet available.\n');
1020
+ return;
1021
+ }
1022
+ const markdown = healthReportToMarkdown(report);
1023
+ res.type('text/markdown').status(200).send(markdown);
1024
+ }
1025
+ catch (err) {
1026
+ logger.error('Failed to generate startup health markdown', {
1027
+ error: err instanceof Error ? err.message : String(err),
1028
+ });
1029
+ res.status(500).type('text/markdown').send('# Error\n\nFailed to generate health report.\n');
1030
+ }
1031
+ });
983
1032
  /**
984
1033
  * Extract: Validate publish mode has proper authentication.
985
1034
  */