@cyanautomation/kaseki-agent 1.53.3 → 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.
- package/dist/kaseki-api-service.d.ts.map +1 -1
- package/dist/kaseki-api-service.js +18 -1
- package/dist/kaseki-api-service.js.map +1 -1
- package/dist/kaseki-api-web.d.ts.map +1 -1
- package/dist/kaseki-api-web.js +290 -101
- package/dist/kaseki-api-web.js.map +1 -1
- package/dist/sentry-integration.d.ts +107 -0
- package/dist/sentry-integration.d.ts.map +1 -0
- package/dist/sentry-integration.js +243 -0
- package/dist/sentry-integration.js.map +1 -0
- package/dist/utils/status-response-builder.d.ts.map +1 -1
- package/dist/utils/status-response-builder.js +2 -3
- package/dist/utils/status-response-builder.js.map +1 -1
- package/kaseki-agent.sh +21 -0
- package/package.json +2 -1
|
@@ -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;
|
|
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 = () =>
|
|
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":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACzH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAqB,MAAM,mCAAmC,CAAC;AAC3G,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"kaseki-api-service.js","sourceRoot":"","sources":["../src/kaseki-api-service.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACzH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAqB,MAAM,mCAAmC,CAAC;AAC3G,OAAO,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC5G,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,CAAC;AAEjE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAkB;IACvD,OAAO,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAE/C,sDAAsD;IACtD,UAAU,EAAE,CAAC;IACb,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;QACjC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QAClD,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,aAAa;KAC7D,CAAC,CAAC;IAEH,uEAAuE;IACvE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,yBAAyB,CAAC;IACjF,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAEnC,qBAAqB;IACrB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,UAAU,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;YAC9C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;YAClB,WAAW,EAAE,iHAAiH;SAC/H,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;QACrC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,0BAA0B;QAC3E,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;QAC/C,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;QACvD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,yBAAyB,EAAE,MAAM,CAAC,yBAAyB;QAC3D,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;QAClC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,SAAS;QAC7C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,8GAA8G,EAC9G,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,qEAAqE,EAAE,CAC1G,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;QAC1C,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAClD,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;KAC7C,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,EACJ,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,SAAS,EACV,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEpC,oEAAoE;IACpE,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,kBAAkB,GAAG,IAAI,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC;IACjD,4BAA4B,CAAC,eAAe,CAAC,CAAC;IAE9C,qBAAqB;IACrB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,0DAA0D;IAC1D,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAEhC,iCAAiC;IACjC,MAAM,WAAW,GAAG,mBAAmB,EAAE,CAAC;IAE1C,iCAAiC;IACjC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE;QAC7D,SAAS,EAAE,2BAA2B;KACvC,CAAC,CAAC,CAAC;IAEJ,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,8EAA8E;IAC9E,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC;IAE3B,yEAAyE;IACzE,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IAC1G,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAExB,wEAAwE;IACxE,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAE9B,eAAe;IACf,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;QAC/C,MAAM,OAAO,GAAG,UAAU,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,0BAA0B;YAC3E,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;YAClC,uBAAuB,EAAE,GAAG,OAAO,OAAO;YAC1C,cAAc,EAAE,GAAG,OAAO,mBAAmB;SAC9C,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI;QACxB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;QACnD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAEzC,oBAAoB;IACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAChF,sDAAsD;QACtD,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAE5C,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QACjH,gBAAgB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjE,gBAAgB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IAChC,KAAK,IAAI,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -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;
|
|
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"}
|
package/dist/kaseki-api-web.js
CHANGED
|
@@ -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:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
--
|
|
14
|
-
--
|
|
15
|
-
--
|
|
16
|
-
--
|
|
17
|
-
--
|
|
18
|
-
|
|
19
|
-
|
|
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
|
|
59
|
+
font: 16px/1.5 var(--font-ui);
|
|
34
60
|
}
|
|
35
61
|
.header-bar {
|
|
36
|
-
background: var(--
|
|
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(
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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:
|
|
130
|
+
background: currentColor;
|
|
75
131
|
flex-shrink: 0;
|
|
76
132
|
}
|
|
133
|
+
.status-indicator::after { content: 'Idle'; }
|
|
77
134
|
.status-indicator.running {
|
|
78
|
-
background:
|
|
79
|
-
|
|
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.
|
|
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 {
|
|
101
|
-
|
|
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(--
|
|
172
|
+
background: var(--surface-low);
|
|
104
173
|
border: 1px solid var(--line);
|
|
105
|
-
border-radius:
|
|
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:
|
|
182
|
+
border-radius: 4px;
|
|
114
183
|
margin: 0;
|
|
115
184
|
padding: var(--space-3);
|
|
116
185
|
}
|
|
117
|
-
legend {
|
|
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 {
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
|
137
|
-
outline:
|
|
138
|
-
|
|
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:
|
|
255
|
+
background: var(--surface);
|
|
161
256
|
border: 1px solid var(--line);
|
|
162
|
-
border-radius:
|
|
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 {
|
|
169
|
-
|
|
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:
|
|
281
|
+
background: var(--surface);
|
|
174
282
|
border: 1px solid var(--line);
|
|
175
|
-
border-radius:
|
|
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:
|
|
185
|
-
border: 1px solid
|
|
186
|
-
border-radius:
|
|
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-
|
|
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:
|
|
197
|
-
|
|
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.
|
|
203
|
-
|
|
204
|
-
|
|
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:
|
|
208
|
-
border: 1px solid
|
|
209
|
-
border-radius:
|
|
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
|
|
217
|
-
color:
|
|
218
|
-
font-
|
|
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
|
-
|
|
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:
|
|
237
|
-
font-
|
|
238
|
-
font-
|
|
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:
|
|
242
|
-
font-
|
|
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:
|
|
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:
|
|
257
|
-
#state {
|
|
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:
|
|
279
|
-
border-bottom:
|
|
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-
|
|
288
|
-
font-
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
transition: color 0.
|
|
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:
|
|
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(--
|
|
315
|
-
color:
|
|
489
|
+
background: var(--surface);
|
|
490
|
+
color: var(--ink);
|
|
316
491
|
padding: var(--space-3);
|
|
317
|
-
border-radius:
|
|
318
|
-
border:
|
|
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:
|
|
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-
|
|
327
|
-
transition:
|
|
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:
|
|
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:
|
|
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:
|
|
340
|
-
height:
|
|
341
|
-
font-
|
|
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
|
|
385
|
-
<button class="health-check-button" data-probe="/ready" type="button">Readiness
|
|
386
|
-
<button class="health-check-button" data-probe="/api/preflight" data-auth="true" type="button">Preflight
|
|
387
|
-
<button class="health-check-button" id="status-check" type="button">Check
|
|
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
|
|
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":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAW1C,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;;;;;;GAQG;AACH,SAAS,oBAAoB;IAC3B,yCAAyC;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpC,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;YAClE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;YACjC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;YACrD,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;YACjC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mCAAmC;QAClE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IAED,+DAA+D;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,YAAoC;IAC7D,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACxD,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,KAAK,SAAS;QACjD,CAAC,CAAC,YAAY,CAAC,OAAO;QACtB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC;IAEzF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,IAAI,CACV,4EAA4E;YAC5E,gEAAgE,CACjE,CAAC;QACF,OAAO;IACT,CAAC;IAED,qCAAqC;IACrC,MAAM,cAAc,GAAG,YAAY,EAAE,OAAO,IAAI,oBAAoB,EAAE,CAAC;IAEvE,MAAM,MAAM,GAAuB;QACjC,GAAG;QACH,WAAW,EAAE,YAAY,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY;QACxF,OAAO,EAAE,cAAc;QACvB,gBAAgB,EAAE,YAAY,EAAE,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,KAAK,CAAC;QACjG,YAAY,EAAE;YACZ,kBAAkB,EAAE;SACrB;QACD,oCAAoC;QACpC,cAAc,EAAE,GAAG;QACnB,kDAAkD;QAClD,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YACpB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,MAAM,CAAC,mBAAmB,EAAE,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,OAAiC;IAChF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC/C,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,KAAgC,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,QAAgB,EAChB,QAA8B,MAAM,EACpC,IAA8B;IAE9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,aAAa,CAAC;QACnB,OAAO;QACP,QAAQ;QACR,KAAK;QACL,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,KAAgE,EAAE;IAE9F,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC;QACb,EAAE,EAAE,MAAM;QACV,KAAK;QACL,QAAQ;QACR,UAAU,EAAE,SAAS;KACtB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAA4B;IAClD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC9D,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/C,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,YAAoB,IAAI;IACxD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -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;
|
|
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,
|
|
173
|
-
|
|
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.
|
|
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",
|