@myagentroam/agent 0.9.62 → 0.9.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +4 -0
  3. package/dist/cli/codex-auth-file.js +268 -3
  4. package/dist/cli/main.js +427 -2
  5. package/dist/error.js +66 -2
  6. package/dist/host/contracts.js +20 -2
  7. package/dist/host/local-agent-host.js +146 -2
  8. package/dist/host/local-process-executor.js +39 -2
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +12 -2
  11. package/dist/model/anthropic-messages.js +474 -2
  12. package/dist/model/anthropic-thinking.js +33 -2
  13. package/dist/model/catalog-file.js +88 -2
  14. package/dist/model/configuration.js +137 -2
  15. package/dist/model/contracts.d.ts +2 -0
  16. package/dist/model/contracts.js +1 -2
  17. package/dist/model/http.js +529 -2
  18. package/dist/model/openai-responses.d.ts +2 -0
  19. package/dist/model/openai-responses.js +1602 -2
  20. package/dist/model/runtime-credential.js +35 -2
  21. package/dist/model/sse.js +199 -2
  22. package/dist/prompts/compact.js +25 -2
  23. package/dist/prompts/core.js +37 -2
  24. package/dist/prompts/execution-budget.js +10 -2
  25. package/dist/prompts/index.d.ts +3 -2
  26. package/dist/prompts/index.js +47 -2
  27. package/dist/prompts/modes.js +25 -2
  28. package/dist/prompts/output.js +1 -2
  29. package/dist/prompts/resources.d.ts +1 -1
  30. package/dist/prompts/resources.js +31 -2
  31. package/dist/prompts/subagent.d.ts +6 -0
  32. package/dist/prompts/subagent.js +29 -2
  33. package/dist/prompts/title.js +9 -2
  34. package/dist/prompts/workflow.js +32 -2
  35. package/dist/runtime/async-queue.js +62 -2
  36. package/dist/runtime/builtin-skills.js +19 -2
  37. package/dist/runtime/byted-ark-imagegen-skill.js +18 -2
  38. package/dist/runtime/codex-imagegen-skill.js +35 -2
  39. package/dist/runtime/compact.js +225 -2
  40. package/dist/runtime/context-gc-runtime.d.ts +35 -0
  41. package/dist/runtime/context-gc-runtime.js +163 -0
  42. package/dist/runtime/context-gc-tokens.d.ts +24 -0
  43. package/dist/runtime/context-gc-tokens.js +83 -0
  44. package/dist/runtime/context-gc.d.ts +66 -0
  45. package/dist/runtime/context-gc.js +909 -0
  46. package/dist/runtime/context-projection.d.ts +23 -0
  47. package/dist/runtime/context-projection.js +203 -0
  48. package/dist/runtime/environment-context.js +41 -2
  49. package/dist/runtime/execution-policy.js +13 -2
  50. package/dist/runtime/instructions.js +298 -2
  51. package/dist/runtime/normalize.js +40 -2
  52. package/dist/runtime/plan-output.js +95 -2
  53. package/dist/runtime/rollout-budget.d.ts +2 -0
  54. package/dist/runtime/rollout-budget.js +92 -2
  55. package/dist/runtime/token-budget.d.ts +2 -0
  56. package/dist/runtime/token-budget.js +44 -2
  57. package/dist/sdk/agent.js +1804 -2
  58. package/dist/sdk/types.d.ts +15 -5
  59. package/dist/sdk/types.js +1 -2
  60. package/dist/session/catalog.d.ts +5 -4
  61. package/dist/session/catalog.js +133 -2
  62. package/dist/session/context-gc-checkpoint.d.ts +148 -0
  63. package/dist/session/context-gc-checkpoint.js +665 -0
  64. package/dist/session/context-gc-replacements.d.ts +52 -0
  65. package/dist/session/context-gc-replacements.js +226 -0
  66. package/dist/session/context-gc-subagent.d.ts +43 -0
  67. package/dist/session/context-gc-subagent.js +267 -0
  68. package/dist/session/jsonl-store.d.ts +42 -4
  69. package/dist/session/jsonl-store.js +1657 -2
  70. package/dist/subagent/scheduler.d.ts +35 -2
  71. package/dist/subagent/scheduler.js +249 -2
  72. package/dist/subagent/session-controller.d.ts +94 -0
  73. package/dist/subagent/session-controller.js +675 -0
  74. package/dist/tools/agent-cancel.js +28 -2
  75. package/dist/tools/{task.d.ts → agent-message.d.ts} +2 -2
  76. package/dist/tools/agent-message.js +51 -0
  77. package/dist/tools/agent-start.js +84 -2
  78. package/dist/tools/agent-wait.js +53 -2
  79. package/dist/tools/apply-patch.js +478 -2
  80. package/dist/tools/code-mode.js +370 -2
  81. package/dist/tools/codex-image-gen.js +312 -2
  82. package/dist/tools/exec.js +455 -2
  83. package/dist/tools/execution-limits.d.ts +1 -0
  84. package/dist/tools/execution-limits.js +44 -2
  85. package/dist/tools/local-registry.js +233 -2
  86. package/dist/tools/local-workspace-tools.js +28 -2
  87. package/dist/tools/question.js +124 -2
  88. package/dist/tools/read-context.d.ts +16 -0
  89. package/dist/tools/read-context.js +85 -0
  90. package/dist/tools/read.d.ts +13 -0
  91. package/dist/tools/read.js +294 -2
  92. package/dist/tools/registry.js +76 -2
  93. package/dist/tools/runtime-context.d.ts +9 -2
  94. package/dist/tools/runtime-context.js +1 -2
  95. package/dist/tools/runtime.js +21 -2
  96. package/dist/tools/scheduler.js +41 -2
  97. package/dist/tools/shared/path-resolver.js +133 -2
  98. package/dist/tools/skill.js +37 -2
  99. package/dist/tools/todo-read.js +10 -2
  100. package/dist/tools/todo-write.js +65 -2
  101. package/dist/tools/todo.js +67 -2
  102. package/dist/tools/view-image.js +81 -2
  103. package/dist/tools/web-fetch.js +11 -2
  104. package/dist/tools/web-search.js +14 -2
  105. package/package.json +9 -7
  106. package/README.md +0 -3
  107. package/dist/runtime/prompt.d.ts +0 -9
  108. package/dist/runtime/prompt.js +0 -2
  109. package/dist/tools/shared/secret-redaction.d.ts +0 -4
  110. package/dist/tools/shared/secret-redaction.js +0 -2
  111. package/dist/tools/task-cancel.d.ts +0 -7
  112. package/dist/tools/task-cancel.js +0 -2
  113. package/dist/tools/task-output.d.ts +0 -7
  114. package/dist/tools/task-output.js +0 -2
  115. package/dist/tools/task-tools.d.ts +0 -36
  116. package/dist/tools/task-tools.js +0 -2
  117. package/dist/tools/task.js +0 -2
  118. package/dist/tools/todo-tools.d.ts +0 -25
  119. package/dist/tools/todo-tools.js +0 -2
@@ -18,10 +18,22 @@ export interface SubagentTaskResult {
18
18
  endLine?: number;
19
19
  }>;
20
20
  }
21
+ export interface SubagentLatestMessage {
22
+ itemId: string;
23
+ turnId: string;
24
+ phase: 'commentary' | 'final_answer';
25
+ text: string;
26
+ timestamp: string;
27
+ truncated: boolean;
28
+ }
21
29
  export interface SubagentTaskSnapshot extends Record<string, unknown> {
22
30
  agentId: string;
23
31
  description: string;
24
- status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
32
+ status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled' | 'interrupted';
33
+ modelId?: string;
34
+ modelName?: string;
35
+ reasoningEffort?: MarAgentReasoningEffort;
36
+ latestMessage?: SubagentLatestMessage;
25
37
  summary?: string;
26
38
  changedFiles?: string[];
27
39
  verification?: string[];
@@ -32,6 +44,13 @@ export interface SubagentTaskSnapshot extends Record<string, unknown> {
32
44
  }>;
33
45
  errorCode?: string;
34
46
  errorMessage?: string;
47
+ messageId?: string;
48
+ turnId?: string;
49
+ deliveryStatus?: 'accepted' | 'applied' | 'cancelled' | 'failed';
50
+ }
51
+ export interface SubagentMessageOptions {
52
+ delivery?: 'append' | 'replace';
53
+ signal?: AbortSignal;
35
54
  }
36
55
  export interface SubagentRunOptions {
37
56
  signal?: AbortSignal;
@@ -41,7 +60,20 @@ export interface SubagentOutputOptions {
41
60
  waitMs?: number;
42
61
  signal?: AbortSignal;
43
62
  }
44
- export declare class SubagentScheduler {
63
+ export interface SubagentController {
64
+ beginExecution?(runner: (task: SubagentTaskInput, signal: AbortSignal) => Promise<SubagentTaskResult>): void;
65
+ run(input: SubagentTaskInput, options?: SubagentRunOptions): Promise<SubagentTaskSnapshot>;
66
+ output(agentId: string, options?: SubagentOutputOptions): Promise<SubagentTaskSnapshot>;
67
+ message(agentId: string, message: string, options?: SubagentMessageOptions): Promise<SubagentTaskSnapshot>;
68
+ cancel(agentId: string): Promise<SubagentTaskSnapshot>;
69
+ listSessionResources(): readonly {
70
+ agentId: string;
71
+ status: SubagentTaskSnapshot['status'];
72
+ description: string;
73
+ }[];
74
+ dispose(): Promise<void>;
75
+ }
76
+ export declare class SubagentScheduler implements SubagentController {
45
77
  #private;
46
78
  readonly limits: {
47
79
  maxTasks: number;
@@ -55,6 +87,7 @@ export declare class SubagentScheduler {
55
87
  run(input: SubagentTaskInput, options?: SubagentRunOptions): Promise<SubagentTaskSnapshot>;
56
88
  output(agentId: string, options?: SubagentOutputOptions): Promise<SubagentTaskSnapshot>;
57
89
  cancel(agentId: string): Promise<SubagentTaskSnapshot>;
90
+ message(_agentId: string, _message: string): Promise<SubagentTaskSnapshot>;
58
91
  listSessionResources(): {
59
92
  agentId: string;
60
93
  status: "completed" | "cancelled" | "running" | "queued" | "failed";
@@ -1,2 +1,249 @@
1
- /* mar-release-protected */
2
- const _0x3dbfa6=_0x2937;(function(_0x4589e5,_0x20aff5){const _0x1d3707=_0x2937,_0x4545cf=_0x4589e5();while(!![]){try{const _0x42f679=-parseInt(_0x1d3707(0x151))/(0x1d14*0x1+0xb*-0x35f+0x32*0x29)+parseInt(_0x1d3707(0x173))/(-0xa45+-0x7*0x4cf+0x130*0x25)+parseInt(_0x1d3707(0x132))/(0x1d*-0x137+-0x1*-0x1a75+0x8c9)*(parseInt(_0x1d3707(0x11a))/(-0x11ca+0x139*0x5+0xbb1))+parseInt(_0x1d3707(0x120))/(-0x1*-0xd5e+0x220d+0x2f66*-0x1)+parseInt(_0x1d3707(0x180))/(0x1*-0x10bd+0x481*-0x7+0x304a)+-parseInt(_0x1d3707(0x114))/(0x6dd+-0x1f66+-0x3*-0x830)*(-parseInt(_0x1d3707(0x14c))/(-0x22fa+0x2*-0xf02+0x4106))+-parseInt(_0x1d3707(0x141))/(-0x50*0x1f+0x1043+-0x68a*0x1);if(_0x42f679===_0x20aff5)break;else _0x4545cf['push'](_0x4545cf['shift']());}catch(_0x558ff1){_0x4545cf['push'](_0x4545cf['shift']());}}}(_0x3b27,0x677f6*-0x1+0x1*0x3c3fd+0x89f2e));import{randomUUID}from'node:crypto';import{describeMarAgentError,MarAgentError}from'../error.js';import{marAgentReasoningEffortSchema}from'../model/configuration.js';import{TOOL_EXECUTION_LIMITS}from'../tools/execution-limits.js';export class SubagentScheduler{[_0x3dbfa6(0x16c)];#tasks=new Map();#queue=[];#running=0x534+0x2*-0x60a+0x6e0;#disposed=![];#createdInExecution=-0x2571+-0x34*0x83+0x35f*0x13;#runner;constructor(_0x578836,_0x5b5dc8={'maxTasks':0x8,'maxConcurrent':0x4}){const _0x3f3d85=_0x3dbfa6;this[_0x3f3d85(0x16c)]=_0x5b5dc8,this.#runner=_0x578836;}[_0x3dbfa6(0x15f)](_0xa8c482){const _0x26b951=_0x3dbfa6;if(this.#disposed)throw new MarAgentError(_0x26b951(0x122),_0x26b951(0x11f));this.#runner=_0xa8c482,this.#createdInExecution=0x1*0x12a9+0xa1a+0xc7*-0x25;}async[_0x3dbfa6(0x116)](_0x1ae936,_0x22f3b3={}){const _0x599b46=_0x3dbfa6;_0x22f3b3[_0x599b46(0x168)]?.[_0x599b46(0x11e)]();const _0x5b6bc5=_0x1ae936[_0x599b46(0x17f)],_0x2fdfd3=typeof _0x5b6bc5===_0x599b46(0x118)?marAgentReasoningEffortSchema[_0x599b46(0x115)](_0x5b6bc5[_0x599b46(0x177)]()):undefined;if(_0x1ae936[_0x599b46(0x117)])throw new MarAgentError(_0x599b46(0x12f),_0x599b46(0x14b));if(this.#disposed||this.#createdInExecution>=this[_0x599b46(0x16c)][_0x599b46(0x145)])throw new MarAgentError(_0x599b46(0x122),_0x599b46(0x16d));if(!_0x1ae936[_0x599b46(0x15e)][_0x599b46(0x177)]()||_0x1ae936[_0x599b46(0x15e)][_0x599b46(0x144)]>TOOL_EXECUTION_LIMITS[_0x599b46(0x17d)]||!_0x1ae936[_0x599b46(0x13c)][_0x599b46(0x177)]()||Buffer[_0x599b46(0x179)](_0x1ae936[_0x599b46(0x13c)])>TOOL_EXECUTION_LIMITS[_0x599b46(0x133)]||_0x5b6bc5!==undefined&&(_0x2fdfd3===undefined||!_0x2fdfd3[_0x599b46(0x124)]))throw new MarAgentError(_0x599b46(0x156),_0x599b46(0x15d));const _0x500db6=randomUUID();let _0x437775;const _0x2ea44d=new Promise(_0x9fe9de=>_0x437775=_0x9fe9de),_0x5a3b52={'agentId':_0x500db6,'input':{..._0x1ae936,'description':_0x1ae936[_0x599b46(0x15e)][_0x599b46(0x177)](),..._0x2fdfd3?.[_0x599b46(0x124)]?{'reasoningEffort':_0x2fdfd3[_0x599b46(0x158)]}:{}},'status':_0x599b46(0x14e),'controller':new AbortController(),'completion':_0x2ea44d,'resolve':_0x437775,'runner':this.#runner};this.#createdInExecution++,this.#tasks[_0x599b46(0x150)](_0x500db6,_0x5a3b52),this.#queue[_0x599b46(0x13a)](_0x5a3b52);const _0x59f94a=!_0x1ae936[_0x599b46(0x11c)]&&_0x22f3b3[_0x599b46(0x168)]?linkAbort(_0x22f3b3[_0x599b46(0x168)],_0xf13bc1=>this.#cancelTask(_0x5a3b52,_0xf13bc1)):undefined;this.#drain();try{try{await _0x22f3b3[_0x599b46(0x17a)]?.(this.#public(_0x5a3b52));}catch(_0x5b5246){this.#cancelTask(_0x5a3b52,_0x5b5246);if(_0x5a3b52[_0x599b46(0x142)]===_0x599b46(0x16f))await _0x5a3b52[_0x599b46(0x154)];throw _0x5b5246;}if(!_0x1ae936[_0x599b46(0x11c)])await _0x2ea44d;return this.#public(_0x5a3b52);}finally{_0x59f94a?.();}}async[_0x3dbfa6(0x164)](_0x59f524,_0x5a1d36={}){const _0x15edc7=_0x3dbfa6;_0x5a1d36[_0x15edc7(0x168)]?.[_0x15edc7(0x11e)]();const _0x5dddd4=this.#tasks[_0x15edc7(0x12d)](_0x59f524);if(!_0x5dddd4)throw new MarAgentError(_0x15edc7(0x11b),_0x15edc7(0x16b));if(_0x5a1d36[_0x15edc7(0x175)]!==undefined&&(!Number[_0x15edc7(0x17b)](_0x5a1d36[_0x15edc7(0x175)])||_0x5a1d36[_0x15edc7(0x175)]<TOOL_EXECUTION_LIMITS[_0x15edc7(0x17e)]||_0x5a1d36[_0x15edc7(0x175)]>TOOL_EXECUTION_LIMITS[_0x15edc7(0x135)]))throw new MarAgentError(_0x15edc7(0x156),_0x15edc7(0x148));const _0x495324=_0x5a1d36[_0x15edc7(0x175)]===undefined?undefined:Math[_0x15edc7(0x134)](_0x5a1d36[_0x15edc7(0x175)],TOOL_EXECUTION_LIMITS[_0x15edc7(0x123)]);if(_0x495324!==undefined&&![_0x15edc7(0x138),_0x15edc7(0x14d),_0x15edc7(0x143)][_0x15edc7(0x16e)](_0x5dddd4[_0x15edc7(0x142)]))await waitForCompletion(_0x5dddd4[_0x15edc7(0x154)],_0x495324,_0x5a1d36[_0x15edc7(0x168)]);return this.#public(_0x5dddd4);}async[_0x3dbfa6(0x130)](_0x47f3fc){const _0x393a1a=_0x3dbfa6,_0x5d23dd=this.#tasks[_0x393a1a(0x12d)](_0x47f3fc);if(!_0x5d23dd)throw new MarAgentError(_0x393a1a(0x11b),_0x393a1a(0x16b));this.#cancelTask(_0x5d23dd,new MarAgentError(_0x393a1a(0x14f),_0x393a1a(0x140)));if(_0x5d23dd[_0x393a1a(0x142)]===_0x393a1a(0x16f))await _0x5d23dd[_0x393a1a(0x154)];return this.#public(_0x5d23dd);}#cancelTask(_0x16332f,_0x7dd9e2){const _0x77801c=_0x3dbfa6;if(_0x16332f[_0x77801c(0x142)]===_0x77801c(0x14e)){_0x16332f[_0x77801c(0x142)]=_0x77801c(0x143);const _0x125565=this.#queue[_0x77801c(0x153)](_0x16332f);if(_0x125565>=-0x433+-0x1826+0x1c59)this.#queue[_0x77801c(0x13b)](_0x125565,0x1e92+0xfe4+-0x2e75);_0x16332f[_0x77801c(0x125)][_0x77801c(0x121)](_0x7dd9e2),_0x16332f[_0x77801c(0x17c)](),this.#drain();}else{if(_0x16332f[_0x77801c(0x142)]===_0x77801c(0x16f))_0x16332f[_0x77801c(0x125)][_0x77801c(0x121)](_0x7dd9e2);}}#drain(){const _0x33fac9=_0x3dbfa6;while(!this.#disposed&&this.#running<this[_0x33fac9(0x16c)][_0x33fac9(0x169)]&&this.#queue[_0x33fac9(0x144)]){const _0x43dc58=this.#queue[_0x33fac9(0x165)]();if(_0x43dc58[_0x33fac9(0x142)]!==_0x33fac9(0x14e))continue;_0x43dc58[_0x33fac9(0x142)]=_0x33fac9(0x16f),this.#running++,void _0x43dc58[_0x33fac9(0x15c)](_0x43dc58[_0x33fac9(0x178)],_0x43dc58[_0x33fac9(0x125)][_0x33fac9(0x168)])[_0x33fac9(0x16a)](_0x3a9c85=>{const _0xe612e3=_0x33fac9;if(_0x43dc58[_0xe612e3(0x125)][_0xe612e3(0x168)][_0xe612e3(0x139)])_0x43dc58[_0xe612e3(0x142)]=_0xe612e3(0x143);else _0x43dc58[_0xe612e3(0x174)]=normalizeResult(_0x3a9c85),_0x43dc58[_0xe612e3(0x142)]=_0xe612e3(0x138);},_0x228409=>{const _0x55efb9=_0x33fac9;_0x43dc58[_0x55efb9(0x142)]=_0x43dc58[_0x55efb9(0x125)][_0x55efb9(0x168)][_0x55efb9(0x139)]?_0x55efb9(0x143):_0x55efb9(0x14d);const _0x288183=describeMarAgentError(_0x228409,_0x55efb9(0x157));_0x43dc58[_0x55efb9(0x146)]=_0x288183[_0x55efb9(0x166)],_0x43dc58[_0x55efb9(0x12c)]=_0x288183[_0x55efb9(0x136)];})[_0x33fac9(0x149)](()=>{const _0xe841d0=_0x33fac9;this.#running--,_0x43dc58[_0xe841d0(0x17c)](),this.#drain();});}}#public(_0x434c67){const _0x1d74de=_0x3dbfa6;return{'agentId':_0x434c67[_0x1d74de(0x171)],'description':_0x434c67[_0x1d74de(0x178)][_0x1d74de(0x15e)],'status':_0x434c67[_0x1d74de(0x142)],..._0x434c67[_0x1d74de(0x174)]?{..._0x434c67[_0x1d74de(0x174)]}:{},..._0x434c67[_0x1d74de(0x146)]?{'errorCode':_0x434c67[_0x1d74de(0x146)]}:{},..._0x434c67[_0x1d74de(0x12c)]?{'errorMessage':_0x434c67[_0x1d74de(0x12c)]}:{}};}[_0x3dbfa6(0x127)](){const _0x86b5ff=_0x3dbfa6;return[...this.#tasks[_0x86b5ff(0x15a)]()][_0x86b5ff(0x161)](_0x2bdd95=>({'agentId':_0x2bdd95[_0x86b5ff(0x171)],'status':_0x2bdd95[_0x86b5ff(0x142)],'description':_0x2bdd95[_0x86b5ff(0x178)][_0x86b5ff(0x15e)]}));}async[_0x3dbfa6(0x129)](){const _0x538eed=_0x3dbfa6;if(this.#disposed)return;this.#disposed=!![];for(const _0x967948 of this.#tasks[_0x538eed(0x15a)]()){if(_0x967948[_0x538eed(0x142)]===_0x538eed(0x14e))_0x967948[_0x538eed(0x142)]=_0x538eed(0x143),_0x967948[_0x538eed(0x125)][_0x538eed(0x121)](),_0x967948[_0x538eed(0x17c)]();else{if(_0x967948[_0x538eed(0x142)]===_0x538eed(0x16f))_0x967948[_0x538eed(0x125)][_0x538eed(0x121)]();}}await Promise[_0x538eed(0x11d)]([...this.#tasks[_0x538eed(0x15a)]()][_0x538eed(0x161)](_0x766d5c=>_0x766d5c[_0x538eed(0x154)])),this.#queue[_0x538eed(0x144)]=0x263*0x3+0x877*-0x1+0x14e,this.#tasks[_0x538eed(0x12a)]();}}function normalizeResult(_0x30dfd2){const _0x42349c=_0x3dbfa6;return{'summary':truncateUtf8(_0x30dfd2[_0x42349c(0x131)],TOOL_EXECUTION_LIMITS[_0x42349c(0x12e)]),'changedFiles':[...new Set(_0x30dfd2[_0x42349c(0x162)])][_0x42349c(0x15b)](_0x5758f1=>typeof _0x5758f1===_0x42349c(0x118)&&_0x5758f1[_0x42349c(0x144)]>0xc93+-0x47a+-0x3*0x2b3&&_0x5758f1[_0x42349c(0x144)]<=0x1e45+-0x8e6*-0x1+0x3*-0x7b9)[_0x42349c(0x13f)](0x3*0x377+0x1b67*0x1+0x4*-0x973,TOOL_EXECUTION_LIMITS[_0x42349c(0x147)]),'verification':_0x30dfd2[_0x42349c(0x126)][_0x42349c(0x15b)](_0x37e757=>typeof _0x37e757===_0x42349c(0x118))[_0x42349c(0x13f)](0x585*-0x4+0x941+0x31*0x43,TOOL_EXECUTION_LIMITS[_0x42349c(0x119)])[_0x42349c(0x161)](_0x13f2f4=>truncateUtf8(_0x13f2f4,-0x1f27+-0x10b1+0x1*0x37a8)),'evidence':(_0x30dfd2[_0x42349c(0x128)]??[])[_0x42349c(0x15b)](_0x2d3667=>_0x2d3667&&typeof _0x2d3667[_0x42349c(0x160)]===_0x42349c(0x118)&&_0x2d3667[_0x42349c(0x160)][_0x42349c(0x144)]>0x15b*0x1+0x6a*-0x2e+-0x287*-0x7&&_0x2d3667[_0x42349c(0x160)][_0x42349c(0x144)]<=0x8*-0x317+-0x11*0x4f+0x2df7*0x1)[_0x42349c(0x13f)](-0x17e*-0x2+-0x1*-0x2197+-0x2493,TOOL_EXECUTION_LIMITS[_0x42349c(0x163)])[_0x42349c(0x161)](_0x30b543=>({'path':_0x30b543[_0x42349c(0x160)],...Number[_0x42349c(0x17b)](_0x30b543[_0x42349c(0x13e)])&&_0x30b543[_0x42349c(0x13e)]>=0xc9d*-0x2+-0x1*0x125f+0x2b9a?{'startLine':_0x30b543[_0x42349c(0x13e)]}:{},...Number[_0x42349c(0x17b)](_0x30b543[_0x42349c(0x172)])&&_0x30b543[_0x42349c(0x172)]>=0x1b3c+-0x15a9+-0x2e*0x1f?{'endLine':_0x30b543[_0x42349c(0x172)]}:{}}))};}function truncateUtf8(_0x37d41c,_0x938d02){const _0x40887b=_0x3dbfa6;if(typeof _0x37d41c!==_0x40887b(0x118))return'';const _0xda9a3b=Buffer[_0x40887b(0x12b)](_0x37d41c);if(_0xda9a3b[_0x40887b(0x144)]<=_0x938d02)return _0x37d41c;let _0x36aba7=_0x938d02;while(_0x36aba7>-0x13e4+-0x2528+0x390c&&(_0xda9a3b[_0x36aba7]&0x20*-0x71+0x1*-0x1951+0x2831*0x1)===0x1343+-0x2*0x6d+-0x11e9)_0x36aba7--;return _0xda9a3b[_0x40887b(0x152)](0x1960+0x5*-0x545+0xf9,_0x36aba7)[_0x40887b(0x13d)](_0x40887b(0x14a));}function _0x2937(_0x331289,_0x3db166){_0x331289=_0x331289-(-0x1*0x172b+-0x1*-0x1bbe+-0x5*0xb3);const _0x4cbfca=_0x3b27();let _0x2359ca=_0x4cbfca[_0x331289];if(_0x2937['LZWfpZ']===undefined){var _0x3d2f81=function(_0x58afc0){const _0x5808c7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x9a14c2='',_0x3f4bb3='';for(let _0x26becc=-0x2*-0x98f+-0x15b3+0x1*0x295,_0x1c6c65,_0x10e69a,_0x194474=-0x221d+-0x2571+-0x81*-0x8e;_0x10e69a=_0x58afc0['charAt'](_0x194474++);~_0x10e69a&&(_0x1c6c65=_0x26becc%(0x13*0x14f+0x5*0x586+-0x3477)?_0x1c6c65*(0x1931+0x16f4+-0x2fe5)+_0x10e69a:_0x10e69a,_0x26becc++%(0x1*-0x1337+-0x449+0x1784))?_0x9a14c2+=String['fromCharCode'](-0x18d7+0x263*0x3+0x12ad*0x1&_0x1c6c65>>(-(-0x18a0+0xc93+0xc0f)*_0x26becc&0xd*0x23e+-0x1171+-0xbaf*0x1)):0x30*0x7+0x16*0x64+0x9e8*-0x1){_0x10e69a=_0x5808c7['indexOf'](_0x10e69a);}for(let _0x480816=0xf4e+0x1*0x7e1+-0x1*0x172f,_0x48d1da=_0x9a14c2['length'];_0x480816<_0x48d1da;_0x480816++){_0x3f4bb3+='%'+('00'+_0x9a14c2['charCodeAt'](_0x480816)['toString'](0x206c+0x1202+-0x325e))['slice'](-(0x1*-0xa83+0x1f2a+0x421*-0x5));}return decodeURIComponent(_0x3f4bb3);};_0x2937['skgAdm']=_0x3d2f81,_0x2937['EFBUAr']={},_0x2937['LZWfpZ']=!![];}const _0x5cde19=_0x4cbfca[-0x5b*-0x53+0x18a8+-0x3629];_0x2937['fQNHjb']!==_0x5cde19&&(_0x2937['EFBUAr']={},_0x2937['fQNHjb']=_0x5cde19);const _0x335435=_0x2937['EFBUAr'][_0x331289];return _0x335435===undefined?(_0x2359ca=_0x2937['skgAdm'](_0x2359ca),_0x2937['EFBUAr'][_0x331289]=_0x2359ca):_0x2359ca=_0x335435,_0x2359ca;}function waitForCompletion(_0x12a0da,_0x50dccf,_0x4e431d){return new Promise((_0x2ef5cb,_0x54f0ab)=>{const _0x2271b2=_0x2937;let _0xe878cb=![];const _0x4e2b07=_0x34a1f8=>{const _0x27ec90=_0x2937;if(_0xe878cb)return;_0xe878cb=!![],clearTimeout(_0x391399),_0x4e431d?.[_0x27ec90(0x170)](_0x27ec90(0x121),_0x25b199);if(_0x34a1f8===undefined)_0x2ef5cb();else _0x54f0ab(_0x34a1f8);},_0x25b199=()=>_0x4e2b07(_0x4e431d?.[_0x2271b2(0x155)]??new MarAgentError(_0x2271b2(0x137),_0x2271b2(0x176))),_0x391399=setTimeout(_0x4e2b07,_0x50dccf);_0x391399[_0x2271b2(0x159)](),_0x4e431d?.[_0x2271b2(0x167)](_0x2271b2(0x121),_0x25b199,{'once':!![]}),void _0x12a0da[_0x2271b2(0x16a)](()=>_0x4e2b07());if(_0x4e431d?.[_0x2271b2(0x139)])_0x25b199();});}function _0x3b27(){const _0x527ca2=['y29TCgXLDgLVBG','CMvHC29U','tufsx0fhru5ux1rpt0XFsu5qvvrFsu5wquXjra','tufsx0fhru5ux1nvqKfhru5ux0zbsuXfra','zgf0yq','Dw5Yzwy','DMfSDwvZ','zMLSDgvY','CNvUBMvY','u3vIywDLBNqGDgfZAYbPCYbPBNzHBgLKlG','zgvZy3jPChrPB24','yMvNAw5fEgvJDxrPB24','Cgf0Aa','BwfW','y2HHBMDLzezPBgvZ','C3vIywDLBNrfDMLKzw5Jzu1HEeL0zw1Z','B3v0Chv0','C2HPzNq','y29Kzq','ywrKrxzLBNrmAxn0zw5LCG','C2LNBMfS','Bwf4q29Uy3vYCMvUDa','DgHLBG','u3vIywDLBNqGDgfZAYb3yxmGBM90igzVDw5KlG','BgLTAxrZ','u3vIywDLBNqGDgfZAYbSAw1PDcb3yxmGCMvHy2HLzc4','Aw5JBhvKzxm','CNvUBMLUzW','CMvTB3zLrxzLBNrmAxn0zw5LCG','ywDLBNrjza','zw5KtgLUzq','mti5oty1mLPLtuXHEG','CMvZDwX0','D2fPDe1Z','rxHLy3v0Aw9UignHBMnLBgXLzc4','DhjPBq','Aw5WDxq','yNL0zuXLBMD0Aa','B25dCMvHDgvK','AxnjBNrLz2vY','CMvZB2X2zq','C3vIywDLBNrezxnJCMLWDgLVBK1HEenOyxjHy3rLCNm','ywDLBNrxywL0twLUv2fPDe1Z','CMvHC29UAw5NrwzMB3j0','mtu4ota2nhrmtezeDG','nZeZntfvrwjtuwS','C2fMzvbHCNnL','CNvU','CgfYzw50u3vIywDLBNrjza','C3rYAw5N','C3vIywDLBNrwzxjPzMLJyxrPB25nyxHjDgvTCW','ndbdA0Lhyu4','tufsx0fhru5ux1nvqKfhru5ux05pvf9gt1vora','yMfJA2DYB3vUza','ywXS','DgHYB3DjzKfIB3j0zwq','u3vIywDLBNqGC2nOzwr1BgvYigLZigrPC3bVC2vKlG','mtCZmdG4mgHptLnduq','ywjVCNq','tufsx0fhru5ux1nvqKfhru5ux0XjtuLu','ywDLBNrxywL0v2fPDezSB29Ytxm','C3vJy2vZCW','y29UDhjVBgXLCG','DMvYAwzPy2f0Aw9U','BgLZDfnLC3nPB25szxnVDxjJzxm','zxzPzgvUy2u','zgLZCg9Zzq','y2XLyxi','zNjVBq','zxjYB3jnzxnZywDL','z2v0','C3vIywDLBNrtDw1Tyxj5twf4qNL0zxm','tufsx0fhru5ux1nvqKfhru5ux1jfq1vsu0LptL9esvnbqKXfra','y2fUy2vS','C3vTBwfYEq','mtK3odi2uxLICLff','C3vIywDLBNrqCM9TChrnyxHcExrLCW','Bwf4','ywDLBNrxywL0twf4v2fPDe1Z','BwvZC2fNzq','tufsx0fhru5ux0vyrunvveLptL9dqu5druXmruq','y29TCgXLDgvK','ywjVCNrLza','ChvZAa','C3bSAwnL','ChjVBxb0','Dg9tDhjPBMC','C3rHCNrmAw5L','C2XPy2u','u3vIywDLBNqGDgfZAYb3yxmGy2fUy2vSBgvKlG','odG0nZCWmMH1Eu9iAq','C3rHDhvZ','y2fUy2vSBgvK','BgvUz3rO','Bwf4vgfZA3m','zxjYB3jdB2rL','C3vIywDLBNrdAgfUz2vKrMLSzxnnyxHjDgvTCW','vgfZAYb3ywL0igLZigLUDMfSAwqU','zMLUywXSEq','DxrMoa','u3vIywDLBNrZignHBM5VDcbJCMvHDguGC3vIywDLBNrZlG','mtyWA1jXzvjj','zMfPBgvK','CxvLDwvK','tufsx0fhru5ux0nbtKnfteXfra','C2v0','nZuZmtu1EhLAsLne','C3vIyxjYyxK','Aw5KzxHpzG'];_0x3b27=function(){return _0x527ca2;};return _0x3b27();}function linkAbort(_0x8a81a9,_0x1f295d){const _0x548798=_0x3dbfa6,_0x131398=()=>_0x1f295d(_0x8a81a9[_0x548798(0x155)]);_0x8a81a9[_0x548798(0x167)](_0x548798(0x121),_0x131398,{'once':!![]});if(_0x8a81a9[_0x548798(0x139)])_0x131398();return()=>_0x8a81a9[_0x548798(0x170)](_0x548798(0x121),_0x131398);}
1
+ import { randomUUID } from 'node:crypto';
2
+ import { describeMarAgentError, MarAgentError } from '../error.js';
3
+ import { marAgentReasoningEffortSchema } from '../model/configuration.js';
4
+ import { TOOL_EXECUTION_LIMITS } from '../tools/execution-limits.js';
5
+ export class SubagentScheduler {
6
+ limits;
7
+ #tasks = new Map();
8
+ #queue = [];
9
+ #running = 0;
10
+ #disposed = false;
11
+ #createdInExecution = 0;
12
+ #runner;
13
+ constructor(runner, limits = { maxTasks: 8, maxConcurrent: 4 }) {
14
+ this.limits = limits;
15
+ this.#runner = runner;
16
+ }
17
+ beginExecution(runner) {
18
+ if (this.#disposed)
19
+ throw new MarAgentError('MAR_AGENT_SUBAGENT_LIMIT', 'Subagent scheduler is disposed.');
20
+ this.#runner = runner;
21
+ this.#createdInExecution = 0;
22
+ }
23
+ async run(input, options = {}) {
24
+ options.signal?.throwIfAborted();
25
+ const reasoningEffort = input.reasoningEffort;
26
+ const parsedReasoningEffort = typeof reasoningEffort === 'string'
27
+ ? marAgentReasoningEffortSchema.safeParse(reasoningEffort.trim())
28
+ : undefined;
29
+ if (input.parentSubagentId)
30
+ throw new MarAgentError('MAR_AGENT_SUBAGENT_RECURSION_DISABLED', 'Subagents cannot create subagents.');
31
+ if (this.#disposed || this.#createdInExecution >= this.limits.maxTasks)
32
+ throw new MarAgentError('MAR_AGENT_SUBAGENT_LIMIT', 'Subagent task limit was reached.');
33
+ if (!input.description.trim() ||
34
+ input.description.length > TOOL_EXECUTION_LIMITS.subagentDescriptionMaxCharacters ||
35
+ !input.prompt.trim() ||
36
+ Buffer.byteLength(input.prompt) > TOOL_EXECUTION_LIMITS.subagentPromptMaxBytes ||
37
+ (reasoningEffort !== undefined &&
38
+ (parsedReasoningEffort === undefined || !parsedReasoningEffort.success)))
39
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Subagent task is invalid.');
40
+ const agentId = randomUUID();
41
+ let resolve;
42
+ const completion = new Promise((done) => (resolve = done));
43
+ const task = {
44
+ agentId,
45
+ input: {
46
+ ...input,
47
+ description: input.description.trim(),
48
+ ...(parsedReasoningEffort?.success ? { reasoningEffort: parsedReasoningEffort.data } : {})
49
+ },
50
+ status: 'queued',
51
+ controller: new AbortController(),
52
+ completion,
53
+ resolve,
54
+ runner: this.#runner
55
+ };
56
+ this.#createdInExecution++;
57
+ this.#tasks.set(agentId, task);
58
+ this.#queue.push(task);
59
+ const detachParentAbort = !input.background && options.signal
60
+ ? linkAbort(options.signal, (reason) => this.#cancelTask(task, reason))
61
+ : undefined;
62
+ this.#drain();
63
+ try {
64
+ try {
65
+ await options.onCreated?.(this.#public(task));
66
+ }
67
+ catch (error) {
68
+ this.#cancelTask(task, error);
69
+ if (task.status === 'running')
70
+ await task.completion;
71
+ throw error;
72
+ }
73
+ if (!input.background)
74
+ await completion;
75
+ return this.#public(task);
76
+ }
77
+ finally {
78
+ detachParentAbort?.();
79
+ }
80
+ }
81
+ async output(agentId, options = {}) {
82
+ options.signal?.throwIfAborted();
83
+ const task = this.#tasks.get(agentId);
84
+ if (!task)
85
+ throw new MarAgentError('MAR_AGENT_SUBAGENT_NOT_FOUND', 'Subagent task was not found.');
86
+ if (options.waitMs !== undefined &&
87
+ (!Number.isInteger(options.waitMs) ||
88
+ options.waitMs < TOOL_EXECUTION_LIMITS.agentWaitMinWaitMs ||
89
+ options.waitMs > TOOL_EXECUTION_LIMITS.agentWaitMaxWaitMs))
90
+ throw new MarAgentError('MAR_AGENT_TOOL_INPUT_INVALID', 'Task wait is invalid.');
91
+ const waitMs = options.waitMs === undefined || options.waitMs === 0
92
+ ? undefined
93
+ : Math.max(options.waitMs, TOOL_EXECUTION_LIMITS.agentWaitWaitFloorMs);
94
+ if (waitMs !== undefined && !['completed', 'failed', 'cancelled'].includes(task.status))
95
+ await waitForCompletion(task.completion, waitMs, options.signal);
96
+ return this.#public(task);
97
+ }
98
+ async cancel(agentId) {
99
+ const task = this.#tasks.get(agentId);
100
+ if (!task)
101
+ throw new MarAgentError('MAR_AGENT_SUBAGENT_NOT_FOUND', 'Subagent task was not found.');
102
+ this.#cancelTask(task, new MarAgentError('MAR_AGENT_CANCELLED', 'Subagent task was cancelled.'));
103
+ if (task.status === 'running')
104
+ await task.completion;
105
+ return this.#public(task);
106
+ }
107
+ async message(_agentId, _message) {
108
+ throw new MarAgentError('MAR_AGENT_SUBAGENT_FAILED', 'The in-memory compatibility scheduler does not support follow-up messages.');
109
+ }
110
+ #cancelTask(task, reason) {
111
+ if (task.status === 'queued') {
112
+ task.status = 'cancelled';
113
+ const index = this.#queue.indexOf(task);
114
+ if (index >= 0)
115
+ this.#queue.splice(index, 1);
116
+ task.controller.abort(reason);
117
+ task.resolve();
118
+ this.#drain();
119
+ }
120
+ else if (task.status === 'running')
121
+ task.controller.abort(reason);
122
+ }
123
+ #drain() {
124
+ while (!this.#disposed && this.#running < this.limits.maxConcurrent && this.#queue.length) {
125
+ const task = this.#queue.shift();
126
+ if (task.status !== 'queued')
127
+ continue;
128
+ task.status = 'running';
129
+ this.#running++;
130
+ void task
131
+ .runner(task.input, task.controller.signal)
132
+ .then((result) => {
133
+ if (task.controller.signal.aborted)
134
+ task.status = 'cancelled';
135
+ else {
136
+ task.result = normalizeResult(result);
137
+ task.status = 'completed';
138
+ }
139
+ }, (error) => {
140
+ task.status = task.controller.signal.aborted ? 'cancelled' : 'failed';
141
+ const diagnostic = describeMarAgentError(error, 'MAR_AGENT_SUBAGENT_FAILED');
142
+ task.errorCode = diagnostic.code;
143
+ task.errorMessage = diagnostic.message;
144
+ })
145
+ .finally(() => {
146
+ this.#running--;
147
+ task.resolve();
148
+ this.#drain();
149
+ });
150
+ }
151
+ }
152
+ #public(task) {
153
+ return {
154
+ agentId: task.agentId,
155
+ description: task.input.description,
156
+ status: task.status,
157
+ ...(task.result ? { ...task.result } : {}),
158
+ ...(task.errorCode ? { errorCode: task.errorCode } : {}),
159
+ ...(task.errorMessage ? { errorMessage: task.errorMessage } : {})
160
+ };
161
+ }
162
+ listSessionResources() {
163
+ return [...this.#tasks.values()].map((task) => ({
164
+ agentId: task.agentId,
165
+ status: task.status,
166
+ description: task.input.description
167
+ }));
168
+ }
169
+ async dispose() {
170
+ if (this.#disposed)
171
+ return;
172
+ this.#disposed = true;
173
+ for (const task of this.#tasks.values()) {
174
+ if (task.status === 'queued') {
175
+ task.status = 'cancelled';
176
+ task.controller.abort();
177
+ task.resolve();
178
+ }
179
+ else if (task.status === 'running')
180
+ task.controller.abort();
181
+ }
182
+ await Promise.all([...this.#tasks.values()].map((task) => task.completion));
183
+ this.#queue.length = 0;
184
+ this.#tasks.clear();
185
+ }
186
+ }
187
+ function normalizeResult(result) {
188
+ return {
189
+ summary: truncateUtf8(result.summary, TOOL_EXECUTION_LIMITS.subagentSummaryMaxBytes),
190
+ changedFiles: [...new Set(result.changedFiles)]
191
+ .filter((path) => typeof path === 'string' && path.length > 0 && path.length <= 4096)
192
+ .slice(0, TOOL_EXECUTION_LIMITS.subagentChangedFilesMaxItems),
193
+ verification: result.verification
194
+ .filter((item) => typeof item === 'string')
195
+ .slice(0, TOOL_EXECUTION_LIMITS.subagentVerificationMaxItems)
196
+ .map((item) => truncateUtf8(item, 2_000)),
197
+ evidence: (result.evidence ?? [])
198
+ .filter((item) => item && typeof item.path === 'string' && item.path.length > 0 && item.path.length <= 4096)
199
+ .slice(0, TOOL_EXECUTION_LIMITS.subagentEvidenceMaxItems)
200
+ .map((item) => ({
201
+ path: item.path,
202
+ ...(Number.isInteger(item.startLine) && item.startLine >= 1
203
+ ? { startLine: item.startLine }
204
+ : {}),
205
+ ...(Number.isInteger(item.endLine) && item.endLine >= 1 ? { endLine: item.endLine } : {})
206
+ }))
207
+ };
208
+ }
209
+ function truncateUtf8(value, maximumBytes) {
210
+ if (typeof value !== 'string')
211
+ return '';
212
+ const bytes = Buffer.from(value);
213
+ if (bytes.length <= maximumBytes)
214
+ return value;
215
+ let end = maximumBytes;
216
+ while (end > 0 && (bytes[end] & 0xc0) === 0x80)
217
+ end--;
218
+ return bytes.subarray(0, end).toString('utf8');
219
+ }
220
+ function waitForCompletion(completion, waitMs, signal) {
221
+ return new Promise((resolve, reject) => {
222
+ let settled = false;
223
+ const finish = (error) => {
224
+ if (settled)
225
+ return;
226
+ settled = true;
227
+ clearTimeout(timer);
228
+ signal?.removeEventListener('abort', abort);
229
+ if (error === undefined)
230
+ resolve();
231
+ else
232
+ reject(error);
233
+ };
234
+ const abort = () => finish(signal?.reason ?? new MarAgentError('MAR_AGENT_EXECUTION_CANCELLED', 'Execution cancelled.'));
235
+ const timer = setTimeout(finish, waitMs);
236
+ timer.unref();
237
+ signal?.addEventListener('abort', abort, { once: true });
238
+ void completion.then(() => finish());
239
+ if (signal?.aborted)
240
+ abort();
241
+ });
242
+ }
243
+ function linkAbort(signal, abort) {
244
+ const listener = () => abort(signal.reason);
245
+ signal.addEventListener('abort', listener, { once: true });
246
+ if (signal.aborted)
247
+ listener();
248
+ return () => signal.removeEventListener('abort', listener);
249
+ }
@@ -0,0 +1,94 @@
1
+ import type { MarAgentReasoningEffort } from '../model/configuration.js';
2
+ import type { MarAgentEvent, ExecutionResult } from '../sdk/types.js';
3
+ import type { SessionRecord, SessionSource } from '../session/jsonl-store.js';
4
+ import type { SubagentController, SubagentMessageOptions, SubagentOutputOptions, SubagentRunOptions, SubagentTaskInput, SubagentTaskSnapshot } from './scheduler.js';
5
+ export interface SubagentModelOption {
6
+ readonly id: string;
7
+ readonly name: string;
8
+ readonly reasoningEfforts: readonly MarAgentReasoningEffort[];
9
+ readonly defaultReasoningEffort: MarAgentReasoningEffort;
10
+ }
11
+ export interface SubagentTurnHandle extends AsyncIterable<MarAgentEvent> {
12
+ readonly executionId: string;
13
+ readonly turnId: string;
14
+ result(): Promise<ExecutionResult>;
15
+ cancel(): void;
16
+ enqueueMessage(message: string, delivery?: SubagentMessageDelivery): boolean;
17
+ }
18
+ export interface SubagentMessageDelivery {
19
+ readonly messageId: string;
20
+ applied(): void;
21
+ }
22
+ export interface SubagentMailboxMessage {
23
+ readonly text: string;
24
+ readonly delivery?: SubagentMessageDelivery;
25
+ }
26
+ export interface SubagentParentExecution {
27
+ readonly executionId: string;
28
+ readonly modelId: string;
29
+ readonly reasoningEffort: MarAgentReasoningEffort;
30
+ readonly models: ReadonlyMap<string, SubagentModelOption>;
31
+ emitTerminal(snapshot: SubagentTaskSnapshot): Promise<void>;
32
+ startTurn(input: {
33
+ readonly sessionId: string;
34
+ readonly prompt: string;
35
+ readonly modelId: string;
36
+ readonly reasoningEffort: MarAgentReasoningEffort;
37
+ readonly role: SubagentTaskInput['role'];
38
+ readonly initialMailbox: readonly SubagentMailboxMessage[];
39
+ readonly turnId: string;
40
+ readonly delivery?: SubagentMessageDelivery;
41
+ }): Promise<SubagentTurnHandle>;
42
+ }
43
+ export interface PersistedSubagentSession {
44
+ readonly id: string;
45
+ readonly source: Extract<SessionSource, {
46
+ type: 'subagent';
47
+ }>;
48
+ readonly records: readonly SessionRecord[];
49
+ }
50
+ export interface SubagentSessionControllerBackend {
51
+ createSession(input: {
52
+ readonly title: string;
53
+ readonly source: Extract<SessionSource, {
54
+ type: 'subagent';
55
+ }>;
56
+ }): Promise<{
57
+ readonly id: string;
58
+ }>;
59
+ deleteSession(sessionId: string): Promise<void>;
60
+ listChildren(parentSessionId: string): Promise<readonly PersistedSubagentSession[]>;
61
+ loadChild(parentSessionId: string, sessionId: string): Promise<PersistedSubagentSession | undefined>;
62
+ }
63
+ export declare class SubagentSessionController implements SubagentController {
64
+ #private;
65
+ private readonly parentSessionId;
66
+ private readonly rootSessionId;
67
+ private readonly backend;
68
+ readonly limits: {
69
+ maxTasks: number;
70
+ maxConcurrent: number;
71
+ };
72
+ private constructor();
73
+ static open(input: {
74
+ readonly parentSessionId: string;
75
+ readonly rootSessionId: string;
76
+ readonly backend: SubagentSessionControllerBackend;
77
+ readonly limits?: {
78
+ readonly maxTasks: number;
79
+ readonly maxConcurrent: number;
80
+ };
81
+ }): Promise<SubagentSessionController>;
82
+ beginParentExecution(execution: SubagentParentExecution): Promise<void>;
83
+ endParentExecution(executionId: string): void;
84
+ run(input: SubagentTaskInput, options?: SubagentRunOptions): Promise<SubagentTaskSnapshot>;
85
+ output(agentId: string, options?: SubagentOutputOptions): Promise<SubagentTaskSnapshot>;
86
+ message(agentId: string, message: string, options?: SubagentMessageOptions): Promise<SubagentTaskSnapshot>;
87
+ cancel(agentId: string): Promise<SubagentTaskSnapshot>;
88
+ listSessionResources(): {
89
+ agentId: string;
90
+ status: "completed" | "cancelled" | "running" | "queued" | "failed" | "interrupted";
91
+ description: string;
92
+ }[];
93
+ dispose(): Promise<void>;
94
+ }