@tea-agent/loop-agent 0.26.4 → 0.26.5-beta.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.
@@ -155,7 +155,7 @@ export const frontendImplementationContractSchema = z
155
155
  "not-needed",
156
156
  ]),
157
157
  productionDefaultOff: z.literal(true),
158
- activation: z.string().min(1),
158
+ activation: z.preprocess((value) => (value === "" ? "explicit activation boundary" : value), z.string().min(1)),
159
159
  endpoints: z.array(z
160
160
  .object({
161
161
  method: z.enum([
@@ -168,7 +168,10 @@ export const frontendImplementationContractSchema = z
168
168
  "OPTIONS",
169
169
  ]),
170
170
  path: z.string().startsWith("/"),
171
- fixture: safePath.optional(),
171
+ // Models occasionally emit an empty fixture when Mock is
172
+ // intentionally not needed. Treat it like an omitted optional
173
+ // field; active Mock strategies still fail the refinement below.
174
+ fixture: z.preprocess((value) => (value === "" ? undefined : value), safePath.optional()),
172
175
  consumer: safePath.optional(),
173
176
  })
174
177
  .strict()),
@@ -187,7 +190,7 @@ export const frontendImplementationContractSchema = z
187
190
  type: z.enum(["static", "unit", "component", "integration", "mock"]),
188
191
  commandLabel: z.string().min(1),
189
192
  file: safePath,
190
- symbol: z.string().min(1).optional(),
193
+ symbol: z.preprocess((value) => (value === "" ? undefined : value), z.string().min(1).optional()),
191
194
  requirementIds: z.array(id),
192
195
  uiStates: z.array(z.string().min(1)),
193
196
  })
@@ -46,7 +46,12 @@ function firstNonEmptyVerdictLine(text) {
46
46
  // The prompt requires VERDICT to be the first non-empty line, but model
47
47
  // output can still prepend a summary. Keep the protocol strict in the
48
48
  // prompt while making the deterministic gate resilient to that drift.
49
- return normalizedLines.find((line) => /^VERDICT:/.test(line)) ?? first;
49
+ const verdictLine = normalizedLines.find((line) => /^VERDICT:/.test(line)) ?? first;
50
+ if (/^VERDICT:\s*pass(?:\s*[.!?。!?]|\s+|$)/i.test(verdictLine))
51
+ return "VERDICT: pass";
52
+ if (/^VERDICT:\s*request-revision(?:\s*[.!?。!?]|\s+|$)/i.test(verdictLine))
53
+ return "VERDICT: request-revision";
54
+ return verdictLine;
50
55
  }
51
56
  function eventArgs(event) {
52
57
  return event.args ?? event.toolInput ?? event.input ?? {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tea-agent/loop-agent",
3
- "version": "0.26.4",
3
+ "version": "0.26.5-beta.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "loop-agent": "bin/loop-agent.js",