@jmanuelcorral/openteam 0.1.19 → 0.1.21
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 +30 -14
- package/dist/cli/dashboardServe.d.ts +45 -0
- package/dist/cli/dashboardServe.d.ts.map +1 -0
- package/dist/cli/{initAdapters.d.ts → setupAdapters.d.ts} +2 -2
- package/dist/cli/setupAdapters.d.ts.map +1 -0
- package/dist/cli.js +1199 -495
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/orchestratorAgent.d.ts +2 -2
- package/dist/commands/orchestratorAgent.d.ts.map +1 -1
- package/dist/commands/{init.d.ts → setup.d.ts} +7 -7
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/slashCommand.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +220 -198
- package/dist/web/git.d.ts +9 -0
- package/dist/web/git.d.ts.map +1 -0
- package/dist/web/server.d.ts +8 -7
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/start.d.ts +2 -2
- package/dist/web/start.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cli/initAdapters.d.ts.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CA4BxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAalB,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACnE,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACvD,kBAAkB,EAAE,CAClB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,mBAAmB,EAAE,CACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sBAAsB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAalB,MAAM,MAAM,OAAO,GAAG;IACpB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,UAAU,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;IACnE,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACvD,kBAAkB,EAAE,CAClB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,mBAAmB,EAAE,CACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,sBAAsB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAyNF,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CA+DpB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { FrontierChoice } from "./
|
|
1
|
+
import type { FrontierChoice } from "./setup";
|
|
2
2
|
/**
|
|
3
|
-
* Ruta relativa (al cwd) del agente primario que `openteam
|
|
3
|
+
* Ruta relativa (al cwd) del agente primario que `openteam setup` genera. El
|
|
4
4
|
* nombre del fichero (`openteam`) es el nombre del agente en opencode.
|
|
5
5
|
*/
|
|
6
6
|
export declare const ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestratorAgent.d.ts","sourceRoot":"","sources":["../../src/commands/orchestratorAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"orchestratorAgent.d.ts","sourceRoot":"","sources":["../../src/commands/orchestratorAgent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AAErE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,iCAAiC,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,MAAM,CAuLR"}
|
|
@@ -14,7 +14,7 @@ export type KnownRuntime = {
|
|
|
14
14
|
dynamicPort?: boolean;
|
|
15
15
|
};
|
|
16
16
|
/**
|
|
17
|
-
* Runtimes locales que `openteam
|
|
17
|
+
* Runtimes locales que `openteam setup` conoce y ofrece. El orden define el
|
|
18
18
|
* orden de las preguntas.
|
|
19
19
|
*/
|
|
20
20
|
export declare const KNOWN_RUNTIMES: readonly KnownRuntime[];
|
|
@@ -36,7 +36,7 @@ export type FrontierChoice = {
|
|
|
36
36
|
providerID: string;
|
|
37
37
|
modelID: string;
|
|
38
38
|
};
|
|
39
|
-
export type
|
|
39
|
+
export type SetupAnswers = {
|
|
40
40
|
runtimes: RuntimeChoice[];
|
|
41
41
|
frontier: FrontierChoice;
|
|
42
42
|
routerMode: RouterMode;
|
|
@@ -80,12 +80,12 @@ export declare function frontierModelsForProvider(profiles: readonly ModelCapabi
|
|
|
80
80
|
* Construye y valida el OpenTeamConfig a partir de las respuestas del init.
|
|
81
81
|
* Pure: no I/O.
|
|
82
82
|
*/
|
|
83
|
-
export declare function buildOpenTeamConfig(answers:
|
|
83
|
+
export declare function buildOpenTeamConfig(answers: SetupAnswers): OpenTeamConfig;
|
|
84
84
|
/**
|
|
85
85
|
* Construye el opencode.json: declara el plugin, los providers locales
|
|
86
86
|
* OpenAI-compatible y el modelo por defecto (baseline frontier). Pure.
|
|
87
87
|
*/
|
|
88
|
-
export declare function buildOpencodeConfig(answers:
|
|
88
|
+
export declare function buildOpencodeConfig(answers: SetupAnswers): OpencodeConfig;
|
|
89
89
|
export declare function serializeOpencodeConfig(config: OpencodeConfig): string;
|
|
90
90
|
export type SelectChoice<T> = {
|
|
91
91
|
value: T;
|
|
@@ -123,7 +123,7 @@ export type Prompter = {
|
|
|
123
123
|
initial?: string;
|
|
124
124
|
}): Promise<string>;
|
|
125
125
|
};
|
|
126
|
-
export type
|
|
126
|
+
export type SetupDeps = {
|
|
127
127
|
cwd: string;
|
|
128
128
|
detect: () => Promise<DetectedRuntime[]>;
|
|
129
129
|
loadFrontierProfiles: () => Promise<ModelCapabilityProfile[]>;
|
|
@@ -131,5 +131,5 @@ export type InitDeps = {
|
|
|
131
131
|
writeFile: (path: string, contents: string) => Promise<void>;
|
|
132
132
|
fileExists: (path: string) => Promise<boolean>;
|
|
133
133
|
};
|
|
134
|
-
export declare function
|
|
135
|
-
//# sourceMappingURL=
|
|
134
|
+
export declare function runSetup(deps: SetupDeps): Promise<CliResult>;
|
|
135
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Ruta relativa (al cwd) del slash command `/openteam` que `openteam
|
|
2
|
+
* Ruta relativa (al cwd) del slash command `/openteam` que `openteam setup`
|
|
3
3
|
* genera. opencode descubre los slash commands leyendo `.opencode/command/*.md`
|
|
4
4
|
* (o `~/.config/opencode/command/`); el nombre del fichero (`openteam`) es el
|
|
5
5
|
* nombre del comando, invocable como `/openteam`.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,EAIN,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,MAAM,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,KAAK,EAIN,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,MAAM,EAAe,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAmBnD,KAAK,gBAAgB,GAAG;IACtB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;CAChC,CAAC;AAcF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAGhE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAGtD;AA0BD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAAqB,GAC1B,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAQjC;AAeD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOrD;AAmBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvB,GAAG,EAAE,MAAM,MAAM,GAChB,aAAa,GAAG,SAAS,CAM3B;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CA4DT;AAED,eAAO,MAAM,MAAM,EAAE,MAyDpB,CAAC;AAEF,QAAA,MAAM,MAAM,EAAE,YAGb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,120 +8,6 @@ import {
|
|
|
8
8
|
} from "node:fs/promises";
|
|
9
9
|
import { dirname as dirname2, join } from "node:path";
|
|
10
10
|
|
|
11
|
-
// src/config/persist.ts
|
|
12
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
13
|
-
import { dirname } from "node:path";
|
|
14
|
-
|
|
15
|
-
// src/config/schema.ts
|
|
16
|
-
import { z } from "zod";
|
|
17
|
-
var ModelRefSchema = z.object({
|
|
18
|
-
providerID: z.string().min(1),
|
|
19
|
-
modelID: z.string().min(1)
|
|
20
|
-
});
|
|
21
|
-
var RouterModeSchema = z.enum(["economy", "balanced", "quality"]);
|
|
22
|
-
var PrivacyModeSchema = z.enum([
|
|
23
|
-
"forceLocalOnSensitive",
|
|
24
|
-
"consentBeforeFrontier",
|
|
25
|
-
"off"
|
|
26
|
-
]);
|
|
27
|
-
var BaselineModeSchema = z.enum(["auto", "pinned"]);
|
|
28
|
-
var DashboardHostSchema = z.enum(["127.0.0.1", "localhost"]);
|
|
29
|
-
var DashboardConfigSchema = z.object({
|
|
30
|
-
enabled: z.boolean().default(false),
|
|
31
|
-
host: DashboardHostSchema.default("127.0.0.1"),
|
|
32
|
-
port: z.number().int().min(1024).max(65535).default(4599),
|
|
33
|
-
autoPortFallback: z.boolean().default(true),
|
|
34
|
-
refreshMs: z.number().int().min(250).default(2000),
|
|
35
|
-
recentRoutes: z.number().int().positive().default(50),
|
|
36
|
-
openBrowser: z.boolean().default(false)
|
|
37
|
-
}).default({
|
|
38
|
-
enabled: false,
|
|
39
|
-
host: "127.0.0.1",
|
|
40
|
-
port: 4599,
|
|
41
|
-
autoPortFallback: true,
|
|
42
|
-
refreshMs: 2000,
|
|
43
|
-
recentRoutes: 50,
|
|
44
|
-
openBrowser: false
|
|
45
|
-
});
|
|
46
|
-
var defaultLocalModel = {
|
|
47
|
-
providerID: "ollama",
|
|
48
|
-
modelID: "qwen3:8b"
|
|
49
|
-
};
|
|
50
|
-
var defaultFrontierModel = {
|
|
51
|
-
providerID: "anthropic",
|
|
52
|
-
modelID: "claude-sonnet-4-5"
|
|
53
|
-
};
|
|
54
|
-
var LocalRuntimeSchema = z.object({
|
|
55
|
-
id: z.enum(["ollama", "lmstudio", "foundry-local"]),
|
|
56
|
-
enabled: z.boolean().default(true),
|
|
57
|
-
baseURL: z.string().url().optional(),
|
|
58
|
-
discovery: z.enum(["cli", "sdk", "manual"]).optional(),
|
|
59
|
-
defaultModel: ModelRefSchema
|
|
60
|
-
});
|
|
61
|
-
var OpenTeamConfigSchema = z.object({
|
|
62
|
-
baseline: z.object({
|
|
63
|
-
mode: BaselineModeSchema.default("auto"),
|
|
64
|
-
pinnedModel: ModelRefSchema.nullable().default(null),
|
|
65
|
-
hardDefault: ModelRefSchema.default(defaultFrontierModel)
|
|
66
|
-
}).default({
|
|
67
|
-
mode: "auto",
|
|
68
|
-
pinnedModel: null,
|
|
69
|
-
hardDefault: defaultFrontierModel
|
|
70
|
-
}),
|
|
71
|
-
router: z.object({
|
|
72
|
-
mode: RouterModeSchema.default("balanced"),
|
|
73
|
-
localDefault: ModelRefSchema.default(defaultLocalModel),
|
|
74
|
-
trivialPromptMaxChars: z.number().int().positive().default(280),
|
|
75
|
-
frontierPromptMinChars: z.number().int().positive().default(2000)
|
|
76
|
-
}).default({
|
|
77
|
-
mode: "balanced",
|
|
78
|
-
localDefault: defaultLocalModel,
|
|
79
|
-
trivialPromptMaxChars: 280,
|
|
80
|
-
frontierPromptMinChars: 2000
|
|
81
|
-
}),
|
|
82
|
-
local: z.object({
|
|
83
|
-
runtimes: z.array(LocalRuntimeSchema).min(1).default([
|
|
84
|
-
{
|
|
85
|
-
id: "ollama",
|
|
86
|
-
enabled: true,
|
|
87
|
-
baseURL: "http://localhost:11434/v1",
|
|
88
|
-
defaultModel: { providerID: "ollama", modelID: "qwen3:8b" }
|
|
89
|
-
}
|
|
90
|
-
])
|
|
91
|
-
}).default({
|
|
92
|
-
runtimes: [
|
|
93
|
-
{
|
|
94
|
-
id: "ollama",
|
|
95
|
-
enabled: true,
|
|
96
|
-
baseURL: "http://localhost:11434/v1",
|
|
97
|
-
defaultModel: defaultLocalModel
|
|
98
|
-
}
|
|
99
|
-
]
|
|
100
|
-
}),
|
|
101
|
-
budgets: z.object({
|
|
102
|
-
sessionUSD: z.number().positive().optional(),
|
|
103
|
-
monthlyUSD: z.number().positive().optional(),
|
|
104
|
-
frontierTokensPerSession: z.number().int().positive().optional(),
|
|
105
|
-
hardStopOnBudgetExhaustion: z.boolean().default(false)
|
|
106
|
-
}).default({ hardStopOnBudgetExhaustion: false }),
|
|
107
|
-
privacyMode: PrivacyModeSchema.default("forceLocalOnSensitive"),
|
|
108
|
-
dashboard: DashboardConfigSchema
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
// src/config/persist.ts
|
|
112
|
-
var DEFAULT_CONFIG_PATH = ".opencode/openteam.json";
|
|
113
|
-
function serializeOpenTeamConfig(config) {
|
|
114
|
-
const validated = OpenTeamConfigSchema.parse(config);
|
|
115
|
-
return `${JSON.stringify(validated, null, 2)}
|
|
116
|
-
`;
|
|
117
|
-
}
|
|
118
|
-
async function writeOpenTeamConfigFile(config, path = DEFAULT_CONFIG_PATH, deps = {}) {
|
|
119
|
-
const mkdirFn = deps.mkdir ?? mkdir;
|
|
120
|
-
const writeFileFn = deps.writeFile ?? writeFile;
|
|
121
|
-
await mkdirFn(dirname(path), { recursive: true });
|
|
122
|
-
await writeFileFn(path, serializeOpenTeamConfig(config), "utf8");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
11
|
// src/commands/orchestratorAgent.ts
|
|
126
12
|
var ORCHESTRATOR_AGENT_PATH = ".opencode/agent/openteam.md";
|
|
127
13
|
function buildOrchestratorAgent(frontier, options = {}) {
|
|
@@ -307,7 +193,121 @@ function buildOrchestratorAgent(frontier, options = {}) {
|
|
|
307
193
|
${body}`;
|
|
308
194
|
}
|
|
309
195
|
|
|
310
|
-
// src/
|
|
196
|
+
// src/config/persist.ts
|
|
197
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
198
|
+
import { dirname } from "node:path";
|
|
199
|
+
|
|
200
|
+
// src/config/schema.ts
|
|
201
|
+
import { z } from "zod";
|
|
202
|
+
var ModelRefSchema = z.object({
|
|
203
|
+
providerID: z.string().min(1),
|
|
204
|
+
modelID: z.string().min(1)
|
|
205
|
+
});
|
|
206
|
+
var RouterModeSchema = z.enum(["economy", "balanced", "quality"]);
|
|
207
|
+
var PrivacyModeSchema = z.enum([
|
|
208
|
+
"forceLocalOnSensitive",
|
|
209
|
+
"consentBeforeFrontier",
|
|
210
|
+
"off"
|
|
211
|
+
]);
|
|
212
|
+
var BaselineModeSchema = z.enum(["auto", "pinned"]);
|
|
213
|
+
var DashboardHostSchema = z.enum(["127.0.0.1", "localhost"]);
|
|
214
|
+
var DashboardConfigSchema = z.object({
|
|
215
|
+
enabled: z.boolean().default(false),
|
|
216
|
+
host: DashboardHostSchema.default("127.0.0.1"),
|
|
217
|
+
port: z.number().int().min(1024).max(65535).default(4599),
|
|
218
|
+
autoPortFallback: z.boolean().default(true),
|
|
219
|
+
refreshMs: z.number().int().min(250).default(2000),
|
|
220
|
+
recentRoutes: z.number().int().positive().default(50),
|
|
221
|
+
openBrowser: z.boolean().default(false)
|
|
222
|
+
}).default({
|
|
223
|
+
enabled: false,
|
|
224
|
+
host: "127.0.0.1",
|
|
225
|
+
port: 4599,
|
|
226
|
+
autoPortFallback: true,
|
|
227
|
+
refreshMs: 2000,
|
|
228
|
+
recentRoutes: 50,
|
|
229
|
+
openBrowser: false
|
|
230
|
+
});
|
|
231
|
+
var defaultLocalModel = {
|
|
232
|
+
providerID: "ollama",
|
|
233
|
+
modelID: "qwen3:8b"
|
|
234
|
+
};
|
|
235
|
+
var defaultFrontierModel = {
|
|
236
|
+
providerID: "anthropic",
|
|
237
|
+
modelID: "claude-sonnet-4-5"
|
|
238
|
+
};
|
|
239
|
+
var LocalRuntimeSchema = z.object({
|
|
240
|
+
id: z.enum(["ollama", "lmstudio", "foundry-local"]),
|
|
241
|
+
enabled: z.boolean().default(true),
|
|
242
|
+
baseURL: z.string().url().optional(),
|
|
243
|
+
discovery: z.enum(["cli", "sdk", "manual"]).optional(),
|
|
244
|
+
defaultModel: ModelRefSchema
|
|
245
|
+
});
|
|
246
|
+
var OpenTeamConfigSchema = z.object({
|
|
247
|
+
baseline: z.object({
|
|
248
|
+
mode: BaselineModeSchema.default("auto"),
|
|
249
|
+
pinnedModel: ModelRefSchema.nullable().default(null),
|
|
250
|
+
hardDefault: ModelRefSchema.default(defaultFrontierModel)
|
|
251
|
+
}).default({
|
|
252
|
+
mode: "auto",
|
|
253
|
+
pinnedModel: null,
|
|
254
|
+
hardDefault: defaultFrontierModel
|
|
255
|
+
}),
|
|
256
|
+
router: z.object({
|
|
257
|
+
mode: RouterModeSchema.default("balanced"),
|
|
258
|
+
localDefault: ModelRefSchema.default(defaultLocalModel),
|
|
259
|
+
trivialPromptMaxChars: z.number().int().positive().default(280),
|
|
260
|
+
frontierPromptMinChars: z.number().int().positive().default(2000)
|
|
261
|
+
}).default({
|
|
262
|
+
mode: "balanced",
|
|
263
|
+
localDefault: defaultLocalModel,
|
|
264
|
+
trivialPromptMaxChars: 280,
|
|
265
|
+
frontierPromptMinChars: 2000
|
|
266
|
+
}),
|
|
267
|
+
local: z.object({
|
|
268
|
+
runtimes: z.array(LocalRuntimeSchema).min(1).default([
|
|
269
|
+
{
|
|
270
|
+
id: "ollama",
|
|
271
|
+
enabled: true,
|
|
272
|
+
baseURL: "http://localhost:11434/v1",
|
|
273
|
+
defaultModel: { providerID: "ollama", modelID: "qwen3:8b" }
|
|
274
|
+
}
|
|
275
|
+
])
|
|
276
|
+
}).default({
|
|
277
|
+
runtimes: [
|
|
278
|
+
{
|
|
279
|
+
id: "ollama",
|
|
280
|
+
enabled: true,
|
|
281
|
+
baseURL: "http://localhost:11434/v1",
|
|
282
|
+
defaultModel: defaultLocalModel
|
|
283
|
+
}
|
|
284
|
+
]
|
|
285
|
+
}),
|
|
286
|
+
budgets: z.object({
|
|
287
|
+
sessionUSD: z.number().positive().optional(),
|
|
288
|
+
monthlyUSD: z.number().positive().optional(),
|
|
289
|
+
frontierTokensPerSession: z.number().int().positive().optional(),
|
|
290
|
+
hardStopOnBudgetExhaustion: z.boolean().default(false)
|
|
291
|
+
}).default({ hardStopOnBudgetExhaustion: false }),
|
|
292
|
+
privacyMode: PrivacyModeSchema.default("forceLocalOnSensitive"),
|
|
293
|
+
dashboard: DashboardConfigSchema
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
// src/config/persist.ts
|
|
297
|
+
var DEFAULT_CONFIG_PATH = ".opencode/openteam.json";
|
|
298
|
+
function serializeOpenTeamConfig(config) {
|
|
299
|
+
const validated = OpenTeamConfigSchema.parse(config);
|
|
300
|
+
return `${JSON.stringify(validated, null, 2)}
|
|
301
|
+
`;
|
|
302
|
+
}
|
|
303
|
+
async function writeOpenTeamConfigFile(config, path = DEFAULT_CONFIG_PATH, deps = {}) {
|
|
304
|
+
const mkdirFn = deps.mkdir ?? mkdir;
|
|
305
|
+
const writeFileFn = deps.writeFile ?? writeFile;
|
|
306
|
+
await mkdirFn(dirname(path), { recursive: true });
|
|
307
|
+
await writeFileFn(path, serializeOpenTeamConfig(config), "utf8");
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/commands/setup.ts
|
|
311
311
|
var OPENCODE_CONFIG_PATH = "opencode.json";
|
|
312
312
|
|
|
313
313
|
// src/config/load.ts
|
|
@@ -884,7 +884,7 @@ function modelText(classification) {
|
|
|
884
884
|
function renderAgentList(classifications, context) {
|
|
885
885
|
const lines = ["openteam agents — LLM por agente:", ""];
|
|
886
886
|
if (classifications.length === 0) {
|
|
887
|
-
lines.push(" (sin agentes en .opencode/agent/) — ejecuta 'openteam
|
|
887
|
+
lines.push(" (sin agentes en .opencode/agent/) — ejecuta 'openteam setup' o pide al orquestador que cree el equipo.");
|
|
888
888
|
return lines.join(`
|
|
889
889
|
`);
|
|
890
890
|
}
|
|
@@ -974,9 +974,12 @@ function renderDashboardStatus(dashboard) {
|
|
|
974
974
|
return [
|
|
975
975
|
"Dashboard: deshabilitado.",
|
|
976
976
|
"",
|
|
977
|
-
'Para activarlo, pon "dashboard": { "enabled": true }
|
|
978
|
-
"y recarga opencode. Se servirá (loopback) en:",
|
|
979
|
-
` ${url}
|
|
977
|
+
'Para activarlo dentro de opencode, pon "dashboard": { "enabled": true }',
|
|
978
|
+
"en .opencode/openteam.json y recarga opencode. Se servirá (loopback) en:",
|
|
979
|
+
` ${url}`,
|
|
980
|
+
"",
|
|
981
|
+
"O véelo ahora mismo sin editar la config:",
|
|
982
|
+
" openteam dashboard --serve (añade --open para abrir el navegador)"
|
|
980
983
|
].join(`
|
|
981
984
|
`);
|
|
982
985
|
}
|
|
@@ -988,7 +991,8 @@ function renderDashboardStatus(dashboard) {
|
|
|
988
991
|
dashboard.autoPortFallback ? " Puerto: con fallback automático si está ocupado" : " Puerto: fijo (sin fallback)",
|
|
989
992
|
"",
|
|
990
993
|
"Nota: solo escucha en loopback y nunca expone prompts (solo hashes).",
|
|
991
|
-
"El servidor corre dentro de la sesión de opencode; se cierra al salir."
|
|
994
|
+
"El servidor corre dentro de la sesión de opencode; se cierra al salir.",
|
|
995
|
+
"Para verlo fuera de opencode: openteam dashboard --serve"
|
|
992
996
|
].join(`
|
|
993
997
|
`);
|
|
994
998
|
}
|
|
@@ -1136,13 +1140,14 @@ var HELP = [
|
|
|
1136
1140
|
"openteam — comandos runtime",
|
|
1137
1141
|
"",
|
|
1138
1142
|
"Uso:",
|
|
1139
|
-
" openteam
|
|
1143
|
+
" openteam setup Configura opencode + openteam (interactivo)",
|
|
1140
1144
|
" openteam baseline show Muestra el baseline efectivo",
|
|
1141
1145
|
" openteam baseline set <p/model> Fija el baseline (modo pinned)",
|
|
1142
1146
|
" openteam baseline auto Baseline cheapest-capable (modo auto)",
|
|
1143
1147
|
" openteam doctor Diagnóstico de runtimes y config",
|
|
1144
1148
|
" openteam agents Lista los agentes y el LLM (local/frontier) de cada uno",
|
|
1145
1149
|
" openteam dashboard Estado y URL del dashboard web (loopback)",
|
|
1150
|
+
" openteam dashboard --serve Levanta el dashboard web (Ctrl+C para parar; --open abre el navegador)",
|
|
1146
1151
|
" openteam report Resumen de coste/ahorro (telemetría)",
|
|
1147
1152
|
" openteam yolo status Muestra si el modo YOLO está activo",
|
|
1148
1153
|
" openteam yolo on Activa YOLO (opencode auto-aprueba todo)",
|
|
@@ -1233,7 +1238,7 @@ ${HELP}`
|
|
|
1233
1238
|
if (config === undefined) {
|
|
1234
1239
|
return {
|
|
1235
1240
|
exitCode: 1,
|
|
1236
|
-
stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam
|
|
1241
|
+
stdout: `No existe ${opencodeConfigPath}. Ejecuta 'openteam setup' primero.`
|
|
1237
1242
|
};
|
|
1238
1243
|
}
|
|
1239
1244
|
if (sub === "status") {
|
|
@@ -2025,6 +2030,25 @@ async function readCostRecords(path, deps = {}) {
|
|
|
2025
2030
|
}
|
|
2026
2031
|
}
|
|
2027
2032
|
|
|
2033
|
+
// src/web/git.ts
|
|
2034
|
+
function createGitLastCommit(exec) {
|
|
2035
|
+
return async () => {
|
|
2036
|
+
const output = await exec("git", [
|
|
2037
|
+
"log",
|
|
2038
|
+
"-1",
|
|
2039
|
+
"--pretty=format:%h%x1f%s%x1f%cI"
|
|
2040
|
+
]);
|
|
2041
|
+
if (output.exitCode !== 0) {
|
|
2042
|
+
return;
|
|
2043
|
+
}
|
|
2044
|
+
const [hash, subject, at] = output.stdout.trim().split("\x1F");
|
|
2045
|
+
if (hash === undefined || subject === undefined || at === undefined) {
|
|
2046
|
+
return;
|
|
2047
|
+
}
|
|
2048
|
+
return { hash, subject, at };
|
|
2049
|
+
};
|
|
2050
|
+
}
|
|
2051
|
+
|
|
2028
2052
|
// src/web/paths.ts
|
|
2029
2053
|
var DEFAULT_BACKLOG_PATH = ".opencode/openteam-backlog.md";
|
|
2030
2054
|
|
|
@@ -2047,6 +2071,11 @@ function createActivityBuffer(max = 100) {
|
|
|
2047
2071
|
};
|
|
2048
2072
|
}
|
|
2049
2073
|
|
|
2074
|
+
// src/web/server.ts
|
|
2075
|
+
import {
|
|
2076
|
+
createServer as createHttpServer
|
|
2077
|
+
} from "node:http";
|
|
2078
|
+
|
|
2050
2079
|
// src/dashboard/render.ts
|
|
2051
2080
|
var TIERS2 = [
|
|
2052
2081
|
"trivial",
|
|
@@ -2394,94 +2423,101 @@ data: ${json}
|
|
|
2394
2423
|
|
|
2395
2424
|
`;
|
|
2396
2425
|
}
|
|
2397
|
-
function
|
|
2398
|
-
|
|
2426
|
+
function tryListen(server, host, port) {
|
|
2427
|
+
return new Promise((resolve, reject) => {
|
|
2428
|
+
const onError = (error) => {
|
|
2429
|
+
server.removeListener("listening", onListening);
|
|
2430
|
+
if (isAddressInUse(error)) {
|
|
2431
|
+
resolve(false);
|
|
2432
|
+
} else {
|
|
2433
|
+
reject(error);
|
|
2434
|
+
}
|
|
2435
|
+
};
|
|
2436
|
+
const onListening = () => {
|
|
2437
|
+
server.removeListener("error", onError);
|
|
2438
|
+
resolve(true);
|
|
2439
|
+
};
|
|
2440
|
+
server.once("error", onError);
|
|
2441
|
+
server.once("listening", onListening);
|
|
2442
|
+
server.listen(port, host);
|
|
2443
|
+
});
|
|
2444
|
+
}
|
|
2445
|
+
async function createDashboardServer(deps) {
|
|
2446
|
+
const create = deps.createServer ?? createHttpServer;
|
|
2399
2447
|
const log = deps.log ?? ((message) => console.log(message));
|
|
2400
|
-
const encoder = new TextEncoder;
|
|
2401
2448
|
const clients = new Set;
|
|
2402
|
-
const
|
|
2403
|
-
const url2 = new URL(request.url);
|
|
2449
|
+
const handle = async (request, response) => {
|
|
2404
2450
|
if (request.method !== "GET") {
|
|
2405
|
-
|
|
2451
|
+
response.writeHead(405).end("method not allowed");
|
|
2452
|
+
return;
|
|
2406
2453
|
}
|
|
2407
|
-
|
|
2408
|
-
|
|
2454
|
+
const url2 = new URL(request.url ?? "/", "http://localhost");
|
|
2455
|
+
const path = url2.pathname;
|
|
2456
|
+
if (path === "/" || path === "/index.html") {
|
|
2457
|
+
response.writeHead(200, HTML_HEADERS).end(await renderState(deps));
|
|
2458
|
+
return;
|
|
2409
2459
|
}
|
|
2410
|
-
if (
|
|
2411
|
-
|
|
2460
|
+
if (path === "/api/state") {
|
|
2461
|
+
response.writeHead(200, JSON_HEADERS).end(await stateJson(deps));
|
|
2462
|
+
return;
|
|
2412
2463
|
}
|
|
2413
|
-
if (
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
});
|
|
2464
|
+
if (path === "/healthz") {
|
|
2465
|
+
response.writeHead(200, JSON_HEADERS).end(JSON.stringify({ ok: true }));
|
|
2466
|
+
return;
|
|
2417
2467
|
}
|
|
2418
|
-
if (
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2424
|
-
|
|
2425
|
-
|
|
2426
|
-
|
|
2427
|
-
|
|
2428
|
-
cancel(controller) {
|
|
2429
|
-
clients.delete(controller);
|
|
2430
|
-
}
|
|
2468
|
+
if (path === "/favicon.ico") {
|
|
2469
|
+
response.writeHead(204).end();
|
|
2470
|
+
return;
|
|
2471
|
+
}
|
|
2472
|
+
if (path === "/events") {
|
|
2473
|
+
response.writeHead(200, SSE_HEADERS);
|
|
2474
|
+
response.write(sseMessage(await stateJson(deps)));
|
|
2475
|
+
clients.add(response);
|
|
2476
|
+
request.on("close", () => {
|
|
2477
|
+
clients.delete(response);
|
|
2431
2478
|
});
|
|
2432
|
-
return
|
|
2479
|
+
return;
|
|
2433
2480
|
}
|
|
2434
|
-
|
|
2481
|
+
response.writeHead(404).end("not found");
|
|
2435
2482
|
};
|
|
2483
|
+
const server = create((request, response) => {
|
|
2484
|
+
handle(request, response);
|
|
2485
|
+
});
|
|
2436
2486
|
const maxAttempts = deps.config.autoPortFallback ? 20 : 1;
|
|
2437
|
-
let
|
|
2438
|
-
let
|
|
2487
|
+
let bound = false;
|
|
2488
|
+
let boundPort = deps.config.port;
|
|
2439
2489
|
for (let offset = 0;offset < maxAttempts; offset += 1) {
|
|
2440
2490
|
const port = deps.config.port + offset;
|
|
2441
2491
|
if (port > 65535) {
|
|
2442
2492
|
break;
|
|
2443
2493
|
}
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
port,
|
|
2448
|
-
fetch: handler
|
|
2449
|
-
});
|
|
2494
|
+
if (await tryListen(server, deps.config.host, port)) {
|
|
2495
|
+
boundPort = port;
|
|
2496
|
+
bound = true;
|
|
2450
2497
|
break;
|
|
2451
|
-
} catch (error) {
|
|
2452
|
-
lastError = error;
|
|
2453
|
-
if (!isAddressInUse(error)) {
|
|
2454
|
-
throw error;
|
|
2455
|
-
}
|
|
2456
2498
|
}
|
|
2457
2499
|
}
|
|
2458
|
-
if (
|
|
2459
|
-
throw
|
|
2500
|
+
if (!bound) {
|
|
2501
|
+
throw new Error("dashboard: no available port");
|
|
2460
2502
|
}
|
|
2461
|
-
const boundPort = server.port ?? deps.config.port;
|
|
2462
2503
|
const url = `http://${deps.config.host}:${boundPort}`;
|
|
2463
2504
|
log(`[openteam] dashboard en ${url}`);
|
|
2464
2505
|
const notify = async () => {
|
|
2465
2506
|
if (clients.size === 0) {
|
|
2466
2507
|
return;
|
|
2467
2508
|
}
|
|
2468
|
-
const message =
|
|
2469
|
-
for (const
|
|
2470
|
-
|
|
2471
|
-
controller.enqueue(message);
|
|
2472
|
-
} catch {
|
|
2473
|
-
clients.delete(controller);
|
|
2474
|
-
}
|
|
2509
|
+
const message = sseMessage(await stateJson(deps));
|
|
2510
|
+
for (const response of clients) {
|
|
2511
|
+
response.write(message);
|
|
2475
2512
|
}
|
|
2476
2513
|
};
|
|
2477
2514
|
const close = () => {
|
|
2478
|
-
for (const
|
|
2479
|
-
|
|
2480
|
-
controller.close();
|
|
2481
|
-
} catch {}
|
|
2515
|
+
for (const response of clients) {
|
|
2516
|
+
response.end();
|
|
2482
2517
|
}
|
|
2483
2518
|
clients.clear();
|
|
2484
|
-
server.
|
|
2519
|
+
server.close();
|
|
2520
|
+
server.closeAllConnections?.();
|
|
2485
2521
|
};
|
|
2486
2522
|
return { url, port: boundPort, notify, close };
|
|
2487
2523
|
}
|
|
@@ -2558,6 +2594,9 @@ function watchSources(paths, onChange, deps, debounceMs = 250) {
|
|
|
2558
2594
|
|
|
2559
2595
|
// src/web/start.ts
|
|
2560
2596
|
function startDashboard(deps) {
|
|
2597
|
+
return createDashboardRuntime(deps);
|
|
2598
|
+
}
|
|
2599
|
+
async function createDashboardRuntime(deps) {
|
|
2561
2600
|
const backlogPath = deps.backlogPath ?? DEFAULT_BACKLOG_PATH;
|
|
2562
2601
|
const activity = createActivityBuffer(deps.config.recentRoutes);
|
|
2563
2602
|
const readSnapshot = createSnapshotReader({
|
|
@@ -2575,7 +2614,7 @@ function startDashboard(deps) {
|
|
|
2575
2614
|
...deps.session !== undefined ? { session: deps.session } : {}
|
|
2576
2615
|
});
|
|
2577
2616
|
const createServer = deps.serve ?? createDashboardServer;
|
|
2578
|
-
const server = createServer({
|
|
2617
|
+
const server = await createServer({
|
|
2579
2618
|
readSnapshot,
|
|
2580
2619
|
config: deps.config,
|
|
2581
2620
|
...deps.log !== undefined ? { log: deps.log } : {}
|
|
@@ -2657,23 +2696,6 @@ async function readTextOptional(path) {
|
|
|
2657
2696
|
throw error;
|
|
2658
2697
|
}
|
|
2659
2698
|
}
|
|
2660
|
-
function createGitLastCommit(exec) {
|
|
2661
|
-
return async () => {
|
|
2662
|
-
const output = await exec("git", [
|
|
2663
|
-
"log",
|
|
2664
|
-
"-1",
|
|
2665
|
-
"--pretty=format:%h%x1f%s%x1f%cI"
|
|
2666
|
-
]);
|
|
2667
|
-
if (output.exitCode !== 0) {
|
|
2668
|
-
return;
|
|
2669
|
-
}
|
|
2670
|
-
const [hash, subject, at] = output.stdout.trim().split("\x1F");
|
|
2671
|
-
if (hash === undefined || subject === undefined || at === undefined) {
|
|
2672
|
-
return;
|
|
2673
|
-
}
|
|
2674
|
-
return { hash, subject, at };
|
|
2675
|
-
};
|
|
2676
|
-
}
|
|
2677
2699
|
var DASHBOARD_EVENT_SUMMARIES = {
|
|
2678
2700
|
"session.created": "Sesión creada",
|
|
2679
2701
|
"session.idle": "Sesión en reposo",
|
|
@@ -2764,7 +2786,7 @@ var server = async (ctx, rawOptions) => {
|
|
|
2764
2786
|
let dashboard;
|
|
2765
2787
|
if (config.dashboard.enabled) {
|
|
2766
2788
|
try {
|
|
2767
|
-
dashboard = startDashboard({
|
|
2789
|
+
dashboard = await startDashboard({
|
|
2768
2790
|
config: config.dashboard,
|
|
2769
2791
|
telemetryPath,
|
|
2770
2792
|
agentDir: dirname2(ORCHESTRATOR_AGENT_PATH),
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CommitView } from "../dashboard/types";
|
|
2
|
+
import type { ExecLike } from "../local/foundry-local";
|
|
3
|
+
/**
|
|
4
|
+
* Lee el último commit (`git log -1`) usando el `exec` inyectado y lo devuelve
|
|
5
|
+
* como `CommitView`. Devuelve `undefined` si git falla o la salida es inválida.
|
|
6
|
+
* El separador `\u001f` (Unit Separator) evita colisiones con el asunto.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createGitLastCommit(exec: ExecLike): () => Promise<CommitView | undefined>;
|
|
9
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/web/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,GACb,MAAM,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAgBvC"}
|