@lark-apaas/devtool-kits 1.2.9-alpha.0 → 1.2.10-alpha.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/index.js CHANGED
@@ -2344,6 +2344,144 @@ function generateUUID() {
2344
2344
  });
2345
2345
  }
2346
2346
  __name(generateUUID, "generateUUID");
2347
+ async function readTriggerList(filePath, trigger, path7, limit, triggerID) {
2348
+ if (!await fileExists(filePath)) {
2349
+ return void 0;
2350
+ }
2351
+ const config = {
2352
+ maxEntriesPerTrace: 10,
2353
+ chunkSize: 64 * 1024
2354
+ };
2355
+ const builders = /* @__PURE__ */ new Map();
2356
+ const completedCalls = [];
2357
+ const createTraceBuilder = /* @__PURE__ */ __name((traceId) => ({
2358
+ traceId,
2359
+ entries: [],
2360
+ method: void 0,
2361
+ path: void 0,
2362
+ startTime: void 0,
2363
+ endTime: void 0,
2364
+ statusCode: void 0,
2365
+ durationMs: void 0,
2366
+ hasCompleted: false
2367
+ }), "createTraceBuilder");
2368
+ const shouldIncludeInCompletedCalls = /* @__PURE__ */ __name((builder) => {
2369
+ const alreadyAdded = completedCalls.some((call) => call.traceId === builder.traceId);
2370
+ if (alreadyAdded) {
2371
+ return false;
2372
+ }
2373
+ const isAutomationTrigger = builder.path?.endsWith(path7);
2374
+ if (!isAutomationTrigger) {
2375
+ return false;
2376
+ }
2377
+ if (trigger && builder.entries.length > 0) {
2378
+ const requestEntry = builder.entries.find((e) => e.request_body?.trigger);
2379
+ if (requestEntry?.request_body?.trigger) {
2380
+ return String(requestEntry.request_body.trigger) === trigger && (triggerID ? requestEntry?.request_body?.triggerID === triggerID : true);
2381
+ }
2382
+ return false;
2383
+ }
2384
+ return true;
2385
+ }, "shouldIncludeInCompletedCalls");
2386
+ const updateBuilderMetadata = /* @__PURE__ */ __name((builder, entry) => {
2387
+ if (entry.method && !builder.method) builder.method = String(entry.method);
2388
+ if (entry.path && !builder.path) builder.path = String(entry.path);
2389
+ builder.entries.push(entry);
2390
+ if (builder.entries.length > config.maxEntriesPerTrace) {
2391
+ builder.entries.shift();
2392
+ }
2393
+ if (shouldIncludeInCompletedCalls(builder)) {
2394
+ completedCalls.push(builder);
2395
+ if (limit && completedCalls.length > limit) {
2396
+ completedCalls.pop();
2397
+ }
2398
+ }
2399
+ }, "updateBuilderMetadata");
2400
+ const handleRequestCompleted = /* @__PURE__ */ __name((builder, entry, message) => {
2401
+ builder.hasCompleted = true;
2402
+ builder.endTime = entry.time;
2403
+ builder.statusCode = extractNumber(message, /status_code:\s*(\d+)/);
2404
+ builder.durationMs = extractNumber(message, /duration_ms:\s*(\d+)/);
2405
+ if (!builder.path && entry.path) {
2406
+ builder.path = String(entry.path);
2407
+ }
2408
+ if (shouldIncludeInCompletedCalls(builder)) {
2409
+ completedCalls.push(builder);
2410
+ if (limit && completedCalls.length > limit) {
2411
+ completedCalls.pop();
2412
+ }
2413
+ }
2414
+ }, "handleRequestCompleted");
2415
+ const processLogEntry = /* @__PURE__ */ __name((entry) => {
2416
+ const { trace_id: traceId, message = "" } = entry;
2417
+ if (!traceId) return;
2418
+ let builder = builders.get(traceId);
2419
+ if (!builder) {
2420
+ builder = createTraceBuilder(traceId);
2421
+ builders.set(traceId, builder);
2422
+ }
2423
+ updateBuilderMetadata(builder, entry);
2424
+ if (!builder.hasCompleted && (message.includes("HTTP request completed") || message.includes("HTTP request failed"))) {
2425
+ handleRequestCompleted(builder, entry, message);
2426
+ }
2427
+ if (message.includes("HTTP request started") && !builder.startTime) {
2428
+ builder.startTime = entry.time;
2429
+ }
2430
+ }, "processLogEntry");
2431
+ const processLine = /* @__PURE__ */ __name((line) => {
2432
+ const entry = parseLogLine2(line);
2433
+ if (entry?.trace_id) {
2434
+ processLogEntry(entry);
2435
+ }
2436
+ }, "processLine");
2437
+ await readFileReverse(filePath, config.chunkSize, processLine);
2438
+ return {
2439
+ page: 1,
2440
+ pageSize: completedCalls.length,
2441
+ totalCalls: completedCalls.length,
2442
+ totalPages: 1,
2443
+ calls: completedCalls.map((builder) => ({
2444
+ traceId: builder.traceId,
2445
+ method: builder.method,
2446
+ path: builder.path,
2447
+ startTime: builder.startTime,
2448
+ endTime: builder.endTime,
2449
+ statusCode: builder.statusCode,
2450
+ durationMs: builder.durationMs,
2451
+ entries: builder.entries.slice().reverse()
2452
+ }))
2453
+ };
2454
+ }
2455
+ __name(readTriggerList, "readTriggerList");
2456
+ async function readTriggerDetail(filePath, path7, instanceID) {
2457
+ const exists = await fileExists(filePath);
2458
+ if (!exists) {
2459
+ return void 0;
2460
+ }
2461
+ const matches = [];
2462
+ const stream = createReadStream(filePath, {
2463
+ encoding: "utf8"
2464
+ });
2465
+ const rl = createInterface({
2466
+ input: stream,
2467
+ crlfDelay: Infinity
2468
+ });
2469
+ for await (const line of rl) {
2470
+ const entry = parseLogLine2(line);
2471
+ if (!entry) continue;
2472
+ const isAutomationTrigger = entry.path?.endsWith(path7);
2473
+ const hasInstanceID = entry.instance_id === instanceID && entry.trigger;
2474
+ if (!isAutomationTrigger || !hasInstanceID) continue;
2475
+ matches.push(entry);
2476
+ }
2477
+ rl.close();
2478
+ stream.close();
2479
+ return {
2480
+ instanceID,
2481
+ entries: matches
2482
+ };
2483
+ }
2484
+ __name(readTriggerDetail, "readTriggerDetail");
2347
2485
 
2348
2486
  // src/middlewares/dev-logs/controller.ts
2349
2487
  function handleNotFound(res, filePath, message = "Log file not found") {
@@ -2463,6 +2601,59 @@ function createGetServerLogsHandler(logDir) {
2463
2601
  };
2464
2602
  }
2465
2603
  __name(createGetServerLogsHandler, "createGetServerLogsHandler");
2604
+ function createGetTriggerListHandler(logDir) {
2605
+ const traceLogPath = join3(logDir, "trace.log");
2606
+ return async (req, res) => {
2607
+ const trigger = typeof req.query.trigger === "string" ? req.query.trigger.trim() : void 0;
2608
+ if (!trigger) {
2609
+ return res.status(400).json({
2610
+ message: "trigger is required"
2611
+ });
2612
+ }
2613
+ const triggerID = typeof req.query.triggerID === "string" ? req.query.triggerID.trim() : void 0;
2614
+ const path7 = typeof req.query.path === "string" ? req.query.path.trim() : "/__innerapi__/automation/invoke";
2615
+ const limit = parseLimit(req.query.limit, 10, 200);
2616
+ try {
2617
+ const result = await readTriggerList(traceLogPath, trigger, path7, limit, triggerID);
2618
+ if (!result) {
2619
+ return handleNotFound(res, traceLogPath);
2620
+ }
2621
+ res.json({
2622
+ file: getRelativePath(traceLogPath),
2623
+ path: path7,
2624
+ ...result
2625
+ });
2626
+ } catch (error) {
2627
+ handleError(res, error, "Failed to read trace log");
2628
+ }
2629
+ };
2630
+ }
2631
+ __name(createGetTriggerListHandler, "createGetTriggerListHandler");
2632
+ function createGetTriggerDetailHandler(logDir) {
2633
+ const traceLogPath = join3(logDir, "server.log");
2634
+ return async (req, res) => {
2635
+ const instanceID = (req.params.instanceID || "").trim();
2636
+ if (!instanceID) {
2637
+ return res.status(400).json({
2638
+ message: "instanceID is required"
2639
+ });
2640
+ }
2641
+ const path7 = typeof req.query.path === "string" ? req.query.path.trim() : "/__innerapi__/automation/invoke";
2642
+ try {
2643
+ const result = await readTriggerDetail(traceLogPath, path7, instanceID);
2644
+ if (!result) {
2645
+ return handleNotFound(res, traceLogPath);
2646
+ }
2647
+ res.json({
2648
+ file: getRelativePath(traceLogPath),
2649
+ ...result
2650
+ });
2651
+ } catch (error) {
2652
+ handleError(res, error, "Failed to read trace log");
2653
+ }
2654
+ };
2655
+ }
2656
+ __name(createGetTriggerDetailHandler, "createGetTriggerDetailHandler");
2466
2657
 
2467
2658
  // src/middlewares/dev-logs/health.controller.ts
2468
2659
  import http2 from "http";
@@ -2539,6 +2730,8 @@ function createDevLogRouter(options = {}) {
2539
2730
  router.get("/trace/recent", createGetRecentTracesHandler(logDir));
2540
2731
  router.get("/files/:fileName", createGetLogFileHandler(logDir));
2541
2732
  router.get("/server-logs", createGetServerLogsHandler(logDir));
2733
+ router.get("/trace/trigger/list", createGetTriggerListHandler(logDir));
2734
+ router.get("/trace/trigger/:instanceID", createGetTriggerDetailHandler(logDir));
2542
2735
  router.get("/health", createHealthCheckHandler());
2543
2736
  return router;
2544
2737
  }
@@ -2565,6 +2758,16 @@ var DEV_LOGS_ROUTES = [
2565
2758
  method: "GET",
2566
2759
  path: "/server-logs",
2567
2760
  description: "Get server logs in ServerLog format (compatible with frontend)"
2761
+ },
2762
+ {
2763
+ method: "GET",
2764
+ path: "/trace/trigger/list",
2765
+ description: "Get trigger list (automation trigger) in trace.log"
2766
+ },
2767
+ {
2768
+ method: "GET",
2769
+ path: "/trace/trigger/:instanceID",
2770
+ description: "Get trigger detail (automation trigger) in trace.log by instanceID"
2568
2771
  }
2569
2772
  ];
2570
2773
  function createDevLogsMiddleware(options = {}) {