@astralyn/pi 0.84.14 → 0.84.16
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 +23 -0
- package/dist/cli.js +2435 -18
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +12 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/tools/bash.d.ts +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +4 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/find.d.ts +2 -0
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +18 -15
- package/dist/core/tools/find.js.map +1 -1
- package/dist/extensions/background/actions.d.ts.map +1 -1
- package/dist/extensions/background/actions.js +3 -2
- package/dist/extensions/background/actions.js.map +1 -1
- package/dist/extensions/background/index.d.ts +5 -4
- package/dist/extensions/background/index.d.ts.map +1 -1
- package/dist/extensions/background/index.js +9 -5
- package/dist/extensions/background/index.js.map +1 -1
- package/dist/extensions/background/manager.d.ts.map +1 -1
- package/dist/extensions/background/manager.js +8 -9
- package/dist/extensions/background/manager.js.map +1 -1
- package/dist/extensions/background/registry.d.ts +4 -1
- package/dist/extensions/background/registry.d.ts.map +1 -1
- package/dist/extensions/background/registry.js +30 -17
- package/dist/extensions/background/registry.js.map +1 -1
- package/dist/extensions/background/task-view.d.ts +6 -0
- package/dist/extensions/background/task-view.d.ts.map +1 -1
- package/dist/extensions/background/task-view.js +11 -6
- package/dist/extensions/background/task-view.js.map +1 -1
- package/dist/extensions/deepwiki/client.d.ts.map +1 -1
- package/dist/extensions/deepwiki/client.js +3 -0
- package/dist/extensions/deepwiki/client.js.map +1 -1
- package/dist/extensions/deepwiki/execute.d.ts +2 -1
- package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
- package/dist/extensions/deepwiki/execute.js +17 -2
- package/dist/extensions/deepwiki/execute.js.map +1 -1
- package/dist/extensions/deepwiki/http.d.ts +1 -0
- package/dist/extensions/deepwiki/http.d.ts.map +1 -1
- package/dist/extensions/deepwiki/http.js +16 -2
- package/dist/extensions/deepwiki/http.js.map +1 -1
- package/dist/extensions/deepwiki/schema.d.ts +1 -1
- package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
- package/dist/extensions/deepwiki/schema.js +8 -2
- package/dist/extensions/deepwiki/schema.js.map +1 -1
- package/dist/extensions/question/dialog.d.ts.map +1 -1
- package/dist/extensions/question/dialog.js +80 -9
- package/dist/extensions/question/dialog.js.map +1 -1
- package/dist/extensions/question/index.d.ts.map +1 -1
- package/dist/extensions/question/index.js +8 -0
- package/dist/extensions/question/index.js.map +1 -1
- package/dist/extensions/question/schema.d.ts +2 -2
- package/dist/extensions/question/schema.d.ts.map +1 -1
- package/dist/extensions/question/schema.js +41 -11
- package/dist/extensions/question/schema.js.map +1 -1
- package/dist/extensions/question/types.d.ts +1 -1
- package/dist/extensions/question/types.d.ts.map +1 -1
- package/dist/extensions/question/types.js.map +1 -1
- package/dist/extensions/router/probe.d.ts.map +1 -1
- package/dist/extensions/router/probe.js +10 -29
- package/dist/extensions/router/probe.js.map +1 -1
- package/dist/extensions/router/register.d.ts.map +1 -1
- package/dist/extensions/router/register.js +16 -6
- package/dist/extensions/router/register.js.map +1 -1
- package/dist/extensions/router/store.d.ts.map +1 -1
- package/dist/extensions/router/store.js +108 -51
- package/dist/extensions/router/store.js.map +1 -1
- package/dist/extensions/router/ui.d.ts +6 -0
- package/dist/extensions/router/ui.d.ts.map +1 -1
- package/dist/extensions/router/ui.js +14 -6
- package/dist/extensions/router/ui.js.map +1 -1
- package/dist/extensions/statusline/index.d.ts.map +1 -1
- package/dist/extensions/statusline/index.js +40 -43
- package/dist/extensions/statusline/index.js.map +1 -1
- package/dist/extensions/subagent/activity.d.ts +7 -1
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js +69 -6
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents-command.js +1 -1
- package/dist/extensions/subagent/agents-command.js.map +1 -1
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js +0 -3
- package/dist/extensions/subagent/agents.js.map +1 -1
- package/dist/extensions/subagent/budget.d.ts.map +1 -1
- package/dist/extensions/subagent/budget.js +29 -2
- package/dist/extensions/subagent/budget.js.map +1 -1
- package/dist/extensions/subagent/cancellation.d.ts +4 -4
- package/dist/extensions/subagent/cancellation.d.ts.map +1 -1
- package/dist/extensions/subagent/cancellation.js +31 -13
- package/dist/extensions/subagent/cancellation.js.map +1 -1
- package/dist/extensions/subagent/constants.d.ts +1 -0
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +1 -0
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +1 -0
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts +8 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +155 -178
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/runner.d.ts +1 -0
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +53 -44
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +0 -3
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/settings.d.ts +1 -1
- package/dist/extensions/subagent/settings.d.ts.map +1 -1
- package/dist/extensions/subagent/settings.js +74 -25
- package/dist/extensions/subagent/settings.js.map +1 -1
- package/dist/extensions/subagent/state.d.ts +1 -0
- package/dist/extensions/subagent/state.d.ts.map +1 -1
- package/dist/extensions/subagent/state.js +46 -16
- package/dist/extensions/subagent/state.js.map +1 -1
- package/dist/extensions/subagent/types.d.ts +0 -7
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/subagent/ui/agents-dialog.js +1 -1
- package/dist/extensions/subagent/ui/agents-dialog.js.map +1 -1
- package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -1
- package/dist/extensions/subagent/ui/model-list.js +3 -4
- package/dist/extensions/subagent/ui/model-list.js.map +1 -1
- package/dist/extensions/subagent/ui/model-picker.d.ts.map +1 -1
- package/dist/extensions/subagent/ui/model-picker.js +2 -1
- package/dist/extensions/subagent/ui/model-picker.js.map +1 -1
- package/dist/extensions/web-search/format.d.ts.map +1 -1
- package/dist/extensions/web-search/format.js +36 -15
- package/dist/extensions/web-search/format.js.map +1 -1
- package/dist/extensions/web-search/index.d.ts.map +1 -1
- package/dist/extensions/web-search/index.js +11 -8
- package/dist/extensions/web-search/index.js.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/deepseek.js +36 -5
- package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
- package/dist/extensions/web-search/providers/http.d.ts +2 -7
- package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/http.js +12 -57
- package/dist/extensions/web-search/providers/http.js.map +1 -1
- package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
- package/dist/extensions/web-search/providers/minimax.js +18 -6
- package/dist/extensions/web-search/providers/minimax.js.map +1 -1
- package/dist/extensions/web-search/render.d.ts.map +1 -1
- package/dist/extensions/web-search/render.js +16 -5
- package/dist/extensions/web-search/render.js.map +1 -1
- package/dist/extensions/web-search/results.d.ts +10 -3
- package/dist/extensions/web-search/results.d.ts.map +1 -1
- package/dist/extensions/web-search/results.js +25 -7
- package/dist/extensions/web-search/results.js.map +1 -1
- package/dist/image-resize-worker.js +2 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +7 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +10 -0
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -40
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +0 -4
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +16 -23
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/rpc-entry.js +2435 -10
- package/dist/utils/http-response.d.ts +10 -0
- package/dist/utils/http-response.d.ts.map +1 -0
- package/dist/utils/http-response.js +68 -0
- package/dist/utils/http-response.js.map +1 -0
- package/docs/bundled/extensions/background.md +4 -3
- package/docs/bundled/extensions/deepwiki.md +7 -5
- package/docs/bundled/extensions/question.md +6 -4
- package/docs/bundled/extensions/router.md +1 -1
- package/docs/bundled/extensions/statusline.md +1 -0
- package/docs/bundled/extensions/subagent.md +29 -39
- package/docs/bundled/extensions/web-search.md +3 -3
- package/docs/development.md +8 -3
- package/docs/extensions.md +2 -2
- package/npm-shrinkwrap.json +110 -109
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,eAAe,EACf,YAAY,GACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,gBAAgB,EAAc,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAA0B,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGhD,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,qBAAqB,GAAG,KAAK,CAAC;AACpC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,gCAAgC,GAAG,wDAAwD,CAAC;AAElG,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,8DAA8D;AAC9D,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACrD,MAAM,cAAc,GAAG,CAAC,GAAG,aAAa,EAAE,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3E,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAC1C,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B,yEAAyE;AACzE,MAAM,cAAc;IAGnB,YAAY,IAAY;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,UAAU,KAAU,CAAC;CACrB;AAED,SAAS,UAAU,CAAC,IAAoB,EAAE,KAAa,EAAE,GAAuB;IAC/E,uEAAuE;IACvE,4EAA4E;IAC5E,MAAM,KAAK,GAAI,IAAgC,CAAC,KAAK,CAAC;IACtD,OAAO,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IAClC,OAAO,oBAAoB,CAAC,KAA0B,CAAC,IAAI,KAAK,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,OAAe;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,cAAc,IAAI,EAAE;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,KAAK,cAAc,GAAG,EAAE,GAAG,CAAC;IAC/F,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,SAA6B,EAAE,OAAgB;IAC/D,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,WAAW,CAAC,MAAyB;IAC7C,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,WAAW;YACf,OAAO,SAAS,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,OAAO,CAAC;QAChB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB,KAAK,SAAS;YACb,OAAO,QAAQ,CAAC;QACjB;YACC,OAAO,OAAO,CAAC;IACjB,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,MAAyB,EAAE,KAAY;IAC5D,MAAM,KAAK,GACV,MAAM,KAAK,WAAW;QACrB,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,MAAM,KAAK,QAAQ;YACpB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,MAAM,KAAK,SAAS;gBACrB,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,MAAM,KAAK,SAAS;oBACrB,CAAC,CAAC,GAAG;oBACL,CAAC,CAAC,GAAG,CAAC;IACX,OAAO,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,MAAyB;IAC5C,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAC/C,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IAC/C,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACzC,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GACV,KAAK,CAAC,gBAAgB,GAAG,CAAC;QACzB,CAAC,CAAC,aAAa,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,QAAQ,KAAK,CAAC,gBAAgB,GAAG;QAClF,CAAC,CAAC,aAAa,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,UAAU,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9C,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,QAAgB,EAAE,KAAa,EAAE,UAAU,GAAG,KAAK;IAC3F,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC;IACzC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC;QAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;IACrF,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,QAAsB;IAC9C,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,QAAQ,CAAC,QAAQ,KAAK,sBAAsB,EAAE,CAAC;QAClD,OAAO,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9E,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpF,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtF,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpF,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1F,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpF,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACvF,OAAO,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC;AACrC,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAuB,EAAE,QAAiB;IACxE,KAAK,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;IACnH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAuB;IACvD,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjD,IAAI,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,eAAe,CAAC;IACpF,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,GAAuB;IAC5C,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE7C,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IACtE,IAAI,UAAU;QAAE,OAAO,eAAe,CAAC;IACvC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,QAAQ;QAAE,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IACxG,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,mBAAmB,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;IAC5E,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,2EAA2E;AAC3E,uEAAuE;AACvE,8DAA8D;AAC9D,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,yEAAyE;AACzE,SAAS,WAAW,CAAC,GAAuB,EAAE,KAAa,EAAE,KAAY,EAAE,GAAW;IACrF,IAAI,MAAc,CAAC;IACnB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,sEAAsE;QACtE,6DAA6D;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5D,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACP,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACvG,CAAC;AAED;0EAC0E;AAC1E,MAAM,aAAa;IAIlB,YAAY,QAAkB;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACjD,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC3B,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,CAAC,CACrF,CAAC;QACF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW,EAAE,CAAC;YACxE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CACT,GAAG;iBACD,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;gBACvB,IAAI,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,OAAO,CAAC;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;gBACpE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;YAC/E,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,CAAC,CACV,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,UAAU,KAAU,CAAC;CACrB;AAED,SAAS,SAAS,CAAC,GAAuB,EAAE,KAAa,EAAE,KAAY;IACtE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7G,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAC/I,CAAC;AAED,SAAS,YAAY,CAAC,QAAsB,EAAE,KAAY;IACzD,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,IAAI,GACP,QAAQ,CAAC,MAAM,KAAK,QAAQ;QAC3B,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE;QAChE,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS;YAC9B,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE;YACjE,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;IAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC5D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,SAAS,IAAI,wBAAwB,EAAE,CAAC;QACzG,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,cAAc,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CACjB,SAAoB,EACpB,GAAuB,EACvB,KAAa,EACb,IAAoB,EACpB,KAAY;IAEZ,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB,EAAE,KAAa,EAAE,IAAoB,EAAE,KAAY;IACnG,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACrE,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,GAAG,CAAC,UAAU,CAAC,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IAClH,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7D,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,EAAE,CAAC;QACX,SAAS,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/G,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU;QAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7G,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,SAAS,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAuB,EAAE,KAAa,EAAE,IAAoB,EAAE,KAAY;IACnG,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACrE,SAAS,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7F,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,QAAQ,CACjB,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE;YAClD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC;SAC7C,CAAC,CACF,CAAC;IACH,CAAC;SAAM,CAAC;QACP,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,MAAwC,EAAE,KAAY,EAAE,OAAgB;IAC/F,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACjG,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC;AAWD,4EAA4E;AAC5E,0EAA0E;AAC1E,SAAS,cAAc,CAAC,IAA0B;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,yEAAyE;AACzE,uEAAuE;AACvE,4EAA4E;AAC5E,yEAAyE;AACzE,yBAAyB;AACzB,MAAM,UAAU,mBAAmB,CAAC,OAAkC,EAAE,SAAkB;IACzF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;QACxC,MAAM,QAAQ,GACb,CAAC,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,2BAA2B,CAAC;QAC9G,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,oEAAoE;YACpE,+DAA+D;YAC/D,IAAI,KAAK,CAAC,eAAe,KAAK,QAAQ;gBAAE,OAAO;YAC/C,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC;QACjC,KAAK,CAAC,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;YAC/B,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;YAClC,OAAO,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC,EAAE,QAAQ,CAAC,CAAC;QACb,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;QAC7B,OAAO;IACR,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;QAC/B,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;IACnC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAoB,EAAE,KAAY;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAClF,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,kEAAkE;AAClE,SAAS,gBAAgB,CAAC,OAAwB,EAAE,KAAY,EAAE,SAAkB;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,IAAI,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;IACjC,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnH,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,QAAQ,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACnF,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9H,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,MAAwC,EACxC,OAAgC,EAChC,KAAY,EACZ,IAAoB,EACpB,OAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEvF,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,SAAS,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5F,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACnD,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC;QAClG,SAAS,CAAC,QAAQ,CACjB,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAC/F,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { getMarkdownTheme, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { AGENT_PROFILE_LABELS } from \"./agents.ts\";\nimport { COMPACTION_ACTIVITY_ID, type SubagentAgentName } from \"./constants.ts\";\nimport type { SubagentParams } from \"./schema.ts\";\nimport { getSubagentRetryView } from \"./state.ts\";\nimport { plainLine, truncate } from \"./text.ts\";\nimport type { SubagentDetails, SubagentRunDetails, SubagentRunStatus, ToolActivity } from \"./types.ts\";\n\nconst ACTIVITY_RESULT_LIMIT = 96;\nconst RETRY_ERROR_LIMIT = 160;\nconst FALLBACK_OUTPUT_LIMIT = 4_000;\nconst ACTIVITY_DURATION_MIN_MS = 10_000;\nconst OUTPUT_TRUNCATION_NOTICE_PATTERN = /\\s*\\[Output truncated(?:: \\d+ bytes omitted)?\\.\\]\\s*$/u;\n\n// A breathing dot-to-star bloom: the sequence plays forward to full bloom\n// and back, holding each extreme for two ticks. The mid frame uses ✼ rather\n// than the more common ✳ because U+2733 carries the Unicode Emoji property\n// and some terminals render it as a double-width color emoji.\nconst SPINNER_BLOOM = [\"·\", \"✢\", \"✼\", \"✶\", \"✻\", \"✽\"];\nconst SPINNER_FRAMES = [...SPINNER_BLOOM, ...[...SPINNER_BLOOM].reverse()];\nconst SPINNER_INTERVAL_MS = 120;\nconst ELAPSED_REFRESH_INTERVAL_MS = 1_000;\nconst FLOW_SEPARATOR = \" · \";\nconst FLOW_SEPARATOR_WIDTH = 3;\n\n/** Width-aware single-line text for compact rows and section headers. */\nclass SingleLineText implements Component {\n\tprivate readonly text: string;\n\n\tconstructor(text: string) {\n\t\tthis.text = text;\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [truncateToWidth(this.text, Math.max(1, width), \"...\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction taskPrompt(args: SubagentParams, index: number, run: SubagentRunDetails): string {\n\t// Tool calls restored from before the tasks-array shape carry a legacy\n\t// args object without `tasks`; those sections fall back to the description.\n\tconst tasks = (args as Partial<SubagentParams>).tasks;\n\treturn tasks?.[index]?.prompt ?? run.description;\n}\n\nfunction profileLabel(agent: string): string {\n\treturn AGENT_PROFILE_LABELS[agent as SubagentAgentName] ?? agent;\n}\n\nfunction formatDuration(seconds: number): string {\n\tconst roundedSeconds = Math.round(seconds);\n\tif (roundedSeconds >= 60) return `${Math.floor(roundedSeconds / 60)}m ${roundedSeconds % 60}s`;\n\treturn `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`;\n}\n\nfunction elapsed(startedAt: number | undefined, endedAt?: number): string | undefined {\n\tif (startedAt === undefined) return undefined;\n\treturn formatDuration(Math.max(0, ((endedAt ?? Date.now()) - startedAt) / 1_000));\n}\n\nfunction statusColor(status: SubagentRunStatus): \"success\" | \"error\" | \"warning\" | \"accent\" | \"muted\" {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"success\";\n\t\tcase \"failed\":\n\t\t\treturn \"error\";\n\t\tcase \"aborted\":\n\t\t\treturn \"warning\";\n\t\tcase \"running\":\n\t\t\treturn \"accent\";\n\t\tdefault:\n\t\t\treturn \"muted\";\n\t}\n}\n\nfunction statusMarker(status: SubagentRunStatus, theme: Theme): string {\n\tconst glyph =\n\t\tstatus === \"completed\"\n\t\t\t? \"✓\"\n\t\t\t: status === \"failed\"\n\t\t\t\t? \"×\"\n\t\t\t\t: status === \"aborted\"\n\t\t\t\t\t? \"■\"\n\t\t\t\t\t: status === \"running\"\n\t\t\t\t\t\t? \"›\"\n\t\t\t\t\t\t: \"○\";\n\treturn theme.fg(statusColor(status), glyph);\n}\n\nfunction statusWord(status: SubagentRunStatus): string {\n\tif (status === \"completed\") return \"Completed\";\n\tif (status === \"failed\") return \"Failed\";\n\tif (status === \"aborted\") return \"Aborted\";\n\tif (status === \"running\") return \"Thinking...\";\n\treturn \"Queued\";\n}\n\nfunction displayLine(text: string): string {\n\treturn plainLine(text).replace(OUTPUT_TRUNCATION_NOTICE_PATTERN, \"...\").trim();\n}\n\nfunction retryText(run: SubagentRunDetails): string | undefined {\n\tconst retry = getSubagentRetryView(run);\n\tif (!retry) return undefined;\n\tconst state =\n\t\tretry.remainingSeconds > 0\n\t\t\t? `Retrying (${retry.attempt}/${retry.maxAttempts}) in ${retry.remainingSeconds}s`\n\t\t\t: `Retrying (${retry.attempt}/${retry.maxAttempts}) now...`;\n\tconst error = truncate(displayLine(retry.error), RETRY_ERROR_LIMIT);\n\treturn error ? `${state} · ${error}` : state;\n}\n\nfunction replaceToolPrefix(text: string, toolName: string, label: string, emptyLabel = label): string {\n\tif (text === toolName) return emptyLabel;\n\tif (text.startsWith(`${toolName} `)) return `${label}${text.slice(toolName.length)}`;\n\treturn text;\n}\n\nfunction activitySummary(activity: ToolActivity): string {\n\tconst summary = displayLine(activity.summary);\n\tif (activity.toolName === COMPACTION_ACTIVITY_ID) {\n\t\treturn activity.status === \"running\" ? \"Compacting...\" : summary;\n\t}\n\tif (activity.toolName === \"bash\") return summary === \"bash\" ? \"Run\" : summary;\n\tif (activity.toolName === \"read\") return replaceToolPrefix(summary, \"read\", \"Read\");\n\tif (activity.toolName === \"grep\") return replaceToolPrefix(summary, \"grep\", \"Search\");\n\tif (activity.toolName === \"find\") return replaceToolPrefix(summary, \"find\", \"Find\");\n\tif (activity.toolName === \"ls\") return replaceToolPrefix(summary, \"ls\", \"List\", \"List .\");\n\tif (activity.toolName === \"edit\") return replaceToolPrefix(summary, \"edit\", \"Edit\");\n\tif (activity.toolName === \"write\") return replaceToolPrefix(summary, \"write\", \"Write\");\n\treturn summary || activity.toolName;\n}\n\nfunction latestRunningActivity(run: SubagentRunDetails, toolName?: string): ToolActivity | undefined {\n\tfor (let index = run.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = run.activities[index];\n\t\tif (activity?.status === \"running\" && (toolName === undefined || activity.toolName === toolName)) return activity;\n\t}\n\treturn undefined;\n}\n\nfunction fallbackCurrentActivity(run: SubagentRunDetails): string | undefined {\n\tif (!run.currentActivity) return undefined;\n\tconst current = displayLine(run.currentActivity);\n\tif (/^Compacting(?: context)?(?:…|\\.\\.\\.)?$/u.test(current)) return \"Compacting...\";\n\treturn current;\n}\n\nfunction runStateText(run: SubagentRunDetails): string {\n\tif (run.status === \"completed\" || run.status === \"failed\" || run.status === \"aborted\") {\n\t\tconst duration = elapsed(run.startedAt, run.endedAt);\n\t\treturn duration ? `${statusWord(run.status)} · ${duration}` : statusWord(run.status);\n\t}\n\n\tconst retry = retryText(run);\n\tif (retry) return retry;\n\tif (run.status === \"queued\") return \"Queued\";\n\n\tconst compaction = latestRunningActivity(run, COMPACTION_ACTIVITY_ID);\n\tif (compaction) return \"Compacting...\";\n\tconst activity = latestRunningActivity(run);\n\tif (activity) return activitySummary(activity);\n\tconst current = fallbackCurrentActivity(run);\n\tif (current) return current;\n\tif (run.status === \"running\" && run.usage.turns === 0 && run.usage.toolUses === 0) return \"Starting...\";\n\treturn statusWord(run.status);\n}\n\nfunction spinnerGlyph(now: number): string {\n\tconst frame = Math.floor(now / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length;\n\treturn SPINNER_FRAMES[frame] ?? SPINNER_FRAMES[0] ?? \"\";\n}\n\n// All spinner and status glyphs are single-width characters; this constant\n// documents the expectation and guards against accidental double-width\n// substitutions causing layout flicker in the collapsed flow.\nconst MARKER_WIDTH = 1;\n\n/** One collapsed cell: status glyph, ordinal, and profile label only. */\nfunction flowSegment(run: SubagentRunDetails, index: number, theme: Theme, now: number): string {\n\tlet marker: string;\n\tif (run.status === \"running\") {\n\t\tconst glyph = spinnerGlyph(now);\n\t\t// Pad to MARKER_WIDTH so cellWidth stays stable across frames even if\n\t\t// a glyph measures wider on some terminal/font combinations.\n\t\tconst pad = Math.max(0, MARKER_WIDTH - visibleWidth(glyph));\n\t\tmarker = theme.fg(\"accent\", glyph) + (pad > 0 ? \" \".repeat(pad) : \"\");\n\t} else {\n\t\tmarker = statusMarker(run.status, theme);\n\t}\n\treturn `${marker} ${theme.fg(\"dim\", `#${index + 1}`)} ${theme.fg(\"accent\", profileLabel(run.agent))}`;\n}\n\n/** Collapsed batch flow: one cell per run, wrapped at cell boundaries with\n * uniform cell widths so continuation rows keep their columns aligned. */\nclass CollapsedFlow implements Component {\n\tprivate readonly segments: string[];\n\tprivate readonly cellWidth: number;\n\n\tconstructor(segments: string[]) {\n\t\tthis.segments = segments;\n\t\tthis.cellWidth = segments.reduce((max, segment) => Math.max(max, visibleWidth(segment)), 1);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst usable = Math.max(1, width);\n\t\tconst joined = this.segments.join(FLOW_SEPARATOR);\n\t\tconst packed = visibleWidth(joined);\n\t\tif (this.cellWidth > usable || packed <= usable) {\n\t\t\treturn [packed <= usable ? joined : truncateToWidth(joined, usable, \"...\")];\n\t\t}\n\t\tconst columnCount = Math.max(\n\t\t\t1,\n\t\t\tMath.floor((usable + FLOW_SEPARATOR_WIDTH) / (this.cellWidth + FLOW_SEPARATOR_WIDTH)),\n\t\t);\n\t\tconst lines: string[] = [];\n\t\tfor (let start = 0; start < this.segments.length; start += columnCount) {\n\t\t\tconst row = this.segments.slice(start, start + columnCount);\n\t\t\tlines.push(\n\t\t\t\trow\n\t\t\t\t\t.map((segment, index) => {\n\t\t\t\t\t\tif (index === row.length - 1) return segment;\n\t\t\t\t\t\tconst padding = Math.max(0, this.cellWidth - visibleWidth(segment));\n\t\t\t\t\t\treturn `${segment}${padding > 0 ? \" \".repeat(padding) : \"\"}${FLOW_SEPARATOR}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\"),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction runHeader(run: SubagentRunDetails, index: number, theme: Theme): string {\n\tconst metrics = [run.model];\n\tif (run.thinking !== \"off\") metrics.push(run.thinking);\n\tif (run.cwd) metrics.push(`cwd: ${run.cwd}`);\n\tif (run.usage.toolUses) metrics.push(`${run.usage.toolUses} tool use${run.usage.toolUses === 1 ? \"\" : \"s\"}`);\n\tif (run.usage.turns) metrics.push(`${run.usage.turns} turn${run.usage.turns === 1 ? \"\" : \"s\"}`);\n\tconst duration = elapsed(run.startedAt, run.endedAt);\n\tif (duration) metrics.push(duration);\n\treturn `${theme.fg(\"dim\", `── #${index + 1} `)}${theme.fg(\"accent\", profileLabel(run.agent))}${theme.fg(\"dim\", ` · ${metrics.join(\" · \")}`)}`;\n}\n\nfunction activityLine(activity: ToolActivity, theme: Theme): string {\n\tconst summary = activitySummary(activity);\n\tlet line =\n\t\tactivity.status === \"failed\"\n\t\t\t? `${theme.fg(\"error\", \"×\")} ${theme.fg(\"toolOutput\", summary)}`\n\t\t\t: activity.status === \"running\"\n\t\t\t\t? `${theme.fg(\"accent\", \"›\")} ${theme.fg(\"toolOutput\", summary)}`\n\t\t\t\t: ` ${theme.fg(\"toolOutput\", summary)}`;\n\tif (activity.status === \"failed\" && activity.resultSummary) {\n\t\tline += theme.fg(\"error\", ` · ${truncate(displayLine(activity.resultSummary), ACTIVITY_RESULT_LIMIT)}`);\n\t}\n\tif (activity.endedAt !== undefined && activity.endedAt - activity.startedAt >= ACTIVITY_DURATION_MIN_MS) {\n\t\tline += theme.fg(\"dim\", ` · ${formatDuration((activity.endedAt - activity.startedAt) / 1_000)}`);\n\t}\n\treturn line;\n}\n\nfunction addPrompt(\n\tcontainer: Container,\n\trun: SubagentRunDetails,\n\tindex: number,\n\targs: SubagentParams,\n\ttheme: Theme,\n): void {\n\tcontainer.addChild(new Spacer(1));\n\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Prompt\"), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"toolOutput\", taskPrompt(args, index, run)), 0, 0));\n}\n\nfunction renderRunningRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new SingleLineText(runHeader(run, index, theme)));\n\taddPrompt(container, run, index, args, theme);\n\tcontainer.addChild(new Spacer(1));\n\tconst total = Math.max(run.usage.toolUses, run.activities.length);\n\tconst label = total > run.activities.length ? `Activity · last ${run.activities.length} of ${total}` : \"Activity\";\n\tcontainer.addChild(new Text(theme.fg(\"muted\", label), 0, 0));\n\n\tconst retry = retryText(run);\n\tif (retry) {\n\t\tcontainer.addChild(new SingleLineText(`${statusMarker(run.status, theme)} ${theme.fg(\"toolOutput\", retry)}`));\n\t}\n\tfor (const activity of run.activities) container.addChild(new SingleLineText(activityLine(activity, theme)));\n\tif (!retry && run.activities.length === 0) {\n\t\tcontainer.addChild(new SingleLineText(theme.fg(\"dim\", ` ${runStateText(run)}`)));\n\t}\n\treturn container;\n}\n\nfunction renderSettledRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new SingleLineText(runHeader(run, index, theme)));\n\taddPrompt(container, run, index, args, theme);\n\tif (run.error) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Error\"), 0, 0));\n\t\tcontainer.addChild(new Text(theme.fg(\"error\", run.error), 0, 0));\n\t}\n\tcontainer.addChild(new Spacer(1));\n\tconst reportLabel = run.status !== \"completed\" && run.report ? \"Report · partial\" : \"Report\";\n\tcontainer.addChild(new Text(theme.fg(\"muted\", reportLabel), 0, 0));\n\tif (run.report) {\n\t\tcontainer.addChild(\n\t\t\tnew Markdown(run.report, 0, 0, getMarkdownTheme(), {\n\t\t\t\tcolor: (text) => theme.fg(\"toolOutput\", text),\n\t\t\t}),\n\t\t);\n\t} else {\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"(No report.)\"), 0, 0));\n\t}\n\treturn container;\n}\n\nfunction fallbackResult(result: AgentToolResult<SubagentDetails>, theme: Theme, isError: boolean): Component {\n\tconst text = result.content.find((part) => part.type === \"text\");\n\tconst value = text?.type === \"text\" ? truncate(text.text, FALLBACK_OUTPUT_LIMIT) : \"(no output)\";\n\treturn new Text(theme.fg(isError ? \"error\" : \"muted\", value), 0, 0);\n}\n\n/** Per-result live-refresh state owned by the shell's render context. */\nexport interface SubagentRenderState {\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n\t/** Cadence the current timer was created with, used to detect changes. */\n\trefreshInterval?: number;\n}\n\ntype SubagentToolRenderContext = ToolRenderContext<SubagentRenderState, SubagentParams, SubagentDetails>;\n\n// Only genuinely running runs justify spinner-cadence repaints; queued runs\n// show a static marker and pick the animation back up via runner updates.\nfunction hasRunningRuns(runs: SubagentRunDetails[]): boolean {\n\treturn runs.some((run) => run.status === \"running\");\n}\n\n// Animate a collapsed flow at the spinner cadence while runs are active;\n// otherwise re-render timing and retry text once per second. The first\n// settled render clears the timer, and a cadence change (expand/collapse or\n// the last run finishing) reschedules immediately instead of waiting out\n// the previous interval.\nexport function scheduleLiveRefresh(context: SubagentToolRenderContext, isPartial: boolean): void {\n\tconst state = context.state;\n\tif (isPartial) {\n\t\tconst details = context.result?.details;\n\t\tconst interval =\n\t\t\t!context.expanded && hasRunningRuns(details?.runs ?? []) ? SPINNER_INTERVAL_MS : ELAPSED_REFRESH_INTERVAL_MS;\n\t\tif (state.refreshTimer !== undefined) {\n\t\t\t// Keep a matching timer so unrelated re-renders cannot postpone the\n\t\t\t// next tick; only reschedule when the desired cadence changes.\n\t\t\tif (state.refreshInterval === interval) return;\n\t\t\tclearTimeout(state.refreshTimer);\n\t\t}\n\t\tstate.refreshInterval = interval;\n\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\tstate.refreshTimer = undefined;\n\t\t\tstate.refreshInterval = undefined;\n\t\t\tcontext.invalidate();\n\t\t}, interval);\n\t\tstate.refreshTimer.unref?.();\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t\tstate.refreshInterval = undefined;\n\t}\n}\n\nexport function renderSubagentCall(args: SubagentParams, theme: Theme): Component {\n\tconst count = Array.isArray(args.tasks) ? args.tasks.length : 0;\n\tconst title = theme.fg(count > 0 ? \"toolTitle\" : \"error\", theme.bold(\"Subagent\"));\n\treturn new Text(title, 0, 0);\n}\n\n/** Batch-level timing and cost live only in the expanded view. */\nfunction batchSummaryLine(details: SubagentDetails, theme: Theme, isPartial: boolean): string {\n\tconst parts: string[] = [];\n\tconst duration = elapsed(details.startedAt, details.endedAt);\n\tif (duration) parts.push(duration);\n\tconst cost = details.usage?.cost;\n\tif (!isPartial && typeof cost === \"number\" && Number.isFinite(cost) && cost > 0) parts.push(`$${cost.toFixed(3)}`);\n\tconst tasks = `${details.runs.length} task${details.runs.length === 1 ? \"\" : \"s\"}`;\n\treturn `${theme.fg(\"dim\", `── Batch · ${tasks}`)}${parts.length > 0 ? `${theme.fg(\"dim\", ` · ${parts.join(\" · \")}`)}` : \"\"}`;\n}\n\nexport function renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\targs: SubagentParams,\n\tisError: boolean,\n): Component {\n\tconst details = result.details;\n\tif (!details || !Array.isArray(details.runs)) return fallbackResult(result, theme, isError);\n\tif (details.runs.length === 0) return new Text(theme.fg(\"muted\", \"Starting...\"), 0, 0);\n\n\tconst container = new Container();\n\tif (!options.expanded) {\n\t\tconst now = Date.now();\n\t\tcontainer.addChild(new CollapsedFlow(details.runs.map((run, index) => flowSegment(run, index, theme, now))));\n\t\treturn container;\n\t}\n\n\tcontainer.addChild(new SingleLineText(batchSummaryLine(details, theme, options.isPartial)));\n\tcontainer.addChild(new Spacer(1));\n\tfor (const [index, run] of details.runs.entries()) {\n\t\tif (index > 0) container.addChild(new Spacer(1));\n\t\tconst settled = run.status === \"completed\" || run.status === \"failed\" || run.status === \"aborted\";\n\t\tcontainer.addChild(\n\t\t\tsettled ? renderSettledRun(run, index, args, theme) : renderRunningRun(run, index, args, theme),\n\t\t);\n\t}\n\treturn container;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Component,\n\tContainer,\n\tMarkdown,\n\tSpacer,\n\tText,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from \"../../core/extensions/types.ts\";\nimport { getMarkdownTheme, type Theme, type ThemeColor } from \"../../modes/interactive/theme/theme.ts\";\nimport { activityCallText, isDisplayableActivity } from \"./activity.ts\";\nimport { AGENT_PROFILE_LABELS } from \"./agents.ts\";\nimport { COMPACTION_ACTIVITY_ID, DISPLAY_ACTIVITY_LIMIT, type SubagentAgentName } from \"./constants.ts\";\nimport type { SubagentParams } from \"./schema.ts\";\nimport { getSubagentRetryView } from \"./state.ts\";\nimport { plainLine, truncate } from \"./text.ts\";\nimport type { SubagentDetails, SubagentRunDetails, SubagentRunStatus, ToolActivity } from \"./types.ts\";\n\nconst RETRY_ERROR_LIMIT = 160;\nconst FALLBACK_OUTPUT_LIMIT = 4_000;\nconst OUTPUT_TRUNCATION_NOTICE_PATTERN = /\\s*\\[Output truncated(?:: \\d+ bytes omitted)?\\.\\]\\s*$/u;\n\n// A breathing dot-to-star bloom: the sequence plays forward to full bloom\n// and back, holding each extreme for two ticks. The mid frame uses ✼ rather\n// than the more common ✳ because U+2733 carries the Unicode Emoji property\n// and some terminals render it as a double-width color emoji.\nconst SPINNER_BLOOM = [\"·\", \"✢\", \"✼\", \"✶\", \"✻\", \"✽\"];\nconst SPINNER_FRAMES = [...SPINNER_BLOOM, ...[...SPINNER_BLOOM].reverse()];\nconst SPINNER_INTERVAL_MS = 120;\nconst ELAPSED_REFRESH_INTERVAL_MS = 1_000;\nconst FLOW_SEPARATOR = \" · \";\nconst FLOW_SEPARATOR_WIDTH = 3;\n\n/** Width-aware single-line text for compact rows and section headers. */\nclass SingleLineText implements Component {\n\tprivate readonly text: string;\n\n\tconstructor(text: string) {\n\t\tthis.text = text;\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [truncateToWidth(this.text, Math.max(1, width), \"...\")];\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction taskPrompt(args: SubagentParams, index: number, run: SubagentRunDetails): string {\n\t// Tool calls restored from before the tasks-array shape carry a legacy\n\t// args object without `tasks`; those sections fall back to the description.\n\tconst tasks = (args as Partial<SubagentParams>).tasks;\n\treturn tasks?.[index]?.prompt ?? run.description;\n}\n\nfunction profileLabel(agent: string): string {\n\treturn AGENT_PROFILE_LABELS[agent as SubagentAgentName] ?? agent;\n}\n\nfunction formatDuration(seconds: number): string {\n\tconst roundedSeconds = Math.round(seconds);\n\tif (roundedSeconds >= 60) return `${Math.floor(roundedSeconds / 60)}m ${roundedSeconds % 60}s`;\n\treturn `${seconds.toFixed(seconds < 10 ? 1 : 0)}s`;\n}\n\nfunction elapsed(startedAt: number | undefined, endedAt?: number): string | undefined {\n\tif (startedAt === undefined) return undefined;\n\treturn formatDuration(Math.max(0, ((endedAt ?? Date.now()) - startedAt) / 1_000));\n}\n\nfunction statusColor(status: SubagentRunStatus): \"success\" | \"error\" | \"warning\" | \"accent\" | \"muted\" {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\t\treturn \"success\";\n\t\tcase \"failed\":\n\t\t\treturn \"error\";\n\t\tcase \"aborted\":\n\t\t\treturn \"warning\";\n\t\tcase \"running\":\n\t\t\treturn \"accent\";\n\t\tdefault:\n\t\t\treturn \"muted\";\n\t}\n}\n\nfunction statusMarker(status: SubagentRunStatus, theme: Theme): string {\n\tconst glyph =\n\t\tstatus === \"completed\"\n\t\t\t? \"✓\"\n\t\t\t: status === \"failed\"\n\t\t\t\t? \"×\"\n\t\t\t\t: status === \"aborted\"\n\t\t\t\t\t? \"■\"\n\t\t\t\t\t: status === \"running\"\n\t\t\t\t\t\t? \"›\"\n\t\t\t\t\t\t: \"○\";\n\treturn theme.fg(statusColor(status), glyph);\n}\n\nfunction displayLine(text: string): string {\n\treturn plainLine(text).replace(OUTPUT_TRUNCATION_NOTICE_PATTERN, \"...\").trim();\n}\n\nfunction retryText(run: SubagentRunDetails): string | undefined {\n\tconst retry = getSubagentRetryView(run);\n\tif (!retry) return undefined;\n\tconst state =\n\t\tretry.remainingSeconds > 0\n\t\t\t? `Retrying (${retry.attempt}/${retry.maxAttempts}) in ${retry.remainingSeconds}s`\n\t\t\t: `Retrying (${retry.attempt}/${retry.maxAttempts}) now...`;\n\tconst error = truncate(displayLine(retry.error), RETRY_ERROR_LIMIT);\n\treturn error ? `${state} · ${error}` : state;\n}\n\nfunction latestRunningActivity(run: SubagentRunDetails, toolName: string): ToolActivity | undefined {\n\tfor (let index = run.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = run.activities[index];\n\t\tif (activity?.status === \"running\" && activity.toolName === toolName) return activity;\n\t}\n\treturn undefined;\n}\n\nfunction formatTotalTokens(value: number): string {\n\tconst count = Number.isFinite(value) ? Math.max(0, Math.round(value)) : 0;\n\tif (count < 1_000) return String(count);\n\tconst divisor = count < 999_950 ? 1_000 : 1_000_000;\n\tconst suffix = divisor === 1_000 ? \"k\" : \"M\";\n\tconst rounded = Math.round((count / divisor) * 10) / 10;\n\treturn `${Number.isInteger(rounded) ? rounded.toFixed(0) : rounded.toFixed(1)}${suffix}`;\n}\n\nfunction spinnerGlyph(now: number): string {\n\tconst frame = Math.floor(now / SPINNER_INTERVAL_MS) % SPINNER_FRAMES.length;\n\treturn SPINNER_FRAMES[frame] ?? SPINNER_FRAMES[0] ?? \"\";\n}\n\n// All spinner and status glyphs are single-width characters; this constant\n// documents the expectation and guards against accidental double-width\n// substitutions causing layout flicker in the collapsed flow.\nconst MARKER_WIDTH = 1;\n\n/** One collapsed cell: status glyph, ordinal, and profile label only. */\nfunction flowSegment(run: SubagentRunDetails, index: number, theme: Theme, now: number): string {\n\tlet marker: string;\n\tif (run.status === \"running\") {\n\t\tconst glyph = spinnerGlyph(now);\n\t\t// Pad to MARKER_WIDTH so cellWidth stays stable across frames even if\n\t\t// a glyph measures wider on some terminal/font combinations.\n\t\tconst pad = Math.max(0, MARKER_WIDTH - visibleWidth(glyph));\n\t\tmarker = theme.fg(\"accent\", glyph) + (pad > 0 ? \" \".repeat(pad) : \"\");\n\t} else {\n\t\tmarker = statusMarker(run.status, theme);\n\t}\n\treturn `${marker} ${theme.fg(\"dim\", `#${index + 1}`)} ${theme.fg(\"accent\", profileLabel(run.agent))}`;\n}\n\n/** Collapsed batch flow: one cell per run, wrapped at cell boundaries with\n * uniform cell widths so continuation rows keep their columns aligned. */\nclass CollapsedFlow implements Component {\n\tprivate readonly segments: string[];\n\tprivate readonly cellWidth: number;\n\n\tconstructor(segments: string[]) {\n\t\tthis.segments = segments;\n\t\tthis.cellWidth = segments.reduce((max, segment) => Math.max(max, visibleWidth(segment)), 1);\n\t}\n\n\trender(width: number): string[] {\n\t\tconst usable = Math.max(1, width);\n\t\tconst joined = this.segments.join(FLOW_SEPARATOR);\n\t\tconst packed = visibleWidth(joined);\n\t\tif (packed <= usable) return [joined];\n\t\tif (this.cellWidth > usable) {\n\t\t\treturn this.segments.map((segment) => truncateToWidth(segment, usable, \"...\"));\n\t\t}\n\t\tconst columnCount = Math.max(\n\t\t\t1,\n\t\t\tMath.floor((usable + FLOW_SEPARATOR_WIDTH) / (this.cellWidth + FLOW_SEPARATOR_WIDTH)),\n\t\t);\n\t\tconst lines: string[] = [];\n\t\tfor (let start = 0; start < this.segments.length; start += columnCount) {\n\t\t\tconst row = this.segments.slice(start, start + columnCount);\n\t\t\tlines.push(\n\t\t\t\trow\n\t\t\t\t\t.map((segment, index) => {\n\t\t\t\t\t\tif (index === row.length - 1) return segment;\n\t\t\t\t\t\tconst padding = Math.max(0, this.cellWidth - visibleWidth(segment));\n\t\t\t\t\t\treturn `${segment}${padding > 0 ? \" \".repeat(padding) : \"\"}${FLOW_SEPARATOR}`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\"\"),\n\t\t\t);\n\t\t}\n\t\treturn lines;\n\t}\n\n\tinvalidate(): void {}\n}\n\nfunction toolCallLabel(count: number): string {\n\treturn `${count} tool call${count === 1 ? \"\" : \"s\"}`;\n}\n\nfunction runHeader(run: SubagentRunDetails, index: number, theme: Theme): string {\n\tconst separator = theme.fg(\"dim\", \" · \");\n\tconst duration = elapsed(run.startedAt, run.endedAt) ?? \"0.0s\";\n\tconst metrics = [\n\t\trun.model,\n\t\trun.thinking,\n\t\t`${formatTotalTokens(run.usage.totalTokens)} tok`,\n\t\ttoolCallLabel(run.usage.toolUses),\n\t\tduration,\n\t].map((metric) => theme.fg(\"muted\", metric));\n\treturn [theme.fg(\"accent\", theme.bold(`#${index + 1} ${profileLabel(run.agent)}`)), ...metrics].join(separator);\n}\n\nfunction sectionTitle(title: string, theme: Theme, color: ThemeColor, suffix?: string): string {\n\tconst heading = theme.fg(color, theme.bold(title));\n\treturn suffix ? `${heading}${theme.fg(\"dim\", ` · ${suffix}`)}` : heading;\n}\n\nfunction activityTitleSuffix(total: number, shown: number): string {\n\tif (total <= DISPLAY_ACTIVITY_LIMIT && shown >= total) return toolCallLabel(total);\n\tif (shown > 0) return `last ${shown} of ${total} tool calls`;\n\treturn toolCallLabel(total);\n}\n\nfunction activityLine(activity: ToolActivity, theme: Theme): string {\n\t// State color stays on the two-column status marker; the call text itself\n\t// keeps the quiet toolOutput color so a running row does not flash a whole\n\t// accent-colored command line on every refresh.\n\tconst text = theme.fg(\"toolOutput\", activityCallText(activity));\n\tif (activity.status === \"failed\") return `${theme.fg(\"error\", \"×\")} ${text}`;\n\tif (activity.status === \"running\") return `${theme.fg(\"accent\", \"›\")} ${text}`;\n\treturn ` ${text}`;\n}\n\nfunction addPrompt(\n\tcontainer: Container,\n\trun: SubagentRunDetails,\n\tindex: number,\n\targs: SubagentParams,\n\ttheme: Theme,\n): void {\n\tcontainer.addChild(new Text(sectionTitle(\"Prompt\", theme, \"toolTitle\"), 0, 0));\n\tcontainer.addChild(new Text(theme.fg(\"toolOutput\", taskPrompt(args, index, run)), 2, 0));\n}\n\nfunction addActivity(container: Container, run: SubagentRunDetails, theme: Theme): void {\n\tconst toolCalls = run.activities.filter(isDisplayableActivity);\n\tconst shown = toolCalls.slice(-DISPLAY_ACTIVITY_LIMIT);\n\tconst total = Math.max(run.usage.toolUses, toolCalls.length);\n\tcontainer.addChild(\n\t\tnew Text(sectionTitle(\"Activity\", theme, \"toolTitle\", activityTitleSuffix(total, shown.length)), 0, 0),\n\t);\n\tif (shown.length === 0) {\n\t\tconst empty = total === 0 ? \"No tool calls yet.\" : \"Activity unavailable.\";\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", empty), 2, 0));\n\t\treturn;\n\t}\n\tfor (const activity of shown) container.addChild(new SingleLineText(activityLine(activity, theme)));\n}\n\nfunction outcomeColor(status: SubagentRunStatus): ThemeColor {\n\tif (status === \"completed\") return \"success\";\n\tif (status === \"failed\") return \"error\";\n\tif (status === \"aborted\") return \"warning\";\n\treturn \"accent\";\n}\n\nfunction outcomeReport(run: SubagentRunDetails): string {\n\tif (typeof run.report === \"string\") return run.report;\n\tconst legacyOutput = (run as SubagentRunDetails & { finalOutput?: unknown }).finalOutput;\n\treturn typeof legacyOutput === \"string\" ? legacyOutput : \"\";\n}\n\nfunction hasOutcome(report: string): boolean {\n\treturn report.trim().length > 0;\n}\n\nfunction addOutcomeMarkdown(container: Container, report: string, theme: Theme): void {\n\tcontainer.addChild(\n\t\tnew Markdown(report, 2, 0, getMarkdownTheme(), {\n\t\t\tcolor: (text) => theme.fg(\"toolOutput\", text),\n\t\t}),\n\t);\n}\n\nfunction addOutcome(container: Container, run: SubagentRunDetails, theme: Theme): void {\n\tconst color = outcomeColor(run.status);\n\tconst report = outcomeReport(run);\n\tcontainer.addChild(new Text(sectionTitle(\"Outcome\", theme, color), 0, 0));\n\n\tif (run.status === \"queued\" || run.status === \"running\") {\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Still running...\"), 2, 0));\n\t\tconst retry = retryText(run);\n\t\tif (retry) {\n\t\t\tcontainer.addChild(new Text(theme.fg(\"warning\", retry), 2, 0));\n\t\t} else if (latestRunningActivity(run, COMPACTION_ACTIVITY_ID)) {\n\t\t\tcontainer.addChild(new Text(theme.fg(\"accent\", \"Compacting context...\"), 2, 0));\n\t\t}\n\t\treturn;\n\t}\n\n\tif (run.status === \"completed\") {\n\t\tif (hasOutcome(report)) addOutcomeMarkdown(container, report, theme);\n\t\telse container.addChild(new Text(theme.fg(\"muted\", \"No outcome returned.\"), 2, 0));\n\t\treturn;\n\t}\n\n\tconst verdict = run.status === \"failed\" ? \"Failed\" : \"Aborted\";\n\tconst reason = run.error ? `${verdict}: ${run.error}` : `${verdict}.`;\n\tcontainer.addChild(new Text(theme.fg(color, reason), 2, 0));\n\tif (hasOutcome(report)) {\n\t\tcontainer.addChild(new Spacer(1));\n\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Partial outcome:\"), 2, 0));\n\t\taddOutcomeMarkdown(container, report, theme);\n\t}\n}\n\nfunction renderRun(run: SubagentRunDetails, index: number, args: SubagentParams, theme: Theme): Component {\n\tconst container = new Container();\n\tcontainer.addChild(new SingleLineText(runHeader(run, index, theme)));\n\tcontainer.addChild(new Spacer(1));\n\taddPrompt(container, run, index, args, theme);\n\tcontainer.addChild(new Spacer(1));\n\taddActivity(container, run, theme);\n\tcontainer.addChild(new Spacer(1));\n\taddOutcome(container, run, theme);\n\treturn container;\n}\n\nfunction fallbackResult(result: AgentToolResult<SubagentDetails>, theme: Theme, isError: boolean): Component {\n\tconst text = result.content.find((part) => part.type === \"text\");\n\tconst value = text?.type === \"text\" ? truncate(text.text, FALLBACK_OUTPUT_LIMIT) : \"(no output)\";\n\treturn new Text(theme.fg(isError ? \"error\" : \"muted\", value), 0, 0);\n}\n\n/** Per-result live-refresh state owned by the shell's render context. */\nexport interface SubagentRenderState {\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n\t/** Cadence the current timer was created with, used to detect changes. */\n\trefreshInterval?: number;\n\t/** Called by the shell when the transcript row is disposed. */\n\tdispose?: () => void;\n}\n\ntype SubagentToolRenderContext = ToolRenderContext<SubagentRenderState, SubagentParams, SubagentDetails>;\n\n/** Pure refresh policy: schedule only while the current view contains changing text. */\nexport function desiredRefreshInterval(\n\truns: readonly SubagentRunDetails[],\n\toptions: { isPartial: boolean; expanded: boolean },\n): number | undefined {\n\tif (!options.isPartial) return undefined;\n\tif (!options.expanded) {\n\t\treturn runs.some((run) => run.status === \"running\") ? SPINNER_INTERVAL_MS : undefined;\n\t}\n\treturn runs.some((run) => run.status === \"running\" || run.retry !== undefined)\n\t\t? ELAPSED_REFRESH_INTERVAL_MS\n\t\t: undefined;\n}\n\nfunction clearLiveRefresh(state: SubagentRenderState): void {\n\tif (state.refreshTimer !== undefined) clearTimeout(state.refreshTimer);\n\tstate.refreshTimer = undefined;\n\tstate.refreshInterval = undefined;\n}\n\n// One one-shot timer per row. A paint with the same cadence keeps the existing\n// deadline; expansion, settlement, or loss of dynamic content clears or\n// reschedules immediately.\nexport function scheduleLiveRefresh(context: SubagentToolRenderContext, isPartial: boolean): void {\n\tconst state = context.state;\n\tstate.dispose ??= () => clearLiveRefresh(state);\n\tconst interval = desiredRefreshInterval(context.result?.details?.runs ?? [], {\n\t\tisPartial,\n\t\texpanded: context.expanded,\n\t});\n\tif (interval === undefined) {\n\t\tclearLiveRefresh(state);\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\t// Keep a matching timer so unrelated re-renders cannot postpone the\n\t\t// next tick; only reschedule when the desired cadence changes.\n\t\tif (state.refreshInterval === interval) return;\n\t\tclearTimeout(state.refreshTimer);\n\t}\n\tstate.refreshInterval = interval;\n\tstate.refreshTimer = setTimeout(() => {\n\t\tstate.refreshTimer = undefined;\n\t\tstate.refreshInterval = undefined;\n\t\tcontext.invalidate();\n\t}, interval);\n\tstate.refreshTimer.unref?.();\n}\n\nexport function renderSubagentCall(args: SubagentParams, theme: Theme): Component {\n\tconst count = Array.isArray(args.tasks) ? args.tasks.length : 0;\n\tconst title = theme.fg(count > 0 ? \"toolTitle\" : \"error\", theme.bold(\"Subagent\"));\n\treturn new Text(title, 0, 0);\n}\n\nexport function renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\targs: SubagentParams,\n\tisError: boolean,\n): Component {\n\tconst details = result.details;\n\tif (!details || !Array.isArray(details.runs)) return fallbackResult(result, theme, isError);\n\tif (details.runs.length === 0) return new Text(theme.fg(\"muted\", \"Starting...\"), 0, 0);\n\n\tconst container = new Container();\n\tif (!options.expanded) {\n\t\tconst now = Date.now();\n\t\tcontainer.addChild(new CollapsedFlow(details.runs.map((run, index) => flowSegment(run, index, theme, now))));\n\t\treturn container;\n\t}\n\n\tfor (const [index, run] of details.runs.entries()) {\n\t\tif (index > 0) container.addChild(new Spacer(1));\n\t\tcontainer.addChild(renderRun(run, index, args, theme));\n\t}\n\treturn container;\n}\n"]}
|
|
@@ -20,6 +20,7 @@ export interface SubagentInvocationOptions {
|
|
|
20
20
|
signal?: AbortSignal;
|
|
21
21
|
gate: ConcurrencyGate;
|
|
22
22
|
onUpdate?: (details: SubagentDetails) => void;
|
|
23
|
+
onConfigWarning?: (message: string) => void;
|
|
23
24
|
registerAbort?: (abort: () => Promise<void>) => () => void;
|
|
24
25
|
/** Test hook: overrides the task-retry backoff base delay. */
|
|
25
26
|
taskRetryBaseDelayMs?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,EAAE,KAAK,kBAAkB,EAAuB,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAYhE,OAAO,KAAK,EAAwB,eAAe,EAAE,uBAAuB,EAAiB,MAAM,YAAY,CAAC;AAUhH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,SAAkB;IAInC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAsBlD,OAAO,CAAC,OAAO;CAYf;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC;IAC3D,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAqID,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,EAAE,KAAK,kBAAkB,EAAuB,MAAM,cAAc,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAC;AAYhE,OAAO,KAAK,EAAwB,eAAe,EAAE,uBAAuB,EAAiB,MAAM,YAAY,CAAC;AAUhH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,SAAkB;IAInC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAsBlD,OAAO,CAAC,OAAO;CAYf;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC;IAC3D,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAqID,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAwDhH;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -78,7 +78,7 @@ async function resolveTasks(tasks, options) {
|
|
|
78
78
|
// One config load and one resolution pass for the whole batch: every
|
|
79
79
|
// task/profile/cwd/model is settled before any run is created or any
|
|
80
80
|
// worker starts, so a failing task cannot strand half-initialized runs.
|
|
81
|
-
const config = await loadSubagentConfig(options.agentDir);
|
|
81
|
+
const config = await loadSubagentConfig(options.agentDir, options.onConfigWarning);
|
|
82
82
|
return Promise.all(tasks.map((task, index) => resolveSubagentTask(task, options.parentCwd, options.parent, options.agentDir, config).catch((error) => {
|
|
83
83
|
const message = error instanceof Error ? error.message : String(error);
|
|
84
84
|
throw new Error(`Subagent task tasks[${index}] failed to resolve: ${message}`);
|
|
@@ -165,53 +165,62 @@ async function runWithGate(task, scope, options, dispatch, getState, onProgress)
|
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
export async function runSubagentInvocation(options) {
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
const
|
|
171
|
-
const
|
|
172
|
-
const runs = resolved.map((task, index) => createRunState(task, index, options.batchId, options.parentCwd));
|
|
173
|
-
const startedAt = Date.now();
|
|
174
|
-
// Every run's cancellation scope exists and is registered before any
|
|
175
|
-
// gate work starts, so a shutdown snapshot can never miss a queued task.
|
|
176
|
-
const scopes = runs.map(() => createRunCancellation(options.signal));
|
|
177
|
-
const unregisterScopes = scopes.map((scope) => options.registerAbort?.(scope.abort));
|
|
178
|
-
let lastVersion = versionSum(runs);
|
|
179
|
-
const progress = () => {
|
|
180
|
-
const version = versionSum(runs);
|
|
181
|
-
if (version === lastVersion)
|
|
182
|
-
return;
|
|
183
|
-
lastVersion = version;
|
|
184
|
-
emitDetails(runs, startedAt, options.onUpdate);
|
|
185
|
-
};
|
|
186
|
-
const dispatch = (index, event) => {
|
|
187
|
-
runs[index] = reduceRun(runs[index], event);
|
|
188
|
-
progress();
|
|
189
|
-
};
|
|
190
|
-
let latestDetails = emitDetails(runs, startedAt, options.onUpdate);
|
|
191
|
-
// Every task runs concurrently through the shared gate; Promise.all keeps
|
|
192
|
-
// result order identical to input order. There is no single-task branch:
|
|
193
|
-
// one task is just a batch of one.
|
|
168
|
+
// Register one invocation-level scope before the first await so shutdown can
|
|
169
|
+
// never snapshot the active set between preflight and worker creation.
|
|
170
|
+
const invocationScope = createRunCancellation(options.signal);
|
|
171
|
+
const unregisterInvocation = options.registerAbort?.(invocationScope.abort);
|
|
194
172
|
try {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
173
|
+
// Defensive count check: the schema already enforces 1..MAX_TASKS, but
|
|
174
|
+
// strict providers can bypass minItems, so validate before any work.
|
|
175
|
+
const tasks = options.params.tasks ?? [];
|
|
176
|
+
const resolved = await resolveTasks(tasks, options);
|
|
177
|
+
const runs = resolved.map((task, index) => createRunState(task, index, options.batchId, options.parentCwd));
|
|
178
|
+
const startedAt = Date.now();
|
|
179
|
+
const scopes = runs.map(() => createRunCancellation(invocationScope.signal));
|
|
180
|
+
const unregisterChildren = invocationScope.onAbort(async () => {
|
|
181
|
+
await Promise.allSettled(scopes.map((scope) => scope.abort()));
|
|
182
|
+
});
|
|
183
|
+
let lastVersion = versionSum(runs);
|
|
184
|
+
const progress = () => {
|
|
185
|
+
const version = versionSum(runs);
|
|
186
|
+
if (version === lastVersion)
|
|
187
|
+
return;
|
|
188
|
+
lastVersion = version;
|
|
189
|
+
emitDetails(runs, startedAt, options.onUpdate);
|
|
190
|
+
};
|
|
191
|
+
const dispatch = (index, event) => {
|
|
192
|
+
runs[index] = reduceRun(runs[index], event);
|
|
193
|
+
progress();
|
|
194
|
+
};
|
|
195
|
+
let latestDetails = emitDetails(runs, startedAt, options.onUpdate);
|
|
196
|
+
// Every task runs concurrently through the shared gate; Promise.all keeps
|
|
197
|
+
// result order identical to input order. There is no single-task branch:
|
|
198
|
+
// one task is just a batch of one.
|
|
199
|
+
try {
|
|
200
|
+
await Promise.all(resolved.map((task, index) => {
|
|
201
|
+
const dispatchToRun = (event) => dispatch(index, event);
|
|
202
|
+
return runWithGate(task, scopes[index], options, dispatchToRun, () => runs[index], progress);
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
unregisterChildren();
|
|
207
|
+
for (const scope of scopes)
|
|
208
|
+
scope.dispose();
|
|
209
|
+
}
|
|
210
|
+
latestDetails = emitDetails(runs, startedAt, undefined);
|
|
211
|
+
latestDetails.endedAt = Date.now();
|
|
212
|
+
// Error classification lives in the tool_result handler (index.ts), the
|
|
213
|
+
// only channel that reaches the session transcript and export.
|
|
214
|
+
return {
|
|
215
|
+
content: resultContent(latestDetails),
|
|
216
|
+
details: boundSubagentDetails(latestDetails),
|
|
217
|
+
usage: toNestedUsage(latestDetails.usage),
|
|
218
|
+
};
|
|
199
219
|
}
|
|
200
220
|
finally {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
for (const scope of scopes)
|
|
204
|
-
scope.dispose();
|
|
221
|
+
unregisterInvocation?.();
|
|
222
|
+
invocationScope.dispose();
|
|
205
223
|
}
|
|
206
|
-
latestDetails = emitDetails(runs, startedAt, undefined);
|
|
207
|
-
latestDetails.endedAt = Date.now();
|
|
208
|
-
// Error classification lives in the tool_result handler (index.ts), the
|
|
209
|
-
// only channel that reaches the session transcript and export.
|
|
210
|
-
return {
|
|
211
|
-
content: resultContent(latestDetails),
|
|
212
|
-
details: boundSubagentDetails(latestDetails),
|
|
213
|
-
usage: toNestedUsage(latestDetails.usage),
|
|
214
|
-
};
|
|
215
224
|
}
|
|
216
225
|
export { isSubagentError } from "./state.js";
|
|
217
226
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRetryableAssistantError } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { emptyUsage, mergeUsage, toNestedUsage } from \"./activity.ts\";\nimport { boundSubagentDetails, resultContent } from \"./budget.ts\";\nimport { abortableSleep, createRunCancellation, type RunCancellation } from \"./cancellation.ts\";\nimport { MAX_CONCURRENCY, MAX_TASKS, TASK_RETRY_BASE_DELAY_MS, TASK_RETRY_LIMIT } from \"./constants.ts\";\nimport { type ParentModelContext, resolveSubagentTask } from \"./resolve.ts\";\nimport type { SubagentParams, SubagentTask } from \"./schema.ts\";\nimport { runSdkTask } from \"./sdk-runner.ts\";\nimport { loadSubagentConfig } from \"./settings.ts\";\nimport {\n\tcreateRunState,\n\treduceRun,\n\ttype SubagentRunEvent,\n\ttype SubagentRunState,\n\tstatusOf,\n\ttoRunDetails,\n\tversionSum,\n} from \"./state.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentExecutionResult, SubagentUsage } from \"./types.ts\";\n\ninterface Waiter {\n\tresolve: (release: () => void) => void;\n\treject: (error: Error) => void;\n\tsignal?: AbortSignal;\n\tabortListener?: () => void;\n\tsettled: boolean;\n}\n\nexport class ConcurrencyGate {\n\tprivate active = 0;\n\tprivate readonly waiters: Waiter[] = [];\n\tprivate readonly limit: number;\n\n\tconstructor(limit = MAX_CONCURRENCY) {\n\t\tthis.limit = limit;\n\t}\n\n\tacquire(signal?: AbortSignal): Promise<() => void> {\n\t\tif (signal?.aborted) return Promise.reject(new Error(\"Subagent was aborted while queued.\"));\n\t\tif (this.active < this.limit) {\n\t\t\tthis.active++;\n\t\t\treturn Promise.resolve(() => this.release());\n\t\t}\n\t\treturn new Promise<() => void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = { resolve, reject, signal, settled: false };\n\t\t\tif (signal) {\n\t\t\t\twaiter.abortListener = () => {\n\t\t\t\t\tif (waiter.settled) return;\n\t\t\t\t\twaiter.settled = true;\n\t\t\t\t\tconst index = this.waiters.indexOf(waiter);\n\t\t\t\t\tif (index >= 0) this.waiters.splice(index, 1);\n\t\t\t\t\treject(new Error(\"Subagent was aborted while queued.\"));\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", waiter.abortListener, { once: true });\n\t\t\t}\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate release(): void {\n\t\tthis.active = Math.max(0, this.active - 1);\n\t\twhile (this.waiters.length > 0) {\n\t\t\tconst waiter = this.waiters.shift()!;\n\t\t\tif (waiter.settled || waiter.signal?.aborted) continue;\n\t\t\twaiter.settled = true;\n\t\t\twaiter.signal?.removeEventListener(\"abort\", waiter.abortListener!);\n\t\t\tthis.active++;\n\t\t\twaiter.resolve(() => this.release());\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport interface SubagentInvocationOptions {\n\tparams: SubagentParams;\n\tparentCwd: string;\n\tparent: ParentModelContext;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tgate: ConcurrencyGate;\n\tonUpdate?: (details: SubagentDetails) => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n\t/** Test hook: overrides the task-retry backoff base delay. */\n\ttaskRetryBaseDelayMs?: number;\n\t/** Tool-call id of the invoking call; prefixes per-run ids for readability. */\n\tbatchId?: string;\n}\n\nfunction aggregateUsage(runs: readonly SubagentRunState[]): SubagentUsage {\n\tconst usage = emptyUsage();\n\tfor (const run of runs) mergeUsage(usage, run.usage);\n\treturn usage;\n}\n\nfunction emitDetails(\n\truns: SubagentRunState[],\n\tstartedAt: number,\n\tonUpdate: ((details: SubagentDetails) => void) | undefined,\n): SubagentDetails {\n\tconst details: SubagentDetails = {\n\t\tstatus: statusOf(runs),\n\t\truns: runs.map(toRunDetails),\n\t\tstartedAt,\n\t\tusage: aggregateUsage(runs),\n\t};\n\tonUpdate?.(boundSubagentDetails(details));\n\treturn details;\n}\n\nfunction validateTaskCount(tasks: readonly SubagentTask[]): void {\n\tif (tasks.length === 0) throw new Error(\"Subagent task list must not be empty.\");\n\tif (tasks.length > MAX_TASKS) throw new Error(`Subagent task list is limited to ${MAX_TASKS} tasks.`);\n}\n\nasync function resolveTasks(\n\ttasks: readonly SubagentTask[],\n\toptions: SubagentInvocationOptions,\n): Promise<ResolvedSubagentTask[]> {\n\tvalidateTaskCount(tasks);\n\t// One config load and one resolution pass for the whole batch: every\n\t// task/profile/cwd/model is settled before any run is created or any\n\t// worker starts, so a failing task cannot strand half-initialized runs.\n\tconst config = await loadSubagentConfig(options.agentDir);\n\treturn Promise.all(\n\t\ttasks.map((task, index) =>\n\t\t\tresolveSubagentTask(task, options.parentCwd, options.parent, options.agentDir, config).catch((error) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new Error(`Subagent task tasks[${index}] failed to resolve: ${message}`);\n\t\t\t}),\n\t\t),\n\t);\n}\n\n// Reuses pi-ai's provider-error classification by wrapping the stored error\n// text in the assistant-message shape it inspects.\nfunction isRetryableRunError(error: string | undefined): boolean {\n\tif (!error) return false;\n\tconst probe = { role: \"assistant\", content: [], stopReason: \"error\", errorMessage: error };\n\treturn isRetryableAssistantError(probe as unknown as Parameters<typeof isRetryableAssistantError>[0]);\n}\n\n// Session-level auto-retry already covers errors that happen inside the agent\n// loop; this catches the paths that bypass it (preflight throws such as auth\n// checks). Only a run that produced nothing is retried, so partial work is\n// never discarded.\nfunction shouldRetryTask(run: SubagentRunState): boolean {\n\treturn (\n\t\trun.status === \"failed\" && run.usage.turns === 0 && run.usage.toolUses === 0 && isRetryableRunError(run.error)\n\t);\n}\n\n// The gate slot is held only while a worker session actually runs. Backoff\n// waits outside the slot (release, sleep, reacquire) so a retrying task\n// cannot starve queued tasks, and aborting during the wait settles the run\n// without occupying the gate.\nasync function runWithGate(\n\ttask: ResolvedSubagentTask,\n\tscope: RunCancellation,\n\toptions: SubagentInvocationOptions,\n\tdispatch: (event: SubagentRunEvent) => void,\n\tgetState: () => SubagentRunState,\n\tonProgress: () => void,\n): Promise<void> {\n\tconst baseDelayMs = options.taskRetryBaseDelayMs ?? TASK_RETRY_BASE_DELAY_MS;\n\tfor (let attempt = 0; ; attempt++) {\n\t\tdispatch({ type: \"retry_started\" });\n\t\tlet release: (() => void) | undefined;\n\t\tlet delayMs = 0;\n\t\ttry {\n\t\t\trelease = await options.gate.acquire(scope.signal);\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch({ type: \"slot_acquired\", startedAt: Date.now() });\n\t\t\tawait runSdkTask({\n\t\t\t\ttask,\n\t\t\t\tscope,\n\t\t\t\tdispatch,\n\t\t\t\tmodelRuntime: options.modelRuntime,\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tprojectTrusted: options.projectTrusted,\n\t\t\t\tonProgress,\n\t\t\t});\n\t\t\tconst state = getState();\n\t\t\tif (attempt >= TASK_RETRY_LIMIT || scope.signal.aborted || !shouldRetryTask(state)) return;\n\t\t\tdelayMs = baseDelayMs * 2 ** attempt;\n\t\t\tdispatch({\n\t\t\t\ttype: \"retry_scheduled\",\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\tmaxAttempts: TASK_RETRY_LIMIT,\n\t\t\t\tdeadline: Date.now() + delayMs,\n\t\t\t\terror: state.error,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t} else {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"settle\",\n\t\t\t\t\tverdict: \"failed\",\n\t\t\t\t\treport: \"\",\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t} finally {\n\t\t\trelease?.();\n\t\t}\n\t\ttry {\n\t\t\tawait abortableSleep(delayMs, scope);\n\t\t} catch {\n\t\t\tdispatch({ type: \"abort_while_retrying\", endedAt: Date.now() });\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport async function runSubagentInvocation(options: SubagentInvocationOptions): Promise<SubagentExecutionResult> {\n\t// Defensive count check: the schema already enforces 1..MAX_TASKS, but\n\t// strict providers can bypass minItems, so validate before any work.\n\tconst tasks = options.params.tasks ?? [];\n\tconst resolved = await resolveTasks(tasks, options);\n\tconst runs = resolved.map((task, index) => createRunState(task, index, options.batchId, options.parentCwd));\n\tconst startedAt = Date.now();\n\t// Every run's cancellation scope exists and is registered before any\n\t// gate work starts, so a shutdown snapshot can never miss a queued task.\n\tconst scopes = runs.map(() => createRunCancellation(options.signal));\n\tconst unregisterScopes = scopes.map((scope) => options.registerAbort?.(scope.abort));\n\tlet lastVersion = versionSum(runs);\n\tconst progress = (): void => {\n\t\tconst version = versionSum(runs);\n\t\tif (version === lastVersion) return;\n\t\tlastVersion = version;\n\t\temitDetails(runs, startedAt, options.onUpdate);\n\t};\n\tconst dispatch = (index: number, event: SubagentRunEvent): void => {\n\t\truns[index] = reduceRun(runs[index]!, event);\n\t\tprogress();\n\t};\n\tlet latestDetails = emitDetails(runs, startedAt, options.onUpdate);\n\n\t// Every task runs concurrently through the shared gate; Promise.all keeps\n\t// result order identical to input order. There is no single-task branch:\n\t// one task is just a batch of one.\n\ttry {\n\t\tawait Promise.all(\n\t\t\tresolved.map((task, index) => {\n\t\t\t\tconst dispatchToRun = (event: SubagentRunEvent): void => dispatch(index, event);\n\t\t\t\treturn runWithGate(task, scopes[index]!, options, dispatchToRun, () => runs[index]!, progress);\n\t\t\t}),\n\t\t);\n\t} finally {\n\t\tfor (const unregister of unregisterScopes) unregister?.();\n\t\tfor (const scope of scopes) scope.dispose();\n\t}\n\tlatestDetails = emitDetails(runs, startedAt, undefined);\n\tlatestDetails.endedAt = Date.now();\n\t// Error classification lives in the tool_result handler (index.ts), the\n\t// only channel that reaches the session transcript and export.\n\treturn {\n\t\tcontent: resultContent(latestDetails),\n\t\tdetails: boundSubagentDetails(latestDetails),\n\t\tusage: toNestedUsage(latestDetails.usage),\n\t};\n}\n\nexport { isSubagentError } from \"./state.ts\";\n"]}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRetryableAssistantError } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { emptyUsage, mergeUsage, toNestedUsage } from \"./activity.ts\";\nimport { boundSubagentDetails, resultContent } from \"./budget.ts\";\nimport { abortableSleep, createRunCancellation, type RunCancellation } from \"./cancellation.ts\";\nimport { MAX_CONCURRENCY, MAX_TASKS, TASK_RETRY_BASE_DELAY_MS, TASK_RETRY_LIMIT } from \"./constants.ts\";\nimport { type ParentModelContext, resolveSubagentTask } from \"./resolve.ts\";\nimport type { SubagentParams, SubagentTask } from \"./schema.ts\";\nimport { runSdkTask } from \"./sdk-runner.ts\";\nimport { loadSubagentConfig } from \"./settings.ts\";\nimport {\n\tcreateRunState,\n\treduceRun,\n\ttype SubagentRunEvent,\n\ttype SubagentRunState,\n\tstatusOf,\n\ttoRunDetails,\n\tversionSum,\n} from \"./state.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentExecutionResult, SubagentUsage } from \"./types.ts\";\n\ninterface Waiter {\n\tresolve: (release: () => void) => void;\n\treject: (error: Error) => void;\n\tsignal?: AbortSignal;\n\tabortListener?: () => void;\n\tsettled: boolean;\n}\n\nexport class ConcurrencyGate {\n\tprivate active = 0;\n\tprivate readonly waiters: Waiter[] = [];\n\tprivate readonly limit: number;\n\n\tconstructor(limit = MAX_CONCURRENCY) {\n\t\tthis.limit = limit;\n\t}\n\n\tacquire(signal?: AbortSignal): Promise<() => void> {\n\t\tif (signal?.aborted) return Promise.reject(new Error(\"Subagent was aborted while queued.\"));\n\t\tif (this.active < this.limit) {\n\t\t\tthis.active++;\n\t\t\treturn Promise.resolve(() => this.release());\n\t\t}\n\t\treturn new Promise<() => void>((resolve, reject) => {\n\t\t\tconst waiter: Waiter = { resolve, reject, signal, settled: false };\n\t\t\tif (signal) {\n\t\t\t\twaiter.abortListener = () => {\n\t\t\t\t\tif (waiter.settled) return;\n\t\t\t\t\twaiter.settled = true;\n\t\t\t\t\tconst index = this.waiters.indexOf(waiter);\n\t\t\t\t\tif (index >= 0) this.waiters.splice(index, 1);\n\t\t\t\t\treject(new Error(\"Subagent was aborted while queued.\"));\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", waiter.abortListener, { once: true });\n\t\t\t}\n\t\t\tthis.waiters.push(waiter);\n\t\t});\n\t}\n\n\tprivate release(): void {\n\t\tthis.active = Math.max(0, this.active - 1);\n\t\twhile (this.waiters.length > 0) {\n\t\t\tconst waiter = this.waiters.shift()!;\n\t\t\tif (waiter.settled || waiter.signal?.aborted) continue;\n\t\t\twaiter.settled = true;\n\t\t\twaiter.signal?.removeEventListener(\"abort\", waiter.abortListener!);\n\t\t\tthis.active++;\n\t\t\twaiter.resolve(() => this.release());\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport interface SubagentInvocationOptions {\n\tparams: SubagentParams;\n\tparentCwd: string;\n\tparent: ParentModelContext;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tsignal?: AbortSignal;\n\tgate: ConcurrencyGate;\n\tonUpdate?: (details: SubagentDetails) => void;\n\tonConfigWarning?: (message: string) => void;\n\tregisterAbort?: (abort: () => Promise<void>) => () => void;\n\t/** Test hook: overrides the task-retry backoff base delay. */\n\ttaskRetryBaseDelayMs?: number;\n\t/** Tool-call id of the invoking call; prefixes per-run ids for readability. */\n\tbatchId?: string;\n}\n\nfunction aggregateUsage(runs: readonly SubagentRunState[]): SubagentUsage {\n\tconst usage = emptyUsage();\n\tfor (const run of runs) mergeUsage(usage, run.usage);\n\treturn usage;\n}\n\nfunction emitDetails(\n\truns: SubagentRunState[],\n\tstartedAt: number,\n\tonUpdate: ((details: SubagentDetails) => void) | undefined,\n): SubagentDetails {\n\tconst details: SubagentDetails = {\n\t\tstatus: statusOf(runs),\n\t\truns: runs.map(toRunDetails),\n\t\tstartedAt,\n\t\tusage: aggregateUsage(runs),\n\t};\n\tonUpdate?.(boundSubagentDetails(details));\n\treturn details;\n}\n\nfunction validateTaskCount(tasks: readonly SubagentTask[]): void {\n\tif (tasks.length === 0) throw new Error(\"Subagent task list must not be empty.\");\n\tif (tasks.length > MAX_TASKS) throw new Error(`Subagent task list is limited to ${MAX_TASKS} tasks.`);\n}\n\nasync function resolveTasks(\n\ttasks: readonly SubagentTask[],\n\toptions: SubagentInvocationOptions,\n): Promise<ResolvedSubagentTask[]> {\n\tvalidateTaskCount(tasks);\n\t// One config load and one resolution pass for the whole batch: every\n\t// task/profile/cwd/model is settled before any run is created or any\n\t// worker starts, so a failing task cannot strand half-initialized runs.\n\tconst config = await loadSubagentConfig(options.agentDir, options.onConfigWarning);\n\treturn Promise.all(\n\t\ttasks.map((task, index) =>\n\t\t\tresolveSubagentTask(task, options.parentCwd, options.parent, options.agentDir, config).catch((error) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new Error(`Subagent task tasks[${index}] failed to resolve: ${message}`);\n\t\t\t}),\n\t\t),\n\t);\n}\n\n// Reuses pi-ai's provider-error classification by wrapping the stored error\n// text in the assistant-message shape it inspects.\nfunction isRetryableRunError(error: string | undefined): boolean {\n\tif (!error) return false;\n\tconst probe = { role: \"assistant\", content: [], stopReason: \"error\", errorMessage: error };\n\treturn isRetryableAssistantError(probe as unknown as Parameters<typeof isRetryableAssistantError>[0]);\n}\n\n// Session-level auto-retry already covers errors that happen inside the agent\n// loop; this catches the paths that bypass it (preflight throws such as auth\n// checks). Only a run that produced nothing is retried, so partial work is\n// never discarded.\nfunction shouldRetryTask(run: SubagentRunState): boolean {\n\treturn (\n\t\trun.status === \"failed\" && run.usage.turns === 0 && run.usage.toolUses === 0 && isRetryableRunError(run.error)\n\t);\n}\n\n// The gate slot is held only while a worker session actually runs. Backoff\n// waits outside the slot (release, sleep, reacquire) so a retrying task\n// cannot starve queued tasks, and aborting during the wait settles the run\n// without occupying the gate.\nasync function runWithGate(\n\ttask: ResolvedSubagentTask,\n\tscope: RunCancellation,\n\toptions: SubagentInvocationOptions,\n\tdispatch: (event: SubagentRunEvent) => void,\n\tgetState: () => SubagentRunState,\n\tonProgress: () => void,\n): Promise<void> {\n\tconst baseDelayMs = options.taskRetryBaseDelayMs ?? TASK_RETRY_BASE_DELAY_MS;\n\tfor (let attempt = 0; ; attempt++) {\n\t\tdispatch({ type: \"retry_started\" });\n\t\tlet release: (() => void) | undefined;\n\t\tlet delayMs = 0;\n\t\ttry {\n\t\t\trelease = await options.gate.acquire(scope.signal);\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdispatch({ type: \"slot_acquired\", startedAt: Date.now() });\n\t\t\tawait runSdkTask({\n\t\t\t\ttask,\n\t\t\t\tscope,\n\t\t\t\tdispatch,\n\t\t\t\tmodelRuntime: options.modelRuntime,\n\t\t\t\tagentDir: options.agentDir,\n\t\t\t\tprojectTrusted: options.projectTrusted,\n\t\t\t\tonProgress,\n\t\t\t});\n\t\t\tconst state = getState();\n\t\t\tif (attempt >= TASK_RETRY_LIMIT || scope.signal.aborted || !shouldRetryTask(state)) return;\n\t\t\tdelayMs = baseDelayMs * 2 ** attempt;\n\t\t\tdispatch({\n\t\t\t\ttype: \"retry_scheduled\",\n\t\t\t\tattempt: attempt + 1,\n\t\t\t\tmaxAttempts: TASK_RETRY_LIMIT,\n\t\t\t\tdeadline: Date.now() + delayMs,\n\t\t\t\terror: state.error,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tif (scope.signal.aborted) {\n\t\t\t\tdispatch({ type: \"abort_while_queued\", endedAt: Date.now() });\n\t\t\t} else {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: \"settle\",\n\t\t\t\t\tverdict: \"failed\",\n\t\t\t\t\treport: \"\",\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tendedAt: Date.now(),\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t} finally {\n\t\t\trelease?.();\n\t\t}\n\t\ttry {\n\t\t\tawait abortableSleep(delayMs, scope);\n\t\t} catch {\n\t\t\tdispatch({ type: \"abort_while_retrying\", endedAt: Date.now() });\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nexport async function runSubagentInvocation(options: SubagentInvocationOptions): Promise<SubagentExecutionResult> {\n\t// Register one invocation-level scope before the first await so shutdown can\n\t// never snapshot the active set between preflight and worker creation.\n\tconst invocationScope = createRunCancellation(options.signal);\n\tconst unregisterInvocation = options.registerAbort?.(invocationScope.abort);\n\ttry {\n\t\t// Defensive count check: the schema already enforces 1..MAX_TASKS, but\n\t\t// strict providers can bypass minItems, so validate before any work.\n\t\tconst tasks = options.params.tasks ?? [];\n\t\tconst resolved = await resolveTasks(tasks, options);\n\t\tconst runs = resolved.map((task, index) => createRunState(task, index, options.batchId, options.parentCwd));\n\t\tconst startedAt = Date.now();\n\t\tconst scopes = runs.map(() => createRunCancellation(invocationScope.signal));\n\t\tconst unregisterChildren = invocationScope.onAbort(async () => {\n\t\t\tawait Promise.allSettled(scopes.map((scope) => scope.abort()));\n\t\t});\n\t\tlet lastVersion = versionSum(runs);\n\t\tconst progress = (): void => {\n\t\t\tconst version = versionSum(runs);\n\t\t\tif (version === lastVersion) return;\n\t\t\tlastVersion = version;\n\t\t\temitDetails(runs, startedAt, options.onUpdate);\n\t\t};\n\t\tconst dispatch = (index: number, event: SubagentRunEvent): void => {\n\t\t\truns[index] = reduceRun(runs[index]!, event);\n\t\t\tprogress();\n\t\t};\n\t\tlet latestDetails = emitDetails(runs, startedAt, options.onUpdate);\n\n\t\t// Every task runs concurrently through the shared gate; Promise.all keeps\n\t\t// result order identical to input order. There is no single-task branch:\n\t\t// one task is just a batch of one.\n\t\ttry {\n\t\t\tawait Promise.all(\n\t\t\t\tresolved.map((task, index) => {\n\t\t\t\t\tconst dispatchToRun = (event: SubagentRunEvent): void => dispatch(index, event);\n\t\t\t\t\treturn runWithGate(task, scopes[index]!, options, dispatchToRun, () => runs[index]!, progress);\n\t\t\t\t}),\n\t\t\t);\n\t\t} finally {\n\t\t\tunregisterChildren();\n\t\t\tfor (const scope of scopes) scope.dispose();\n\t\t}\n\t\tlatestDetails = emitDetails(runs, startedAt, undefined);\n\t\tlatestDetails.endedAt = Date.now();\n\t\t// Error classification lives in the tool_result handler (index.ts), the\n\t\t// only channel that reaches the session transcript and export.\n\t\treturn {\n\t\t\tcontent: resultContent(latestDetails),\n\t\t\tdetails: boundSubagentDetails(latestDetails),\n\t\t\tusage: toNestedUsage(latestDetails.usage),\n\t\t};\n\t} finally {\n\t\tunregisterInvocation?.();\n\t\tinvocationScope.dispose();\n\t}\n}\n\nexport { isSubagentError } from \"./state.ts\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,eAAe,CAAC;IACvB,mEAAmE;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AA8DD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,iBAAiB,EACxB,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,EACnC,GAAG,SAAa,GACd,kBAAkB,GAAG,SAAS,CA2EhC;AA0CD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"sdk-runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAMhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,eAAe,CAAC;IACvB,mEAAmE;IACnE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AA8DD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,qFAAqF;IACrF,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,iBAAiB,EACxB,qBAAqB,EAAE,GAAG,CAAC,OAAO,CAAC,EACnC,GAAG,SAAa,GACd,kBAAkB,GAAG,SAAS,CA2EhC;AA0CD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuJzE"}
|
|
@@ -203,9 +203,6 @@ export async function runSdkTask(options) {
|
|
|
203
203
|
noSkills: true,
|
|
204
204
|
noPromptTemplates: true,
|
|
205
205
|
noThemes: true,
|
|
206
|
-
// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need
|
|
207
|
-
// commit/PR/style rules, and the parent interprets their results.
|
|
208
|
-
noContextFiles: task.agent.omitContextFiles ?? false,
|
|
209
206
|
systemPromptOverride: (base) => workerSystemPrompt(base, task),
|
|
210
207
|
});
|
|
211
208
|
const initialization = (async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { finalAssistantText } from \"./activity.ts\";\nimport type { RunCancellation } from \"./cancellation.ts\";\nimport type { SubagentRunEvent } from \"./state.ts\";\nimport type { ResolvedSubagentTask } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\t/** Cancellation scope covering this attempt (queued through session end). */\n\tscope: RunCancellation;\n\t/** Reducer input; the adapter never touches run state directly. */\n\tdispatch: (event: SubagentRunEvent) => void;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tonProgress?: () => void;\n}\n\n/**\n * Assembles the worker session's system prompt.\n * @param base - The global system prompt from resource loading; undefined when\n * no global system prompt is configured (e.g. no AGENTS.md or system prompt override).\n */\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\nexport interface MappedSessionEvent {\n\trunEvent: SubagentRunEvent;\n\t/** Whether the progress emission should be immediate (true) or throttled (false). */\n\timmediate: boolean;\n}\n\n/**\n * Pure mapping from AgentSessionEvent to SubagentRunEvent. Returns undefined\n * for events the subagent adapter does not handle. Exported for unit testing.\n */\nexport function mapSessionEvent(\n\tevent: AgentSessionEvent,\n\tseenAssistantMessages: Set<unknown>,\n\tnow = Date.now(),\n): MappedSessionEvent | undefined {\n\tif (event.type === \"auto_retry_start\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"auto_retry_start\",\n\t\t\t\tattempt: event.attempt,\n\t\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\t\tdeadline: now + event.delayMs,\n\t\t\t\terror: event.errorMessage,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\tif (event.type === \"auto_retry_end\") {\n\t\treturn { runEvent: { type: \"auto_retry_end\" }, immediate: true };\n\t}\n\tif (event.type === \"turn_end\") {\n\t\treturn { runEvent: { type: \"turn_end\" }, immediate: true };\n\t}\n\tif (event.type === \"compaction_start\") {\n\t\treturn { runEvent: { type: \"compaction_started\", startedAt: now }, immediate: true };\n\t}\n\tif (event.type === \"compaction_end\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"compaction_ended\",\n\t\t\t\ttokensBefore: event.result?.tokensBefore,\n\t\t\t\ttokensAfter: event.result?.estimatedTokensAfter,\n\t\t\t\terror: event.errorMessage,\n\t\t\t\tendedAt: now,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\tconst usage = seenAssistantMessages.has(event.message) ? undefined : event.message.usage;\n\t\tseenAssistantMessages.add(event.message);\n\t\treturn { runEvent: { type: \"assistant_message_settled\", usage }, immediate: true };\n\t}\n\tif (event.type === \"tool_execution_start\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"tool_started\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t\tstartedAt: now,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\tif (event.type === \"tool_execution_update\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"tool_updated\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t},\n\t\t\timmediate: false,\n\t\t};\n\t}\n\tif (event.type === \"tool_execution_end\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"tool_ended\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\tresult: event.result,\n\t\t\t\tisError: event.isError,\n\t\t\t\tendedAt: now,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\treturn undefined;\n}\n\ntype InitializationOutcome =\n\t| { kind: \"created\"; session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] }\n\t| { kind: \"aborted\" }\n\t| { kind: \"error\"; error: unknown };\n\n// Neither resource loading nor session creation takes an abort signal, and\n// both can hang on network work; race both against the scope. The losing\n// chain keeps running, so its eventual result or rejection is always\n// consumed by a no-op handler.\nasync function raceInitialization(\n\tchain: Promise<InitializationOutcome>,\n\tscope: RunCancellation,\n): Promise<InitializationOutcome> {\n\treturn new Promise<InitializationOutcome>((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = (outcome: InitializationOutcome): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tscope.signal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(outcome);\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tfinish({ kind: \"aborted\" });\n\t\t};\n\t\tif (scope.signal.aborted) {\n\t\t\tonAbort();\n\t\t\tvoid chain.then(\n\t\t\t\t() => undefined,\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tscope.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid chain.then(\n\t\t\t(outcome) => finish(outcome),\n\t\t\t(error) => finish({ kind: \"error\", error }),\n\t\t);\n\t});\n}\n\n/**\n * Runs one worker attempt as a pure adapter: it owns the worker session's\n * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every\n * state transition happens in the reducer on the other side of dispatch.\n */\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<void> {\n\tconst { task, scope, dispatch, modelRuntime, agentDir, projectTrusted, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\t// Streaming updates carry no semantic weight; the settled messages are\n\t// where usage is accounted, and worker sessions can replay them.\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst emitImmediate = (): void => onProgress?.();\n\tconst emitThrottled = throttled.emit;\n\n\tunregisterAbort = scope.onAbort(async () => {\n\t\tif (session) await session.abort();\n\t});\n\n\ttry {\n\t\tif (scope.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted before it started.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\t// Read-only explorers skip AGENTS.md/CLAUDE.md: they don't need\n\t\t\t// commit/PR/style rules, and the parent interprets their results.\n\t\t\tnoContextFiles: task.agent.omitContextFiles ?? false,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tconst initialization = (async (): Promise<InitializationOutcome> => {\n\t\t\tawait resourceLoader.reload();\n\t\t\tif (scope.signal.aborted) return { kind: \"aborted\" };\n\t\t\tconst created = await createAgentSession({\n\t\t\t\tcwd: task.cwd,\n\t\t\t\tagentDir,\n\t\t\t\tmodelRuntime,\n\t\t\t\tmodel: task.model,\n\t\t\t\tthinkingLevel: task.thinking,\n\t\t\t\ttools: task.agent.tools,\n\t\t\t\tresourceLoader,\n\t\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\t\treturn { kind: \"created\", session: created.session };\n\t\t})();\n\t\tconst outcome = await raceInitialization(initialization, scope);\n\t\tif (outcome.kind === \"error\") throw outcome.error;\n\t\tif (outcome.kind === \"aborted\") {\n\t\t\t// The initialization chain cannot be cancelled. Dispose the\n\t\t\t// session if it eventually resolves, and swallow a late rejection\n\t\t\t// after this run has already settled.\n\t\t\tvoid initialization.then(\n\t\t\t\t(late) => {\n\t\t\t\t\tif (late.kind === \"created\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlate.session.dispose();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// The aborted run has no remaining channel for cleanup errors.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsession = outcome.session;\n\t\tif (scope.aborted) {\n\t\t\tawait session.abort();\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tconst mapped = mapSessionEvent(event, seenAssistantMessages);\n\t\t\tif (!mapped) return;\n\t\t\tdispatch(mapped.runEvent);\n\t\t\tif (mapped.immediate) emitImmediate();\n\t\t\telse emitThrottled();\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\tconst report = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (scope.signal.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent failed.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({ type: \"settle\", verdict: \"completed\", report, error: undefined, endedAt: Date.now() });\n\t\t}\n\t} catch (error) {\n\t\tconst report = session ? finalAssistantText(session.messages) : \"\";\n\t\tif (scope.signal.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t} finally {\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\temitImmediate();\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-runner.js","sourceRoot":"","sources":["../../../src/extensions/subagent/sdk-runner.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport { finalAssistantText } from \"./activity.ts\";\nimport type { RunCancellation } from \"./cancellation.ts\";\nimport type { SubagentRunEvent } from \"./state.ts\";\nimport type { ResolvedSubagentTask } from \"./types.ts\";\n\nexport interface SdkRunnerOptions {\n\ttask: ResolvedSubagentTask;\n\t/** Cancellation scope covering this attempt (queued through session end). */\n\tscope: RunCancellation;\n\t/** Reducer input; the adapter never touches run state directly. */\n\tdispatch: (event: SubagentRunEvent) => void;\n\tmodelRuntime: ModelRuntime;\n\tagentDir: string;\n\tprojectTrusted: boolean;\n\tonProgress?: () => void;\n}\n\n/**\n * Assembles the worker session's system prompt.\n * @param base - The global system prompt from resource loading; undefined when\n * no global system prompt is configured (e.g. no AGENTS.md or system prompt override).\n */\nfunction workerSystemPrompt(base: string | undefined, task: ResolvedSubagentTask): string {\n\treturn [\n\t\tbase,\n\t\t`You are Pi subagent \"${task.agent.name}\", working independently on one delegated task.`,\n\t\t\"You cannot see the parent conversation; rely entirely on the task briefing and repository context available in your working directory.\",\n\t\t\"Only your final message is returned to the caller; nothing you write in earlier turns is visible to anyone.\",\n\t\t\"Complete the task fully—do not gold-plate it, but do not leave it half-done.\",\n\t\t\"Stay inside the assigned working directory and delegated scope.\",\n\t\t\"Do not ask the end user questions. If blocked, report the exact blocker and what would resolve it.\",\n\t\t\"Do not spawn subagents or invoke tools outside the configured tool list.\",\n\t\t\"When referencing files in the final report, use paths relative to the task's working directory so the caller can locate them unambiguously.\",\n\t\t\"Include code snippets only when the exact text is load-bearing (a bug you found, a signature the caller asked for); do not recap code you merely read.\",\n\t\t\"End with a concise report covering findings or changes, verification performed, blockers, and unresolved risks. The caller will relay it to the user, so include only the essentials.\",\n\t\ttask.agent.systemPrompt,\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction lastAssistantMessage(session: { messages: readonly AgentMessage[] }) {\n\tfor (let index = session.messages.length - 1; index >= 0; index--) {\n\t\tconst message = session.messages[index];\n\t\tif (message?.role === \"assistant\") return message;\n\t}\n\treturn undefined;\n}\n\nfunction assistantError(message: ReturnType<typeof lastAssistantMessage>): string | undefined {\n\tif (!message || message.role !== \"assistant\") return undefined;\n\treturn message.errorMessage;\n}\n\ninterface ThrottledEmitter {\n\temit: () => void;\n\t/** Drops any pending timer so nothing fires after the run has settled. */\n\tcancel: () => void;\n}\n\nfunction createThrottledEmitter(onProgress: (() => void) | undefined): ThrottledEmitter {\n\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\treturn {\n\t\temit: () => {\n\t\t\tif (!onProgress || timer) return;\n\t\t\ttimer = setTimeout(() => {\n\t\t\t\ttimer = undefined;\n\t\t\t\tonProgress();\n\t\t\t}, 80);\n\t\t},\n\t\tcancel: () => {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t},\n\t};\n}\n\nexport interface MappedSessionEvent {\n\trunEvent: SubagentRunEvent;\n\t/** Whether the progress emission should be immediate (true) or throttled (false). */\n\timmediate: boolean;\n}\n\n/**\n * Pure mapping from AgentSessionEvent to SubagentRunEvent. Returns undefined\n * for events the subagent adapter does not handle. Exported for unit testing.\n */\nexport function mapSessionEvent(\n\tevent: AgentSessionEvent,\n\tseenAssistantMessages: Set<unknown>,\n\tnow = Date.now(),\n): MappedSessionEvent | undefined {\n\tif (event.type === \"auto_retry_start\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"auto_retry_start\",\n\t\t\t\tattempt: event.attempt,\n\t\t\t\tmaxAttempts: event.maxAttempts,\n\t\t\t\tdeadline: now + event.delayMs,\n\t\t\t\terror: event.errorMessage,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\tif (event.type === \"auto_retry_end\") {\n\t\treturn { runEvent: { type: \"auto_retry_end\" }, immediate: true };\n\t}\n\tif (event.type === \"turn_end\") {\n\t\treturn { runEvent: { type: \"turn_end\" }, immediate: true };\n\t}\n\tif (event.type === \"compaction_start\") {\n\t\treturn { runEvent: { type: \"compaction_started\", startedAt: now }, immediate: true };\n\t}\n\tif (event.type === \"compaction_end\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"compaction_ended\",\n\t\t\t\ttokensBefore: event.result?.tokensBefore,\n\t\t\t\ttokensAfter: event.result?.estimatedTokensAfter,\n\t\t\t\terror: event.errorMessage,\n\t\t\t\tendedAt: now,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\tconst usage = seenAssistantMessages.has(event.message) ? undefined : event.message.usage;\n\t\tseenAssistantMessages.add(event.message);\n\t\treturn { runEvent: { type: \"assistant_message_settled\", usage }, immediate: true };\n\t}\n\tif (event.type === \"tool_execution_start\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"tool_started\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t\tstartedAt: now,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\tif (event.type === \"tool_execution_update\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"tool_updated\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t},\n\t\t\timmediate: false,\n\t\t};\n\t}\n\tif (event.type === \"tool_execution_end\") {\n\t\treturn {\n\t\t\trunEvent: {\n\t\t\t\ttype: \"tool_ended\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\tresult: event.result,\n\t\t\t\tisError: event.isError,\n\t\t\t\tendedAt: now,\n\t\t\t},\n\t\t\timmediate: true,\n\t\t};\n\t}\n\treturn undefined;\n}\n\ntype InitializationOutcome =\n\t| { kind: \"created\"; session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] }\n\t| { kind: \"aborted\" }\n\t| { kind: \"error\"; error: unknown };\n\n// Neither resource loading nor session creation takes an abort signal, and\n// both can hang on network work; race both against the scope. The losing\n// chain keeps running, so its eventual result or rejection is always\n// consumed by a no-op handler.\nasync function raceInitialization(\n\tchain: Promise<InitializationOutcome>,\n\tscope: RunCancellation,\n): Promise<InitializationOutcome> {\n\treturn new Promise<InitializationOutcome>((resolve) => {\n\t\tlet settled = false;\n\t\tconst finish = (outcome: InitializationOutcome): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tscope.signal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(outcome);\n\t\t};\n\t\tconst onAbort = (): void => {\n\t\t\tfinish({ kind: \"aborted\" });\n\t\t};\n\t\tif (scope.signal.aborted) {\n\t\t\tonAbort();\n\t\t\tvoid chain.then(\n\t\t\t\t() => undefined,\n\t\t\t\t() => undefined,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tscope.signal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tvoid chain.then(\n\t\t\t(outcome) => finish(outcome),\n\t\t\t(error) => finish({ kind: \"error\", error }),\n\t\t);\n\t});\n}\n\n/**\n * Runs one worker attempt as a pure adapter: it owns the worker session's\n * lifecycle and translates AgentSessionEvents into SubagentRunEvents; every\n * state transition happens in the reducer on the other side of dispatch.\n */\nexport async function runSdkTask(options: SdkRunnerOptions): Promise<void> {\n\tconst { task, scope, dispatch, modelRuntime, agentDir, projectTrusted, onProgress } = options;\n\tconst throttled = createThrottledEmitter(onProgress);\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unregisterAbort: (() => void) | undefined;\n\tlet session: Awaited<ReturnType<typeof createAgentSession>>[\"session\"] | undefined;\n\t// Streaming updates carry no semantic weight; the settled messages are\n\t// where usage is accounted, and worker sessions can replay them.\n\tconst seenAssistantMessages = new Set<unknown>();\n\tconst emitImmediate = (): void => onProgress?.();\n\tconst emitThrottled = throttled.emit;\n\n\tunregisterAbort = scope.onAbort(async () => {\n\t\tif (session) await session.abort();\n\t});\n\n\ttry {\n\t\tif (scope.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted before it started.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconst settingsManager = SettingsManager.create(task.cwd, agentDir, { projectTrusted });\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: task.cwd,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoSkills: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t\tsystemPromptOverride: (base) => workerSystemPrompt(base, task),\n\t\t});\n\t\tconst initialization = (async (): Promise<InitializationOutcome> => {\n\t\t\tawait resourceLoader.reload();\n\t\t\tif (scope.signal.aborted) return { kind: \"aborted\" };\n\t\t\tconst created = await createAgentSession({\n\t\t\t\tcwd: task.cwd,\n\t\t\t\tagentDir,\n\t\t\t\tmodelRuntime,\n\t\t\t\tmodel: task.model,\n\t\t\t\tthinkingLevel: task.thinking,\n\t\t\t\ttools: task.agent.tools,\n\t\t\t\tresourceLoader,\n\t\t\t\tsessionManager: SessionManager.inMemory(task.cwd),\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\t\treturn { kind: \"created\", session: created.session };\n\t\t})();\n\t\tconst outcome = await raceInitialization(initialization, scope);\n\t\tif (outcome.kind === \"error\") throw outcome.error;\n\t\tif (outcome.kind === \"aborted\") {\n\t\t\t// The initialization chain cannot be cancelled. Dispose the\n\t\t\t// session if it eventually resolves, and swallow a late rejection\n\t\t\t// after this run has already settled.\n\t\t\tvoid initialization.then(\n\t\t\t\t(late) => {\n\t\t\t\t\tif (late.kind === \"created\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlate.session.dispose();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// The aborted run has no remaining channel for cleanup errors.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t);\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tsession = outcome.session;\n\t\tif (scope.aborted) {\n\t\t\tawait session.abort();\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport: \"\",\n\t\t\t\terror: \"Subagent was aborted during initialization.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tunsubscribe = session.subscribe((event: AgentSessionEvent) => {\n\t\t\tconst mapped = mapSessionEvent(event, seenAssistantMessages);\n\t\t\tif (!mapped) return;\n\t\t\tdispatch(mapped.runEvent);\n\t\t\tif (mapped.immediate) emitImmediate();\n\t\t\telse emitThrottled();\n\t\t});\n\t\tawait session.prompt(task.prompt);\n\t\tconst finalMessage = lastAssistantMessage(session);\n\t\tconst report = finalAssistantText(session.messages);\n\t\tconst error = assistantError(finalMessage);\n\t\tif (scope.signal.aborted || finalMessage?.stopReason === \"aborted\") {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else if (finalMessage?.stopReason === \"error\" || error) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error ?? \"Subagent failed.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({ type: \"settle\", verdict: \"completed\", report, error: undefined, endedAt: Date.now() });\n\t\t}\n\t} catch (error) {\n\t\tconst report = session ? finalAssistantText(session.messages) : \"\";\n\t\tif (scope.signal.aborted) {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"aborted\",\n\t\t\t\treport,\n\t\t\t\terror: \"Subagent was aborted.\",\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t} else {\n\t\t\tdispatch({\n\t\t\t\ttype: \"settle\",\n\t\t\t\tverdict: \"failed\",\n\t\t\t\treport,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tendedAt: Date.now(),\n\t\t\t});\n\t\t}\n\t} finally {\n\t\tthrottled.cancel();\n\t\tunregisterAbort?.();\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\temitImmediate();\n\t}\n}\n"]}
|
|
@@ -3,6 +3,6 @@ import type { SubagentConfigFile, SubagentProfileOverride } from "./types.ts";
|
|
|
3
3
|
export declare function getSubagentConfigPath(agentDir?: string): string;
|
|
4
4
|
export declare function emptySubagentConfig(): SubagentConfigFile;
|
|
5
5
|
export declare function parseSubagentConfig(raw: string): SubagentConfigFile;
|
|
6
|
-
export declare function loadSubagentConfig(agentDir?: string): Promise<SubagentConfigFile>;
|
|
6
|
+
export declare function loadSubagentConfig(agentDir?: string, onWarning?: (message: string) => void): Promise<SubagentConfigFile>;
|
|
7
7
|
export declare function updateProfileOverride(profile: SubagentAgentName, patch: Partial<SubagentProfileOverride>, agentDir?: string): Promise<SubagentConfigFile>;
|
|
8
8
|
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/settings.ts"],"names":[],"mappings":"AAKA,OAAO,EAIN,KAAK,iBAAiB,EAEtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAqC9E,wBAAgB,qBAAqB,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAEtE;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAExD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAgCnE;AAUD,wBAAsB,kBAAkB,CACvC,QAAQ,SAAgB,EACxB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACnC,OAAO,CAAC,kBAAkB,CAAC,CAS7B;AA8ED,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,OAAO,CAAC,uBAAuB,CAAC,EACvC,QAAQ,SAAgB,GACtB,OAAO,CAAC,kBAAkB,CAAC,CA6B7B"}
|