@bluecopa/harness 0.1.0-snapshot.103 → 0.1.0-snapshot.105
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/arc/app-adapter.d.ts +1 -1
- package/dist/arc/app-adapter.js +11 -1
- package/dist/arc/app-adapter.js.map +1 -1
- package/dist/arc/create-arc-agent.d.ts +1 -1
- package/dist/arc/create-arc-agent.js +147 -6
- package/dist/arc/create-arc-agent.js.map +1 -1
- package/dist/arc/profile-builder.d.ts +1 -1
- package/dist/arc/profile-builder.js +1 -0
- package/dist/arc/profile-builder.js.map +1 -1
- package/dist/loop/vercel-agent-loop.d.ts +1 -1
- package/dist/loop/vercel-agent-loop.js.map +1 -1
- package/dist/{types-BV-E1pvS.d.ts → types-C6i8K9rZ.d.ts} +50 -0
- package/package.json +1 -1
package/dist/arc/app-adapter.js
CHANGED
|
@@ -27,6 +27,13 @@ function cleanProcessSummary(summary) {
|
|
|
27
27
|
function formatArcAppProcessSummary(summary) {
|
|
28
28
|
return cleanProcessSummary(summary);
|
|
29
29
|
}
|
|
30
|
+
function formatValidationSuffix(event) {
|
|
31
|
+
if (!event.validation || event.validation.status === "fulfilled") {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
const reason = event.validation.reasons[0] ?? "validation not satisfied";
|
|
35
|
+
return `Validation ${event.validation.status}: ${reason}`;
|
|
36
|
+
}
|
|
30
37
|
function createEmptyArcAppRunStats() {
|
|
31
38
|
return {
|
|
32
39
|
tools: 0,
|
|
@@ -200,7 +207,10 @@ var ArcAppAdapter = class {
|
|
|
200
207
|
status: "completed"
|
|
201
208
|
});
|
|
202
209
|
}
|
|
203
|
-
const
|
|
210
|
+
const summaryText = formatArcAppProcessSummary(event.summary);
|
|
211
|
+
const validationText = formatValidationSuffix(event);
|
|
212
|
+
const display = validationText ? `${summaryText}
|
|
213
|
+
${validationText}` : summaryText;
|
|
204
214
|
this.emit(withDefined({
|
|
205
215
|
type: "process_summary",
|
|
206
216
|
id: event.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/arc/app-adapter.ts"],"names":[],"mappings":";AAgEA,SAAS,WAAW,KAAA,EAAiC;AACnD,EAAA,OAAO;AAAA,IACL,cAAc,KAAA,CAAM,YAAA;AAAA,IACpB,SAAA,EAAW,EAAE,GAAG,KAAA,CAAM,SAAA,EAAU;AAAA,IAChC,eAAA,EAAiB,EAAE,GAAG,KAAA,CAAM,eAAA,EAAgB;AAAA,IAC5C,QAAA,EAAU,EAAE,GAAG,KAAA,CAAM,QAAA;AAAS,GAChC;AACF;AAEA,SAAS,YAA+C,KAAA,EAAa;AACnE,EAAA,OAAO,MAAA,CAAO,WAAA;AAAA,IACZ,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAS;AAAA,GACjE;AACF;AAEA,SAAS,oBAAoB,OAAA,EAAyB;AACpD,EAAA,MAAM,KAAA,GAAQ,OAAA,CACX,KAAA,CAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,OAAO,OAAO,CAAA;AAEjB,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,CAAC,SAAS,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA;AACjE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,iBAAA,EAAmB,EAAE,EAAE,IAAA,EAAK;AAAA,EACxD;AAEA,EAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,CAAC,SAAS,CAAC,kEAAA,CAAmE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3H,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA,CACJ,OAAA,CAAQ,kCAAA,EAAoC,EAAE,EAC9C,IAAA,EAAK;AACV;AAEO,SAAS,2BAA2B,OAAA,EAAyB;AAClE,EAAA,OAAO,oBAAoB,OAAO,CAAA;AACpC;AAEO,SAAS,yBAAA,GAA4C;AAC1D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,KAAA,EAAO,CAAA;AAAA,IACP,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa,CAAA;AAAA,IACb,QAAA,EAAU,CAAA;AAAA,IACV,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc;AAAA,GAChB;AACF;AAEO,SAAS,qBAAqB,KAAA,EAA+B;AAClE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,EAAG,MAAM,KAAK,CAAA,KAAA,EAAQ,MAAM,KAAA,KAAU,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,IAClD,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IACjF,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IACrE,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,CAAA,GAAK,EAAA;AAAA,IACjF,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,YAAA,EAAe,KAAA,CAAM,WAAA,KAAgB,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IAC9F,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IACjF,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,GAAA,CAAA,GAAQ,EAAA;AAAA,IAChD,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,KAAA,CAAM,YAAY,CAAA,IAAA,CAAA,GAAS;AAAA,GACrD,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;AAEO,SAAS,qBAAA,CAAsB,OAAuB,OAAA,EAAgC;AAC3F,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,CAAA,IAAK,KAAA,CAAM,aAAa,CAAA,EAAG;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,SAAS,OAAO,CAAA,CAAA;AAAA,IAChB,CAAA,EAAG,MAAM,KAAK,CAAA,KAAA,EAAQ,MAAM,KAAA,KAAU,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,IAClD,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IACjF,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IACrE,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,CAAA,GAAK,EAAA;AAAA,IACjF,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,YAAA,EAAe,KAAA,CAAM,WAAA,KAAgB,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IAC9F,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAA,QAAA,EAAW,KAAA,CAAM,QAAA,KAAa,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAA,GAAK,EAAA;AAAA,IACjF,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,aAAA,CAAA,GAAkB,EAAA;AAAA,IAC1D,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,KAAA,CAAM,YAAY,CAAA,cAAA,CAAA,GAAmB;AAAA,GAC/D,CAAE,OAAO,OAAO,CAAA;AAChB,EAAA,OAAO,CAAA;;AAAA,EAAkB,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACtE;AAEO,SAAS,wBAAA,GAAwC;AACtD,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,IAAA;AAAA,IACd,WAAW,EAAC;AAAA,IACZ,iBAAiB,EAAC;AAAA,IAClB,UAAU,yBAAA;AAA0B,GACtC;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB,KAAA;AAAA,EAEA,SAAA,uBAAgB,GAAA,EAAc;AAAA,EAE9B,eAAuC,EAAC;AAAA,EAExC,qBAA6C,EAAC;AAAA,EAEtD,WAAA,CAAY,YAAA,GAA4B,wBAAA,EAAyB,EAAG;AAClE,IAAA,IAAA,CAAK,KAAA,GAAQ,WAAW,YAAY,CAAA;AAAA,EACtC;AAAA,EAEA,UAAU,QAAA,EAAgC;AACxC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEA,QAAA,GAAwB;AACtB,IAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EAC9B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,wBAAA,EAAyB;AACtC,IAAA,IAAA,CAAK,eAAe,EAAC;AACrB,IAAA,IAAA,CAAK,qBAAqB,EAAC;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,EAC7D;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAQ;AACxC,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,MAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,EAC7D;AAAA,EAEA,WAAW,MAAA,EAAsB;AAC/B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAQ;AACtC,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA;AAC1B,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,MAAM,CAAA,EAAG;AACtC,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,MAAM,CAAA;AACxC,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,QAAgB,IAAA,EAAqE;AAClG,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,MAAA,EAAQ;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,MAAM,CAAA,GAAI,WAAA,CAAY;AAAA,MAC/C,EAAA,EAAI,MAAA;AAAA,MACJ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,YAAA,EAAc,KAAK,GAAA;AAAI,KACxB,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,eAAe,KAAA,EAAmC;AAChD,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,oBAAA;AACH,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,IAAI,WAAA,CAAY;AAAA,UAC3C,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,YAAA,EAAc,KAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA,EAAG,YAAA,IAAgB,IAAA,CAAK,GAAA,EAAI;AAAA,UACvE,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAC3D,QAAA;AAAA,MACF,KAAK,oBAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,IAAI,WAAA,CAAY;AAAA,UAC3C,GAAG,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,UAChC,MAAA,EAAQ,SAAA;AAAA,UACR,MAAM,KAAA,CAAM;AAAA,SACb,CAAA;AACD,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AACjD,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAA,EAAM,kBAAA;AAAA,UACN,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAC3D,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,IAAI,WAAA,CAAY;AAAA,UAC3C,GAAG,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,UAChC,MAAA,EAAQ,SAAA;AAAA,UACR,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AACD,QAAA,IAAI,KAAA,CAAM,KAAA,EAAO,WAAA,IAAe,IAAA,EAAM;AACpC,UAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,WAAA;AAAA,QAChD;AACA,QAAA,IAAI,KAAA,CAAM,KAAA,EAAO,YAAA,IAAgB,IAAA,EAAM;AACrC,UAAA,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,YAAA;AAAA,QACjD;AACA,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AACjD,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAA,EAAM,kBAAA;AAAA,UACN,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,IAAA,EAAM;AAAA,SACP,CAAA;AACD,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,EAAG,CAAA;AACtE,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAC3D,QAAA;AAAA,MACF,KAAK,oBAAA;AACH,QAAA,IAAA,CAAK,sBAAA,CAAuB,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,IAAI,CAAA;AAChD,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAChC,QAAA;AAAA,MACF,KAAK,mBAAA;AACH,QAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,EAAE,CAAA;AACpC,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,EAAG;AAClC,UAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,IAAI,WAAA,CAAY;AAAA,YAC3C,GAAG,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,YAChC,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,MAAM,OAAA,GAAU,0BAAA,CAA2B,KAAA,CAAM,OAAO,CAAA;AACxD,QAAA,IAAA,CAAK,KAAK,WAAA,CAAY;AAAA,UACpB,IAAA,EAAM,iBAAA;AAAA,UACN,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,UACnC,SAAS,KAAA,CAAM,OAAA;AAAA,UACf;AAAA,SACD,CAAgB,CAAA;AACjB,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA;AACpC,QAAA,OAAO,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,KAAA,CAAM,EAAE,CAAA;AAC1C,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAC3D,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAA,EAAM,kBAAA;AAAA,UACN,MAAM,KAAA,CAAM;AAAA,SACb,CAAA;AACD,QAAA;AAAA,MACF,KAAK,gBAAA;AACH,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,EAAE,CAAA;AAAA,QACtC;AACA,QAAA,IAAA,CAAK,KAAK,WAAA,CAAY;AAAA,UACpB,IAAA,EAAM,gBAAA;AAAA,UACN,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,SACvB,CAAgB,CAAA;AACjB,QAAA,IAAA,CAAK,KAAA,CAAM,SAAS,QAAA,IAAY,CAAA;AAChC,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,EAAG,CAAA;AACtE,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA,EAAG;AAClC,YAAA,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,IAAI,WAAA,CAAY;AAAA,cAC3C,GAAG,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,EAAE,CAAA;AAAA,cAChC,MAAA,EAAQ,KAAA,CAAM,KAAA,KAAU,WAAA,GAAc,WAAA,GAAc;AAAA,aACrD,CAAA;AAAA,UACH;AACA,UAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,EAAE,CAAA;AACpC,UAAA,OAAO,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB,KAAA,CAAM,EAAE,CAAA;AAC1C,UAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAO,IAAA,CAAK,QAAA,IAAY,CAAA;AAAA,QAC7D;AACA,QAAA;AAAA,MACF,KAAK,mBAAA;AACH,QAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,EAAE,CAAA;AACpC,QAAA;AAAA,MACF;AACE,QAAA;AAAA;AACJ,EACF;AAAA,EAEQ,KAAK,KAAA,EAA0B;AACrC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,sBAAsB,KAAA,EAA0E;AACtG,IAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,IAAA,IAAI,QAAA,CAAS,SAAS,YAAA,EAAc;AAClC,MAAA,IAAA,CAAK,KAAA,CAAM,SAAS,KAAA,IAAS,CAAA;AAC7B,MAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,KAAA,CAAM,SAAS,QAAA,IAAY,CAAA;AAChC,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,CAAS,IAAA,EAAM,SAAS,CAAA;AACrD,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA,GAAI,OAAA;AAAA,QAChC;AAAA,MACF,CAAA,MAAA,IAAW,QAAA,CAAS,IAAA,KAAS,MAAA,EAAQ;AACnC,QAAA,IAAA,CAAK,KAAA,CAAM,SAAS,KAAA,IAAS,CAAA;AAAA,MAC/B,WAAW,QAAA,CAAS,IAAA,KAAS,MAAA,IAAU,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC/D,QAAA,IAAA,CAAK,KAAA,CAAM,SAAS,QAAA,IAAY,CAAA;AAAA,MAClC,WAAW,QAAA,CAAS,IAAA,KAAS,MAAA,IAAU,QAAA,CAAS,SAAS,OAAA,EAAS;AAChE,QAAA,IAAA,CAAK,KAAA,CAAM,SAAS,WAAA,IAAe,CAAA;AAAA,MACrC;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,IAAA,EAAM,mBAAA;AAAA,QACN,UAAU,WAAA,CAAY;AAAA,UACpB,KAAA,EAAO,OAAA;AAAA,UACP,WAAW,KAAA,CAAM,EAAA;AAAA,UACjB,UAAU,QAAA,CAAS,IAAA;AAAA,UACnB,MAAM,QAAA,CAAS,IAAA;AAAA,UACf,OAAA,EAAS,SAAS,IAAA,KAAS,MAAA,GAAS,aAAa,QAAA,CAAS,IAAA,EAAM,SAAS,CAAA,GAAI,MAAA;AAAA,UAC7E,IAAA,EAAM,QAAA,CAAS,IAAA,KAAS,MAAA,IAAU,SAAS,IAAA,KAAS,OAAA,IAAW,QAAA,CAAS,IAAA,KAAS,MAAA,GAC7E,YAAA,CAAa,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA,GAClC;AAAA,SACL;AAAA,OACF,CAAA;AACD,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,EAAG,CAAA;AACtE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,UAAA,EAAY;AAChC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,KAAA,CAAM,SAAS,QAAA,IAAY,CAAA;AAAA,MAClC;AAEA,MAAA,IAAI,QAAA,CAAS,SAAS,MAAA,EAAQ;AAC5B,QAAA,MAAM,OAAA,GAAU,MAAM,EAAA,GAAM,IAAA,CAAK,aAAa,KAAA,CAAM,EAAE,KAAK,EAAA,GAAM,EAAA;AACjE,QAAA,IAAI,MAAM,EAAA,EAAI;AACZ,UAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA;AAAA,QACnC;AACA,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,IAAA,EAAM,mBAAA;AAAA,UACN,UAAU,WAAA,CAAY;AAAA,YACpB,KAAA,EAAO,KAAA;AAAA,YACP,WAAW,KAAA,CAAM,EAAA;AAAA,YACjB,UAAU,QAAA,CAAS,IAAA;AAAA,YACnB,IAAI,QAAA,CAAS,EAAA;AAAA,YACb,OAAA,EAAS,SAAS,OAAA,IAAW,EAAA;AAAA,YAC7B;AAAA,WACD;AAAA,SACF,CAAA;AAAA,MACH;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,EAAG,CAAA;AAAA,IACxE;AAAA,EACF;AAAA,EAEQ,sBAAA,CAAuB,IAAY,IAAA,EAAoB;AAC7D,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAA,IAAK,EAAE,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAChF,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,sBAAsB,IAAI,CAAA;AACnD,IAAA,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAA,GAAI,IAAA;AAC9B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,sBAAsB,EAAA,EAAI,IAAA,EAAM,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,uBAAuB,EAAA,EAAkB;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,kBAAA,CAAmB,EAAE,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,mBAAmB,EAAE,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,EAAK;AAC/B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,sBAAsB,EAAA,EAAI,IAAA,EAAM,WAAW,CAAA;AAAA,EAC/D;AACF;AAEA,SAAS,YAAA,CAAa,SAA8C,IAAA,EAAwB;AAC1F,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,sBAAsB,MAAA,EAAoD;AACjF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,IAAA,GAAO,MAAA;AAEX,EAAA,WAAS;AACP,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAC5C,IAAA,IAAI,mBAAmB,EAAA,EAAI;AACzB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,EAAE,IAAA,EAAK;AACjD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IACnB;AACA,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,cAAc,CAAA,CAAE,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC7C,EAAA,IAAI,oBAAoB,EAAA,EAAI;AAC1B,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,eAAe,EAAE,IAAA,EAAK;AACrD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,IACtB;AACA,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AACjD,IAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,MAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,aAAA,GAAgB,CAAC,EAAE,IAAA,EAAK;AACvD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MACtB;AACA,MAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,CAAC,EAAE,SAAA,EAAU;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB","file":"app-adapter.js","sourcesContent":["import type { StepUsage } from '../agent/types';\nimport type { ArcEvent } from './types';\n\nexport type ArcAppRunStats = {\n tools: number;\n commands: number;\n reads: number;\n searches: number;\n fileChanges: number;\n failures: number;\n inputTokens: number;\n outputTokens: number;\n};\n\nexport type ArcAppProcessMeta = {\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n step?: number;\n usage?: StepUsage;\n};\n\nexport type ArcAppBackgroundTurn = {\n id: string;\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n};\n\nexport type ArcAppState = {\n activeTurnId: string | null;\n processes: Record<string, ArcAppProcessMeta>;\n backgroundTurns: Record<string, ArcAppBackgroundTurn>;\n runStats: ArcAppRunStats;\n};\n\nexport type ArcAppObservedActivity = {\n phase: 'start' | 'end';\n processId?: string;\n toolName: string;\n args?: Record<string, unknown>;\n ok?: boolean;\n preview?: string;\n command?: string;\n path?: string;\n};\n\nexport type ArcAdapterInputEvent = ArcEvent;\n\nexport type ArcAppEvent =\n | { type: 'state_changed'; state: ArcAppState }\n | { type: 'stats_changed'; stats: ArcAppRunStats }\n | { type: 'activity_observed'; activity: ArcAppObservedActivity }\n | { type: 'assistant_progress'; id?: string; text: string }\n | { type: 'process_progress'; id: string; meta: ArcAppProcessMeta }\n | { type: 'process_summary'; id: string; meta?: ArcAppProcessMeta; summary: string; display: string }\n | { type: 'process_failed'; id?: string; error: string }\n | { type: 'assistant_output'; text: string };\n\ntype Listener = (event: ArcAppEvent) => void;\n\nfunction cloneState(state: ArcAppState): ArcAppState {\n return {\n activeTurnId: state.activeTurnId,\n processes: { ...state.processes },\n backgroundTurns: { ...state.backgroundTurns },\n runStats: { ...state.runStats },\n };\n}\n\nfunction withDefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction cleanProcessSummary(summary: string): string {\n const lines = summary\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n\n const resultLine = lines.find((line) => /^result\\s*:/i.test(line));\n if (resultLine) {\n return resultLine.replace(/^result\\s*:\\s*/i, '').trim();\n }\n\n const firstUsefulLine = lines.find((line) => !/^(action|status|steps|tools used|files read|files modified)\\s*:/i.test(line));\n if (firstUsefulLine) {\n return firstUsefulLine;\n }\n\n return summary\n .replace(/^(action|summary|result)\\s*:\\s*/i, '')\n .trim();\n}\n\nexport function formatArcAppProcessSummary(summary: string): string {\n return cleanProcessSummary(summary);\n}\n\nexport function createEmptyArcAppRunStats(): ArcAppRunStats {\n return {\n tools: 0,\n commands: 0,\n reads: 0,\n searches: 0,\n fileChanges: 0,\n failures: 0,\n inputTokens: 0,\n outputTokens: 0,\n };\n}\n\nexport function formatArcAppRunStats(stats: ArcAppRunStats): string {\n const parts = [\n `${stats.tools} tool${stats.tools === 1 ? '' : 's'}`,\n stats.commands ? `${stats.commands} command${stats.commands === 1 ? '' : 's'}` : '',\n stats.reads ? `${stats.reads} read${stats.reads === 1 ? '' : 's'}` : '',\n stats.searches ? `${stats.searches} search${stats.searches === 1 ? '' : 'es'}` : '',\n stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? '' : 's'}` : '',\n stats.failures ? `${stats.failures} failure${stats.failures === 1 ? '' : 's'}` : '',\n stats.inputTokens ? `${stats.inputTokens} in` : '',\n stats.outputTokens ? `${stats.outputTokens} out` : '',\n ].filter(Boolean);\n return parts.join(' · ');\n}\n\nexport function buildArcAppRunSummary(stats: ArcAppRunStats, modelId: string): string | null {\n if (stats.tools === 0 && stats.failures === 0) {\n return null;\n }\n const parts = [\n `model ${modelId}`,\n `${stats.tools} tool${stats.tools === 1 ? '' : 's'}`,\n stats.commands ? `${stats.commands} command${stats.commands === 1 ? '' : 's'}` : '',\n stats.reads ? `${stats.reads} read${stats.reads === 1 ? '' : 's'}` : '',\n stats.searches ? `${stats.searches} search${stats.searches === 1 ? '' : 'es'}` : '',\n stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? '' : 's'}` : '',\n stats.failures ? `${stats.failures} failure${stats.failures === 1 ? '' : 's'}` : '',\n stats.inputTokens ? `${stats.inputTokens} input tokens` : '',\n stats.outputTokens ? `${stats.outputTokens} output tokens` : '',\n ].filter(Boolean);\n return `Run summary\\n\\n${parts.map((part) => `- ${part}`).join('\\n')}`;\n}\n\nexport function createInitialArcAppState(): ArcAppState {\n return {\n activeTurnId: null,\n processes: {},\n backgroundTurns: {},\n runStats: createEmptyArcAppRunStats(),\n };\n}\n\nexport class ArcAppAdapter {\n private state: ArcAppState;\n\n private listeners = new Set<Listener>();\n\n private bashCommands: Record<string, string> = {};\n\n private processTextBuffers: Record<string, string> = {};\n\n constructor(initialState: ArcAppState = createInitialArcAppState()) {\n this.state = cloneState(initialState);\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getState(): ArcAppState {\n return cloneState(this.state);\n }\n\n reset(): void {\n this.state = createInitialArcAppState();\n this.bashCommands = {};\n this.processTextBuffers = {};\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n beginTurn(turnId: string): void {\n if (this.state.activeTurnId === turnId) return;\n this.state.activeTurnId = turnId;\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n finishTurn(turnId: string): void {\n let changed = false;\n if (this.state.activeTurnId === turnId) {\n this.state.activeTurnId = null;\n changed = true;\n }\n if (this.state.backgroundTurns[turnId]) {\n delete this.state.backgroundTurns[turnId];\n changed = true;\n }\n if (changed) {\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n }\n\n backgroundTurn(turnId: string, meta: { label?: string; profile?: string; model?: string }): boolean {\n if (this.state.activeTurnId !== turnId) {\n return false;\n }\n\n this.state.activeTurnId = null;\n this.state.backgroundTurns[turnId] = withDefined({\n id: turnId,\n label: meta.label,\n profile: meta.profile,\n model: meta.model,\n dispatchedAt: Date.now(),\n }) as ArcAppBackgroundTurn;\n this.emit({ type: 'state_changed', state: this.getState() });\n return true;\n }\n\n handleArcEvent(event: ArcAdapterInputEvent): void {\n switch (event.type) {\n case 'process_dispatched':\n this.state.processes[event.id] = withDefined({\n label: event.label,\n profile: event.profile,\n model: event.model,\n dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now(),\n status: 'pending',\n }) as ArcAppProcessMeta;\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_step_start':\n if (!this.state.processes[event.id]) return;\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'running',\n step: event.step,\n }) as ArcAppProcessMeta;\n const startedMeta = this.state.processes[event.id]!;\n this.emit({\n type: 'process_progress',\n id: event.id,\n meta: startedMeta,\n });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_step_end':\n if (!this.state.processes[event.id]) return;\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'running',\n step: event.step,\n usage: event.usage,\n }) as ArcAppProcessMeta;\n if (event.usage?.inputTokens != null) {\n this.state.runStats.inputTokens = event.usage.inputTokens;\n }\n if (event.usage?.outputTokens != null) {\n this.state.runStats.outputTokens = event.usage.outputTokens;\n }\n const steppedMeta = this.state.processes[event.id]!;\n this.emit({\n type: 'process_progress',\n id: event.id,\n meta: steppedMeta,\n });\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_text_delta':\n this.handleProcessTextDelta(event.id, event.text);\n return;\n case 'process_activity':\n this.handleProcessActivity(event);\n return;\n case 'process_completed':\n this.flushProcessTextBuffer(event.id);\n if (this.state.processes[event.id]) {\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'completed',\n }) as ArcAppProcessMeta;\n }\n const display = formatArcAppProcessSummary(event.summary);\n this.emit(withDefined({\n type: 'process_summary',\n id: event.id,\n meta: this.state.processes[event.id],\n summary: event.summary,\n display,\n }) as ArcAppEvent);\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'done':\n this.emit({\n type: 'assistant_output',\n text: event.output,\n });\n return;\n case 'process_failed':\n if (event.id) {\n this.flushProcessTextBuffer(event.id);\n }\n this.emit(withDefined({\n type: 'process_failed',\n id: event.id,\n error: event.error ?? 'unknown error',\n }) as ArcAppEvent);\n this.state.runStats.failures += 1;\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n if (event.id) {\n if (this.state.processes[event.id]) {\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: event.error === 'cancelled' ? 'cancelled' : 'failed',\n }) as ArcAppProcessMeta;\n }\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n return;\n case 'process_cancelled':\n this.flushProcessTextBuffer(event.id);\n return;\n default:\n return;\n }\n }\n\n private emit(event: ArcAppEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n private handleProcessActivity(event: Extract<ArcAdapterInputEvent, { type: 'process_activity' }>): void {\n const activity = event.activity;\n\n if (activity.type === 'tool_start') {\n this.state.runStats.tools += 1;\n if (activity.name === 'Bash') {\n this.state.runStats.commands += 1;\n const command = getArgString(activity.args, 'command');\n if (event.id) {\n this.bashCommands[event.id] = command;\n }\n } else if (activity.name === 'Read') {\n this.state.runStats.reads += 1;\n } else if (activity.name === 'Grep' || activity.name === 'Glob') {\n this.state.runStats.searches += 1;\n } else if (activity.name === 'Edit' || activity.name === 'Write') {\n this.state.runStats.fileChanges += 1;\n }\n\n this.emit({\n type: 'activity_observed',\n activity: withDefined({\n phase: 'start',\n processId: event.id,\n toolName: activity.name,\n args: activity.args,\n command: activity.name === 'Bash' ? getArgString(activity.args, 'command') : undefined,\n path: activity.name === 'Read' || activity.name === 'Write' || activity.name === 'Edit'\n ? getArgString(activity.args, 'path')\n : undefined,\n }) as ArcAppObservedActivity,\n });\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n return;\n }\n\n if (activity.type === 'tool_end') {\n if (!activity.ok) {\n this.state.runStats.failures += 1;\n }\n\n if (activity.name === 'Bash') {\n const command = event.id ? (this.bashCommands[event.id] ?? '') : '';\n if (event.id) {\n delete this.bashCommands[event.id];\n }\n this.emit({\n type: 'activity_observed',\n activity: withDefined({\n phase: 'end',\n processId: event.id,\n toolName: activity.name,\n ok: activity.ok,\n preview: activity.preview ?? '',\n command,\n }) as ArcAppObservedActivity,\n });\n }\n\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n }\n }\n\n private handleProcessTextDelta(id: string, text: string): void {\n const next = `${this.processTextBuffers[id] ?? ''}${text}`.replace(/\\r\\n/g, '\\n');\n const { blocks, rest } = extractProgressBlocks(next);\n this.processTextBuffers[id] = rest;\n for (const block of blocks) {\n this.emit({ type: 'assistant_progress', id, text: block });\n }\n }\n\n private flushProcessTextBuffer(id: string): void {\n const pending = this.processTextBuffers[id];\n if (!pending) {\n return;\n }\n delete this.processTextBuffers[id];\n const finalText = pending.trim();\n if (!finalText) {\n return;\n }\n this.emit({ type: 'assistant_progress', id, text: finalText });\n }\n}\n\nfunction getArgString(args: Record<string, unknown> | undefined, ...keys: string[]): string {\n for (const key of keys) {\n const value = args?.[key];\n if (typeof value === 'string') {\n return value;\n }\n }\n return '';\n}\n\nfunction extractProgressBlocks(buffer: string): { blocks: string[]; rest: string } {\n const blocks: string[] = [];\n let rest = buffer;\n\n for (;;) {\n const paragraphBreak = rest.search(/\\n\\s*\\n/);\n if (paragraphBreak === -1) {\n break;\n }\n const block = rest.slice(0, paragraphBreak).trim();\n if (block) {\n blocks.push(block);\n }\n rest = rest.slice(paragraphBreak).replace(/^\\n\\s*\\n+/, '');\n }\n\n const trailingNewline = rest.lastIndexOf('\\n');\n if (trailingNewline !== -1) {\n const complete = rest.slice(0, trailingNewline).trim();\n if (complete) {\n blocks.push(complete);\n }\n rest = rest.slice(trailingNewline + 1);\n }\n\n if (rest.length > 220) {\n const sentenceBreak = rest.search(/[.!?](?:\\s|$)/);\n if (sentenceBreak !== -1) {\n const sentence = rest.slice(0, sentenceBreak + 1).trim();\n if (sentence) {\n blocks.push(sentence);\n }\n rest = rest.slice(sentenceBreak + 1).trimStart();\n }\n }\n\n return { blocks, rest };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/arc/app-adapter.ts"],"names":[],"mappings":"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","file":"app-adapter.js","sourcesContent":["import type { StepUsage } from '../agent/types';\nimport type { ArcEvent } from './types';\n\nexport type ArcAppRunStats = {\n tools: number;\n commands: number;\n reads: number;\n searches: number;\n fileChanges: number;\n failures: number;\n inputTokens: number;\n outputTokens: number;\n};\n\nexport type ArcAppProcessMeta = {\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n step?: number;\n usage?: StepUsage;\n};\n\nexport type ArcAppBackgroundTurn = {\n id: string;\n label?: string;\n profile?: string;\n model?: string;\n dispatchedAt: number;\n};\n\nexport type ArcAppState = {\n activeTurnId: string | null;\n processes: Record<string, ArcAppProcessMeta>;\n backgroundTurns: Record<string, ArcAppBackgroundTurn>;\n runStats: ArcAppRunStats;\n};\n\nexport type ArcAppObservedActivity = {\n phase: 'start' | 'end';\n processId?: string;\n toolName: string;\n args?: Record<string, unknown>;\n ok?: boolean;\n preview?: string;\n command?: string;\n path?: string;\n};\n\nexport type ArcAdapterInputEvent = ArcEvent;\n\nexport type ArcAppEvent =\n | { type: 'state_changed'; state: ArcAppState }\n | { type: 'stats_changed'; stats: ArcAppRunStats }\n | { type: 'activity_observed'; activity: ArcAppObservedActivity }\n | { type: 'assistant_progress'; id?: string; text: string }\n | { type: 'process_progress'; id: string; meta: ArcAppProcessMeta }\n | { type: 'process_summary'; id: string; meta?: ArcAppProcessMeta; summary: string; display: string }\n | { type: 'process_failed'; id?: string; error: string }\n | { type: 'assistant_output'; text: string };\n\ntype Listener = (event: ArcAppEvent) => void;\n\nfunction cloneState(state: ArcAppState): ArcAppState {\n return {\n activeTurnId: state.activeTurnId,\n processes: { ...state.processes },\n backgroundTurns: { ...state.backgroundTurns },\n runStats: { ...state.runStats },\n };\n}\n\nfunction withDefined<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction cleanProcessSummary(summary: string): string {\n const lines = summary\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n\n const resultLine = lines.find((line) => /^result\\s*:/i.test(line));\n if (resultLine) {\n return resultLine.replace(/^result\\s*:\\s*/i, '').trim();\n }\n\n const firstUsefulLine = lines.find((line) => !/^(action|status|steps|tools used|files read|files modified)\\s*:/i.test(line));\n if (firstUsefulLine) {\n return firstUsefulLine;\n }\n\n return summary\n .replace(/^(action|summary|result)\\s*:\\s*/i, '')\n .trim();\n}\n\nexport function formatArcAppProcessSummary(summary: string): string {\n return cleanProcessSummary(summary);\n}\n\nfunction formatValidationSuffix(event: Extract<ArcEvent, { type: 'process_completed' }>): string {\n if (!event.validation || event.validation.status === 'fulfilled') {\n return '';\n }\n const reason = event.validation.reasons[0] ?? 'validation not satisfied';\n return `Validation ${event.validation.status}: ${reason}`;\n}\n\nexport function createEmptyArcAppRunStats(): ArcAppRunStats {\n return {\n tools: 0,\n commands: 0,\n reads: 0,\n searches: 0,\n fileChanges: 0,\n failures: 0,\n inputTokens: 0,\n outputTokens: 0,\n };\n}\n\nexport function formatArcAppRunStats(stats: ArcAppRunStats): string {\n const parts = [\n `${stats.tools} tool${stats.tools === 1 ? '' : 's'}`,\n stats.commands ? `${stats.commands} command${stats.commands === 1 ? '' : 's'}` : '',\n stats.reads ? `${stats.reads} read${stats.reads === 1 ? '' : 's'}` : '',\n stats.searches ? `${stats.searches} search${stats.searches === 1 ? '' : 'es'}` : '',\n stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? '' : 's'}` : '',\n stats.failures ? `${stats.failures} failure${stats.failures === 1 ? '' : 's'}` : '',\n stats.inputTokens ? `${stats.inputTokens} in` : '',\n stats.outputTokens ? `${stats.outputTokens} out` : '',\n ].filter(Boolean);\n return parts.join(' · ');\n}\n\nexport function buildArcAppRunSummary(stats: ArcAppRunStats, modelId: string): string | null {\n if (stats.tools === 0 && stats.failures === 0) {\n return null;\n }\n const parts = [\n `model ${modelId}`,\n `${stats.tools} tool${stats.tools === 1 ? '' : 's'}`,\n stats.commands ? `${stats.commands} command${stats.commands === 1 ? '' : 's'}` : '',\n stats.reads ? `${stats.reads} read${stats.reads === 1 ? '' : 's'}` : '',\n stats.searches ? `${stats.searches} search${stats.searches === 1 ? '' : 'es'}` : '',\n stats.fileChanges ? `${stats.fileChanges} file change${stats.fileChanges === 1 ? '' : 's'}` : '',\n stats.failures ? `${stats.failures} failure${stats.failures === 1 ? '' : 's'}` : '',\n stats.inputTokens ? `${stats.inputTokens} input tokens` : '',\n stats.outputTokens ? `${stats.outputTokens} output tokens` : '',\n ].filter(Boolean);\n return `Run summary\\n\\n${parts.map((part) => `- ${part}`).join('\\n')}`;\n}\n\nexport function createInitialArcAppState(): ArcAppState {\n return {\n activeTurnId: null,\n processes: {},\n backgroundTurns: {},\n runStats: createEmptyArcAppRunStats(),\n };\n}\n\nexport class ArcAppAdapter {\n private state: ArcAppState;\n\n private listeners = new Set<Listener>();\n\n private bashCommands: Record<string, string> = {};\n\n private processTextBuffers: Record<string, string> = {};\n\n constructor(initialState: ArcAppState = createInitialArcAppState()) {\n this.state = cloneState(initialState);\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getState(): ArcAppState {\n return cloneState(this.state);\n }\n\n reset(): void {\n this.state = createInitialArcAppState();\n this.bashCommands = {};\n this.processTextBuffers = {};\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n beginTurn(turnId: string): void {\n if (this.state.activeTurnId === turnId) return;\n this.state.activeTurnId = turnId;\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n\n finishTurn(turnId: string): void {\n let changed = false;\n if (this.state.activeTurnId === turnId) {\n this.state.activeTurnId = null;\n changed = true;\n }\n if (this.state.backgroundTurns[turnId]) {\n delete this.state.backgroundTurns[turnId];\n changed = true;\n }\n if (changed) {\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n }\n\n backgroundTurn(turnId: string, meta: { label?: string; profile?: string; model?: string }): boolean {\n if (this.state.activeTurnId !== turnId) {\n return false;\n }\n\n this.state.activeTurnId = null;\n this.state.backgroundTurns[turnId] = withDefined({\n id: turnId,\n label: meta.label,\n profile: meta.profile,\n model: meta.model,\n dispatchedAt: Date.now(),\n }) as ArcAppBackgroundTurn;\n this.emit({ type: 'state_changed', state: this.getState() });\n return true;\n }\n\n handleArcEvent(event: ArcAdapterInputEvent): void {\n switch (event.type) {\n case 'process_dispatched':\n this.state.processes[event.id] = withDefined({\n label: event.label,\n profile: event.profile,\n model: event.model,\n dispatchedAt: this.state.processes[event.id]?.dispatchedAt ?? Date.now(),\n status: 'pending',\n }) as ArcAppProcessMeta;\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_step_start':\n if (!this.state.processes[event.id]) return;\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'running',\n step: event.step,\n }) as ArcAppProcessMeta;\n const startedMeta = this.state.processes[event.id]!;\n this.emit({\n type: 'process_progress',\n id: event.id,\n meta: startedMeta,\n });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_step_end':\n if (!this.state.processes[event.id]) return;\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'running',\n step: event.step,\n usage: event.usage,\n }) as ArcAppProcessMeta;\n if (event.usage?.inputTokens != null) {\n this.state.runStats.inputTokens = event.usage.inputTokens;\n }\n if (event.usage?.outputTokens != null) {\n this.state.runStats.outputTokens = event.usage.outputTokens;\n }\n const steppedMeta = this.state.processes[event.id]!;\n this.emit({\n type: 'process_progress',\n id: event.id,\n meta: steppedMeta,\n });\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'process_text_delta':\n this.handleProcessTextDelta(event.id, event.text);\n return;\n case 'process_activity':\n this.handleProcessActivity(event);\n return;\n case 'process_completed':\n this.flushProcessTextBuffer(event.id);\n if (this.state.processes[event.id]) {\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: 'completed',\n }) as ArcAppProcessMeta;\n }\n const summaryText = formatArcAppProcessSummary(event.summary);\n const validationText = formatValidationSuffix(event);\n const display = validationText ? `${summaryText}\\n${validationText}` : summaryText;\n this.emit(withDefined({\n type: 'process_summary',\n id: event.id,\n meta: this.state.processes[event.id],\n summary: event.summary,\n display,\n }) as ArcAppEvent);\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n return;\n case 'done':\n this.emit({\n type: 'assistant_output',\n text: event.output,\n });\n return;\n case 'process_failed':\n if (event.id) {\n this.flushProcessTextBuffer(event.id);\n }\n this.emit(withDefined({\n type: 'process_failed',\n id: event.id,\n error: event.error ?? 'unknown error',\n }) as ArcAppEvent);\n this.state.runStats.failures += 1;\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n if (event.id) {\n if (this.state.processes[event.id]) {\n this.state.processes[event.id] = withDefined({\n ...this.state.processes[event.id],\n status: event.error === 'cancelled' ? 'cancelled' : 'failed',\n }) as ArcAppProcessMeta;\n }\n delete this.state.processes[event.id];\n delete this.state.backgroundTurns[event.id];\n this.emit({ type: 'state_changed', state: this.getState() });\n }\n return;\n case 'process_cancelled':\n this.flushProcessTextBuffer(event.id);\n return;\n default:\n return;\n }\n }\n\n private emit(event: ArcAppEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n private handleProcessActivity(event: Extract<ArcAdapterInputEvent, { type: 'process_activity' }>): void {\n const activity = event.activity;\n\n if (activity.type === 'tool_start') {\n this.state.runStats.tools += 1;\n if (activity.name === 'Bash') {\n this.state.runStats.commands += 1;\n const command = getArgString(activity.args, 'command');\n if (event.id) {\n this.bashCommands[event.id] = command;\n }\n } else if (activity.name === 'Read') {\n this.state.runStats.reads += 1;\n } else if (activity.name === 'Grep' || activity.name === 'Glob') {\n this.state.runStats.searches += 1;\n } else if (activity.name === 'Edit' || activity.name === 'Write') {\n this.state.runStats.fileChanges += 1;\n }\n\n this.emit({\n type: 'activity_observed',\n activity: withDefined({\n phase: 'start',\n processId: event.id,\n toolName: activity.name,\n args: activity.args,\n command: activity.name === 'Bash' ? getArgString(activity.args, 'command') : undefined,\n path: activity.name === 'Read' || activity.name === 'Write' || activity.name === 'Edit'\n ? getArgString(activity.args, 'path')\n : undefined,\n }) as ArcAppObservedActivity,\n });\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n return;\n }\n\n if (activity.type === 'tool_end') {\n if (!activity.ok) {\n this.state.runStats.failures += 1;\n }\n\n if (activity.name === 'Bash') {\n const command = event.id ? (this.bashCommands[event.id] ?? '') : '';\n if (event.id) {\n delete this.bashCommands[event.id];\n }\n this.emit({\n type: 'activity_observed',\n activity: withDefined({\n phase: 'end',\n processId: event.id,\n toolName: activity.name,\n ok: activity.ok,\n preview: activity.preview ?? '',\n command,\n }) as ArcAppObservedActivity,\n });\n }\n\n this.emit({ type: 'stats_changed', stats: { ...this.state.runStats } });\n }\n }\n\n private handleProcessTextDelta(id: string, text: string): void {\n const next = `${this.processTextBuffers[id] ?? ''}${text}`.replace(/\\r\\n/g, '\\n');\n const { blocks, rest } = extractProgressBlocks(next);\n this.processTextBuffers[id] = rest;\n for (const block of blocks) {\n this.emit({ type: 'assistant_progress', id, text: block });\n }\n }\n\n private flushProcessTextBuffer(id: string): void {\n const pending = this.processTextBuffers[id];\n if (!pending) {\n return;\n }\n delete this.processTextBuffers[id];\n const finalText = pending.trim();\n if (!finalText) {\n return;\n }\n this.emit({ type: 'assistant_progress', id, text: finalText });\n }\n}\n\nfunction getArgString(args: Record<string, unknown> | undefined, ...keys: string[]): string {\n for (const key of keys) {\n const value = args?.[key];\n if (typeof value === 'string') {\n return value;\n }\n }\n return '';\n}\n\nfunction extractProgressBlocks(buffer: string): { blocks: string[]; rest: string } {\n const blocks: string[] = [];\n let rest = buffer;\n\n for (;;) {\n const paragraphBreak = rest.search(/\\n\\s*\\n/);\n if (paragraphBreak === -1) {\n break;\n }\n const block = rest.slice(0, paragraphBreak).trim();\n if (block) {\n blocks.push(block);\n }\n rest = rest.slice(paragraphBreak).replace(/^\\n\\s*\\n+/, '');\n }\n\n const trailingNewline = rest.lastIndexOf('\\n');\n if (trailingNewline !== -1) {\n const complete = rest.slice(0, trailingNewline).trim();\n if (complete) {\n blocks.push(complete);\n }\n rest = rest.slice(trailingNewline + 1);\n }\n\n if (rest.length > 220) {\n const sentenceBreak = rest.search(/[.!?](?:\\s|$)/);\n if (sentenceBreak !== -1) {\n const sentence = rest.slice(0, sentenceBreak + 1).trim();\n if (sentence) {\n blocks.push(sentence);\n }\n rest = rest.slice(sentenceBreak + 1).trimStart();\n }\n }\n\n return { blocks, rest };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ArcLoopConfig, b as AgentMessage, A as ArcEvent, c as ArcRunResult, T as TraceEvent } from '../types-
|
|
1
|
+
import { a as ArcLoopConfig, b as AgentMessage, A as ArcEvent, c as ArcRunResult, T as TraceEvent } from '../types-C6i8K9rZ.js';
|
|
2
2
|
import 'zod';
|
|
3
3
|
import 'ai';
|
|
4
4
|
|
|
@@ -208,6 +208,12 @@ var Thread = tool({
|
|
|
208
208
|
model: z.enum(["fast", "medium", "strong"]).optional().describe("Model tier (default: medium)"),
|
|
209
209
|
maxSteps: z.number().optional().describe("Max tool-call steps"),
|
|
210
210
|
label: z.string().optional().describe("Human-readable label"),
|
|
211
|
+
validation: z.object({
|
|
212
|
+
outcome: z.enum(["read", "edit", "answer", "verify"]).optional().describe("Observable result type expected from this thread."),
|
|
213
|
+
outputFormat: z.enum(["plain_text", "json"]).optional().describe("Expected final output format."),
|
|
214
|
+
expectedFiles: z.array(z.string()).optional().describe("Files the thread is expected to read or modify."),
|
|
215
|
+
expectedCommands: z.array(z.string()).optional().describe("Commands the thread is expected to run, such as build or typecheck.")
|
|
216
|
+
}).optional().describe("Observable validation expectations for the thread result."),
|
|
211
217
|
profile: z.string().optional().describe('Named process profile (e.g. "readonly", "generalist")')
|
|
212
218
|
})
|
|
213
219
|
});
|
|
@@ -1111,6 +1117,19 @@ function extractFilesModified(messages) {
|
|
|
1111
1117
|
}
|
|
1112
1118
|
return [...paths];
|
|
1113
1119
|
}
|
|
1120
|
+
function extractCommandsRun(messages) {
|
|
1121
|
+
const commands = [];
|
|
1122
|
+
for (const msg of messages) {
|
|
1123
|
+
if (msg.role === "assistant" && msg.toolCalls) {
|
|
1124
|
+
for (const tc of msg.toolCalls) {
|
|
1125
|
+
if (tc.toolName === "Bash" && typeof tc.args.command === "string") {
|
|
1126
|
+
commands.push(String(tc.args.command));
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
return commands;
|
|
1132
|
+
}
|
|
1114
1133
|
function countSteps(messages) {
|
|
1115
1134
|
return messages.filter((m) => m.role === "assistant" && m.toolCalls && m.toolCalls.length > 0).length;
|
|
1116
1135
|
}
|
|
@@ -1255,6 +1274,88 @@ var EpisodeCompressor = class {
|
|
|
1255
1274
|
}
|
|
1256
1275
|
};
|
|
1257
1276
|
|
|
1277
|
+
// src/arc/process-validator.ts
|
|
1278
|
+
function includesPathMatch(values, expected) {
|
|
1279
|
+
return values.some((value) => value === expected || value.endsWith(`/${expected}`));
|
|
1280
|
+
}
|
|
1281
|
+
function includesCommandMatch(commands, expected) {
|
|
1282
|
+
const normalized = expected.trim().toLowerCase();
|
|
1283
|
+
return commands.some((command) => command.toLowerCase().includes(normalized));
|
|
1284
|
+
}
|
|
1285
|
+
function collectObservedFacts(messages, episode) {
|
|
1286
|
+
return {
|
|
1287
|
+
toolNames: extractToolNames(messages),
|
|
1288
|
+
filesRead: episode.filesRead,
|
|
1289
|
+
filesModified: episode.filesModified,
|
|
1290
|
+
commandsRun: extractCommandsRun(messages),
|
|
1291
|
+
finalOutput: extractFinalOutput(messages),
|
|
1292
|
+
...episode.structuredOutput ? { structuredOutput: episode.structuredOutput } : {}
|
|
1293
|
+
};
|
|
1294
|
+
}
|
|
1295
|
+
function validateObservedProcessResult(request, facts) {
|
|
1296
|
+
if (!request.validation) {
|
|
1297
|
+
return null;
|
|
1298
|
+
}
|
|
1299
|
+
const reasons = [];
|
|
1300
|
+
const spec = request.validation;
|
|
1301
|
+
const touchedFiles = [.../* @__PURE__ */ new Set([...facts.filesRead, ...facts.filesModified])];
|
|
1302
|
+
if (spec.outcome === "edit" && facts.filesModified.length === 0) {
|
|
1303
|
+
reasons.push("Expected an edit outcome, but no files were modified.");
|
|
1304
|
+
}
|
|
1305
|
+
if (spec.outcome === "read" && touchedFiles.length === 0 && facts.commandsRun.length === 0) {
|
|
1306
|
+
reasons.push("Expected a read outcome, but no files were read and no commands were run.");
|
|
1307
|
+
}
|
|
1308
|
+
if (spec.outcome === "answer" && !facts.finalOutput.trim()) {
|
|
1309
|
+
reasons.push("Expected a direct answer, but the thread produced no final output.");
|
|
1310
|
+
}
|
|
1311
|
+
if (spec.outcome === "verify" && facts.commandsRun.length === 0) {
|
|
1312
|
+
reasons.push("Expected a verification outcome, but no commands were run.");
|
|
1313
|
+
}
|
|
1314
|
+
for (const expectedFile of spec.expectedFiles ?? []) {
|
|
1315
|
+
if (!includesPathMatch(touchedFiles, expectedFile) && !facts.commandsRun.some((command) => command.includes(expectedFile))) {
|
|
1316
|
+
reasons.push(`Expected file activity for "${expectedFile}", but it was not observed.`);
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
for (const expectedCommand of spec.expectedCommands ?? []) {
|
|
1320
|
+
if (!includesCommandMatch(facts.commandsRun, expectedCommand)) {
|
|
1321
|
+
reasons.push(`Expected command matching "${expectedCommand}", but it was not observed.`);
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
if (spec.outputFormat === "plain_text") {
|
|
1325
|
+
const output = facts.finalOutput.trim();
|
|
1326
|
+
if (!output) {
|
|
1327
|
+
reasons.push("Expected plain-text output, but no final output was produced.");
|
|
1328
|
+
} else {
|
|
1329
|
+
try {
|
|
1330
|
+
JSON.parse(output);
|
|
1331
|
+
reasons.push("Expected plain-text output, but the final output looked like JSON.");
|
|
1332
|
+
} catch {
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
if (spec.outputFormat === "json") {
|
|
1337
|
+
const output = facts.finalOutput.trim();
|
|
1338
|
+
const hasStructured = !!facts.structuredOutput && Object.keys(facts.structuredOutput).length > 0;
|
|
1339
|
+
let parsed = false;
|
|
1340
|
+
if (output) {
|
|
1341
|
+
try {
|
|
1342
|
+
JSON.parse(output);
|
|
1343
|
+
parsed = true;
|
|
1344
|
+
} catch {
|
|
1345
|
+
parsed = false;
|
|
1346
|
+
}
|
|
1347
|
+
}
|
|
1348
|
+
if (!hasStructured && !parsed) {
|
|
1349
|
+
reasons.push("Expected JSON output, but neither structured output nor JSON text was observed.");
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
return {
|
|
1353
|
+
status: reasons.length > 0 ? "incomplete" : "fulfilled",
|
|
1354
|
+
reasons,
|
|
1355
|
+
spec
|
|
1356
|
+
};
|
|
1357
|
+
}
|
|
1358
|
+
|
|
1258
1359
|
// src/arc/utils.ts
|
|
1259
1360
|
function normalizeTools(tools) {
|
|
1260
1361
|
const out = {};
|
|
@@ -1876,9 +1977,7 @@ ${subGuideBlocks}
|
|
|
1876
1977
|
if (result.structuredOutput) {
|
|
1877
1978
|
episode.structuredOutput = result.structuredOutput;
|
|
1878
1979
|
}
|
|
1879
|
-
|
|
1880
|
-
await config.episodeStore.addTrace(trace);
|
|
1881
|
-
const processResult = {
|
|
1980
|
+
const baseProcessResult = {
|
|
1882
1981
|
episode,
|
|
1883
1982
|
trace,
|
|
1884
1983
|
artifacts,
|
|
@@ -1886,6 +1985,30 @@ ${subGuideBlocks}
|
|
|
1886
1985
|
durationMs,
|
|
1887
1986
|
resolvedModel: model
|
|
1888
1987
|
};
|
|
1988
|
+
const facts = collectObservedFacts(result.messages, episode);
|
|
1989
|
+
let validation = validateObservedProcessResult(request, facts);
|
|
1990
|
+
if (config.validateProcessResult) {
|
|
1991
|
+
try {
|
|
1992
|
+
const overridden = await config.validateProcessResult({
|
|
1993
|
+
request,
|
|
1994
|
+
facts,
|
|
1995
|
+
result: baseProcessResult
|
|
1996
|
+
});
|
|
1997
|
+
if (overridden) {
|
|
1998
|
+
validation = overridden;
|
|
1999
|
+
}
|
|
2000
|
+
} catch {
|
|
2001
|
+
}
|
|
2002
|
+
}
|
|
2003
|
+
if (validation) {
|
|
2004
|
+
episode.validation = validation;
|
|
2005
|
+
}
|
|
2006
|
+
await config.episodeStore.addEpisode(episode);
|
|
2007
|
+
await config.episodeStore.addTrace(trace);
|
|
2008
|
+
const processResult = {
|
|
2009
|
+
...baseProcessResult,
|
|
2010
|
+
...validation ? { validation } : {}
|
|
2011
|
+
};
|
|
1889
2012
|
process2.result = processResult;
|
|
1890
2013
|
process2.status = "completed";
|
|
1891
2014
|
outbox.push({ type: "episode", episode });
|
|
@@ -2342,6 +2465,7 @@ var ProcessManager = class {
|
|
|
2342
2465
|
"permissionManager",
|
|
2343
2466
|
"telemetry"
|
|
2344
2467
|
]),
|
|
2468
|
+
...loopConfig.validateProcessResult ? { validateProcessResult: loopConfig.validateProcessResult } : {},
|
|
2345
2469
|
executeToolAction: async (action) => {
|
|
2346
2470
|
if (action.name === "ReadEpisode") {
|
|
2347
2471
|
const allowedEpisodeIds = new Set(request.contextEpisodeIds ?? []);
|
|
@@ -2493,7 +2617,8 @@ var ProcessManager = class {
|
|
|
2493
2617
|
id: proc.id,
|
|
2494
2618
|
episodeId: event.result.episode.id,
|
|
2495
2619
|
summary: event.result.episode.summary,
|
|
2496
|
-
durationMs: event.result.durationMs
|
|
2620
|
+
durationMs: event.result.durationMs,
|
|
2621
|
+
...event.result.validation ? { validation: event.result.validation } : {}
|
|
2497
2622
|
});
|
|
2498
2623
|
} else if (event.type === "failed") {
|
|
2499
2624
|
this.traceProcessRunning(proc.id);
|
|
@@ -2723,7 +2848,8 @@ var OrchestratorTurnRunner = class {
|
|
|
2723
2848
|
if (!proc) {
|
|
2724
2849
|
resultText = `Process not found: ${call.args.id}`;
|
|
2725
2850
|
} else if (proc.result) {
|
|
2726
|
-
|
|
2851
|
+
const validationText = proc.result.validation ? ` fulfillment=${proc.result.validation.status}${proc.result.validation.reasons.length > 0 ? ` (${proc.result.validation.reasons.join("; ")})` : ""}` : "";
|
|
2852
|
+
resultText = `Process ${proc.id} [${proc.status}]${validationText} (episodeId: ${proc.result.episode.id}):
|
|
2727
2853
|
${proc.result.episode.summary}`;
|
|
2728
2854
|
} else {
|
|
2729
2855
|
resultText = `Process ${proc.id}: status=${proc.status}`;
|
|
@@ -2823,6 +2949,18 @@ ${proc.result.episode.summary}`;
|
|
|
2823
2949
|
if (typeof args.label === "string") {
|
|
2824
2950
|
req.label = args.label;
|
|
2825
2951
|
}
|
|
2952
|
+
if (args.validation && typeof args.validation === "object") {
|
|
2953
|
+
const validation = args.validation;
|
|
2954
|
+
const parsedValidation = {
|
|
2955
|
+
...typeof validation.outcome === "string" ? { outcome: validation.outcome } : {},
|
|
2956
|
+
...typeof validation.outputFormat === "string" ? { outputFormat: validation.outputFormat } : {},
|
|
2957
|
+
...Array.isArray(validation.expectedFiles) ? { expectedFiles: validation.expectedFiles.map(String) } : {},
|
|
2958
|
+
...Array.isArray(validation.expectedCommands) ? { expectedCommands: validation.expectedCommands.map(String) } : {}
|
|
2959
|
+
};
|
|
2960
|
+
if (Object.keys(parsedValidation).length > 0) {
|
|
2961
|
+
req.validation = parsedValidation;
|
|
2962
|
+
}
|
|
2963
|
+
}
|
|
2826
2964
|
if (typeof args.profile === "string") {
|
|
2827
2965
|
req.profile = args.profile;
|
|
2828
2966
|
}
|
|
@@ -2873,7 +3011,10 @@ var CompletionPolicy = class {
|
|
|
2873
3011
|
if (!process2.result || this.reportedCompletions.has(id)) continue;
|
|
2874
3012
|
this.reportedCompletions.add(id);
|
|
2875
3013
|
const episode = process2.result.episode;
|
|
2876
|
-
|
|
3014
|
+
let status = process2.result.success ? "success" : `failed: ${process2.result.error ?? "unknown"}`;
|
|
3015
|
+
if (process2.result.validation && process2.result.validation.status !== "fulfilled") {
|
|
3016
|
+
status = `${process2.result.validation.status}: ${process2.result.validation.reasons.join("; ") || "validation not satisfied"}`;
|
|
3017
|
+
}
|
|
2877
3018
|
const deliveredFile = process2.result.trace?.messages?.some(
|
|
2878
3019
|
(message) => message.role === "tool" && message.toolResults?.some(
|
|
2879
3020
|
(toolResult) => toolResult.toolName === "DownloadRawFile" && !toolResult.isError
|