agent-inspect 3.2.0 → 3.4.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.
@@ -580,6 +580,108 @@ function createRunDurationRule(options) {
580
580
  }
581
581
  };
582
582
  }
583
+ function createMaxStepDurationRule(options) {
584
+ return {
585
+ id: "run.maxStepDuration",
586
+ category: "run",
587
+ defaultSeverity: "error",
588
+ evaluate(context) {
589
+ const over = context.events.filter((event) => {
590
+ const duration = eventDurationMs(event);
591
+ return duration !== void 0 && duration > options.maxDurationMs;
592
+ });
593
+ if (over.length === 0) return [];
594
+ return [
595
+ failFinding(
596
+ "run.maxStepDuration",
597
+ `${over.length} step(s) exceeded max duration ${options.maxDurationMs}ms.`,
598
+ over.map((event) => eventEvidence(event, "durationMs")),
599
+ { maxDurationMs: options.maxDurationMs },
600
+ over.map((event) => ({
601
+ eventId: event.eventId,
602
+ name: event.name,
603
+ durationMs: eventDurationMs(event)
604
+ }))
605
+ )
606
+ ];
607
+ }
608
+ };
609
+ }
610
+ function createStallDetectionRule(options = {}) {
611
+ const requireEndedAt = options.requireEndedAt === true;
612
+ return {
613
+ id: "run.stall",
614
+ category: "run",
615
+ defaultSeverity: "warning",
616
+ evaluate(context) {
617
+ const findings = [];
618
+ const running = context.events.filter((event) => event.status === "running");
619
+ if (running.length > 0) {
620
+ findings.push(
621
+ failFinding(
622
+ "run.stall",
623
+ `Found ${running.length} event(s) still running (possible stall).`,
624
+ running.map((event) => eventEvidence(event, "status")),
625
+ "no running events",
626
+ running.length
627
+ )
628
+ );
629
+ }
630
+ if (requireEndedAt) {
631
+ const incomplete = context.events.filter(
632
+ (event) => event.startedAt !== void 0 && event.endedAt === void 0 && event.status !== "running"
633
+ );
634
+ if (incomplete.length > 0) {
635
+ findings.push(
636
+ failFinding(
637
+ "run.stall",
638
+ `Found ${incomplete.length} started event(s) without endedAt.`,
639
+ incomplete.map((event) => eventEvidence(event, "endedAt")),
640
+ "endedAt for started events",
641
+ incomplete.length
642
+ )
643
+ );
644
+ }
645
+ }
646
+ return findings;
647
+ }
648
+ };
649
+ }
650
+ function createRequireCompletedRule() {
651
+ return {
652
+ id: "run.requireCompleted",
653
+ category: "run",
654
+ defaultSeverity: "error",
655
+ evaluate(context) {
656
+ const findings = [];
657
+ const runStatus = context.selectedRun?.status;
658
+ if (runStatus === "running") {
659
+ findings.push(
660
+ failFinding(
661
+ "run.requireCompleted",
662
+ "Run is still running.",
663
+ runEvidence(context.selectedRun),
664
+ "completed run",
665
+ runStatus
666
+ )
667
+ );
668
+ }
669
+ const running = context.events.filter((event) => event.status === "running");
670
+ if (running.length > 0) {
671
+ findings.push(
672
+ failFinding(
673
+ "run.requireCompleted",
674
+ `Run has ${running.length} incomplete running event(s).`,
675
+ running.map((event) => eventEvidence(event, "status")),
676
+ "no running events",
677
+ running.length
678
+ )
679
+ );
680
+ }
681
+ return findings;
682
+ }
683
+ };
684
+ }
583
685
  function createRunEventCountRule(options) {
584
686
  return {
585
687
  id: "run.eventCount",
@@ -1513,6 +1615,8 @@ exports.createBaselineRegressionRule = createBaselineRegressionRule;
1513
1615
  exports.createDecisionRule = createDecisionRule;
1514
1616
  exports.createGuardrailRule = createGuardrailRule;
1515
1617
  exports.createLlmUsageRule = createLlmUsageRule;
1618
+ exports.createMaxStepDurationRule = createMaxStepDurationRule;
1619
+ exports.createRequireCompletedRule = createRequireCompletedRule;
1516
1620
  exports.createRetrievalRule = createRetrievalRule;
1517
1621
  exports.createRunDepthRule = createRunDepthRule;
1518
1622
  exports.createRunDurationRule = createRunDurationRule;
@@ -1522,6 +1626,7 @@ exports.createSafetyOversizedAttributeRule = createSafetyOversizedAttributeRule;
1522
1626
  exports.createSafetyRawContentRule = createSafetyRawContentRule;
1523
1627
  exports.createSafetyRedactionRule = createSafetyRedactionRule;
1524
1628
  exports.createSafetySecretPatternRule = createSafetySecretPatternRule;
1629
+ exports.createStallDetectionRule = createStallDetectionRule;
1525
1630
  exports.createStructureCycleRule = createStructureCycleRule;
1526
1631
  exports.createStructureIncompleteRule = createStructureIncompleteRule;
1527
1632
  exports.createStructureOrphanRule = createStructureOrphanRule;