orbitx 0.2.8 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +478 -456
- package/dist/agents/backend.d.ts +4 -0
- package/dist/agents/backend.d.ts.map +1 -0
- package/dist/agents/backend.js +54 -0
- package/dist/agents/backend.js.map +1 -0
- package/dist/agents/frontend.d.ts +4 -0
- package/dist/agents/frontend.d.ts.map +1 -0
- package/dist/agents/frontend.js +50 -0
- package/dist/agents/frontend.js.map +1 -0
- package/dist/agents/index.d.ts +10 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +22 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/planner.d.ts +4 -0
- package/dist/agents/planner.d.ts.map +1 -0
- package/dist/agents/planner.js +86 -0
- package/dist/agents/planner.js.map +1 -0
- package/dist/agents/protocol.d.ts +5 -0
- package/dist/agents/protocol.d.ts.map +1 -0
- package/dist/agents/protocol.js +70 -0
- package/dist/agents/protocol.js.map +1 -0
- package/dist/agents/reasoner.d.ts +5 -0
- package/dist/agents/reasoner.d.ts.map +1 -0
- package/dist/agents/reasoner.js +96 -0
- package/dist/agents/reasoner.js.map +1 -0
- package/dist/agents/research.d.ts +4 -0
- package/dist/agents/research.d.ts.map +1 -0
- package/dist/agents/research.js +28 -0
- package/dist/agents/research.js.map +1 -0
- package/dist/agents/tester.d.ts +4 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/tester.js +70 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/core/agent-definition.d.ts +61 -0
- package/dist/core/agent-definition.d.ts.map +1 -0
- package/dist/core/agent-definition.js +82 -0
- package/dist/core/agent-definition.js.map +1 -0
- package/dist/core/ai-provider.d.ts +3 -0
- package/dist/core/ai-provider.d.ts.map +1 -1
- package/dist/core/ai-provider.js.map +1 -1
- package/dist/core/anthropic-provider.d.ts +1 -0
- package/dist/core/anthropic-provider.d.ts.map +1 -1
- package/dist/core/anthropic-provider.js +3 -0
- package/dist/core/anthropic-provider.js.map +1 -1
- package/dist/core/base-agent.d.ts +52 -29
- package/dist/core/base-agent.d.ts.map +1 -1
- package/dist/core/base-agent.js +123 -27
- package/dist/core/base-agent.js.map +1 -1
- package/dist/core/deepseek-provider.d.ts +1 -0
- package/dist/core/deepseek-provider.d.ts.map +1 -1
- package/dist/core/deepseek-provider.js +3 -0
- package/dist/core/deepseek-provider.js.map +1 -1
- package/dist/core/mcp-computer.d.ts +14 -1
- package/dist/core/mcp-computer.d.ts.map +1 -1
- package/dist/core/mcp-computer.js +352 -71
- package/dist/core/mcp-computer.js.map +1 -1
- package/dist/core/ollama-provider.d.ts +1 -0
- package/dist/core/ollama-provider.d.ts.map +1 -1
- package/dist/core/ollama-provider.js +3 -0
- package/dist/core/ollama-provider.js.map +1 -1
- package/dist/core/openai-provider.d.ts +1 -0
- package/dist/core/openai-provider.d.ts.map +1 -1
- package/dist/core/openai-provider.js +3 -0
- package/dist/core/openai-provider.js.map +1 -1
- package/dist/core/swarm-base.d.ts +88 -0
- package/dist/core/swarm-base.d.ts.map +1 -0
- package/dist/core/swarm-base.js +427 -0
- package/dist/core/swarm-base.js.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/tests/agents/default-agents.test.d.ts +2 -0
- package/dist/tests/agents/default-agents.test.d.ts.map +1 -0
- package/dist/tests/agents/default-agents.test.js +106 -0
- package/dist/tests/agents/default-agents.test.js.map +1 -0
- package/dist/tests/core/agent-definition.test.d.ts +2 -0
- package/dist/tests/core/agent-definition.test.d.ts.map +1 -0
- package/dist/tests/core/agent-definition.test.js +99 -0
- package/dist/tests/core/agent-definition.test.js.map +1 -0
- package/dist/tests/core/scripted-provider.d.ts +38 -0
- package/dist/tests/core/scripted-provider.d.ts.map +1 -0
- package/dist/tests/core/scripted-provider.js +85 -0
- package/dist/tests/core/scripted-provider.js.map +1 -0
- package/dist/tests/core/swarm-base.test.d.ts +2 -0
- package/dist/tests/core/swarm-base.test.d.ts.map +1 -0
- package/dist/tests/core/swarm-base.test.js +387 -0
- package/dist/tests/core/swarm-base.test.js.map +1 -0
- package/dist/tests/index.d.ts +3 -0
- package/dist/tests/index.d.ts.map +1 -1
- package/dist/tests/index.js +3 -0
- package/dist/tests/index.js.map +1 -1
- package/dist/tests/tools/agent/agent-tools.test.js +225 -153
- package/dist/tests/tools/agent/agent-tools.test.js.map +1 -1
- package/dist/tools/agent/active.d.ts +5 -0
- package/dist/tools/agent/active.d.ts.map +1 -0
- package/dist/tools/agent/active.js +40 -0
- package/dist/tools/agent/active.js.map +1 -0
- package/dist/tools/agent/fire.d.ts +5 -0
- package/dist/tools/agent/fire.d.ts.map +1 -0
- package/dist/tools/agent/fire.js +38 -0
- package/dist/tools/agent/fire.js.map +1 -0
- package/dist/tools/agent/hire.d.ts +2 -2
- package/dist/tools/agent/hire.d.ts.map +1 -1
- package/dist/tools/agent/hire.js +43 -10
- package/dist/tools/agent/hire.js.map +1 -1
- package/dist/tools/agent/index.d.ts +22 -19
- package/dist/tools/agent/index.d.ts.map +1 -1
- package/dist/tools/agent/index.js +29 -21
- package/dist/tools/agent/index.js.map +1 -1
- package/dist/tools/agent/prompt.d.ts +2 -2
- package/dist/tools/agent/prompt.d.ts.map +1 -1
- package/dist/tools/agent/prompt.js +19 -53
- package/dist/tools/agent/prompt.js.map +1 -1
- package/dist/tools/agent/registry.d.ts +74 -24
- package/dist/tools/agent/registry.d.ts.map +1 -1
- package/dist/tools/agent/registry.js +93 -48
- package/dist/tools/agent/registry.js.map +1 -1
- package/dist/tools/agent/report-group.d.ts +5 -0
- package/dist/tools/agent/report-group.d.ts.map +1 -0
- package/dist/tools/agent/report-group.js +50 -0
- package/dist/tools/agent/report-group.js.map +1 -0
- package/dist/tools/agent/report-parent.d.ts +5 -0
- package/dist/tools/agent/report-parent.d.ts.map +1 -0
- package/dist/tools/agent/report-parent.js +36 -0
- package/dist/tools/agent/report-parent.js.map +1 -0
- package/dist/tools/agent/types.d.ts +5 -0
- package/dist/tools/agent/types.d.ts.map +1 -0
- package/dist/tools/agent/types.js +17 -0
- package/dist/tools/agent/types.js.map +1 -0
- package/docs/agents.md +173 -212
- package/docs/api-reference.md +9 -4
- package/docs/getting-started.md +78 -78
- package/docs/index.md +24 -23
- package/docs/mcp-architecture.md +29 -6
- package/docs/providers.md +258 -254
- package/docs/skills.md +0 -1
- package/docs/streaming.md +133 -133
- package/docs/swarm.md +503 -0
- package/docs/tools.md +214 -212
- package/package.json +1 -1
package/dist/tools/agent/hire.js
CHANGED
|
@@ -2,26 +2,59 @@ import { MCPTool } from "../../core/mcp.js";
|
|
|
2
2
|
export const AgentHireTool = (registry) => {
|
|
3
3
|
const maxHired = registry.getMaxHired();
|
|
4
4
|
const limitNote = maxHired !== undefined
|
|
5
|
-
? ` At most ${maxHired}
|
|
5
|
+
? ` At most ${maxHired} agent${maxHired === 1 ? "" : "s"} may be hired across the whole swarm at once — that budget is shared with every other agent that can hire, so check agent-types for remaining slots and fire what you no longer need.`
|
|
6
6
|
: "";
|
|
7
7
|
return new MCPTool({
|
|
8
8
|
name: "agent-hire",
|
|
9
|
-
description: `hire a
|
|
9
|
+
description: `hire a new agent of one of the types from agent-types. It starts idle — use agent-prompt to give it work — and reports back only to you.${limitNote}`,
|
|
10
10
|
inputs: [
|
|
11
11
|
{
|
|
12
|
-
name: "
|
|
12
|
+
name: "type",
|
|
13
13
|
type: "string",
|
|
14
|
-
description: "the
|
|
14
|
+
description: "the agent type to hire, exactly as agent-types spells it",
|
|
15
15
|
required: true,
|
|
16
16
|
},
|
|
17
|
+
{
|
|
18
|
+
name: "group",
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "optional group name to put this agent in. Agents in the same group can broadcast to each other with agent-report-group without going through you — useful when several agents work the same area and need to stay in sync.",
|
|
21
|
+
required: false,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "briefing",
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "optional context appended to this agent's standing instruction for its whole lifetime — the project background it should never forget. Per-task work goes in agent-prompt instead.",
|
|
27
|
+
required: false,
|
|
28
|
+
},
|
|
17
29
|
],
|
|
18
|
-
execute: async (_envID, inputs
|
|
19
|
-
const {
|
|
20
|
-
if (!
|
|
21
|
-
throw new Error("
|
|
30
|
+
execute: async (_envID, inputs) => {
|
|
31
|
+
const { type, group, briefing } = inputs;
|
|
32
|
+
if (!type || typeof type !== "string") {
|
|
33
|
+
throw new Error("type must be a non-empty string");
|
|
34
|
+
}
|
|
35
|
+
if (group !== undefined && typeof group !== "string") {
|
|
36
|
+
throw new Error("group must be a string when given");
|
|
37
|
+
}
|
|
38
|
+
if (briefing !== undefined && typeof briefing !== "string") {
|
|
39
|
+
throw new Error("briefing must be a string when given");
|
|
40
|
+
}
|
|
41
|
+
const { controller, agentId } = registry.requireCaller();
|
|
42
|
+
if (!registry.requireAgent(controller, agentId).active) {
|
|
43
|
+
throw new Error("a fired agent cannot hire.");
|
|
44
|
+
}
|
|
45
|
+
const limit = registry.getMaxHired();
|
|
46
|
+
if (limit !== undefined && registry.countHired() >= limit) {
|
|
47
|
+
throw new Error(`cannot hire "${type}" — the swarm's shared limit of ${limit} hired agent(s) is already reached. ` +
|
|
48
|
+
`Fire an agent you no longer need (agent-fire), or use one already working (agent-active).`);
|
|
22
49
|
}
|
|
23
|
-
registry.hire
|
|
24
|
-
return {
|
|
50
|
+
const hired = await registry.request("agent-hire", agentId, { type, group, briefing });
|
|
51
|
+
return {
|
|
52
|
+
hired: true,
|
|
53
|
+
agentId: hired.agentId,
|
|
54
|
+
type: hired.type,
|
|
55
|
+
groups: hired.groups,
|
|
56
|
+
remaining: registry.getRemaining() ?? null,
|
|
57
|
+
};
|
|
25
58
|
},
|
|
26
59
|
});
|
|
27
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hire.js","sourceRoot":"","sources":["../../../src/tools/agent/hire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"hire.js","sourceRoot":"","sources":["../../../src/tools/agent/hire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAI5C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAA4B,EAAE,EAAE;IAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS;QACpC,CAAC,CAAC,YAAY,QAAQ,SAAS,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,uLAAuL;QAC/O,CAAC,CAAC,EAAE,CAAC;IAET,OAAO,IAAI,OAAO,CAAC;QACf,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,2IAA2I,SAAS,EAAE;QACnK,MAAM,EAAE;YACJ;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;gBACvE,QAAQ,EAAE,IAAI;aACjB;YACD;gBACI,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4NAA4N;gBACzO,QAAQ,EAAE,KAAK;aAClB;YACD;gBACI,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oLAAoL;gBACjM,QAAQ,EAAE,KAAK;aAClB;SACJ;QACD,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EACf,EAAE;YACd,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;YAEzC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACvD,CAAC;YACD,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YAEzD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,IAAI,KAAK,EAAE,CAAC;gBACxD,MAAM,IAAI,KAAK,CACX,gBAAgB,IAAI,mCAAmC,KAAK,sCAAsC;oBAClG,2FAA2F,CAC9F,CAAC;YACN,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAiB,YAAY,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAEvG,OAAO;gBACH,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,IAAI,IAAI;aAC7C,CAAC;QACN,CAAC;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,25 +1,28 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { AgentTypesTool } from "./types.js";
|
|
2
2
|
export { AgentHireTool } from "./hire.js";
|
|
3
|
+
export { AgentFireTool } from "./fire.js";
|
|
4
|
+
export { AgentActiveTool } from "./active.js";
|
|
3
5
|
export { AgentPromptTool } from "./prompt.js";
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export
|
|
7
|
-
|
|
6
|
+
export { AgentReportParentTool } from "./report-parent.js";
|
|
7
|
+
export { AgentReportGroupTool } from "./report-group.js";
|
|
8
|
+
export { AgentToolsRegistry } from "./registry.js";
|
|
9
|
+
export type { SwarmController, SwarmAgentTypeInfo, SwarmAgentInfo, AgentToolsEvent, AgentToolsAck, AgentToolsListener, } from "./registry.js";
|
|
10
|
+
import type MCPTool from "../../core/mcp.js";
|
|
11
|
+
import { type AgentToolsEvent, type AgentToolsListener, type SwarmController } from "./registry.js";
|
|
8
12
|
export interface AgentToolsOptions {
|
|
9
|
-
/** Cap on how many workers may be hired at once. Omit for no limit. Surfaced dynamically in agent-hire's own description (and in agent-list's output) so the model knows the constraint without being told out of band. */
|
|
10
13
|
maxHired?: number;
|
|
11
14
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export declare const
|
|
24
|
-
export default
|
|
15
|
+
export interface AgentToolsHandle {
|
|
16
|
+
readonly tools: MCPTool[];
|
|
17
|
+
readonly id: string;
|
|
18
|
+
getMaxHired(): number | undefined;
|
|
19
|
+
/** Lets the tools read the swarm's roster. SwarmBase calls this. */
|
|
20
|
+
attach(swarm: SwarmController): void;
|
|
21
|
+
/** Subscribe to what the tools ask the swarm to do. SwarmBase calls this, once per event. */
|
|
22
|
+
on(event: AgentToolsEvent, listener: AgentToolsListener): void;
|
|
23
|
+
/** Run an agent's turn labelled with its id, so tools called during it know their caller. SwarmBase wraps every run in this. */
|
|
24
|
+
runAs<T>(agentId: string, fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
}
|
|
26
|
+
export declare const getAgentTools: (options?: AgentToolsOptions) => AgentToolsHandle;
|
|
27
|
+
export default getAgentTools;
|
|
25
28
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACR,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,aAAa,EACb,kBAAkB,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAA2B,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AASxH,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,WAAW,IAAI,MAAM,GAAG,SAAS,CAAC;IAClC,oEAAoE;IACpE,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,6FAA6F;IAC7F,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/D,gIAAgI;IAChI,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,aAAa,GAAI,UAAS,iBAAsB,KAAG,gBAqB/D,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,30 +1,38 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { AgentTypesTool } from "./types.js";
|
|
2
2
|
export { AgentHireTool } from "./hire.js";
|
|
3
|
+
export { AgentFireTool } from "./fire.js";
|
|
4
|
+
export { AgentActiveTool } from "./active.js";
|
|
3
5
|
export { AgentPromptTool } from "./prompt.js";
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
|
|
6
|
+
export { AgentReportParentTool } from "./report-parent.js";
|
|
7
|
+
export { AgentReportGroupTool } from "./report-group.js";
|
|
8
|
+
export { AgentToolsRegistry } from "./registry.js";
|
|
9
|
+
import AgentToolsRegistry, {} from "./registry.js";
|
|
10
|
+
import { AgentTypesTool } from "./types.js";
|
|
7
11
|
import { AgentHireTool } from "./hire.js";
|
|
12
|
+
import { AgentFireTool } from "./fire.js";
|
|
13
|
+
import { AgentActiveTool } from "./active.js";
|
|
8
14
|
import { AgentPromptTool } from "./prompt.js";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* separate AgentTools(...) calls (e.g. for two different planners in the
|
|
16
|
-
* same process) never share hire state.
|
|
17
|
-
*
|
|
18
|
-
* Not included here: AgentReportTool — that one goes on each *worker's*
|
|
19
|
-
* own tool list instead, not the planner's. Import it separately.
|
|
20
|
-
*/
|
|
21
|
-
export const AgentTools = (availableAgents, options = {}) => {
|
|
22
|
-
const registry = new AgentRegistry(availableAgents, options.maxHired);
|
|
23
|
-
return [
|
|
24
|
-
AgentListTool(registry),
|
|
15
|
+
import { AgentReportParentTool } from "./report-parent.js";
|
|
16
|
+
import { AgentReportGroupTool } from "./report-group.js";
|
|
17
|
+
export const getAgentTools = (options = {}) => {
|
|
18
|
+
const registry = new AgentToolsRegistry(options.maxHired);
|
|
19
|
+
const tools = [
|
|
20
|
+
AgentTypesTool(registry),
|
|
25
21
|
AgentHireTool(registry),
|
|
22
|
+
AgentFireTool(registry),
|
|
23
|
+
AgentActiveTool(registry),
|
|
26
24
|
AgentPromptTool(registry),
|
|
25
|
+
AgentReportParentTool(registry),
|
|
26
|
+
AgentReportGroupTool(registry),
|
|
27
27
|
];
|
|
28
|
+
return {
|
|
29
|
+
tools,
|
|
30
|
+
id: registry.id,
|
|
31
|
+
getMaxHired: () => registry.getMaxHired(),
|
|
32
|
+
attach: (swarm) => registry.attach(swarm),
|
|
33
|
+
on: (event, listener) => { registry.on(event, listener); },
|
|
34
|
+
runAs: (agentId, fn) => registry.runAs(agentId, fn),
|
|
35
|
+
};
|
|
28
36
|
};
|
|
29
|
-
export default
|
|
37
|
+
export default getAgentTools;
|
|
30
38
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAWnD,OAAO,kBAAkB,EAAE,EAAuE,MAAM,eAAe,CAAC;AACxH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAkBzD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAA6B,EAAE,EAAoB,EAAE;IAC/E,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAc;QACrB,cAAc,CAAC,QAAQ,CAAC;QACxB,aAAa,CAAC,QAAQ,CAAC;QACvB,aAAa,CAAC,QAAQ,CAAC;QACvB,eAAe,CAAC,QAAQ,CAAC;QACzB,eAAe,CAAC,QAAQ,CAAC;QACzB,qBAAqB,CAAC,QAAQ,CAAC;QAC/B,oBAAoB,CAAC,QAAQ,CAAC;KACjC,CAAC;IAEF,OAAO;QACH,KAAK;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE;QACzC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1D,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;KACtD,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
-
import type
|
|
3
|
-
export declare const AgentPromptTool: (registry:
|
|
2
|
+
import type AgentToolsRegistry from "./registry.js";
|
|
3
|
+
export declare const AgentPromptTool: (registry: AgentToolsRegistry) => MCPTool;
|
|
4
4
|
export default AgentPromptTool;
|
|
5
5
|
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,kBAAkB,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,eAAe,GAAI,UAAU,kBAAkB,YA+C1D,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
|
@@ -1,76 +1,42 @@
|
|
|
1
1
|
import { MCPTool } from "../../core/mcp.js";
|
|
2
2
|
export const AgentPromptTool = (registry) => new MCPTool({
|
|
3
3
|
name: "agent-prompt",
|
|
4
|
-
description: "
|
|
4
|
+
description: "give a task to an agent you hired. Returns as soon as the task is handed over — the agent works in parallel with you and its answer arrives later as a report message from it, so do not wait or poll for a result. You can prompt several agents in a row to run them at the same time. Prompting an agent that is already mid-task adds your message to its current work rather than starting it over.",
|
|
5
5
|
inputs: [
|
|
6
6
|
{
|
|
7
|
-
name: "
|
|
7
|
+
name: "agentId",
|
|
8
8
|
type: "string",
|
|
9
|
-
description: "
|
|
9
|
+
description: "id of the agent to task, as returned by agent-hire or shown in agent-active",
|
|
10
10
|
required: true,
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
name: "prompt",
|
|
14
14
|
type: "string",
|
|
15
|
-
description: "the
|
|
15
|
+
description: "the task, written to stand on its own — the agent cannot see your conversation, only what you send here and the briefing it was hired with",
|
|
16
16
|
required: true,
|
|
17
17
|
},
|
|
18
18
|
],
|
|
19
|
-
execute: async (_envID, inputs
|
|
20
|
-
const {
|
|
21
|
-
if (!
|
|
22
|
-
throw new Error("
|
|
19
|
+
execute: async (_envID, inputs) => {
|
|
20
|
+
const { agentId: target, prompt } = inputs;
|
|
21
|
+
if (!target || typeof target !== "string") {
|
|
22
|
+
throw new Error("agentId must be a non-empty string");
|
|
23
23
|
}
|
|
24
24
|
if (!prompt || typeof prompt !== "string") {
|
|
25
25
|
throw new Error("prompt must be a non-empty string");
|
|
26
26
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const { controller, agentId } = registry.requireCaller();
|
|
28
|
+
const info = registry.requireAgent(controller, target);
|
|
29
|
+
if (!info.active) {
|
|
30
|
+
throw new Error(`"${target}" has been fired and can no longer be prompted.`);
|
|
30
31
|
}
|
|
31
|
-
if (
|
|
32
|
-
throw new Error(`
|
|
32
|
+
if (info.parentId !== agentId) {
|
|
33
|
+
throw new Error(`only ${info.parentId}, the agent that hired "${target}", can prompt it.`);
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// diffing total count across both arrays stays valid even if one happens.
|
|
40
|
-
const statesBefore = agent.getCurrentAgentStates();
|
|
41
|
-
const beforeLength = statesBefore.retiredMessages.length + statesBefore.messagesCompact.length;
|
|
42
|
-
await agent.run(prompt);
|
|
43
|
-
// Only look at messages this specific call produced — otherwise a
|
|
44
|
-
// worker that answers in plain text (no fresh agent-report) could
|
|
45
|
-
// surface a stale report left over from an earlier prompt.
|
|
46
|
-
const statesAfter = agent.getCurrentAgentStates();
|
|
47
|
-
const newMessages = [...statesAfter.retiredMessages, ...statesAfter.messagesCompact].slice(beforeLength);
|
|
48
|
-
let report;
|
|
49
|
-
let reported = false;
|
|
50
|
-
for (let i = newMessages.length - 1; i >= 0; i--) {
|
|
51
|
-
const msg = newMessages[i];
|
|
52
|
-
if (msg.role === "tool" && msg.toolName === "agent-report") {
|
|
53
|
-
try {
|
|
54
|
-
report = JSON.parse(msg.content || "{}").report;
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
report = msg.content;
|
|
58
|
-
}
|
|
59
|
-
reported = true;
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (!reported) {
|
|
64
|
-
for (let i = newMessages.length - 1; i >= 0; i--) {
|
|
65
|
-
const msg = newMessages[i];
|
|
66
|
-
if (msg.role === "assistant" && msg.content) {
|
|
67
|
-
report = msg.content;
|
|
68
|
-
break;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
report ??= "(worker agent produced no output this turn)";
|
|
73
|
-
return { report, reported };
|
|
35
|
+
await registry.request("agent-prompt", agentId, {
|
|
36
|
+
to: [target],
|
|
37
|
+
message: `[task from ${agentId}, the agent that hired you]\n${prompt}`,
|
|
38
|
+
});
|
|
39
|
+
return { dispatched: true, agentId: target };
|
|
74
40
|
},
|
|
75
41
|
});
|
|
76
42
|
export default AgentPromptTool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/tools/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/tools/agent/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAA4B,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IACzE,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,0YAA0Y;IACvZ,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6EAA6E;YAC1F,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,4IAA4I;YACzJ,QAAQ,EAAE,IAAI;SACjB;KACJ;IACD,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EACf,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAE3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEvD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,iDAAiD,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,2BAA2B,MAAM,mBAAmB,CAAC,CAAC;QAC/F,CAAC;QAED,MAAM,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE;YAC5C,EAAE,EAAE,CAAC,MAAM,CAAC;YACZ,OAAO,EAAE,cAAc,OAAO,gCAAgC,MAAM,EAAE;SACzE,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACjD,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,eAAe,CAAC"}
|
|
@@ -1,33 +1,83 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
name: string;
|
|
1
|
+
import EventEmitter from "events";
|
|
2
|
+
export interface SwarmAgentTypeInfo {
|
|
3
|
+
type: string;
|
|
5
4
|
description: string;
|
|
6
|
-
rating
|
|
7
|
-
hired
|
|
5
|
+
rating?: Record<string, number>;
|
|
6
|
+
/** How many agents of this type are hired and still active right now. */
|
|
7
|
+
active: number;
|
|
8
|
+
}
|
|
9
|
+
export interface SwarmAgentInfo {
|
|
10
|
+
agentId: string;
|
|
11
|
+
type: string;
|
|
12
|
+
parentId?: string;
|
|
13
|
+
groups: string[];
|
|
14
|
+
active: boolean;
|
|
15
|
+
busy: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* True from the moment its parent tasks it until it reports back.
|
|
18
|
+
*
|
|
19
|
+
* Read together with `busy`, this is what separates the three states that
|
|
20
|
+
* otherwise all look like "not running": `busy` means it is working right
|
|
21
|
+
* now; `awaitingReport` without `busy` means it was given a task, is not
|
|
22
|
+
* running, and has not answered — it has paused mid-task, which in practice
|
|
23
|
+
* means it is blocked on something outside the swarm, such as a question
|
|
24
|
+
* put to the user. Neither flag set means it is idle with nothing owed.
|
|
25
|
+
*
|
|
26
|
+
* Without this a parent cannot tell a paused agent from a dead one, and
|
|
27
|
+
* tends to re-task or fire an agent that was only waiting.
|
|
28
|
+
*/
|
|
29
|
+
awaitingReport: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* What a swarm lets the agent tools *read*. Nothing here changes anything — the
|
|
33
|
+
* swarm's job is to know the state of its agents, and every action goes back to
|
|
34
|
+
* it as an event instead (see AgentToolsEvent below).
|
|
35
|
+
*/
|
|
36
|
+
export interface SwarmController {
|
|
37
|
+
listTypes(): SwarmAgentTypeInfo[];
|
|
38
|
+
/** Every agent, active or not, in creation order. */
|
|
39
|
+
listAgents(): SwarmAgentInfo[];
|
|
40
|
+
getAgentInfo(agentId: string): SwarmAgentInfo | undefined;
|
|
41
|
+
/** The agent the user talks to — it has no parent and cannot be fired. */
|
|
42
|
+
isEntrypoint(agentId: string): boolean;
|
|
8
43
|
}
|
|
9
44
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* the same process each get their own roster and hire state.
|
|
45
|
+
* Everything a tool asks the swarm to *do*. The tool has already decided it is
|
|
46
|
+
* allowed (parentage, hire cap, group membership) and has already written the
|
|
47
|
+
* message the receiving agent will see; the swarm only carries it out.
|
|
14
48
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* provider/instruction/tools); the model can only hire/prompt from what's
|
|
20
|
-
* already here, never create new ones.
|
|
49
|
+
* - `agent-hire` — payload `{ type, group?, briefing? }`, acked with the new `SwarmAgentInfo`
|
|
50
|
+
* - `agent-fire` — payload `{ agentId }`, acked with nothing
|
|
51
|
+
* - `agent-prompt` / `agent-report-parent` / `agent-report-group`
|
|
52
|
+
* — payload `{ to: string[], message: string }`, acked with nothing
|
|
21
53
|
*/
|
|
22
|
-
export
|
|
54
|
+
export type AgentToolsEvent = "agent-hire" | "agent-fire" | "agent-prompt" | "agent-report-parent" | "agent-report-group";
|
|
55
|
+
/** Called by the swarm once it has carried the request out — `done(error)` to fail the tool call, `done(null, result)` to answer it. */
|
|
56
|
+
export type AgentToolsAck<T = void> = (error?: Error | null, result?: T) => void;
|
|
57
|
+
export type AgentToolsListener = (agentId: string, payload: any, done: AgentToolsAck<any>) => void;
|
|
58
|
+
export declare class AgentToolsRegistry extends EventEmitter {
|
|
23
59
|
#private;
|
|
24
|
-
|
|
60
|
+
readonly id: string;
|
|
61
|
+
constructor(maxHired?: number);
|
|
25
62
|
getMaxHired(): number | undefined;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
63
|
+
attach(controller: SwarmController): void;
|
|
64
|
+
isAttached(): boolean;
|
|
65
|
+
requireController(): SwarmController;
|
|
66
|
+
/** Run an agent's turn labelled with its id. SwarmBase wraps every `BaseAgent.run()` in this. */
|
|
67
|
+
runAs<T>(agentId: string, fn: () => Promise<T>): Promise<T>;
|
|
68
|
+
currentAgentId(): string | undefined;
|
|
69
|
+
/** The caller and the swarm, or a tool error saying which of the two is missing. */
|
|
70
|
+
requireCaller(): {
|
|
71
|
+
controller: SwarmController;
|
|
72
|
+
agentId: string;
|
|
73
|
+
};
|
|
74
|
+
/** Ask the swarm to carry something out, and wait for its ack. */
|
|
75
|
+
request<T = void>(event: AgentToolsEvent, agentId: string, payload: Record<string, any>): Promise<T>;
|
|
76
|
+
/** Hired agents still active — the entrypoint agent is not one of them. */
|
|
77
|
+
countHired(): number;
|
|
78
|
+
getRemaining(): number | undefined;
|
|
79
|
+
/** Look an agent up the way a tool needs it: with an error the model can act on. */
|
|
80
|
+
requireAgent(controller: SwarmController, agentId: string): SwarmAgentInfo;
|
|
31
81
|
}
|
|
32
|
-
export default
|
|
82
|
+
export default AgentToolsRegistry;
|
|
33
83
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/tools/agent/registry.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAGlC,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd;;;;;;;;;;;;OAYG;IACH,cAAc,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC5B,SAAS,IAAI,kBAAkB,EAAE,CAAC;IAClC,qDAAqD;IACrD,UAAU,IAAI,cAAc,EAAE,CAAC;IAC/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IAC1D,0EAA0E;IAC1E,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GACrB,YAAY,GACZ,YAAY,GACZ,cAAc,GACd,qBAAqB,GACrB,oBAAoB,CAAC;AAE3B,wIAAwI;AACxI,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;AAEjF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAUnG,qBAAa,kBAAmB,SAAQ,YAAY;;IAChD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAgB;gBAgBvB,QAAQ,CAAC,EAAE,MAAM;IAQ7B,WAAW,IAAI,MAAM,GAAG,SAAS;IAIjC,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAOzC,UAAU,IAAI,OAAO;IAIrB,iBAAiB,IAAI,eAAe;IAOpC,iGAAiG;IACjG,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3D,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC,oFAAoF;IACpF,aAAa,IAAI;QAAE,UAAU,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IASjE,kEAAkE;IAClE,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2BpG,2EAA2E;IAC3E,UAAU,IAAI,MAAM;IAKpB,YAAY,IAAI,MAAM,GAAG,SAAS;IAKlC,oFAAoF;IACpF,YAAY,CAAC,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc;CAO7E;AAED,eAAe,kBAAkB,CAAC"}
|