@jmanuelcorral/openteam 0.1.15 → 0.1.17

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 CHANGED
@@ -365,6 +365,7 @@ openteam baseline show
365
365
  openteam baseline set openai/gpt-5-mini
366
366
  openteam doctor --config .opencode/openteam.json
367
367
  openteam agents
368
+ openteam dashboard
368
369
  openteam report --telemetry .opencode/openteam-telemetry.jsonl
369
370
  openteam yolo status
370
371
  openteam yolo on
@@ -414,6 +415,40 @@ También puedes activarlo durante `openteam init` (te lo pregunta), o al vuelo c
414
415
 
415
416
  Segundo modo de operación: un **bucle externo** que invoca `opencode run` contra un backlog persistente hasta vaciarlo, con contexto fresco por iteración y topes de seguridad (presupuesto, máx. iteraciones, sin-progreso). Complementa al orquestador interactivo, no lo sustituye. Consulta el diseño y los ejemplos en **[docs/loop.md](docs/loop.md)**.
416
417
 
418
+ ### Dashboard web (mientras la sesión está viva)
419
+
420
+ openteam puede exponer un **panel web local** que se sirve **dentro del proceso de opencode** (hook `server()`), mientras la sesión está abierta. Muestra en vivo: ruteo reciente (coste/ahorro y modelo elegido, **solo hashes de prompt, nunca el texto**), progreso del backlog del loop, el equipo de agentes (LLM local/frontier de cada uno), últimos commits y actividad. Se actualiza por **SSE** (con *polling* de respaldo).
421
+
422
+ Actívalo en `.opencode/openteam.json`:
423
+
424
+ ```json
425
+ {
426
+ "dashboard": {
427
+ "enabled": true,
428
+ "host": "127.0.0.1",
429
+ "port": 4599,
430
+ "autoPortFallback": true,
431
+ "refreshMs": 2000,
432
+ "recentRoutes": 50,
433
+ "openBrowser": false
434
+ }
435
+ }
436
+ ```
437
+
438
+ Recarga opencode. Al arrancar, el plugin registra la URL en el log:
439
+
440
+ ```text
441
+ [openteam] dashboard en http://127.0.0.1:4599
442
+ ```
443
+
444
+ Ábrela en el navegador. Para consultar el estado (URL, puerto, si está activo) desde la CLI o desde dentro de opencode:
445
+
446
+ ```powershell
447
+ openteam dashboard
448
+ ```
449
+
450
+ > **Seguridad**: el servidor escucha **solo en loopback** (`127.0.0.1`/`localhost`, validado por Zod) y **nunca expone prompts** (solo `promptHash`). Se cierra al terminar la sesión de opencode. Si el puerto está ocupado y `autoPortFallback` es `true`, prueba el siguiente libre.
451
+
417
452
 
418
453
 
419
454
  ### Ollama
package/dist/cli.js CHANGED
@@ -956,6 +956,24 @@ var PrivacyModeSchema = z2.enum([
956
956
  "off"
957
957
  ]);
958
958
  var BaselineModeSchema = z2.enum(["auto", "pinned"]);
959
+ var DashboardHostSchema = z2.enum(["127.0.0.1", "localhost"]);
960
+ var DashboardConfigSchema = z2.object({
961
+ enabled: z2.boolean().default(false),
962
+ host: DashboardHostSchema.default("127.0.0.1"),
963
+ port: z2.number().int().min(1024).max(65535).default(4599),
964
+ autoPortFallback: z2.boolean().default(true),
965
+ refreshMs: z2.number().int().min(250).default(2000),
966
+ recentRoutes: z2.number().int().positive().default(50),
967
+ openBrowser: z2.boolean().default(false)
968
+ }).default({
969
+ enabled: false,
970
+ host: "127.0.0.1",
971
+ port: 4599,
972
+ autoPortFallback: true,
973
+ refreshMs: 2000,
974
+ recentRoutes: 50,
975
+ openBrowser: false
976
+ });
959
977
  var defaultLocalModel = {
960
978
  providerID: "ollama",
961
979
  modelID: "qwen3:8b"
@@ -1017,7 +1035,8 @@ var OpenTeamConfigSchema = z2.object({
1017
1035
  frontierTokensPerSession: z2.number().int().positive().optional(),
1018
1036
  hardStopOnBudgetExhaustion: z2.boolean().default(false)
1019
1037
  }).default({ hardStopOnBudgetExhaustion: false }),
1020
- privacyMode: PrivacyModeSchema.default("forceLocalOnSensitive")
1038
+ privacyMode: PrivacyModeSchema.default("forceLocalOnSensitive"),
1039
+ dashboard: DashboardConfigSchema
1021
1040
  });
1022
1041
 
1023
1042
  // src/commands/baseline.ts
@@ -1081,6 +1100,32 @@ function autoBaseline(config) {
1081
1100
  };
1082
1101
  }
1083
1102
 
1103
+ // src/commands/dashboard.ts
1104
+ function renderDashboardStatus(dashboard) {
1105
+ const url = `http://${dashboard.host}:${dashboard.port}`;
1106
+ if (!dashboard.enabled) {
1107
+ return [
1108
+ "Dashboard: deshabilitado.",
1109
+ "",
1110
+ 'Para activarlo, pon "dashboard": { "enabled": true } en .opencode/openteam.json',
1111
+ "y recarga opencode. Se servirá (loopback) en:",
1112
+ ` ${url}`
1113
+ ].join(`
1114
+ `);
1115
+ }
1116
+ return [
1117
+ "Dashboard: habilitado.",
1118
+ ` URL: ${url}`,
1119
+ ` Refresco: ${dashboard.refreshMs} ms (SSE + polling)`,
1120
+ ` Rutas: últimas ${dashboard.recentRoutes}`,
1121
+ dashboard.autoPortFallback ? " Puerto: con fallback automático si está ocupado" : " Puerto: fijo (sin fallback)",
1122
+ "",
1123
+ "Nota: solo escucha en loopback y nunca expone prompts (solo hashes).",
1124
+ "El servidor corre dentro de la sesión de opencode; se cierra al salir."
1125
+ ].join(`
1126
+ `);
1127
+ }
1128
+
1084
1129
  // src/commands/doctor.ts
1085
1130
  function runtimeLine(snapshot) {
1086
1131
  const mark = snapshot.reachable ? "✓" : "✗";
@@ -1415,6 +1460,7 @@ var HELP = [
1415
1460
  " openteam baseline auto Baseline cheapest-capable (modo auto)",
1416
1461
  " openteam doctor Diagnóstico de runtimes y config",
1417
1462
  " openteam agents Lista los agentes y el LLM (local/frontier) de cada uno",
1463
+ " openteam dashboard Estado y URL del dashboard web (loopback)",
1418
1464
  " openteam report Resumen de coste/ahorro (telemetría)",
1419
1465
  " openteam yolo status Muestra si el modo YOLO está activo",
1420
1466
  " openteam yolo on Activa YOLO (opencode auto-aprueba todo)",
@@ -1604,6 +1650,10 @@ async function runCli(argv, deps) {
1604
1650
  if (command === "agents") {
1605
1651
  return await runAgents(deps, configPath, opencodeConfigPath);
1606
1652
  }
1653
+ if (command === "dashboard") {
1654
+ const config = await deps.loadConfig(configPath);
1655
+ return { exitCode: 0, stdout: renderDashboardStatus(config.dashboard) };
1656
+ }
1607
1657
  if (command === undefined || command === "help" || command === "--help") {
1608
1658
  return { exitCode: 0, stdout: HELP };
1609
1659
  }
@@ -0,0 +1,9 @@
1
+ import type { DashboardConfig } from "../config/schema";
2
+ /**
3
+ * `openteam dashboard`: informa del estado del dashboard web (habilitado o no)
4
+ * y la URL en la que se sirve mientras la sesión de opencode está activa. El
5
+ * servidor vive dentro del proceso del plugin (`server()`), no en la CLI, así
6
+ * que este comando es de solo lectura: reporta config y cómo activarlo.
7
+ */
8
+ export declare function renderDashboardStatus(dashboard: DashboardConfig): string;
9
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +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 +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;AAYlB,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;AAuNF,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,SAAS,CAAC,CA0DpB"}
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"}
@@ -17,6 +17,22 @@ export declare const BaselineModeSchema: z.ZodEnum<{
17
17
  auto: "auto";
18
18
  pinned: "pinned";
19
19
  }>;
20
+ export declare const DashboardHostSchema: z.ZodEnum<{
21
+ "127.0.0.1": "127.0.0.1";
22
+ localhost: "localhost";
23
+ }>;
24
+ export declare const DashboardConfigSchema: z.ZodDefault<z.ZodObject<{
25
+ enabled: z.ZodDefault<z.ZodBoolean>;
26
+ host: z.ZodDefault<z.ZodEnum<{
27
+ "127.0.0.1": "127.0.0.1";
28
+ localhost: "localhost";
29
+ }>>;
30
+ port: z.ZodDefault<z.ZodNumber>;
31
+ autoPortFallback: z.ZodDefault<z.ZodBoolean>;
32
+ refreshMs: z.ZodDefault<z.ZodNumber>;
33
+ recentRoutes: z.ZodDefault<z.ZodNumber>;
34
+ openBrowser: z.ZodDefault<z.ZodBoolean>;
35
+ }, z.core.$strip>>;
20
36
  export declare const LocalRuntimeSchema: z.ZodObject<{
21
37
  id: z.ZodEnum<{
22
38
  ollama: "ollama";
@@ -94,10 +110,23 @@ export declare const OpenTeamConfigSchema: z.ZodObject<{
94
110
  consentBeforeFrontier: "consentBeforeFrontier";
95
111
  off: "off";
96
112
  }>>;
113
+ dashboard: z.ZodDefault<z.ZodObject<{
114
+ enabled: z.ZodDefault<z.ZodBoolean>;
115
+ host: z.ZodDefault<z.ZodEnum<{
116
+ "127.0.0.1": "127.0.0.1";
117
+ localhost: "localhost";
118
+ }>>;
119
+ port: z.ZodDefault<z.ZodNumber>;
120
+ autoPortFallback: z.ZodDefault<z.ZodBoolean>;
121
+ refreshMs: z.ZodDefault<z.ZodNumber>;
122
+ recentRoutes: z.ZodDefault<z.ZodNumber>;
123
+ openBrowser: z.ZodDefault<z.ZodBoolean>;
124
+ }, z.core.$strip>>;
97
125
  }, z.core.$strip>;
98
126
  export type ModelRef = z.infer<typeof ModelRefSchema>;
99
127
  export type RouterMode = z.infer<typeof RouterModeSchema>;
100
128
  export type PrivacyMode = z.infer<typeof PrivacyModeSchema>;
101
129
  export type OpenTeamConfig = z.infer<typeof OpenTeamConfigSchema>;
102
130
  export type LocalRuntime = z.infer<typeof LocalRuntimeSchema>;
131
+ export type DashboardConfig = z.infer<typeof DashboardConfigSchema>;
103
132
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;EAA6C,CAAC;AAC3E,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAC;AACH,eAAO,MAAM,kBAAkB;;;EAA6B,CAAC;AAW7D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA0D/B,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;iBAGzB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;EAA6C,CAAC;AAC3E,eAAO,MAAM,iBAAiB;;;;EAI5B,CAAC;AACH,eAAO,MAAM,kBAAkB;;;EAA6B,CAAC;AAE7D,eAAO,MAAM,mBAAmB;;;EAAqC,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;kBAkB9B,CAAC;AAWL,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2D/B,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { BacklogItem, LoopSnapshot } from "./types";
2
+ /** Extrae los ítems de checklist de un backlog Markdown. Pure. */
3
+ export declare function parseBacklog(text: string): BacklogItem[];
4
+ /**
5
+ * Construye el snapshot del loop a partir de los ítems parseados. `progressPct`
6
+ * es determinista: 100 si no hay ítems. Pure.
7
+ */
8
+ export declare function buildLoopSnapshot(backlogPath: string, items: readonly BacklogItem[]): LoopSnapshot;
9
+ //# sourceMappingURL=backlog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../src/dashboard/backlog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAwBzD,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAmBxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,WAAW,EAAE,GAC5B,YAAY,CAcd"}
@@ -0,0 +1,14 @@
1
+ import type { DashboardState } from "./types";
2
+ /** Escapa texto para HTML. Evita fuga de markup y roturas de `</script>`. Pure. */
3
+ export declare function escapeHtml(value: string): string;
4
+ export type RenderOptions = {
5
+ /** Fallback de polling en ms (default 2000). */
6
+ refreshMs?: number;
7
+ };
8
+ /**
9
+ * Renderiza el dashboard como un único HTML autocontenido (CSS + JS inline, sin
10
+ * CDNs). Escapa todo texto de usuario y **nunca** incluye prompts en claro.
11
+ * Determinista. Pure.
12
+ */
13
+ export declare function renderDashboardHtml(state: DashboardState, options?: RenderOptions): string;
14
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/dashboard/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,SAAS,CAAC;AASjB,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAiND,MAAM,MAAM,aAAa,GAAG;IAC1B,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAmCR"}
@@ -0,0 +1,33 @@
1
+ import type { AgentInfo } from "../commands/agents";
2
+ import type { CostRecord } from "../telemetry/types";
3
+ import type { ActivityEntry, BacklogItem, CommitView, DashboardState } from "./types";
4
+ export declare const DEFAULT_RECENT_ROUTES = 50;
5
+ export declare const DEFAULT_ACTIVITY_LIMIT = 100;
6
+ /** Fuentes crudas ya leídas por el driver. `buildDashboardState` las compone. */
7
+ export type DashboardInputs = {
8
+ /** ISO-8601 inyectado por el driver. */
9
+ generatedAt: string;
10
+ session?: {
11
+ id?: string;
12
+ startedAt?: string;
13
+ };
14
+ costRecords: readonly CostRecord[];
15
+ /** `undefined` si no hay backlog en disco. */
16
+ backlog?: {
17
+ path: string;
18
+ items: readonly BacklogItem[];
19
+ lastCommit?: CommitView;
20
+ };
21
+ team: readonly AgentInfo[];
22
+ activity: readonly ActivityEntry[];
23
+ /** Tope de `recentRoutes` (def 50). */
24
+ recentRoutesLimit?: number;
25
+ /** Tope de `activity` (def 100). */
26
+ activityLimit?: number;
27
+ };
28
+ /**
29
+ * Compone el snapshot del dashboard a partir de las fuentes crudas. Determinista:
30
+ * el orden de `recentRoutes`/`activity` no depende del orden de entrada. Pure.
31
+ */
32
+ export declare function buildDashboardState(inputs: DashboardInputs): DashboardState;
33
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/dashboard/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,cAAc,EAGf,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,iFAAiF;AACjF,MAAM,MAAM,eAAe,GAAG;IAC5B,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE;QACR,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IACnC,8CAA8C;IAC9C,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;QAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;KACzB,CAAC;IACF,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3B,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,uCAAuC;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA8CF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,eAAe,GAAG,cAAc,CA0B3E"}
@@ -0,0 +1,71 @@
1
+ import type { ComplexityTier } from "../capabilities/types";
2
+ import type { AgentInfo } from "../commands/agents";
3
+ import type { CostReport } from "../commands/report";
4
+ /**
5
+ * Snapshot inmutable del estado del dashboard. Producido por `buildDashboardState`
6
+ * (puro) y servido en `/api/state`. Reutiliza tipos ya existentes (`CostReport`,
7
+ * `AgentInfo`). Nunca contiene texto de prompt en claro: solo `promptHash`.
8
+ */
9
+ export type DashboardState = {
10
+ /** ISO-8601. Lo inyecta el driver (no el core determinista). */
11
+ generatedAt: string;
12
+ session: {
13
+ id?: string;
14
+ startedAt?: string;
15
+ };
16
+ /** Routing / coste — reutiliza `summarizeCostRecords()`. */
17
+ cost: CostReport;
18
+ /** Últimas decisiones de routing (redactadas: solo `promptHash`). */
19
+ recentRoutes: RouteView[];
20
+ /** Progreso del loop. `undefined` si no hay backlog. */
21
+ loop?: LoopSnapshot;
22
+ /** Equipo — reutiliza el frontmatter de los agentes. */
23
+ team: AgentInfo[];
24
+ /** Actividad reciente (scribe + eventos opencode), más nueva primero. */
25
+ activity: ActivityEntry[];
26
+ };
27
+ export type RouteView = {
28
+ ts: number;
29
+ tier: ComplexityTier;
30
+ routeKind: "local" | "frontier";
31
+ /** "providerID/modelID". */
32
+ model: string;
33
+ /** NUNCA el prompt. */
34
+ promptHash: string;
35
+ estimatedCostUSD: number;
36
+ estimatedSavingsUSD: number;
37
+ budgetAction: string;
38
+ };
39
+ export type LoopSnapshot = {
40
+ backlogPath: string;
41
+ total: number;
42
+ done: number;
43
+ open: number;
44
+ /** 0..100, derivado de forma determinista. */
45
+ progressPct: number;
46
+ items: BacklogItem[];
47
+ /** Lo aporta el driver (git), opcional. */
48
+ lastCommit?: CommitView;
49
+ };
50
+ export type BacklogItem = {
51
+ text: string;
52
+ done: boolean;
53
+ /** Del prefijo `[@Nombre]` del casting. */
54
+ assignee?: string;
55
+ };
56
+ export type CommitView = {
57
+ /** short sha. */
58
+ hash: string;
59
+ subject: string;
60
+ /** ISO-8601. */
61
+ at: string;
62
+ };
63
+ export type ActivityEntry = {
64
+ ts: number;
65
+ kind: "route" | "agent" | "decision" | "commit";
66
+ /** Nombre del agente si aplica. */
67
+ agent?: string;
68
+ /** Texto ya redactado. */
69
+ summary: string;
70
+ };
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/dashboard/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE;QACP,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,4DAA4D;IAC5D,IAAI,EAAE,UAAU,CAAC;IACjB,qEAAqE;IACrE,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,wDAAwD;IACxD,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,yEAAyE;IACzE,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,OAAO,GAAG,UAAU,CAAC;IAChC,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChD,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { appendFile, mkdir } from "node:fs/promises";
2
2
  import type { Plugin, PluginModule } from "@opencode-ai/plugin";
3
3
  import type { CliDeps } from "./commands/dispatch";
4
4
  import type { OpenTeamConfig } from "./config/schema";
5
+ import type { ActivityEntry } from "./dashboard/types";
5
6
  import { RuntimeRegistry } from "./local/registry";
6
7
  type FileAppenderDeps = {
7
8
  mkdir?: typeof mkdir;
@@ -11,6 +12,14 @@ export declare function logAvailabilityRefreshError(error: unknown): void;
11
12
  export declare function logTelemetryError(error: unknown): void;
12
13
  export declare function createFileAppender(filePath: string, deps?: FileAppenderDeps): (line: string) => Promise<void>;
13
14
  export declare function isMissingFile(error: unknown): boolean;
15
+ /**
16
+ * Mapea un evento de opencode a una entrada de actividad **redactada** (solo el
17
+ * tipo de evento, nunca contenido de prompt). Devuelve `undefined` para eventos
18
+ * fuera de la allow-list.
19
+ */
20
+ export declare function activityFromEvent(event: {
21
+ type: string;
22
+ }, now: () => number): ActivityEntry | undefined;
14
23
  export declare function createCliDeps(config: OpenTeamConfig, registry: RuntimeRegistry, telemetryPath: string): CliDeps;
15
24
  export declare const server: Plugin;
16
25
  declare const plugin: PluginModule;
@@ -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;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAgBnD,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;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,MAAM,GACpB,OAAO,CA4DT;AAED,eAAO,MAAM,MAAM,EAAE,MA8BpB,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,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"}