@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 +35 -0
- package/dist/cli.js +51 -1
- package/dist/commands/dashboard.d.ts +9 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/config/schema.d.ts +29 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/dashboard/backlog.d.ts +9 -0
- package/dist/dashboard/backlog.d.ts.map +1 -0
- package/dist/dashboard/render.d.ts +14 -0
- package/dist/dashboard/render.d.ts.map +1 -0
- package/dist/dashboard/state.d.ts +33 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/types.d.ts +71 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +703 -4
- package/dist/plugin/commandTool.d.ts +1 -1
- package/dist/plugin/commandTool.d.ts.map +1 -1
- package/dist/web/activity.d.ts +12 -0
- package/dist/web/activity.d.ts.map +1 -0
- package/dist/web/paths.d.ts +4 -0
- package/dist/web/paths.d.ts.map +1 -0
- package/dist/web/server.d.ts +26 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/snapshot.d.ts +34 -0
- package/dist/web/snapshot.d.ts.map +1 -0
- package/dist/web/start.d.ts +36 -0
- package/dist/web/start.d.ts.map +1 -0
- package/dist/web/watch.d.ts +19 -0
- package/dist/web/watch.d.ts.map +1 -0
- package/package.json +1 -1
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;
|
|
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"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
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;
|
|
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"}
|