iosm-cli 0.2.4 → 0.2.5
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/CHANGELOG.md +31 -0
- package/README.md +23 -17
- package/dist/core/agent-profiles.d.ts +1 -0
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +10 -6
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +6 -2
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +90 -19
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +6 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +9 -0
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/parallel-task-agent.d.ts +23 -1
- package/dist/core/parallel-task-agent.d.ts.map +1 -1
- package/dist/core/parallel-task-agent.js +110 -20
- package/dist/core/parallel-task-agent.js.map +1 -1
- package/dist/core/shared-memory.d.ts +2 -2
- package/dist/core/shared-memory.d.ts.map +1 -1
- package/dist/core/shared-memory.js +220 -91
- package/dist/core/shared-memory.js.map +1 -1
- package/dist/core/singular.d.ts.map +1 -1
- package/dist/core/singular.js +3 -1
- package/dist/core/singular.js.map +1 -1
- package/dist/core/subagents.d.ts +1 -1
- package/dist/core/subagents.d.ts.map +1 -1
- package/dist/core/subagents.js +11 -3
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/swarm/planner.d.ts.map +1 -1
- package/dist/core/swarm/planner.js +200 -12
- package/dist/core/swarm/planner.js.map +1 -1
- package/dist/core/swarm/scheduler.d.ts +2 -0
- package/dist/core/swarm/scheduler.d.ts.map +1 -1
- package/dist/core/swarm/scheduler.js +87 -6
- package/dist/core/swarm/scheduler.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/ast-grep.d.ts.map +1 -1
- package/dist/core/tools/ast-grep.js +2 -0
- package/dist/core/tools/ast-grep.js.map +1 -1
- package/dist/core/tools/shared-memory.d.ts.map +1 -1
- package/dist/core/tools/shared-memory.js +34 -6
- package/dist/core/tools/shared-memory.js.map +1 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +464 -73
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/yq.d.ts.map +1 -1
- package/dist/core/tools/yq.js +2 -0
- package/dist/core/tools/yq.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +13 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +756 -74
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/cli-reference.md +4 -0
- package/docs/interactive-mode.md +2 -0
- package/docs/orchestration-and-subagents.md +5 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-task-agent.js","sourceRoot":"","sources":["../../src/core/parallel-task-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAmBzE;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAAC,SAA4B;IAC5E,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,iBAAiB;IACzB,OAAO,IAAI,WAAW,CACrB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,EACrC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7D,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IAIxC,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,EAAE;KACX,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,QAAyB,EAAE,MAA6B;IAC7E,MAAM,MAAM,GAAG;QACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC;QACxE,OAAO,EAAE,EAAE;KACX,CAAC;IACF,MAAM,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,sBAAsB;QAC5B,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,IAAI,EAAE,QAAQ,CAAC,SAAS;KACxB,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,MAAM;QACN,OAAO,EAAE,IAAI;KACb,CAAC,CAAC;IACH,MAAM,iBAAiB,GAA0B;QAChD,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACjE,OAAO,iBAAiB,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,KAAmC,EACnC,SAA4B,EAC5B,MAAmB,EACnB,MAA6B,EAC7B,mBAAmD;IAEnD,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,gBAA4C,CAAC;IAEjD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,sBAAsB;YAC5B,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,IAAI,EAAE,QAAQ,CAAC,SAAS;SACxB,CAAC,CAAC;QAEH,IAAI,MAAW,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,IAAI,YAAY,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAe,CAAC,CAAC;YACnE,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE;gBACjF,MAAM,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,uBAAuB;oBAC7B,UAAU,EAAE,QAAQ,CAAC,EAAE;oBACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,aAAa;iBACb,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,MAAM;YACN,OAAO;SACP,CAAC,CAAC;QACH,MAAM,iBAAiB,GAA0B;YAChD,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEjE,IAAI,mBAAmB,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,EAAE,CAAC;YAC7C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,gBAAgB,GAAG,QAAQ,CAAC;gBAC5B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;gBAClD,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;oBACtC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBACD,MAAM;YACP,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AACnD,CAAC;AAED,KAAK,UAAU,iCAAiC,CAC/C,KAAmC,EACnC,SAA4B,EAC5B,MAAmB,EACnB,MAA6B,EAC7B,mBAAmD;IAEnD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,sBAAsB;YAC5B,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,IAAI,EAAE,QAAQ,CAAC,SAAS;SACxB,CAAC,CAAC;QAEH,IAAI,MAAW,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,IAAI,YAAY,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAe,CAAC,CAAC;YACnE,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE;gBACjF,MAAM,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,uBAAuB;oBAC7B,UAAU,EAAE,QAAQ,CAAC,EAAE;oBACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;oBACvB,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,aAAa;iBACb,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,MAAM;YACN,OAAO;SACP,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAA0B;YAChD,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,QAAQ,CAAC,EAAE;YACvB,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,SAAS;SAC9B,KAAK,EAAE;SACP,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;SAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAExC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,OAAO;QACN,WAAW,EAAE,cAAc;QAC3B,gBAAgB,EAAE,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;KAChG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,KAAmC,EACnC,gBAAqB,EACrB,MAAmB,EACnB,MAA6B,EAC7B,mBAAmD;IAEnD,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAsB,CAAC;IACtH,IAAI,gCAAgC,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,OAAO,iCAAiC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,0BAA0B,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAC1F,CAAC;AAED,KAAK,UAAU,uBAAuB,CACrC,OAAY,EACZ,MAAW,EACX,MAAmB,EACnB,MAA6B,EAC7B,QAAiC;IAEjC,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;KACpB,CAAC;IACF,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC;IACvH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE;QACzD,GAAG,MAAM;QACT,MAAM,EAAE,cAAc;QACtB,MAAM;KACN,CAAC,CAAC;IAEH,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QACpC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,OAAO;gBACX,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACtC,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,CAAC;gBACvE,MAAM;YACP,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU,CAAC;YAChB,KAAK,gBAAgB,CAAC;YACtB,KAAK,gBAAgB,CAAC;YACtB,KAAK,cAAc,CAAC;YACpB,KAAK,gBAAgB,CAAC;YACtB,KAAK,gBAAgB,CAAC;YACtB,KAAK,cAAc;gBAClB,IAAI,cAAc,EAAE,CAAC;oBACpB,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC;oBAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC;oBAC/D,MAAM,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,gBAAgB;wBACtB,qBAAqB,EAAE,KAAK;wBAC5B,OAAO,EAAE,EAAE,GAAG,cAAc,EAAE;qBAC9B,CAAC,CAAC;gBACJ,CAAC;gBACD,MAAM;YACP,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO,CAAC,CAAC,CAAC;gBACd,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC7C,IAAI,YAAY,EAAE,CAAC;oBAClB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrC,CAAC;gBACD,IAAI,CAAC,YAAY,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;gBAC5D,OAAO,YAAY,CAAC;YACrB,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC/B,cAAmB,EACnB,WAA2B,EAC3B,MAAW,EACX,MAAmB,EACnB,MAA6B,EAC7B,QAAiC;IAEjC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAEnE,OAAO,IAAI,EAAE,CAAC;QACb,IAAI,gBAAgB,GAAG,IAAI,CAAC;QAC5B,IAAI,kBAAkB,GAA0B,IAAI,CAAC;QAErD,OAAO,gBAAgB,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACP,SAAS,GAAG,KAAK,CAAC;YACnB,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;oBACvC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;oBAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC9C,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACtC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3B,CAAC;gBACD,eAAe,GAAG,EAAE,CAAC;YACtB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAChG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBACxE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC1D,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACxB,OAAO;YACR,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YACxF,gBAAgB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,MAAM,WAAW,GAA4B,EAAE,CAAC;YAChD,IAAI,gBAAgB,EAAE,CAAC;gBACtB,MAAM,aAAa,GAAG,MAAM,0BAA0B,CACrD,cAAc,CAAC,KAAK,EACpB,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,CAAC,mBAAmB,CAC1B,CAAC;gBACF,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;gBAC/C,kBAAkB,GAAG,aAAa,CAAC,gBAAgB,IAAI,IAAI,CAAC;gBAC5D,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;oBAClC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;oBAC5C,WAAW,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;gBACjC,CAAC;YACF,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACxD,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,eAAe,GAAG,kBAAkB,CAAC;gBACrC,kBAAkB,GAAG,IAAI,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACP,eAAe,GAAG,CAAC,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YAChE,CAAC;QACF,CAAC;QAED,MAAM,gBAAgB,GAAG,CAAC,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACtE,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,eAAe,GAAG,gBAAgB,CAAC;YACnC,SAAS;QACV,CAAC;QACD,MAAM;IACP,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAC3B,OAAuB,EACvB,OAAY,EACZ,MAAW,EACX,MAAmB,EACnB,QAAiC;IAEjC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,KAAK,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QACjC,MAAM,cAAc,GAAG;YACtB,GAAG,OAAO;YACV,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC;SAC3C,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,iBAAiB,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxF,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,2BAA2B,CACnC,OAAY,EACZ,MAAW,EACX,MAAmB,EACnB,QAAiC;IAEjC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,KAAK,CAAC,KAAK,IAAI,EAAE;QAChB,MAAM,WAAW,GAAmB,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACpC,MAAM,iBAAiB,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACxF,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAAC,KAAY;IAC9D,MAAM,OAAO,GAAQ,KAAK,CAAC;IAC3B,IAAI,OAAO,CAAC,yBAAyB,EAAE,CAAC;QACvC,OAAO;IACR,CAAC;IACD,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAEzC,OAAO,CAAC,QAAQ,GAAG,KAAK,UAAU,cAAc,CAC/C,QAAyB,EACzB,OAA+C;QAE/C,MAAM,IAAI,GAAQ,IAAI,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEnD,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClD,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;QAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAC9F,MAAM,OAAO,GAAG;YACf,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE;YACtC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;SACxB,CAAC;QAEF,IAAI,uBAAuB,GAAG,OAAO,EAAE,uBAAuB,KAAK,IAAI,CAAC;QACxE,MAAM,MAAM,GAAG;YACd,KAAK;YACL,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,eAAe,EAAE,IAAI,CAAC,gBAAgB;YACtC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,mBAAmB,EAAE,KAAK,IAAI,EAAE;gBAC/B,IAAI,uBAAuB,EAAE,CAAC;oBAC7B,uBAAuB,GAAG,KAAK,CAAC;oBAChC,OAAO,EAAE,CAAC;gBACX,CAAC;gBACD,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACvC,CAAC;YACD,mBAAmB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE;SAC/D,CAAC;QAEF,IAAI,OAAO,GAAwB,IAAI,CAAC;QACxC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,QAAQ;gBACtB,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;gBAC5F,CAAC,CAAC,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE5F,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAClC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACpB,KAAK,eAAe;wBACnB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;wBACxB,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;wBAC1C,MAAM;oBACP,KAAK,gBAAgB;wBACpB,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;wBACxB,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;wBAC1C,MAAM;oBACP,KAAK,aAAa;wBACjB,OAAO,GAAG,IAAI,CAAC;wBACf,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;wBACjC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAClC,MAAM;oBACP,KAAK,sBAAsB,CAAC,CAAC,CAAC;wBAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;wBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBAC9B,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC;wBACvC,MAAM;oBACP,CAAC;oBACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;wBAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;wBACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,OAAO,CAAC;wBACvC,MAAM;oBACP,CAAC;oBACD,KAAK,UAAU;wBACd,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;4BACtE,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;wBAChD,CAAC;wBACD,MAAM;oBACP,KAAK,WAAW;wBACf,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;wBAChC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;wBACjC,MAAM;gBACR,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3E,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CACtC,CAAC,OAAY,EAAE,EAAE,CAChB,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBACnE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC3D,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAChE,CAAC;gBACF,IAAI,CAAC,SAAS,EAAE,CAAC;oBAChB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACxC,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG;gBACpB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;gBACrC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,KAAK,EAAE;oBACN,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,CAAC;oBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;iBACpE;gBACD,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;gBACtE,YAAY,EAAE,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;gBAC7C,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACrB,CAAC;YACF,IAAI,CAAC,aAAa,CAAC,YAAmB,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;YACzC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;YACjC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;QACvC,CAAC;IACF,CAAC,CAAC;AACH,CAAC","sourcesContent":["import type { Agent, AgentMessage, AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { EventStream, validateToolArguments } from \"@mariozechner/pi-ai\";\n\ntype ToolCallContent = {\n\ttype: \"toolCall\";\n\tid: string;\n\tname: string;\n\targuments: unknown;\n};\n\ntype ToolResultMessageLike = {\n\trole: \"toolResult\";\n\ttoolCallId: string;\n\ttoolName: string;\n\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\tdetails: unknown;\n\tisError: boolean;\n\ttimestamp: number;\n};\n\n/**\n * Parallel policy: run tool calls concurrently only when all calls are `task`.\n * This preserves deterministic behavior for mutating filesystem tools.\n */\nexport function shouldExecuteTaskCallsInParallel(toolCalls: ToolCallContent[]): boolean {\n\treturn toolCalls.length > 1 && toolCalls.every((toolCall) => toolCall.name === \"task\");\n}\n\nfunction createAgentStream(): EventStream<any, any> {\n\treturn new EventStream(\n\t\t(event) => event.type === \"agent_end\",\n\t\t(event) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\nfunction toToolResultError(error: unknown): {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Record<string, never>;\n} {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: error instanceof Error ? error.message : String(error) }],\n\t\tdetails: {},\n\t};\n}\n\nfunction skipToolCall(toolCall: ToolCallContent, stream: EventStream<any, any>): ToolResultMessageLike {\n\tconst result = {\n\t\tcontent: [{ type: \"text\", text: \"Skipped due to queued user message.\" }],\n\t\tdetails: {},\n\t};\n\tstream.push({\n\t\ttype: \"tool_execution_start\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\targs: toolCall.arguments,\n\t});\n\tstream.push({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tresult,\n\t\tisError: true,\n\t});\n\tconst toolResultMessage: ToolResultMessageLike = {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent: result.content,\n\t\tdetails: {},\n\t\tisError: true,\n\t\ttimestamp: Date.now(),\n\t};\n\tstream.push({ type: \"message_start\", message: toolResultMessage });\n\tstream.push({ type: \"message_end\", message: toolResultMessage });\n\treturn toolResultMessage;\n}\n\nasync function executeToolCallsSequential(\n\ttools: AgentTool<any>[] | undefined,\n\ttoolCalls: ToolCallContent[],\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tgetSteeringMessages?: () => Promise<AgentMessage[]>,\n): Promise<{ toolResults: ToolResultMessageLike[]; steeringMessages?: AgentMessage[] }> {\n\tconst results: ToolResultMessageLike[] = [];\n\tlet steeringMessages: AgentMessage[] | undefined;\n\n\tfor (let index = 0; index < toolCalls.length; index++) {\n\t\tconst toolCall = toolCalls[index];\n\t\tconst tool = tools?.find((item) => item.name === toolCall.name);\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tlet result: any;\n\t\tlet isError = false;\n\t\ttry {\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool ${toolCall.name} not found`);\n\t\t\t}\n\t\t\tconst validatedArgs = validateToolArguments(tool, toolCall as any);\n\t\t\tresult = await tool.execute(toolCall.id, validatedArgs, signal, (partialResult) => {\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\tpartialResult,\n\t\t\t\t});\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresult = toToolResultError(error);\n\t\t\tisError = true;\n\t\t}\n\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_end\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tresult,\n\t\t\tisError,\n\t\t});\n\t\tconst toolResultMessage: ToolResultMessageLike = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tcontent: result.content,\n\t\t\tdetails: result.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tresults.push(toolResultMessage);\n\t\tstream.push({ type: \"message_start\", message: toolResultMessage });\n\t\tstream.push({ type: \"message_end\", message: toolResultMessage });\n\n\t\tif (getSteeringMessages) {\n\t\t\tconst steering = await getSteeringMessages();\n\t\t\tif (steering.length > 0) {\n\t\t\t\tsteeringMessages = steering;\n\t\t\t\tconst remainingCalls = toolCalls.slice(index + 1);\n\t\t\t\tfor (const skipped of remainingCalls) {\n\t\t\t\t\tresults.push(skipToolCall(skipped, stream));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { toolResults: results, steeringMessages };\n}\n\nasync function executeToolCallsParallelTasksOnly(\n\ttools: AgentTool<any>[] | undefined,\n\ttoolCalls: ToolCallContent[],\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tgetSteeringMessages?: () => Promise<AgentMessage[]>,\n): Promise<{ toolResults: ToolResultMessageLike[]; steeringMessages?: AgentMessage[] }> {\n\tconst executions = toolCalls.map(async (toolCall, index) => {\n\t\tconst tool = tools?.find((item) => item.name === toolCall.name);\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tlet result: any;\n\t\tlet isError = false;\n\t\ttry {\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool ${toolCall.name} not found`);\n\t\t\t}\n\t\t\tconst validatedArgs = validateToolArguments(tool, toolCall as any);\n\t\t\tresult = await tool.execute(toolCall.id, validatedArgs, signal, (partialResult) => {\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\tpartialResult,\n\t\t\t\t});\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresult = toToolResultError(error);\n\t\t\tisError = true;\n\t\t}\n\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_end\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tresult,\n\t\t\tisError,\n\t\t});\n\n\t\tconst toolResultMessage: ToolResultMessageLike = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tcontent: result.content,\n\t\t\tdetails: result.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tstream.push({ type: \"message_start\", message: toolResultMessage });\n\t\tstream.push({ type: \"message_end\", message: toolResultMessage });\n\t\treturn { index, toolResultMessage };\n\t});\n\n\tconst completed = await Promise.all(executions);\n\tconst orderedResults = completed\n\t\t.slice()\n\t\t.sort((left, right) => left.index - right.index)\n\t\t.map((item) => item.toolResultMessage);\n\n\tconst steeringMessages = getSteeringMessages ? await getSteeringMessages() : undefined;\n\treturn {\n\t\ttoolResults: orderedResults,\n\t\tsteeringMessages: steeringMessages && steeringMessages.length > 0 ? steeringMessages : undefined,\n\t};\n}\n\nasync function executeToolCallsWithPolicy(\n\ttools: AgentTool<any>[] | undefined,\n\tassistantMessage: any,\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tgetSteeringMessages?: () => Promise<AgentMessage[]>,\n): Promise<{ toolResults: ToolResultMessageLike[]; steeringMessages?: AgentMessage[] }> {\n\tconst toolCalls = assistantMessage.content.filter((content: any) => content.type === \"toolCall\") as ToolCallContent[];\n\tif (shouldExecuteTaskCallsInParallel(toolCalls)) {\n\t\treturn executeToolCallsParallelTasksOnly(tools, toolCalls, signal, stream, getSteeringMessages);\n\t}\n\treturn executeToolCallsSequential(tools, toolCalls, signal, stream, getSteeringMessages);\n}\n\nasync function streamAssistantResponse(\n\tcontext: any,\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tstreamFn: (...args: any[]) => any,\n): Promise<any> {\n\tlet messages = context.messages;\n\tif (config.transformContext) {\n\t\tmessages = await config.transformContext(messages, signal);\n\t}\n\tconst llmMessages = await config.convertToLlm(messages);\n\tconst llmContext = {\n\t\tsystemPrompt: context.systemPrompt,\n\t\tmessages: llmMessages,\n\t\ttools: context.tools,\n\t};\n\tconst resolvedApiKey = (config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\tconst response = await streamFn(config.model, llmContext, {\n\t\t...config,\n\t\tapiKey: resolvedApiKey,\n\t\tsignal,\n\t});\n\n\tlet partialMessage = null;\n\tlet addedPartial = false;\n\tfor await (const event of response) {\n\t\tswitch (event.type) {\n\t\t\tcase \"start\":\n\t\t\t\tpartialMessage = event.partial;\n\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\taddedPartial = true;\n\t\t\t\tstream.push({ type: \"message_start\", message: { ...partialMessage } });\n\t\t\t\tbreak;\n\t\t\tcase \"text_start\":\n\t\t\tcase \"text_delta\":\n\t\t\tcase \"text_end\":\n\t\t\tcase \"thinking_start\":\n\t\t\tcase \"thinking_delta\":\n\t\t\tcase \"thinking_end\":\n\t\t\tcase \"toolcall_start\":\n\t\t\tcase \"toolcall_delta\":\n\t\t\tcase \"toolcall_end\":\n\t\t\t\tif (partialMessage) {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"done\":\n\t\t\tcase \"error\": {\n\t\t\t\tconst finalMessage = await response.result();\n\t\t\t\tif (addedPartial) {\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t} else {\n\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t}\n\t\t\t\tif (!addedPartial) {\n\t\t\t\t\tstream.push({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t\t}\n\t\t\t\tstream.push({ type: \"message_end\", message: finalMessage });\n\t\t\t\treturn finalMessage;\n\t\t\t}\n\t\t}\n\t}\n\treturn await response.result();\n}\n\nasync function runLoopWithPolicy(\n\tcurrentContext: any,\n\tnewMessages: AgentMessage[],\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tstreamFn: (...args: any[]) => any,\n): Promise<void> {\n\tlet firstTurn = true;\n\tlet pendingMessages = (await config.getSteeringMessages?.()) || [];\n\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\t\tlet steeringAfterTools: AgentMessage[] | null = null;\n\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (!firstTurn) {\n\t\t\t\tstream.push({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\tstream.push({ type: \"message_start\", message });\n\t\t\t\t\tstream.push({ type: \"message_end\", message });\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\tconst message = await streamAssistantResponse(currentContext, config, signal, stream, streamFn);\n\t\t\tnewMessages.push(message);\n\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\tstream.push({ type: \"turn_end\", message, toolResults: [] });\n\t\t\t\tstream.push({ type: \"agent_end\", messages: newMessages });\n\t\t\t\tstream.end(newMessages);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst toolCalls = message.content.filter((content: any) => content.type === \"toolCall\");\n\t\t\thasMoreToolCalls = toolCalls.length > 0;\n\t\t\tconst toolResults: ToolResultMessageLike[] = [];\n\t\t\tif (hasMoreToolCalls) {\n\t\t\t\tconst toolExecution = await executeToolCallsWithPolicy(\n\t\t\t\t\tcurrentContext.tools,\n\t\t\t\t\tmessage,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstream,\n\t\t\t\t\tconfig.getSteeringMessages,\n\t\t\t\t);\n\t\t\t\ttoolResults.push(...toolExecution.toolResults);\n\t\t\t\tsteeringAfterTools = toolExecution.steeringMessages ?? null;\n\t\t\t\tfor (const result of toolResults) {\n\t\t\t\t\tcurrentContext.messages.push(result as any);\n\t\t\t\t\tnewMessages.push(result as any);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstream.push({ type: \"turn_end\", message, toolResults });\n\t\t\tif (steeringAfterTools && steeringAfterTools.length > 0) {\n\t\t\t\tpendingMessages = steeringAfterTools;\n\t\t\t\tsteeringAfterTools = null;\n\t\t\t} else {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\t\t}\n\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\n\tstream.push({ type: \"agent_end\", messages: newMessages });\n\tstream.end(newMessages);\n}\n\nfunction agentLoopWithPolicy(\n\tprompts: AgentMessage[],\n\tcontext: any,\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstreamFn: (...args: any[]) => any,\n): EventStream<any, any> {\n\tconst stream = createAgentStream();\n\tvoid (async () => {\n\t\tconst newMessages = [...prompts];\n\t\tconst currentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages, ...prompts],\n\t\t};\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\t\tfor (const prompt of prompts) {\n\t\t\tstream.push({ type: \"message_start\", message: prompt });\n\t\t\tstream.push({ type: \"message_end\", message: prompt });\n\t\t}\n\t\tawait runLoopWithPolicy(currentContext, newMessages, config, signal, stream, streamFn);\n\t})();\n\treturn stream;\n}\n\nfunction agentLoopContinueWithPolicy(\n\tcontext: any,\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstreamFn: (...args: any[]) => any,\n): EventStream<any, any> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\tconst stream = createAgentStream();\n\tvoid (async () => {\n\t\tconst newMessages: AgentMessage[] = [];\n\t\tconst currentContext = { ...context };\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\t\tawait runLoopWithPolicy(currentContext, newMessages, config, signal, stream, streamFn);\n\t})();\n\treturn stream;\n}\n\n/**\n * Patch a pi-agent-core Agent instance so multiple `task` tool calls in one assistant turn\n * execute concurrently.\n */\nexport function patchAgentForParallelTaskExecution(agent: Agent): void {\n\tconst runtime: any = agent;\n\tif (runtime.__iosmParallelTaskPatched) {\n\t\treturn;\n\t}\n\truntime.__iosmParallelTaskPatched = true;\n\n\truntime._runLoop = async function patchedRunLoop(\n\t\tmessages?: AgentMessage[],\n\t\toptions?: { skipInitialSteeringPoll?: boolean },\n\t) {\n\t\tconst self: any = this;\n\t\tconst model = self._state.model;\n\t\tif (!model) throw new Error(\"No model configured\");\n\n\t\tself.runningPrompt = new Promise<void>((resolve) => {\n\t\t\tself.resolveRunningPrompt = resolve;\n\t\t});\n\t\tself.abortController = new AbortController();\n\t\tself._state.isStreaming = true;\n\t\tself._state.streamMessage = null;\n\t\tself._state.error = undefined;\n\n\t\tconst reasoning = self._state.thinkingLevel === \"off\" ? undefined : self._state.thinkingLevel;\n\t\tconst context = {\n\t\t\tsystemPrompt: self._state.systemPrompt,\n\t\t\tmessages: self._state.messages.slice(),\n\t\t\ttools: self._state.tools,\n\t\t};\n\n\t\tlet skipInitialSteeringPoll = options?.skipInitialSteeringPoll === true;\n\t\tconst config = {\n\t\t\tmodel,\n\t\t\treasoning,\n\t\t\tsessionId: self._sessionId,\n\t\t\ttransport: self._transport,\n\t\t\tthinkingBudgets: self._thinkingBudgets,\n\t\t\tmaxRetryDelayMs: self._maxRetryDelayMs,\n\t\t\tconvertToLlm: self.convertToLlm,\n\t\t\ttransformContext: self.transformContext,\n\t\t\tgetApiKey: self.getApiKey,\n\t\t\tgetSteeringMessages: async () => {\n\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\treturn self.dequeueSteeringMessages();\n\t\t\t},\n\t\t\tgetFollowUpMessages: async () => self.dequeueFollowUpMessages(),\n\t\t};\n\n\t\tlet partial: AgentMessage | null = null;\n\t\ttry {\n\t\t\tconst stream = messages\n\t\t\t\t? agentLoopWithPolicy(messages, context, config, self.abortController.signal, self.streamFn)\n\t\t\t\t: agentLoopContinueWithPolicy(context, config, self.abortController.signal, self.streamFn);\n\n\t\t\tfor await (const event of stream) {\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"message_start\":\n\t\t\t\t\t\tpartial = event.message;\n\t\t\t\t\t\tself._state.streamMessage = event.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"message_update\":\n\t\t\t\t\t\tpartial = event.message;\n\t\t\t\t\t\tself._state.streamMessage = event.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"message_end\":\n\t\t\t\t\t\tpartial = null;\n\t\t\t\t\t\tself._state.streamMessage = null;\n\t\t\t\t\t\tself.appendMessage(event.message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tool_execution_start\": {\n\t\t\t\t\t\tconst pending = new Set(self._state.pendingToolCalls);\n\t\t\t\t\t\tpending.add(event.toolCallId);\n\t\t\t\t\t\tself._state.pendingToolCalls = pending;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"tool_execution_end\": {\n\t\t\t\t\t\tconst pending = new Set(self._state.pendingToolCalls);\n\t\t\t\t\t\tpending.delete(event.toolCallId);\n\t\t\t\t\t\tself._state.pendingToolCalls = pending;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"turn_end\":\n\t\t\t\t\t\tif (event.message.role === \"assistant\" && event.message.errorMessage) {\n\t\t\t\t\t\t\tself._state.error = event.message.errorMessage;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"agent_end\":\n\t\t\t\t\t\tself._state.isStreaming = false;\n\t\t\t\t\t\tself._state.streamMessage = null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tself.emit(event);\n\t\t\t}\n\n\t\t\tif (partial && partial.role === \"assistant\" && partial.content.length > 0) {\n\t\t\t\tconst onlyEmpty = !partial.content.some(\n\t\t\t\t\t(content: any) =>\n\t\t\t\t\t\t(content.type === \"thinking\" && content.thinking.trim().length > 0) ||\n\t\t\t\t\t\t(content.type === \"text\" && content.text.trim().length > 0) ||\n\t\t\t\t\t\t(content.type === \"toolCall\" && content.name.trim().length > 0),\n\t\t\t\t);\n\t\t\t\tif (!onlyEmpty) {\n\t\t\t\t\tself.appendMessage(partial);\n\t\t\t\t} else if (self.abortController?.signal.aborted) {\n\t\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconst errorMessage = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"\" }],\n\t\t\t\tapi: model.api,\n\t\t\t\tprovider: model.provider,\n\t\t\t\tmodel: model.id,\n\t\t\t\tusage: {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t},\n\t\t\t\tstopReason: self.abortController?.signal.aborted ? \"aborted\" : \"error\",\n\t\t\t\terrorMessage: error?.message || String(error),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tself.appendMessage(errorMessage as any);\n\t\t\tself._state.error = error?.message || String(error);\n\t\t\tself.emit({ type: \"agent_end\", messages: [errorMessage] });\n\t\t} finally {\n\t\t\tself._state.isStreaming = false;\n\t\t\tself._state.streamMessage = null;\n\t\t\tself._state.pendingToolCalls = new Set();\n\t\t\tself.abortController = undefined;\n\t\t\tself.resolveRunningPrompt?.();\n\t\t\tself.runningPrompt = undefined;\n\t\t\tself.resolveRunningPrompt = undefined;\n\t\t}\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"parallel-task-agent.js","sourceRoot":"","sources":["../../src/core/parallel-task-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Agent, AgentMessage, AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { EventStream, validateToolArguments } from \"@mariozechner/pi-ai\";\n\ntype ToolCallContent = {\n\ttype: \"toolCall\";\n\tid: string;\n\tname: string;\n\targuments: unknown;\n};\n\ntype ToolResultMessageLike = {\n\trole: \"toolResult\";\n\ttoolCallId: string;\n\ttoolName: string;\n\tcontent: Array<{ type: string; text?: string; data?: string; mimeType?: string }>;\n\tdetails: unknown;\n\tisError: boolean;\n\ttimestamp: number;\n};\n\n/**\n * Parallel policy: run tool calls concurrently only when all calls are `task`.\n * This preserves deterministic behavior for mutating filesystem tools.\n */\nexport function shouldExecuteTaskCallsInParallel(toolCalls: ToolCallContent[]): boolean {\n\treturn toolCalls.length > 1 && toolCalls.every((toolCall) => toolCall.name === \"task\");\n}\n\nfunction createAgentStream(): EventStream<any, any> {\n\treturn new EventStream(\n\t\t(event) => event.type === \"agent_end\",\n\t\t(event) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\nfunction toToolResultError(error: unknown): {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Record<string, never>;\n} {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: error instanceof Error ? error.message : String(error) }],\n\t\tdetails: {},\n\t};\n}\n\nconst STEERING_SKIP_TEXT = \"Skipped due to queued user message.\";\nconst STEERING_POLL_INTERVAL_MS = 40;\n\nfunction createSteeringSkipResult(): {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: { steeringSkipped: true };\n} {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: STEERING_SKIP_TEXT }],\n\t\tdetails: { steeringSkipped: true },\n\t};\n}\n\nfunction createLinkedAbortController(\n\tprimary: AbortSignal,\n\tsecondary: AbortSignal,\n): { signal: AbortSignal; cleanup: () => void } {\n\tconst controller = new AbortController();\n\tconst cleanup = () => {\n\t\tprimary.removeEventListener(\"abort\", onAbort);\n\t\tsecondary.removeEventListener(\"abort\", onAbort);\n\t};\n\tconst onAbort = () => {\n\t\tcleanup();\n\t\tcontroller.abort();\n\t};\n\tif (primary.aborted || secondary.aborted) {\n\t\tcontroller.abort();\n\t\treturn { signal: controller.signal, cleanup };\n\t}\n\tprimary.addEventListener(\"abort\", onAbort, { once: true });\n\tsecondary.addEventListener(\"abort\", onAbort, { once: true });\n\treturn { signal: controller.signal, cleanup };\n}\n\nfunction waitForSteeringPoll(signal: AbortSignal): Promise<void> {\n\treturn new Promise((resolve) => {\n\t\tif (signal.aborted) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t}, STEERING_POLL_INTERVAL_MS);\n\t\tconst onAbort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve();\n\t\t};\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t});\n}\n\nfunction isAbortError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\treturn error.message.toLowerCase().includes(\"aborted\");\n}\n\nfunction skipToolCall(toolCall: ToolCallContent, stream: EventStream<any, any>): ToolResultMessageLike {\n\tconst result = createSteeringSkipResult();\n\tstream.push({\n\t\ttype: \"tool_execution_start\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\targs: toolCall.arguments,\n\t});\n\tstream.push({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tresult,\n\t\tisError: false,\n\t});\n\tconst toolResultMessage: ToolResultMessageLike = {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: toolCall.id,\n\t\ttoolName: toolCall.name,\n\t\tcontent: result.content,\n\t\tdetails: result.details,\n\t\tisError: false,\n\t\ttimestamp: Date.now(),\n\t};\n\tstream.push({ type: \"message_start\", message: toolResultMessage });\n\tstream.push({ type: \"message_end\", message: toolResultMessage });\n\treturn toolResultMessage;\n}\n\nasync function executeToolCallsSequential(\n\ttools: AgentTool<any>[] | undefined,\n\ttoolCalls: ToolCallContent[],\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tgetSteeringMessages?: () => Promise<AgentMessage[]>,\n): Promise<{ toolResults: ToolResultMessageLike[]; steeringMessages?: AgentMessage[] }> {\n\tconst results: ToolResultMessageLike[] = [];\n\tlet steeringMessages: AgentMessage[] | undefined;\n\n\tfor (let index = 0; index < toolCalls.length; index++) {\n\t\tconst toolCall = toolCalls[index];\n\t\tconst tool = tools?.find((item) => item.name === toolCall.name);\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tlet result: any;\n\t\tlet isError = false;\n\t\ttry {\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool ${toolCall.name} not found`);\n\t\t\t}\n\t\t\tconst validatedArgs = validateToolArguments(tool, toolCall as any);\n\t\t\tresult = await tool.execute(toolCall.id, validatedArgs, signal, (partialResult) => {\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\tpartialResult,\n\t\t\t\t});\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresult = toToolResultError(error);\n\t\t\tisError = true;\n\t\t}\n\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_end\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tresult,\n\t\t\tisError,\n\t\t});\n\t\tconst toolResultMessage: ToolResultMessageLike = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tcontent: result.content,\n\t\t\tdetails: result.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tresults.push(toolResultMessage);\n\t\tstream.push({ type: \"message_start\", message: toolResultMessage });\n\t\tstream.push({ type: \"message_end\", message: toolResultMessage });\n\n\t\tif (getSteeringMessages) {\n\t\t\tconst steering = await getSteeringMessages();\n\t\t\tif (steering.length > 0) {\n\t\t\t\tsteeringMessages = steering;\n\t\t\t\tconst remainingCalls = toolCalls.slice(index + 1);\n\t\t\t\tfor (const skipped of remainingCalls) {\n\t\t\t\t\tresults.push(skipToolCall(skipped, stream));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { toolResults: results, steeringMessages };\n}\n\nasync function executeToolCallsParallelTasksOnly(\n\ttools: AgentTool<any>[] | undefined,\n\ttoolCalls: ToolCallContent[],\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tgetSteeringMessages?: () => Promise<AgentMessage[]>,\n): Promise<{ toolResults: ToolResultMessageLike[]; steeringMessages?: AgentMessage[] }> {\n\tconst steeringAbortController = new AbortController();\n\tconst linkedAbort = createLinkedAbortController(signal, steeringAbortController.signal);\n\tconst executionSignal = linkedAbort.signal;\n\tlet completedCount = 0;\n\tlet steeringMessages: AgentMessage[] | undefined;\n\n\tconst steeringWatcher = getSteeringMessages\n\t\t? (async () => {\n\t\t\t\twhile (completedCount < toolCalls.length && !executionSignal.aborted) {\n\t\t\t\t\tconst steering = await getSteeringMessages();\n\t\t\t\t\tif (steering.length > 0) {\n\t\t\t\t\t\tsteeringMessages = steering;\n\t\t\t\t\t\tif (!signal.aborted && !steeringAbortController.signal.aborted) {\n\t\t\t\t\t\t\tsteeringAbortController.abort();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (completedCount >= toolCalls.length || executionSignal.aborted) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tawait waitForSteeringPoll(executionSignal);\n\t\t\t\t}\n\t\t\t})()\n\t\t: undefined;\n\n\tconst executions = toolCalls.map(async (toolCall, index) => {\n\t\tconst tool = tools?.find((item) => item.name === toolCall.name);\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tlet result: any;\n\t\tlet isError = false;\n\t\ttry {\n\t\t\tif (!tool) {\n\t\t\t\tthrow new Error(`Tool ${toolCall.name} not found`);\n\t\t\t}\n\t\t\tconst validatedArgs = validateToolArguments(tool, toolCall as any);\n\t\t\tresult = await tool.execute(toolCall.id, validatedArgs, executionSignal, (partialResult) => {\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\targs: toolCall.arguments,\n\t\t\t\t\tpartialResult,\n\t\t\t\t});\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst interruptedBySteering = steeringAbortController.signal.aborted && !signal.aborted;\n\t\t\tconst steeringSkip = interruptedBySteering && isAbortError(error);\n\t\t\tresult = steeringSkip ? createSteeringSkipResult() : toToolResultError(error);\n\t\t\tisError = !steeringSkip;\n\t\t} finally {\n\t\t\tcompletedCount += 1;\n\t\t}\n\n\t\tstream.push({\n\t\t\ttype: \"tool_execution_end\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tresult,\n\t\t\tisError,\n\t\t});\n\n\t\tconst toolResultMessage: ToolResultMessageLike = {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\tcontent: result.content,\n\t\t\tdetails: result.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tstream.push({ type: \"message_start\", message: toolResultMessage });\n\t\tstream.push({ type: \"message_end\", message: toolResultMessage });\n\t\treturn { index, toolResultMessage };\n\t});\n\n\ttry {\n\t\tconst completed = await Promise.all(executions);\n\t\tif (steeringWatcher) {\n\t\t\tawait steeringWatcher;\n\t\t}\n\t\tconst orderedResults = completed\n\t\t\t.slice()\n\t\t\t.sort((left, right) => left.index - right.index)\n\t\t\t.map((item) => item.toolResultMessage);\n\n\t\tif (!steeringMessages && getSteeringMessages) {\n\t\t\tconst trailingSteering = await getSteeringMessages();\n\t\t\tif (trailingSteering.length > 0) {\n\t\t\t\tsteeringMessages = trailingSteering;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttoolResults: orderedResults,\n\t\t\tsteeringMessages: steeringMessages && steeringMessages.length > 0 ? steeringMessages : undefined,\n\t\t};\n\t} finally {\n\t\tlinkedAbort.cleanup();\n\t}\n}\n\nasync function executeToolCallsWithPolicy(\n\ttools: AgentTool<any>[] | undefined,\n\tassistantMessage: any,\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tgetSteeringMessages?: () => Promise<AgentMessage[]>,\n): Promise<{ toolResults: ToolResultMessageLike[]; steeringMessages?: AgentMessage[] }> {\n\tconst toolCalls = assistantMessage.content.filter((content: any) => content.type === \"toolCall\") as ToolCallContent[];\n\tif (shouldExecuteTaskCallsInParallel(toolCalls)) {\n\t\treturn executeToolCallsParallelTasksOnly(tools, toolCalls, signal, stream, getSteeringMessages);\n\t}\n\treturn executeToolCallsSequential(tools, toolCalls, signal, stream, getSteeringMessages);\n}\n\nexport const __parallelTaskAgentTestUtils = {\n\texecuteToolCallsWithPolicy,\n};\n\nasync function streamAssistantResponse(\n\tcontext: any,\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tstreamFn: (...args: any[]) => any,\n): Promise<any> {\n\tlet messages = context.messages;\n\tif (config.transformContext) {\n\t\tmessages = await config.transformContext(messages, signal);\n\t}\n\tconst llmMessages = await config.convertToLlm(messages);\n\tconst llmContext = {\n\t\tsystemPrompt: context.systemPrompt,\n\t\tmessages: llmMessages,\n\t\ttools: context.tools,\n\t};\n\tconst resolvedApiKey = (config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\tconst response = await streamFn(config.model, llmContext, {\n\t\t...config,\n\t\tapiKey: resolvedApiKey,\n\t\tsignal,\n\t});\n\n\tlet partialMessage = null;\n\tlet addedPartial = false;\n\tfor await (const event of response) {\n\t\tswitch (event.type) {\n\t\t\tcase \"start\":\n\t\t\t\tpartialMessage = event.partial;\n\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\taddedPartial = true;\n\t\t\t\tstream.push({ type: \"message_start\", message: { ...partialMessage } });\n\t\t\t\tbreak;\n\t\t\tcase \"text_start\":\n\t\t\tcase \"text_delta\":\n\t\t\tcase \"text_end\":\n\t\t\tcase \"thinking_start\":\n\t\t\tcase \"thinking_delta\":\n\t\t\tcase \"thinking_end\":\n\t\t\tcase \"toolcall_start\":\n\t\t\tcase \"toolcall_delta\":\n\t\t\tcase \"toolcall_end\":\n\t\t\t\tif (partialMessage) {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"done\":\n\t\t\tcase \"error\": {\n\t\t\t\tconst finalMessage = await response.result();\n\t\t\t\tif (addedPartial) {\n\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t} else {\n\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t}\n\t\t\t\tif (!addedPartial) {\n\t\t\t\t\tstream.push({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t\t}\n\t\t\t\tstream.push({ type: \"message_end\", message: finalMessage });\n\t\t\t\treturn finalMessage;\n\t\t\t}\n\t\t}\n\t}\n\treturn await response.result();\n}\n\nasync function runLoopWithPolicy(\n\tcurrentContext: any,\n\tnewMessages: AgentMessage[],\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstream: EventStream<any, any>,\n\tstreamFn: (...args: any[]) => any,\n): Promise<void> {\n\tlet firstTurn = true;\n\tlet pendingMessages = (await config.getSteeringMessages?.()) || [];\n\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\t\tlet steeringAfterTools: AgentMessage[] | null = null;\n\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (!firstTurn) {\n\t\t\t\tstream.push({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\tstream.push({ type: \"message_start\", message });\n\t\t\t\t\tstream.push({ type: \"message_end\", message });\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\tconst message = await streamAssistantResponse(currentContext, config, signal, stream, streamFn);\n\t\t\tnewMessages.push(message);\n\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\tstream.push({ type: \"turn_end\", message, toolResults: [] });\n\t\t\t\tstream.push({ type: \"agent_end\", messages: newMessages });\n\t\t\t\tstream.end(newMessages);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst toolCalls = message.content.filter((content: any) => content.type === \"toolCall\");\n\t\t\thasMoreToolCalls = toolCalls.length > 0;\n\t\t\tconst toolResults: ToolResultMessageLike[] = [];\n\t\t\tif (hasMoreToolCalls) {\n\t\t\t\tconst toolExecution = await executeToolCallsWithPolicy(\n\t\t\t\t\tcurrentContext.tools,\n\t\t\t\t\tmessage,\n\t\t\t\t\tsignal,\n\t\t\t\t\tstream,\n\t\t\t\t\tconfig.getSteeringMessages,\n\t\t\t\t);\n\t\t\t\ttoolResults.push(...toolExecution.toolResults);\n\t\t\t\tsteeringAfterTools = toolExecution.steeringMessages ?? null;\n\t\t\t\tfor (const result of toolResults) {\n\t\t\t\t\tcurrentContext.messages.push(result as any);\n\t\t\t\t\tnewMessages.push(result as any);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstream.push({ type: \"turn_end\", message, toolResults });\n\t\t\tif (steeringAfterTools && steeringAfterTools.length > 0) {\n\t\t\t\tpendingMessages = steeringAfterTools;\n\t\t\t\tsteeringAfterTools = null;\n\t\t\t} else {\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\t\t}\n\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\t\tbreak;\n\t}\n\n\tstream.push({ type: \"agent_end\", messages: newMessages });\n\tstream.end(newMessages);\n}\n\nfunction agentLoopWithPolicy(\n\tprompts: AgentMessage[],\n\tcontext: any,\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstreamFn: (...args: any[]) => any,\n): EventStream<any, any> {\n\tconst stream = createAgentStream();\n\tvoid (async () => {\n\t\tconst newMessages = [...prompts];\n\t\tconst currentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages, ...prompts],\n\t\t};\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\t\tfor (const prompt of prompts) {\n\t\t\tstream.push({ type: \"message_start\", message: prompt });\n\t\t\tstream.push({ type: \"message_end\", message: prompt });\n\t\t}\n\t\tawait runLoopWithPolicy(currentContext, newMessages, config, signal, stream, streamFn);\n\t})();\n\treturn stream;\n}\n\nfunction agentLoopContinueWithPolicy(\n\tcontext: any,\n\tconfig: any,\n\tsignal: AbortSignal,\n\tstreamFn: (...args: any[]) => any,\n): EventStream<any, any> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\tconst stream = createAgentStream();\n\tvoid (async () => {\n\t\tconst newMessages: AgentMessage[] = [];\n\t\tconst currentContext = { ...context };\n\t\tstream.push({ type: \"agent_start\" });\n\t\tstream.push({ type: \"turn_start\" });\n\t\tawait runLoopWithPolicy(currentContext, newMessages, config, signal, stream, streamFn);\n\t})();\n\treturn stream;\n}\n\n/**\n * Patch a pi-agent-core Agent instance so multiple `task` tool calls in one assistant turn\n * execute concurrently.\n */\nexport function patchAgentForParallelTaskExecution(agent: Agent): void {\n\tconst runtime: any = agent;\n\tif (runtime.__iosmParallelTaskPatched) {\n\t\treturn;\n\t}\n\truntime.__iosmParallelTaskPatched = true;\n\n\truntime._runLoop = async function patchedRunLoop(\n\t\tmessages?: AgentMessage[],\n\t\toptions?: { skipInitialSteeringPoll?: boolean },\n\t) {\n\t\tconst self: any = this;\n\t\tconst model = self._state.model;\n\t\tif (!model) throw new Error(\"No model configured\");\n\n\t\tself.runningPrompt = new Promise<void>((resolve) => {\n\t\t\tself.resolveRunningPrompt = resolve;\n\t\t});\n\t\tself.abortController = new AbortController();\n\t\tself._state.isStreaming = true;\n\t\tself._state.streamMessage = null;\n\t\tself._state.error = undefined;\n\n\t\tconst reasoning = self._state.thinkingLevel === \"off\" ? undefined : self._state.thinkingLevel;\n\t\tconst context = {\n\t\t\tsystemPrompt: self._state.systemPrompt,\n\t\t\tmessages: self._state.messages.slice(),\n\t\t\ttools: self._state.tools,\n\t\t};\n\n\t\tlet skipInitialSteeringPoll = options?.skipInitialSteeringPoll === true;\n\t\tconst config = {\n\t\t\tmodel,\n\t\t\treasoning,\n\t\t\tsessionId: self._sessionId,\n\t\t\ttransport: self._transport,\n\t\t\tthinkingBudgets: self._thinkingBudgets,\n\t\t\tmaxRetryDelayMs: self._maxRetryDelayMs,\n\t\t\tconvertToLlm: self.convertToLlm,\n\t\t\ttransformContext: self.transformContext,\n\t\t\tgetApiKey: self.getApiKey,\n\t\t\tgetSteeringMessages: async () => {\n\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\treturn self.dequeueSteeringMessages();\n\t\t\t},\n\t\t\tgetFollowUpMessages: async () => self.dequeueFollowUpMessages(),\n\t\t};\n\n\t\tlet partial: AgentMessage | null = null;\n\t\ttry {\n\t\t\tconst stream = messages\n\t\t\t\t? agentLoopWithPolicy(messages, context, config, self.abortController.signal, self.streamFn)\n\t\t\t\t: agentLoopContinueWithPolicy(context, config, self.abortController.signal, self.streamFn);\n\n\t\t\tfor await (const event of stream) {\n\t\t\t\tswitch (event.type) {\n\t\t\t\t\tcase \"message_start\":\n\t\t\t\t\t\tpartial = event.message;\n\t\t\t\t\t\tself._state.streamMessage = event.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"message_update\":\n\t\t\t\t\t\tpartial = event.message;\n\t\t\t\t\t\tself._state.streamMessage = event.message;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"message_end\":\n\t\t\t\t\t\tpartial = null;\n\t\t\t\t\t\tself._state.streamMessage = null;\n\t\t\t\t\t\tself.appendMessage(event.message);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"tool_execution_start\": {\n\t\t\t\t\t\tconst pending = new Set(self._state.pendingToolCalls);\n\t\t\t\t\t\tpending.add(event.toolCallId);\n\t\t\t\t\t\tself._state.pendingToolCalls = pending;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"tool_execution_end\": {\n\t\t\t\t\t\tconst pending = new Set(self._state.pendingToolCalls);\n\t\t\t\t\t\tpending.delete(event.toolCallId);\n\t\t\t\t\t\tself._state.pendingToolCalls = pending;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase \"turn_end\":\n\t\t\t\t\t\tif (event.message.role === \"assistant\" && event.message.errorMessage) {\n\t\t\t\t\t\t\tself._state.error = event.message.errorMessage;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"agent_end\":\n\t\t\t\t\t\tself._state.isStreaming = false;\n\t\t\t\t\t\tself._state.streamMessage = null;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tself.emit(event);\n\t\t\t}\n\n\t\t\tif (partial && partial.role === \"assistant\" && partial.content.length > 0) {\n\t\t\t\tconst onlyEmpty = !partial.content.some(\n\t\t\t\t\t(content: any) =>\n\t\t\t\t\t\t(content.type === \"thinking\" && content.thinking.trim().length > 0) ||\n\t\t\t\t\t\t(content.type === \"text\" && content.text.trim().length > 0) ||\n\t\t\t\t\t\t(content.type === \"toolCall\" && content.name.trim().length > 0),\n\t\t\t\t);\n\t\t\t\tif (!onlyEmpty) {\n\t\t\t\t\tself.appendMessage(partial);\n\t\t\t\t} else if (self.abortController?.signal.aborted) {\n\t\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconst errorMessage = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: [{ type: \"text\", text: \"\" }],\n\t\t\t\tapi: model.api,\n\t\t\t\tprovider: model.provider,\n\t\t\t\tmodel: model.id,\n\t\t\t\tusage: {\n\t\t\t\t\tinput: 0,\n\t\t\t\t\toutput: 0,\n\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t},\n\t\t\t\tstopReason: self.abortController?.signal.aborted ? \"aborted\" : \"error\",\n\t\t\t\terrorMessage: error?.message || String(error),\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tself.appendMessage(errorMessage as any);\n\t\t\tself._state.error = error?.message || String(error);\n\t\t\tself.emit({ type: \"agent_end\", messages: [errorMessage] });\n\t\t} finally {\n\t\t\tself._state.isStreaming = false;\n\t\t\tself._state.streamMessage = null;\n\t\t\tself._state.pendingToolCalls = new Set();\n\t\t\tself.abortController = undefined;\n\t\t\tself.resolveRunningPrompt?.();\n\t\t\tself.runningPrompt = undefined;\n\t\t\tself.resolveRunningPrompt = undefined;\n\t\t}\n\t};\n}\n"]}
|
|
@@ -41,6 +41,6 @@ export interface SharedMemoryReadInput {
|
|
|
41
41
|
includeValues?: boolean;
|
|
42
42
|
}
|
|
43
43
|
export declare function getSharedMemoryPath(rootCwd: string, runId: string): string;
|
|
44
|
-
export declare function writeSharedMemory(context: SharedMemoryContext, input: SharedMemoryWriteInput): Promise<SharedMemoryReadItem>;
|
|
45
|
-
export declare function readSharedMemory(context: SharedMemoryContext, input: SharedMemoryReadInput): Promise<SharedMemoryReadResult>;
|
|
44
|
+
export declare function writeSharedMemory(context: SharedMemoryContext, input: SharedMemoryWriteInput, signal?: AbortSignal): Promise<SharedMemoryReadItem>;
|
|
45
|
+
export declare function readSharedMemory(context: SharedMemoryContext, input: SharedMemoryReadInput, signal?: AbortSignal): Promise<SharedMemoryReadResult>;
|
|
46
46
|
//# sourceMappingURL=shared-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-memory.d.ts","sourceRoot":"","sources":["../../src/core/shared-memory.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAC/C,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"shared-memory.d.ts","sourceRoot":"","sources":["../../src/core/shared-memory.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAC/C,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,kBAAkB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,MAAM,WAAW,oBAAoB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,oBAAoB,EAAE,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAqID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1E;AAmJD,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,sBAAsB,EAC7B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAwD/B;AAyBD,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,qBAAqB,EAC5B,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAkCjC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import lockfile from "proper-lockfile";
|
|
4
4
|
const maxEntryCharsDefault = 4000;
|
|
@@ -6,6 +6,8 @@ const maxKeysDefault = 500;
|
|
|
6
6
|
const historySizeDefault = 1000;
|
|
7
7
|
const lockRetryAttempts = 12;
|
|
8
8
|
const lockRetryDelayMs = 20;
|
|
9
|
+
const snapshotRetryAttempts = 4;
|
|
10
|
+
const snapshotRetryDelayMs = 8;
|
|
9
11
|
const maxEntryChars = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_ENTRY_CHARS, maxEntryCharsDefault, 64, 20_000);
|
|
10
12
|
const maxKeys = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_MAX_KEYS, maxKeysDefault, 10, 20_000);
|
|
11
13
|
const historySize = readBoundedInt(process.env.IOSM_SUBAGENT_SHARED_MEMORY_HISTORY_SIZE, historySizeDefault, 10, 50_000);
|
|
@@ -15,8 +17,65 @@ function readBoundedInt(raw, fallback, min, max) {
|
|
|
15
17
|
return fallback;
|
|
16
18
|
return Math.max(min, Math.min(max, parsed));
|
|
17
19
|
}
|
|
18
|
-
function delay(ms) {
|
|
19
|
-
|
|
20
|
+
function delay(ms, signal) {
|
|
21
|
+
if (!signal) {
|
|
22
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
23
|
+
}
|
|
24
|
+
if (signal.aborted) {
|
|
25
|
+
return Promise.reject(new Error("Operation aborted"));
|
|
26
|
+
}
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
const timer = setTimeout(() => {
|
|
29
|
+
signal.removeEventListener("abort", onAbort);
|
|
30
|
+
resolve();
|
|
31
|
+
}, ms);
|
|
32
|
+
const onAbort = () => {
|
|
33
|
+
clearTimeout(timer);
|
|
34
|
+
signal.removeEventListener("abort", onAbort);
|
|
35
|
+
reject(new Error("Operation aborted"));
|
|
36
|
+
};
|
|
37
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
class Mutex {
|
|
41
|
+
constructor() {
|
|
42
|
+
this.locked = false;
|
|
43
|
+
this.waiters = [];
|
|
44
|
+
}
|
|
45
|
+
async acquire() {
|
|
46
|
+
if (!this.locked) {
|
|
47
|
+
this.locked = true;
|
|
48
|
+
return () => this.release();
|
|
49
|
+
}
|
|
50
|
+
await new Promise((resolve) => this.waiters.push(resolve));
|
|
51
|
+
this.locked = true;
|
|
52
|
+
return () => this.release();
|
|
53
|
+
}
|
|
54
|
+
release() {
|
|
55
|
+
this.locked = false;
|
|
56
|
+
const next = this.waiters.shift();
|
|
57
|
+
if (next) {
|
|
58
|
+
next();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
isIdle() {
|
|
62
|
+
return !this.locked && this.waiters.length === 0;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const localWriteMutexes = new Map();
|
|
66
|
+
function getOrCreateLocalWriteMutex(filePath) {
|
|
67
|
+
const existing = localWriteMutexes.get(filePath);
|
|
68
|
+
if (existing)
|
|
69
|
+
return existing;
|
|
70
|
+
const created = new Mutex();
|
|
71
|
+
localWriteMutexes.set(filePath, created);
|
|
72
|
+
return created;
|
|
73
|
+
}
|
|
74
|
+
function cleanupLocalWriteMutex(filePath) {
|
|
75
|
+
const existing = localWriteMutexes.get(filePath);
|
|
76
|
+
if (!existing || !existing.isIdle())
|
|
77
|
+
return;
|
|
78
|
+
localWriteMutexes.delete(filePath);
|
|
20
79
|
}
|
|
21
80
|
function normalizeRunId(runId) {
|
|
22
81
|
const trimmed = runId.trim();
|
|
@@ -77,36 +136,70 @@ function createInitialStore(runId) {
|
|
|
77
136
|
history: [],
|
|
78
137
|
};
|
|
79
138
|
}
|
|
139
|
+
function normalizeParsedStore(runId, parsed) {
|
|
140
|
+
if (!parsed || typeof parsed !== "object")
|
|
141
|
+
return createInitialStore(runId);
|
|
142
|
+
const cast = parsed;
|
|
143
|
+
if (cast.runId !== runId)
|
|
144
|
+
return createInitialStore(runId);
|
|
145
|
+
if (!cast.entries || typeof cast.entries !== "object")
|
|
146
|
+
cast.entries = {};
|
|
147
|
+
if (!Array.isArray(cast.history))
|
|
148
|
+
cast.history = [];
|
|
149
|
+
if (!cast.createdAt || typeof cast.createdAt !== "string")
|
|
150
|
+
cast.createdAt = new Date().toISOString();
|
|
151
|
+
if (!cast.updatedAt || typeof cast.updatedAt !== "string")
|
|
152
|
+
cast.updatedAt = cast.createdAt;
|
|
153
|
+
return cast;
|
|
154
|
+
}
|
|
80
155
|
function readStore(filePath, runId) {
|
|
81
156
|
if (!existsSync(filePath)) {
|
|
82
157
|
return createInitialStore(runId);
|
|
83
158
|
}
|
|
84
159
|
try {
|
|
85
160
|
const parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
86
|
-
|
|
87
|
-
return createInitialStore(runId);
|
|
88
|
-
if (parsed.runId !== runId)
|
|
89
|
-
return createInitialStore(runId);
|
|
90
|
-
if (!parsed.entries || typeof parsed.entries !== "object")
|
|
91
|
-
parsed.entries = {};
|
|
92
|
-
if (!Array.isArray(parsed.history))
|
|
93
|
-
parsed.history = [];
|
|
94
|
-
if (!parsed.createdAt || typeof parsed.createdAt !== "string")
|
|
95
|
-
parsed.createdAt = new Date().toISOString();
|
|
96
|
-
if (!parsed.updatedAt || typeof parsed.updatedAt !== "string")
|
|
97
|
-
parsed.updatedAt = parsed.createdAt;
|
|
98
|
-
return parsed;
|
|
161
|
+
return normalizeParsedStore(runId, parsed);
|
|
99
162
|
}
|
|
100
163
|
catch {
|
|
101
164
|
return createInitialStore(runId);
|
|
102
165
|
}
|
|
103
166
|
}
|
|
167
|
+
async function readStoreSnapshot(filePath, runId, signal) {
|
|
168
|
+
if (!existsSync(filePath)) {
|
|
169
|
+
return createInitialStore(runId);
|
|
170
|
+
}
|
|
171
|
+
for (let attempt = 1; attempt <= snapshotRetryAttempts; attempt += 1) {
|
|
172
|
+
if (signal?.aborted)
|
|
173
|
+
throw new Error("Operation aborted");
|
|
174
|
+
try {
|
|
175
|
+
const parsed = JSON.parse(readFileSync(filePath, "utf8"));
|
|
176
|
+
return normalizeParsedStore(runId, parsed);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
if (attempt >= snapshotRetryAttempts)
|
|
180
|
+
break;
|
|
181
|
+
await delay(snapshotRetryDelayMs * attempt, signal);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return createInitialStore(runId);
|
|
185
|
+
}
|
|
104
186
|
function writeStore(filePath, store) {
|
|
105
187
|
mkdirSync(dirname(filePath), { recursive: true });
|
|
106
|
-
|
|
188
|
+
const tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2, 8)}.tmp`;
|
|
189
|
+
try {
|
|
190
|
+
writeFileSync(tempPath, `${JSON.stringify(store, null, 2)}\n`, "utf8");
|
|
191
|
+
renameSync(tempPath, filePath);
|
|
192
|
+
}
|
|
193
|
+
finally {
|
|
194
|
+
if (existsSync(tempPath)) {
|
|
195
|
+
rmSync(tempPath, { force: true });
|
|
196
|
+
}
|
|
197
|
+
}
|
|
107
198
|
}
|
|
108
|
-
async function acquireFileLock(filePath) {
|
|
199
|
+
async function acquireFileLock(filePath, signal) {
|
|
109
200
|
for (let attempt = 1; attempt <= lockRetryAttempts; attempt += 1) {
|
|
201
|
+
if (signal?.aborted)
|
|
202
|
+
throw new Error("Operation aborted");
|
|
110
203
|
try {
|
|
111
204
|
return await lockfile.lock(filePath, { realpath: false });
|
|
112
205
|
}
|
|
@@ -115,19 +208,20 @@ async function acquireFileLock(filePath) {
|
|
|
115
208
|
if (code !== "ELOCKED" || attempt >= lockRetryAttempts) {
|
|
116
209
|
throw error;
|
|
117
210
|
}
|
|
118
|
-
await delay(lockRetryDelayMs * attempt);
|
|
211
|
+
await delay(lockRetryDelayMs * attempt, signal);
|
|
119
212
|
}
|
|
120
213
|
}
|
|
121
214
|
throw new Error("failed to acquire shared memory lock");
|
|
122
215
|
}
|
|
123
|
-
async function withLockedStore(context, fn) {
|
|
216
|
+
async function withLockedStore(context, fn, signal) {
|
|
124
217
|
const runId = normalizeRunId(context.runId);
|
|
125
218
|
const filePath = getSharedMemoryPath(context.rootCwd, runId);
|
|
219
|
+
const releaseLocalMutex = await getOrCreateLocalWriteMutex(filePath).acquire();
|
|
126
220
|
mkdirSync(dirname(filePath), { recursive: true });
|
|
127
221
|
if (!existsSync(filePath)) {
|
|
128
222
|
writeStore(filePath, createInitialStore(runId));
|
|
129
223
|
}
|
|
130
|
-
const release = await acquireFileLock(filePath);
|
|
224
|
+
const release = await acquireFileLock(filePath, signal);
|
|
131
225
|
try {
|
|
132
226
|
const store = readStore(filePath, runId);
|
|
133
227
|
const value = fn(store, filePath);
|
|
@@ -135,9 +229,34 @@ async function withLockedStore(context, fn) {
|
|
|
135
229
|
return value;
|
|
136
230
|
}
|
|
137
231
|
finally {
|
|
138
|
-
|
|
232
|
+
try {
|
|
233
|
+
await release();
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
releaseLocalMutex();
|
|
237
|
+
cleanupLocalWriteMutex(filePath);
|
|
238
|
+
}
|
|
139
239
|
}
|
|
140
240
|
}
|
|
241
|
+
async function withSnapshotStore(context, fn, signal) {
|
|
242
|
+
const runId = normalizeRunId(context.runId);
|
|
243
|
+
const filePath = getSharedMemoryPath(context.rootCwd, runId);
|
|
244
|
+
const store = await readStoreSnapshot(filePath, runId, signal);
|
|
245
|
+
return fn(store, filePath);
|
|
246
|
+
}
|
|
247
|
+
function isAbortError(error) {
|
|
248
|
+
if (error instanceof Error)
|
|
249
|
+
return /aborted/i.test(error.message);
|
|
250
|
+
if (typeof error === "string")
|
|
251
|
+
return /aborted/i.test(error);
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
function normalizeLockError(error) {
|
|
255
|
+
if (isAbortError(error)) {
|
|
256
|
+
throw new Error("Operation aborted");
|
|
257
|
+
}
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
141
260
|
function trimHistory(store) {
|
|
142
261
|
if (store.history.length <= historySize)
|
|
143
262
|
return;
|
|
@@ -150,56 +269,61 @@ function writerFromContext(context) {
|
|
|
150
269
|
profile: context.profile?.trim() || undefined,
|
|
151
270
|
};
|
|
152
271
|
}
|
|
153
|
-
export async function writeSharedMemory(context, input) {
|
|
272
|
+
export async function writeSharedMemory(context, input, signal) {
|
|
154
273
|
const normalizedValue = input.value;
|
|
155
274
|
if (normalizedValue.length > maxEntryChars) {
|
|
156
275
|
throw new Error(`shared memory value exceeds ${maxEntryChars} chars`);
|
|
157
276
|
}
|
|
158
277
|
const scopedKey = resolveScopedKey(context, input.scope, input.key);
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
278
|
+
try {
|
|
279
|
+
return await withLockedStore(context, (store) => {
|
|
280
|
+
const now = new Date().toISOString();
|
|
281
|
+
const entriesCount = Object.keys(store.entries).length;
|
|
282
|
+
const previous = store.entries[scopedKey];
|
|
283
|
+
if (!previous && entriesCount >= maxKeys) {
|
|
284
|
+
throw new Error(`shared memory key limit reached (${maxKeys})`);
|
|
285
|
+
}
|
|
286
|
+
if (input.ifVersion !== undefined && previous && previous.version !== input.ifVersion) {
|
|
287
|
+
throw new Error(`shared memory CAS mismatch for key "${input.key}" (expected ${input.ifVersion}, got ${previous.version})`);
|
|
288
|
+
}
|
|
289
|
+
if (input.ifVersion !== undefined && !previous) {
|
|
290
|
+
throw new Error(`shared memory CAS mismatch for key "${input.key}" (expected ${input.ifVersion}, got 0)`);
|
|
291
|
+
}
|
|
292
|
+
const nextValue = input.mode === "append" ? `${previous?.value ?? ""}${normalizedValue}` : normalizedValue;
|
|
293
|
+
if (nextValue.length > maxEntryChars) {
|
|
294
|
+
throw new Error(`shared memory value exceeds ${maxEntryChars} chars after ${input.mode}`);
|
|
295
|
+
}
|
|
296
|
+
const nextVersion = (previous?.version ?? 0) + 1;
|
|
297
|
+
const writer = writerFromContext(context);
|
|
298
|
+
store.entries[scopedKey] = {
|
|
299
|
+
value: nextValue,
|
|
300
|
+
version: nextVersion,
|
|
301
|
+
updatedAt: now,
|
|
302
|
+
writer,
|
|
303
|
+
};
|
|
304
|
+
store.updatedAt = now;
|
|
305
|
+
store.history.push({
|
|
306
|
+
key: normalizeKey(input.key),
|
|
307
|
+
scope: input.scope,
|
|
308
|
+
mode: input.mode,
|
|
309
|
+
version: nextVersion,
|
|
310
|
+
updatedAt: now,
|
|
311
|
+
writer,
|
|
312
|
+
});
|
|
313
|
+
trimHistory(store);
|
|
314
|
+
return {
|
|
315
|
+
key: normalizeKey(input.key),
|
|
316
|
+
scope: input.scope,
|
|
317
|
+
value: nextValue,
|
|
318
|
+
version: nextVersion,
|
|
319
|
+
updatedAt: now,
|
|
320
|
+
writer,
|
|
321
|
+
};
|
|
322
|
+
}, signal);
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
normalizeLockError(error);
|
|
326
|
+
}
|
|
203
327
|
}
|
|
204
328
|
function matchesScopeAndPrefix(context, scopedKey, scope, key, prefix) {
|
|
205
329
|
const parsed = parseScopedKey(scopedKey);
|
|
@@ -220,34 +344,39 @@ function matchesScopeAndPrefix(context, scopedKey, scope, key, prefix) {
|
|
|
220
344
|
}
|
|
221
345
|
return { matched: true, parsed };
|
|
222
346
|
}
|
|
223
|
-
export async function readSharedMemory(context, input) {
|
|
347
|
+
export async function readSharedMemory(context, input, signal) {
|
|
224
348
|
const normalizedKey = input.key ? normalizeKey(input.key) : undefined;
|
|
225
349
|
const normalizedPrefix = input.prefix ? normalizeKey(input.prefix) : undefined;
|
|
226
350
|
const limit = Math.max(1, Math.min(100, input.limit ?? 20));
|
|
227
351
|
const includeValues = input.includeValues !== false;
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
352
|
+
try {
|
|
353
|
+
return await withSnapshotStore(context, (store) => {
|
|
354
|
+
const matchedItems = [];
|
|
355
|
+
for (const [scopedKey, entry] of Object.entries(store.entries)) {
|
|
356
|
+
const matched = matchesScopeAndPrefix(context, scopedKey, input.scope, normalizedKey, normalizedPrefix);
|
|
357
|
+
if (!matched.matched)
|
|
358
|
+
continue;
|
|
359
|
+
matchedItems.push({
|
|
360
|
+
key: matched.parsed.key,
|
|
361
|
+
scope: input.scope,
|
|
362
|
+
value: includeValues ? entry.value : undefined,
|
|
363
|
+
version: entry.version,
|
|
364
|
+
updatedAt: entry.updatedAt,
|
|
365
|
+
writer: entry.writer ?? {},
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
matchedItems.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
369
|
+
const sliced = matchedItems.slice(0, limit);
|
|
370
|
+
return {
|
|
371
|
+
runId: store.runId,
|
|
236
372
|
scope: input.scope,
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
return {
|
|
246
|
-
runId: store.runId,
|
|
247
|
-
scope: input.scope,
|
|
248
|
-
items: sliced,
|
|
249
|
-
totalMatched: matchedItems.length,
|
|
250
|
-
};
|
|
251
|
-
});
|
|
373
|
+
items: sliced,
|
|
374
|
+
totalMatched: matchedItems.length,
|
|
375
|
+
};
|
|
376
|
+
}, signal);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
normalizeLockError(error);
|
|
380
|
+
}
|
|
252
381
|
}
|
|
253
382
|
//# sourceMappingURL=shared-memory.js.map
|