agent-inspect 6.7.2 → 6.7.3

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 (39) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -1
  3. package/docs/EXPORTS.md +9 -0
  4. package/docs/PERFORMANCE.md +18 -0
  5. package/docs/STANDARDS.md +4 -0
  6. package/package.json +2 -2
  7. package/packages/cli/dist/{chunk-M6PC5KUT.mjs → chunk-EMYDJREA.mjs} +26 -10
  8. package/packages/cli/dist/chunk-EMYDJREA.mjs.map +1 -0
  9. package/packages/cli/dist/index.cjs +46 -21
  10. package/packages/cli/dist/index.cjs.map +1 -1
  11. package/packages/cli/dist/index.mjs +23 -14
  12. package/packages/cli/dist/index.mjs.map +1 -1
  13. package/packages/cli/dist/{src-27LC2BB3.mjs → src-IPJNFV37.mjs} +3 -3
  14. package/packages/cli/dist/{src-27LC2BB3.mjs.map → src-IPJNFV37.mjs.map} +1 -1
  15. package/packages/core/dist/advanced.cjs +24 -8
  16. package/packages/core/dist/advanced.cjs.map +1 -1
  17. package/packages/core/dist/advanced.mjs +25 -9
  18. package/packages/core/dist/advanced.mjs.map +1 -1
  19. package/packages/core/dist/checks.cjs +56 -4
  20. package/packages/core/dist/checks.cjs.map +1 -1
  21. package/packages/core/dist/checks.mjs +1 -1
  22. package/packages/core/dist/{chunk-EWHN6NA4.mjs → chunk-EQVXDGGU.mjs} +58 -6
  23. package/packages/core/dist/chunk-EQVXDGGU.mjs.map +1 -0
  24. package/packages/core/dist/diff.cjs +4 -0
  25. package/packages/core/dist/diff.cjs.map +1 -1
  26. package/packages/core/dist/diff.mjs +4 -0
  27. package/packages/core/dist/diff.mjs.map +1 -1
  28. package/packages/core/dist/exporters.cjs +9 -4
  29. package/packages/core/dist/exporters.cjs.map +1 -1
  30. package/packages/core/dist/exporters.d.cts +3 -2
  31. package/packages/core/dist/exporters.d.ts +3 -2
  32. package/packages/core/dist/exporters.mjs +9 -4
  33. package/packages/core/dist/exporters.mjs.map +1 -1
  34. package/packages/core/dist/logs.cjs +3 -2
  35. package/packages/core/dist/logs.cjs.map +1 -1
  36. package/packages/core/dist/logs.mjs +3 -2
  37. package/packages/core/dist/logs.mjs.map +1 -1
  38. package/packages/cli/dist/chunk-M6PC5KUT.mjs.map +0 -1
  39. package/packages/core/dist/chunk-EWHN6NA4.mjs.map +0 -1
@@ -77,20 +77,72 @@ function contractFailFinding(ruleId, message, evidence, expected, actual) {
77
77
  };
78
78
  }
79
79
  function normalizeStatus(status) {
80
+ if (status === "ok" || status === "error" || status === "running") return status;
80
81
  if (status === "success") return "ok";
81
82
  if (status === "failed") return "error";
82
- if (status === "running") return "running";
83
83
  return "error";
84
84
  }
85
85
  function contractToRules(contract) {
86
86
  const rules = [];
87
- if (contract.run?.allowedStatuses?.length === 1) {
87
+ const allowedStatuses = contract.run?.allowedStatuses ?? [];
88
+ if (allowedStatuses.length === 1) {
88
89
  rules.push(
89
90
  createRunStatusRule({
90
- expected: normalizeStatus(contract.run.allowedStatuses[0]),
91
- allowIncomplete: contract.run.requireCompleted === false
91
+ expected: normalizeStatus(allowedStatuses[0]),
92
+ allowIncomplete: contract.run?.requireCompleted === false
92
93
  })
93
94
  );
95
+ } else if (allowedStatuses.length > 1) {
96
+ const expected = [...new Set(allowedStatuses.map(normalizeStatus))];
97
+ const allowIncomplete = contract.run?.requireCompleted === false;
98
+ rules.push({
99
+ id: "contract.run.allowedStatuses",
100
+ category: "run",
101
+ defaultSeverity: "error",
102
+ evaluate(context) {
103
+ const findings = [];
104
+ const actual = context.selectedRun?.status ?? "unknown";
105
+ if (!expected.includes(actual)) {
106
+ findings.push(
107
+ contractFailFinding(
108
+ "contract.run.allowedStatuses",
109
+ `Run status ${actual} is not one of the allowed statuses: ${expected.join(", ")}.`,
110
+ context.selectedRun ? [
111
+ {
112
+ runId: context.selectedRun.runId,
113
+ kind: "RUN",
114
+ name: context.selectedRun.name,
115
+ status: context.selectedRun.status
116
+ }
117
+ ] : [],
118
+ expected,
119
+ actual
120
+ )
121
+ );
122
+ }
123
+ if (!allowIncomplete) {
124
+ const running = context.events.filter((event) => event.status === "running");
125
+ if (running.length > 0) {
126
+ findings.push(
127
+ contractFailFinding(
128
+ "contract.run.allowedStatuses",
129
+ "Run contains incomplete running events.",
130
+ running.map((event) => ({
131
+ runId: event.runId,
132
+ eventId: event.eventId,
133
+ kind: event.kind,
134
+ name: event.name,
135
+ status: event.status
136
+ })),
137
+ "no running events",
138
+ running.length
139
+ )
140
+ );
141
+ }
142
+ }
143
+ return findings;
144
+ }
145
+ });
94
146
  } else if (contract.run?.requireCompleted !== false) {
95
147
  rules.push(createRunStatusRule({ allowIncomplete: false }));
96
148
  }