@lark-apaas/devtool-kits 1.2.7 → 1.2.8-alpha.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.
package/dist/index.js CHANGED
@@ -2318,6 +2318,144 @@ function generateUUID() {
2318
2318
  });
2319
2319
  }
2320
2320
  __name(generateUUID, "generateUUID");
2321
+ async function readTriggerList(filePath, trigger, path7, limit, triggerID) {
2322
+ if (!await fileExists(filePath)) {
2323
+ return void 0;
2324
+ }
2325
+ const config = {
2326
+ maxEntriesPerTrace: 10,
2327
+ chunkSize: 64 * 1024
2328
+ };
2329
+ const builders = /* @__PURE__ */ new Map();
2330
+ const completedCalls = [];
2331
+ const createTraceBuilder = /* @__PURE__ */ __name((traceId) => ({
2332
+ traceId,
2333
+ entries: [],
2334
+ method: void 0,
2335
+ path: void 0,
2336
+ startTime: void 0,
2337
+ endTime: void 0,
2338
+ statusCode: void 0,
2339
+ durationMs: void 0,
2340
+ hasCompleted: false
2341
+ }), "createTraceBuilder");
2342
+ const shouldIncludeInCompletedCalls = /* @__PURE__ */ __name((builder) => {
2343
+ const alreadyAdded = completedCalls.some((call) => call.traceId === builder.traceId);
2344
+ if (alreadyAdded) {
2345
+ return false;
2346
+ }
2347
+ const isAutomationTrigger = builder.path?.endsWith(path7);
2348
+ if (!isAutomationTrigger) {
2349
+ return false;
2350
+ }
2351
+ if (trigger && builder.entries.length > 0) {
2352
+ const requestEntry = builder.entries.find((e) => e.request_body?.trigger);
2353
+ if (requestEntry?.request_body?.trigger) {
2354
+ return String(requestEntry.request_body.trigger) === trigger && (triggerID ? requestEntry?.request_body?.triggerID === triggerID : true);
2355
+ }
2356
+ return false;
2357
+ }
2358
+ return true;
2359
+ }, "shouldIncludeInCompletedCalls");
2360
+ const updateBuilderMetadata = /* @__PURE__ */ __name((builder, entry) => {
2361
+ if (entry.method && !builder.method) builder.method = String(entry.method);
2362
+ if (entry.path && !builder.path) builder.path = String(entry.path);
2363
+ builder.entries.push(entry);
2364
+ if (builder.entries.length > config.maxEntriesPerTrace) {
2365
+ builder.entries.shift();
2366
+ }
2367
+ if (shouldIncludeInCompletedCalls(builder)) {
2368
+ completedCalls.push(builder);
2369
+ if (limit && completedCalls.length > limit) {
2370
+ completedCalls.pop();
2371
+ }
2372
+ }
2373
+ }, "updateBuilderMetadata");
2374
+ const handleRequestCompleted = /* @__PURE__ */ __name((builder, entry, message) => {
2375
+ builder.hasCompleted = true;
2376
+ builder.endTime = entry.time;
2377
+ builder.statusCode = extractNumber(message, /status_code:\s*(\d+)/);
2378
+ builder.durationMs = extractNumber(message, /duration_ms:\s*(\d+)/);
2379
+ if (!builder.path && entry.path) {
2380
+ builder.path = String(entry.path);
2381
+ }
2382
+ if (shouldIncludeInCompletedCalls(builder)) {
2383
+ completedCalls.push(builder);
2384
+ if (limit && completedCalls.length > limit) {
2385
+ completedCalls.pop();
2386
+ }
2387
+ }
2388
+ }, "handleRequestCompleted");
2389
+ const processLogEntry = /* @__PURE__ */ __name((entry) => {
2390
+ const { trace_id: traceId, message = "" } = entry;
2391
+ if (!traceId) return;
2392
+ let builder = builders.get(traceId);
2393
+ if (!builder) {
2394
+ builder = createTraceBuilder(traceId);
2395
+ builders.set(traceId, builder);
2396
+ }
2397
+ updateBuilderMetadata(builder, entry);
2398
+ if (!builder.hasCompleted && (message.includes("HTTP request completed") || message.includes("HTTP request failed"))) {
2399
+ handleRequestCompleted(builder, entry, message);
2400
+ }
2401
+ if (message.includes("HTTP request started") && !builder.startTime) {
2402
+ builder.startTime = entry.time;
2403
+ }
2404
+ }, "processLogEntry");
2405
+ const processLine = /* @__PURE__ */ __name((line) => {
2406
+ const entry = parseLogLine2(line);
2407
+ if (entry?.trace_id) {
2408
+ processLogEntry(entry);
2409
+ }
2410
+ }, "processLine");
2411
+ await readFileReverse(filePath, config.chunkSize, processLine);
2412
+ return {
2413
+ page: 1,
2414
+ pageSize: completedCalls.length,
2415
+ totalCalls: completedCalls.length,
2416
+ totalPages: 1,
2417
+ calls: completedCalls.map((builder) => ({
2418
+ traceId: builder.traceId,
2419
+ method: builder.method,
2420
+ path: builder.path,
2421
+ startTime: builder.startTime,
2422
+ endTime: builder.endTime,
2423
+ statusCode: builder.statusCode,
2424
+ durationMs: builder.durationMs,
2425
+ entries: builder.entries.slice().reverse()
2426
+ }))
2427
+ };
2428
+ }
2429
+ __name(readTriggerList, "readTriggerList");
2430
+ async function readTriggerDetail(filePath, path7, instanceID) {
2431
+ const exists = await fileExists(filePath);
2432
+ if (!exists) {
2433
+ return void 0;
2434
+ }
2435
+ const matches = [];
2436
+ const stream = createReadStream(filePath, {
2437
+ encoding: "utf8"
2438
+ });
2439
+ const rl = createInterface({
2440
+ input: stream,
2441
+ crlfDelay: Infinity
2442
+ });
2443
+ for await (const line of rl) {
2444
+ const entry = parseLogLine2(line);
2445
+ if (!entry) continue;
2446
+ const isAutomationTrigger = entry.path?.endsWith(path7);
2447
+ const hasInstanceID = entry.instance_id === instanceID && entry.trigger;
2448
+ if (!isAutomationTrigger || !hasInstanceID) continue;
2449
+ matches.push(entry);
2450
+ }
2451
+ rl.close();
2452
+ stream.close();
2453
+ return {
2454
+ instanceID,
2455
+ entries: matches
2456
+ };
2457
+ }
2458
+ __name(readTriggerDetail, "readTriggerDetail");
2321
2459
 
2322
2460
  // src/middlewares/dev-logs/controller.ts
2323
2461
  function handleNotFound(res, filePath, message = "Log file not found") {
@@ -2437,6 +2575,59 @@ function createGetServerLogsHandler(logDir) {
2437
2575
  };
2438
2576
  }
2439
2577
  __name(createGetServerLogsHandler, "createGetServerLogsHandler");
2578
+ function createGetTriggerListHandler(logDir) {
2579
+ const traceLogPath = join3(logDir, "trace.log");
2580
+ return async (req, res) => {
2581
+ const trigger = typeof req.query.trigger === "string" ? req.query.trigger.trim() : void 0;
2582
+ if (!trigger) {
2583
+ return res.status(400).json({
2584
+ message: "trigger is required"
2585
+ });
2586
+ }
2587
+ const triggerID = typeof req.query.triggerID === "string" ? req.query.triggerID.trim() : void 0;
2588
+ const path7 = typeof req.query.path === "string" ? req.query.path.trim() : "/__innerapi__/automation/invoke";
2589
+ const limit = parseLimit(req.query.limit, 10, 200);
2590
+ try {
2591
+ const result = await readTriggerList(traceLogPath, trigger, path7, limit, triggerID);
2592
+ if (!result) {
2593
+ return handleNotFound(res, traceLogPath);
2594
+ }
2595
+ res.json({
2596
+ file: getRelativePath(traceLogPath),
2597
+ path: path7,
2598
+ ...result
2599
+ });
2600
+ } catch (error) {
2601
+ handleError(res, error, "Failed to read trace log");
2602
+ }
2603
+ };
2604
+ }
2605
+ __name(createGetTriggerListHandler, "createGetTriggerListHandler");
2606
+ function createGetTriggerDetailHandler(logDir) {
2607
+ const traceLogPath = join3(logDir, "server.log");
2608
+ return async (req, res) => {
2609
+ const instanceID = (req.params.instanceID || "").trim();
2610
+ if (!instanceID) {
2611
+ return res.status(400).json({
2612
+ message: "instanceID is required"
2613
+ });
2614
+ }
2615
+ const path7 = typeof req.query.path === "string" ? req.query.path.trim() : "/__innerapi__/automation/invoke";
2616
+ try {
2617
+ const result = await readTriggerDetail(traceLogPath, path7, instanceID);
2618
+ if (!result) {
2619
+ return handleNotFound(res, traceLogPath);
2620
+ }
2621
+ res.json({
2622
+ file: getRelativePath(traceLogPath),
2623
+ ...result
2624
+ });
2625
+ } catch (error) {
2626
+ handleError(res, error, "Failed to read trace log");
2627
+ }
2628
+ };
2629
+ }
2630
+ __name(createGetTriggerDetailHandler, "createGetTriggerDetailHandler");
2440
2631
 
2441
2632
  // src/middlewares/dev-logs/health.controller.ts
2442
2633
  import http2 from "http";
@@ -2513,6 +2704,8 @@ function createDevLogRouter(options = {}) {
2513
2704
  router.get("/trace/recent", createGetRecentTracesHandler(logDir));
2514
2705
  router.get("/files/:fileName", createGetLogFileHandler(logDir));
2515
2706
  router.get("/server-logs", createGetServerLogsHandler(logDir));
2707
+ router.get("/trace/trigger/list", createGetTriggerListHandler(logDir));
2708
+ router.get("/trace/trigger/:instanceID", createGetTriggerDetailHandler(logDir));
2516
2709
  router.get("/health", createHealthCheckHandler());
2517
2710
  return router;
2518
2711
  }
@@ -2539,6 +2732,16 @@ var DEV_LOGS_ROUTES = [
2539
2732
  method: "GET",
2540
2733
  path: "/server-logs",
2541
2734
  description: "Get server logs in ServerLog format (compatible with frontend)"
2735
+ },
2736
+ {
2737
+ method: "GET",
2738
+ path: "/trace/trigger/list",
2739
+ description: "Get trigger list (automation trigger) in trace.log"
2740
+ },
2741
+ {
2742
+ method: "GET",
2743
+ path: "/trace/trigger/:instanceID",
2744
+ description: "Get trigger detail (automation trigger) in trace.log by instanceID"
2542
2745
  }
2543
2746
  ];
2544
2747
  function createDevLogsMiddleware(options = {}) {