@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.
@@ -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,CAwBxE"}
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;AAwNF,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CA+DpB"}
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 "./init";
1
+ import type { FrontierChoice } from "./setup";
2
2
  /**
3
- * Ruta relativa (al cwd) del agente primario que `openteam init` genera. El
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,QAAQ,CAAC;AAE7C;;;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"}
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 init` conoce y ofrece. El orden define el
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 InitAnswers = {
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: InitAnswers): OpenTeamConfig;
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: InitAnswers): OpencodeConfig;
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 InitDeps = {
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 runInit(deps: InitDeps): Promise<CliResult>;
135
- //# sourceMappingURL=init.d.ts.map
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 init`
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`.
@@ -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,EAAc,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAkBnD,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;AAuCD;;;;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"}
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/commands/init.ts
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 init' o pide al orquestador que cree el equipo.");
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 } en .opencode/openteam.json',
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 init Configura opencode + openteam (interactivo)",
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 init' primero.`
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 createDashboardServer(deps) {
2398
- const serve = deps.serve ?? Bun.serve;
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 handler = async (request) => {
2403
- const url2 = new URL(request.url);
2449
+ const handle = async (request, response) => {
2404
2450
  if (request.method !== "GET") {
2405
- return new Response("method not allowed", { status: 405 });
2451
+ response.writeHead(405).end("method not allowed");
2452
+ return;
2406
2453
  }
2407
- if (url2.pathname === "/" || url2.pathname === "/index.html") {
2408
- return new Response(await renderState(deps), { headers: HTML_HEADERS });
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 (url2.pathname === "/api/state") {
2411
- return new Response(await stateJson(deps), { headers: JSON_HEADERS });
2460
+ if (path === "/api/state") {
2461
+ response.writeHead(200, JSON_HEADERS).end(await stateJson(deps));
2462
+ return;
2412
2463
  }
2413
- if (url2.pathname === "/healthz") {
2414
- return new Response(JSON.stringify({ ok: true }), {
2415
- headers: JSON_HEADERS
2416
- });
2464
+ if (path === "/healthz") {
2465
+ response.writeHead(200, JSON_HEADERS).end(JSON.stringify({ ok: true }));
2466
+ return;
2417
2467
  }
2418
- if (url2.pathname === "/favicon.ico") {
2419
- return new Response(null, { status: 204 });
2420
- }
2421
- if (url2.pathname === "/events") {
2422
- const initial = await stateJson(deps);
2423
- const stream = new ReadableStream({
2424
- start(controller) {
2425
- controller.enqueue(encoder.encode(sseMessage(initial)));
2426
- clients.add(controller);
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 new Response(stream, { headers: SSE_HEADERS });
2479
+ return;
2433
2480
  }
2434
- return new Response("not found", { status: 404 });
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 server;
2438
- let lastError;
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
- try {
2445
- server = serve({
2446
- hostname: deps.config.host,
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 (server === undefined) {
2459
- throw lastError ?? new Error("dashboard: no available port");
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 = encoder.encode(sseMessage(await stateJson(deps)));
2469
- for (const controller of clients) {
2470
- try {
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 controller of clients) {
2479
- try {
2480
- controller.close();
2481
- } catch {}
2515
+ for (const response of clients) {
2516
+ response.end();
2482
2517
  }
2483
2518
  clients.clear();
2484
- server.stop(true);
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"}