@jmanuelcorral/openteam 0.1.21 → 0.1.22

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.
Files changed (40) hide show
  1. package/README.md +29 -31
  2. package/dist/cli/dashboardServe.d.ts +15 -8
  3. package/dist/cli/dashboardServe.d.ts.map +1 -1
  4. package/dist/cli.js +889 -276
  5. package/dist/commands/dashboard.d.ts +4 -4
  6. package/dist/commands/dashboard.d.ts.map +1 -1
  7. package/dist/commands/orchestratorAgent.d.ts.map +1 -1
  8. package/dist/contract/opencode.d.ts +1 -1
  9. package/dist/contract/opencode.d.ts.map +1 -1
  10. package/dist/dashboard/render.d.ts.map +1 -1
  11. package/dist/dashboard/state.d.ts +14 -6
  12. package/dist/dashboard/state.d.ts.map +1 -1
  13. package/dist/dashboard/types.d.ts +14 -3
  14. package/dist/dashboard/types.d.ts.map +1 -1
  15. package/dist/index.d.ts +8 -9
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +476 -802
  18. package/dist/orchestrator/coordinator.d.ts +14 -2
  19. package/dist/orchestrator/coordinator.d.ts.map +1 -1
  20. package/dist/plugin/capture.d.ts +46 -0
  21. package/dist/plugin/capture.d.ts.map +1 -0
  22. package/dist/plugin/hooks.d.ts +2 -2
  23. package/dist/plugin/hooks.d.ts.map +1 -1
  24. package/dist/plugin/toolcalls.d.ts +21 -0
  25. package/dist/plugin/toolcalls.d.ts.map +1 -0
  26. package/dist/telemetry/aggregate.d.ts +89 -0
  27. package/dist/telemetry/aggregate.d.ts.map +1 -0
  28. package/dist/telemetry/decisions.d.ts +25 -0
  29. package/dist/telemetry/decisions.d.ts.map +1 -0
  30. package/dist/telemetry/eventLog.d.ts +63 -0
  31. package/dist/telemetry/eventLog.d.ts.map +1 -0
  32. package/dist/telemetry/events.d.ts +217 -0
  33. package/dist/telemetry/events.d.ts.map +1 -0
  34. package/dist/web/snapshot.d.ts +13 -7
  35. package/dist/web/snapshot.d.ts.map +1 -1
  36. package/dist/web/start.d.ts +10 -7
  37. package/dist/web/start.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/dist/web/activity.d.ts +0 -12
  40. package/dist/web/activity.d.ts.map +0 -1
@@ -2,7 +2,8 @@ import type { BudgetState } from "../capabilities/budget";
2
2
  import type { ModelCapabilityProfile } from "../capabilities/types";
3
3
  import type { OpenTeamConfig } from "../config/schema";
4
4
  import type { AvailableModel, RoutingDecision, TaskSignals } from "../router/types";
5
- import type { TelemetrySink } from "../telemetry/sink";
5
+ import { type EventSink } from "../telemetry/eventLog";
6
+ import { type MeetingEvent, type RouteEvent } from "../telemetry/events";
6
7
  import type { CostRecord } from "../telemetry/types";
7
8
  import { type OpencodeSessionClient, type SubsessionResult } from "./subsessions";
8
9
  export type RoleTaskInput = {
@@ -20,7 +21,7 @@ export type RoleTaskInput = {
20
21
  };
21
22
  export type CoordinatorDeps = {
22
23
  client: OpencodeSessionClient;
23
- sink: TelemetrySink;
24
+ sink: EventSink;
24
25
  now: () => number;
25
26
  newDecisionID: () => string;
26
27
  timeoutMs?: number;
@@ -38,6 +39,17 @@ export type RoleTaskResult = {
38
39
  subsession: SubsessionResult;
39
40
  record: CorrelatedCostRecord;
40
41
  };
42
+ /**
43
+ * Mapea un `CorrelatedCostRecord` a un `route` event preservando la correlación
44
+ * (decisionID/agent/success/batchID/failureReason/failureStage) que el sink de
45
+ * `CostRecord` legacy descartaba. Puro.
46
+ */
47
+ export declare function correlatedCostRecordToRouteEvent(record: CorrelatedCostRecord): RouteEvent;
48
+ /**
49
+ * Construye el `meeting` event de un batch multi-agente. Devuelve `undefined` si
50
+ * ninguna tarea del batch tiene una sesión padre a la que atribuir la reunión.
51
+ */
52
+ export declare function buildMeetingEvent(inputs: readonly RoleTaskInput[], batchID: string, decisionIDs: readonly string[], ts: number): MeetingEvent | undefined;
41
53
  export declare function runRoleTask(input: RoleTaskInput, deps: CoordinatorDeps): Promise<RoleTaskResult>;
42
54
  export declare function runRoleTasks(inputs: readonly RoleTaskInput[], deps: CoordinatorDeps): Promise<RoleTaskResult[]>;
43
55
  //# sourceMappingURL=coordinator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQrD,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AA0OF,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAW3B"}
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../src/orchestrator/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEf,WAAW,EACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAEL,KAAK,YAAY,EAEjB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQrD,OAAO,EACL,KAAK,qBAAqB,EAG1B,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpC,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AA6KF;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,oBAAoB,GAC3B,UAAU,CAqBZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,EAAE,EAAE,MAAM,GACT,YAAY,GAAG,SAAS,CAkB1B;AA4DD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,cAAc,EAAE,CAAC,CAuB3B"}
@@ -0,0 +1,46 @@
1
+ import { type ActivityEvent, type MessageEvent } from "../telemetry/events";
2
+ /**
3
+ * Mapeo **puro** de eventos de opencode a `OpenTeamEvent` redactados. Sin I/O,
4
+ * red, reloj (se inyecta `now`), random ni env vars.
5
+ */
6
+ /** Forma estructural mínima de un `AssistantMessage` de opencode. */
7
+ export type AssistantInfoLike = {
8
+ role?: string;
9
+ sessionID?: string;
10
+ providerID?: string;
11
+ modelID?: string;
12
+ mode?: string;
13
+ id?: string;
14
+ cost?: number;
15
+ time?: {
16
+ created?: number;
17
+ completed?: number;
18
+ };
19
+ tokens?: {
20
+ input?: number;
21
+ output?: number;
22
+ reasoning?: number;
23
+ cache?: {
24
+ read?: number;
25
+ write?: number;
26
+ };
27
+ };
28
+ };
29
+ /**
30
+ * Construye un `message` event a partir de un mensaje de asistente **completado**
31
+ * (coste y tokens reales). Devuelve `undefined` si el mensaje no es de asistente,
32
+ * no ha terminado, o le falta sesión/modelo.
33
+ */
34
+ export declare function messageEventFrom(info: AssistantInfoLike, now: () => number): MessageEvent | undefined;
35
+ type OpencodeEventLike = {
36
+ type: string;
37
+ properties?: unknown;
38
+ };
39
+ /**
40
+ * Construye un `activity` event redactado (solo el tipo de evento, nunca
41
+ * contenido) a partir de un evento de ciclo de vida de sesión. Devuelve
42
+ * `undefined` fuera de la allow-list o si falta `sessionID`.
43
+ */
44
+ export declare function activityEventFrom(event: OpencodeEventLike, now: () => number): ActivityEvent | undefined;
45
+ export {};
46
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/plugin/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AAEH,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,MAAM,CAAC,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC;CACH,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,MAAM,MAAM,GAChB,YAAY,GAAG,SAAS,CA0C1B;AAQD,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAoBF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,MAAM,MAAM,GAChB,aAAa,GAAG,SAAS,CAiB3B"}
@@ -1,11 +1,11 @@
1
1
  import type { Hooks } from "@opencode-ai/plugin";
2
2
  import type { OpenTeamConfig } from "../config/schema";
3
3
  import type { TaskSignals } from "../router/types";
4
- import { type TelemetrySink } from "../telemetry/sink";
4
+ import { type EventSink } from "../telemetry/eventLog";
5
5
  import type { AvailabilityProvider } from "./availability";
6
6
  export type ChatMessageHook = NonNullable<Hooks["chat.message"]>;
7
7
  export type ChatMessageHookOptions = {
8
- sink?: TelemetrySink;
8
+ sink?: EventSink;
9
9
  now?: () => number;
10
10
  };
11
11
  export declare function deriveTaskSignals(input: Parameters<ChatMessageHook>[0], output: Parameters<ChatMessageHook>[1]): TaskSignals;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/plugin/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AA8CF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACrC,MAAM,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GACrC,WAAW,CAqBb;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CA8BjB;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,OAAO,GAAE,sBAA2B,GACnC,KAAK,CAIP"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/plugin/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAEjE,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AA8CF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACrC,MAAM,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GACrC,WAAW,CAqBb;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAiCjB;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,OAAO,GAAE,sBAA2B,GACnC,KAAK,CAIP"}
@@ -0,0 +1,21 @@
1
+ import type { EventSink } from "../telemetry/eventLog";
2
+ /**
3
+ * Rastrea `tool.execute.before` / `tool.execute.after` para medir la duración de
4
+ * cada toolcall (correlando por `sessionID` + `callID`) y emite un `toolcall`
5
+ * event **redactado** (nunca argumentos ni salida) al terminar.
6
+ */
7
+ export type ToolExecuteInput = {
8
+ tool: string;
9
+ sessionID: string;
10
+ callID: string;
11
+ };
12
+ export type ToolcallTrackerDeps = {
13
+ sink: EventSink;
14
+ now?: () => number;
15
+ };
16
+ export type ToolcallTracker = {
17
+ before: (input: ToolExecuteInput) => void;
18
+ after: (input: ToolExecuteInput) => Promise<void> | void;
19
+ };
20
+ export declare function createToolcallTracker(deps: ToolcallTrackerDeps): ToolcallTracker;
21
+ //# sourceMappingURL=toolcalls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolcalls.d.ts","sourceRoot":"","sources":["../../src/plugin/toolcalls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGvD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1D,CAAC;AAMF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,eAAe,CA6BjB"}
@@ -0,0 +1,89 @@
1
+ import type { ActivityEvent, OpenTeamEvent } from "./events";
2
+ /**
3
+ * Agregación **pura y determinista** de eventos de openteam para el dashboard.
4
+ * Reconstruye resúmenes por sesión y rollups globales sin depender del orden de
5
+ * entrada. Sin I/O, red, reloj, random ni env vars.
6
+ */
7
+ export type ToolUsage = {
8
+ count: number;
9
+ ok: number;
10
+ failed: number;
11
+ totalDurationMs: number;
12
+ };
13
+ export type ToolcallStats = ToolUsage & {
14
+ byTool: Record<string, ToolUsage>;
15
+ };
16
+ export type SessionSummary = {
17
+ sessionID: string;
18
+ firstTs: number;
19
+ lastTs: number;
20
+ routeCount: number;
21
+ localCount: number;
22
+ frontierCount: number;
23
+ estimatedCostUSD: number;
24
+ estimatedSavingsUSD: number;
25
+ realCostUSD: number;
26
+ messageCount: number;
27
+ tokensIn: number;
28
+ tokensOut: number;
29
+ tokensReasoning: number;
30
+ tokensCacheRead: number;
31
+ tokensCacheWrite: number;
32
+ toolcalls: ToolcallStats;
33
+ /** Modelos usados: "providerID/modelID", orden estable. */
34
+ models: string[];
35
+ /** Agentes vistos, orden estable. */
36
+ agents: string[];
37
+ };
38
+ export type DecisionView = {
39
+ ts: number;
40
+ sessionID: string;
41
+ agent?: string;
42
+ summary: string;
43
+ tags?: string[];
44
+ };
45
+ export type MeetingView = {
46
+ ts: number;
47
+ sessionID: string;
48
+ batchID: string;
49
+ roles: string[];
50
+ purpose?: string;
51
+ decisionIDs?: string[];
52
+ };
53
+ export type ActivityView = {
54
+ ts: number;
55
+ sessionID: string;
56
+ kind: ActivityEvent["kind"];
57
+ agent?: string;
58
+ summary: string;
59
+ };
60
+ export type EventTotals = {
61
+ sessions: number;
62
+ routeCount: number;
63
+ localCount: number;
64
+ frontierCount: number;
65
+ estimatedCostUSD: number;
66
+ estimatedSavingsUSD: number;
67
+ realCostUSD: number;
68
+ messageCount: number;
69
+ tokensIn: number;
70
+ tokensOut: number;
71
+ tokensReasoning: number;
72
+ tokensCacheRead: number;
73
+ tokensCacheWrite: number;
74
+ toolcalls: ToolcallStats;
75
+ };
76
+ export type EventsAggregate = {
77
+ sessions: SessionSummary[];
78
+ totals: EventTotals;
79
+ decisions: DecisionView[];
80
+ meetings: MeetingView[];
81
+ activity: ActivityView[];
82
+ };
83
+ /**
84
+ * Compone la agregación completa a partir de la lista de eventos (en cualquier
85
+ * orden). Sesiones ordenadas por actividad más reciente; decisiones, reuniones y
86
+ * actividad, más nuevas primero.
87
+ */
88
+ export declare function aggregateEvents(events: readonly OpenTeamEvent[]): EventsAggregate;
89
+ //# sourceMappingURL=aggregate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.d.ts","sourceRoot":"","sources":["../../src/telemetry/aggregate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type DecisionEvent } from "./events";
2
+ /**
3
+ * Parser **puro** del log de decisiones del scribe (`openteam-decisions.md`).
4
+ *
5
+ * El scribe escribe cada decisión/aprendizaje como un item de lista Markdown ya
6
+ * **redactado** (nunca prompts ni datos sensibles). Este parser lo convierte a
7
+ * `decision` events para que el dashboard los agregue junto al resto.
8
+ *
9
+ * Sin I/O, red, reloj (`now`), random ni env vars. `Date.parse` sobre una fecha
10
+ * literal es determinista.
11
+ */
12
+ /** Sesión sintética a la que se atribuyen las decisiones del log compartido. */
13
+ export declare const DECISIONS_SESSION_ID = "decisions";
14
+ export type ParseDecisionsOptions = {
15
+ /** Sesión a la que atribuir las decisiones. Por defecto `DECISIONS_SESSION_ID`. */
16
+ sessionID?: string;
17
+ /** Base de tiempo para items sin fecha (se les suma su índice). Por defecto 0. */
18
+ baseTs?: number;
19
+ };
20
+ /**
21
+ * Convierte el texto del log de decisiones en `decision` events. Ignora líneas
22
+ * que no sean items de lista y descarta items sin resumen. Nunca lanza.
23
+ */
24
+ export declare function parseDecisionsMarkdown(text: string, options?: ParseDecisionsOptions): DecisionEvent[];
25
+ //# sourceMappingURL=decisions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../src/telemetry/decisions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,UAAU,CAAC;AAEpE;;;;;;;;;GASG;AAEH,gFAAgF;AAChF,eAAO,MAAM,oBAAoB,cAAc,CAAC;AAEhD,MAAM,MAAM,qBAAqB,GAAG;IAClC,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAYF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,qBAA0B,GAClC,aAAa,EAAE,CA+DjB"}
@@ -0,0 +1,63 @@
1
+ import { type OpenTeamEvent, type RouteEvent } from "./events";
2
+ import type { CostRecord } from "./types";
3
+ /** Directorio por defecto de los logs de sesión que alimentan el dashboard. */
4
+ export declare const DEFAULT_SESSIONS_DIR = ".opencode/openteam/sessions";
5
+ /** Sesión sintética para registros del telemetry legacy sin `sessionID`. */
6
+ export declare const LEGACY_SESSION_ID = "legacy";
7
+ /** Sink que persiste eventos redactados; `emit` nunca debe lanzar. */
8
+ export type EventSink = {
9
+ emit: (event: OpenTeamEvent) => Promise<void> | void;
10
+ };
11
+ /** Sanea un `sessionID` para usarlo como nombre de fichero seguro. */
12
+ export declare function sessionFileName(sessionID: string): string;
13
+ export type EventLogSinkDeps = {
14
+ /** Directorio destino (`sessions/`). */
15
+ dir: string;
16
+ /** Añade una línea al fichero indicado (crea dir/fichero si hace falta). */
17
+ appendLine: (path: string, line: string) => Promise<void> | void;
18
+ /** Une segmentos de ruta (por defecto `node:path.join`). Inyectable en tests. */
19
+ join?: (dir: string, file: string) => string;
20
+ onError?: (error: unknown) => void;
21
+ };
22
+ /**
23
+ * Crea un sink que enruta cada evento a `<dir>/<sessionID>.jsonl`. Valida con Zod
24
+ * antes de escribir y captura cualquier error (la telemetría nunca rompe el flujo).
25
+ */
26
+ export declare function createEventLogSink(deps: EventLogSinkDeps): EventSink;
27
+ export declare function createNullEventSink(): EventSink;
28
+ /**
29
+ * Parsea JSONL de eventos, saltando líneas en blanco o inválidas (nunca lanza).
30
+ * Puro.
31
+ */
32
+ export declare function parseEventsJsonl(text: string): OpenTeamEvent[];
33
+ /** Mapea un `CostRecord` legacy a un `route` event (para no perder histórico). Puro. */
34
+ export declare function costRecordToRouteEvent(record: CostRecord): RouteEvent;
35
+ /**
36
+ * Mapea un `route` event de vuelta a un `CostRecord` para reutilizar
37
+ * `summarizeCostRecords`/vistas de routing existentes. Descarta la correlación
38
+ * (decisionID/agent/…), que no forma parte del `CostRecord`. Puro.
39
+ */
40
+ export declare function routeEventToCostRecord(event: RouteEvent): CostRecord;
41
+ /**
42
+ * Lee los `route` events de todas las sesiones (más el telemetry legacy como
43
+ * fallback) y los mapea a `CostRecord[]`. Es la fuente de `openteam report` y
44
+ * `openteam doctor` ahora que el plugin escribe eventos por sesión en vez del
45
+ * JSONL legacy de `CostRecord`.
46
+ */
47
+ export declare function readRouteCostRecords(dir: string, deps: ReadSessionEventsDeps): Promise<CostRecord[]>;
48
+ export type ReadSessionEventsDeps = {
49
+ /** Lista los ficheros del directorio; `[]` si no existe. */
50
+ listFiles: (dir: string) => Promise<string[]>;
51
+ /** Lee texto; `undefined` si el fichero no existe. */
52
+ readText: (path: string) => Promise<string | undefined>;
53
+ join?: (dir: string, file: string) => string;
54
+ /** Telemetry legacy a fusionar como `route` events. Opcional. */
55
+ legacyTelemetryPath?: string;
56
+ };
57
+ /**
58
+ * Lee y fusiona los eventos de **todas** las sesiones bajo `dir` (glob `*.jsonl`)
59
+ * más, opcionalmente, el telemetry legacy mapeado a `route` events. Orden
60
+ * cronológico ascendente por `ts`. No lanza si el directorio no existe.
61
+ */
62
+ export declare function readSessionEvents(dir: string, deps: ReadSessionEventsDeps): Promise<OpenTeamEvent[]>;
63
+ //# sourceMappingURL=eventLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventLog.d.ts","sourceRoot":"","sources":["../../src/telemetry/eventLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAElE,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,sEAAsE;AACtE,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtD,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjE,iFAAiF;IACjF,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,CAAC;AAMF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAapE;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAE/C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAmB9D;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAwBrE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAsBpE;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CASvB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,4DAA4D;IAC5D,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,sDAAsD;IACtD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7C,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,aAAa,EAAE,CAAC,CAyB1B"}
@@ -0,0 +1,217 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Modelo de eventos de openteam. Cada sesión de opencode escribe una secuencia
4
+ * de estos eventos (JSONL) que el dashboard agrega. Discriminados por `type`.
5
+ *
6
+ * Privacidad: **nunca** contienen texto de prompt, argumentos de tool ni salida
7
+ * en claro; solo `promptHash`, contadores y resúmenes ya redactados.
8
+ *
9
+ * Módulo puro: sin I/O, red, reloj, random ni env vars.
10
+ */
11
+ export declare const EVENT_SCHEMA_VERSION: 1;
12
+ /** Decisión de routing (superconjunto de `CostRecord` + correlación). */
13
+ export declare const RouteEventSchema: z.ZodObject<{
14
+ v: z.ZodLiteral<1>;
15
+ ts: z.ZodNumber;
16
+ sessionID: z.ZodString;
17
+ type: z.ZodLiteral<"route">;
18
+ promptHash: z.ZodString;
19
+ promptChars: z.ZodNumber;
20
+ tier: z.ZodEnum<{
21
+ trivial: "trivial";
22
+ simple: "simple";
23
+ moderate: "moderate";
24
+ hard: "hard";
25
+ }>;
26
+ routeKind: z.ZodEnum<{
27
+ local: "local";
28
+ frontier: "frontier";
29
+ }>;
30
+ selected: z.ZodObject<{
31
+ providerID: z.ZodString;
32
+ modelID: z.ZodString;
33
+ }, z.core.$strip>;
34
+ rationale: z.ZodString;
35
+ estimatedCostUSD: z.ZodNumber;
36
+ baselineCostUSD: z.ZodNumber;
37
+ estimatedSavingsUSD: z.ZodNumber;
38
+ budgetAction: z.ZodString;
39
+ tokensIn: z.ZodOptional<z.ZodNumber>;
40
+ tokensOut: z.ZodOptional<z.ZodNumber>;
41
+ decisionID: z.ZodOptional<z.ZodString>;
42
+ agent: z.ZodOptional<z.ZodString>;
43
+ success: z.ZodOptional<z.ZodBoolean>;
44
+ batchID: z.ZodOptional<z.ZodString>;
45
+ failureReason: z.ZodOptional<z.ZodString>;
46
+ failureStage: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>;
48
+ /** Mensaje del asistente completado: coste y tokens **reales** de opencode. */
49
+ export declare const MessageEventSchema: z.ZodObject<{
50
+ v: z.ZodLiteral<1>;
51
+ ts: z.ZodNumber;
52
+ sessionID: z.ZodString;
53
+ type: z.ZodLiteral<"message">;
54
+ providerID: z.ZodString;
55
+ modelID: z.ZodString;
56
+ agent: z.ZodOptional<z.ZodString>;
57
+ mode: z.ZodOptional<z.ZodString>;
58
+ messageID: z.ZodOptional<z.ZodString>;
59
+ costUSD: z.ZodNumber;
60
+ tokensIn: z.ZodNumber;
61
+ tokensOut: z.ZodNumber;
62
+ tokensReasoning: z.ZodNumber;
63
+ tokensCacheRead: z.ZodNumber;
64
+ tokensCacheWrite: z.ZodNumber;
65
+ durationMs: z.ZodNumber;
66
+ }, z.core.$strip>;
67
+ /** Ejecución de una tool con su duración (correlada por `callID`). */
68
+ export declare const ToolcallEventSchema: z.ZodObject<{
69
+ v: z.ZodLiteral<1>;
70
+ ts: z.ZodNumber;
71
+ sessionID: z.ZodString;
72
+ type: z.ZodLiteral<"toolcall">;
73
+ tool: z.ZodString;
74
+ callID: z.ZodString;
75
+ agent: z.ZodOptional<z.ZodString>;
76
+ durationMs: z.ZodNumber;
77
+ ok: z.ZodBoolean;
78
+ title: z.ZodOptional<z.ZodString>;
79
+ }, z.core.$strip>;
80
+ /** Reunión: un batch multi-agente lanzado por el orquestador. */
81
+ export declare const MeetingEventSchema: z.ZodObject<{
82
+ v: z.ZodLiteral<1>;
83
+ ts: z.ZodNumber;
84
+ sessionID: z.ZodString;
85
+ type: z.ZodLiteral<"meeting">;
86
+ batchID: z.ZodString;
87
+ purpose: z.ZodOptional<z.ZodString>;
88
+ roles: z.ZodArray<z.ZodString>;
89
+ decisionIDs: z.ZodOptional<z.ZodArray<z.ZodString>>;
90
+ }, z.core.$strip>;
91
+ /** Decisión/aprendizaje registrado (scribe u orquestador), redactado. */
92
+ export declare const DecisionEventSchema: z.ZodObject<{
93
+ v: z.ZodLiteral<1>;
94
+ ts: z.ZodNumber;
95
+ sessionID: z.ZodString;
96
+ type: z.ZodLiteral<"decision">;
97
+ agent: z.ZodOptional<z.ZodString>;
98
+ summary: z.ZodString;
99
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
100
+ }, z.core.$strip>;
101
+ /** Actividad de ciclo de vida de sesión, ya redactada. */
102
+ export declare const ActivityEventSchema: z.ZodObject<{
103
+ v: z.ZodLiteral<1>;
104
+ ts: z.ZodNumber;
105
+ sessionID: z.ZodString;
106
+ type: z.ZodLiteral<"activity">;
107
+ kind: z.ZodEnum<{
108
+ route: "route";
109
+ agent: "agent";
110
+ decision: "decision";
111
+ commit: "commit";
112
+ }>;
113
+ agent: z.ZodOptional<z.ZodString>;
114
+ summary: z.ZodString;
115
+ }, z.core.$strip>;
116
+ export declare const OpenTeamEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
117
+ v: z.ZodLiteral<1>;
118
+ ts: z.ZodNumber;
119
+ sessionID: z.ZodString;
120
+ type: z.ZodLiteral<"route">;
121
+ promptHash: z.ZodString;
122
+ promptChars: z.ZodNumber;
123
+ tier: z.ZodEnum<{
124
+ trivial: "trivial";
125
+ simple: "simple";
126
+ moderate: "moderate";
127
+ hard: "hard";
128
+ }>;
129
+ routeKind: z.ZodEnum<{
130
+ local: "local";
131
+ frontier: "frontier";
132
+ }>;
133
+ selected: z.ZodObject<{
134
+ providerID: z.ZodString;
135
+ modelID: z.ZodString;
136
+ }, z.core.$strip>;
137
+ rationale: z.ZodString;
138
+ estimatedCostUSD: z.ZodNumber;
139
+ baselineCostUSD: z.ZodNumber;
140
+ estimatedSavingsUSD: z.ZodNumber;
141
+ budgetAction: z.ZodString;
142
+ tokensIn: z.ZodOptional<z.ZodNumber>;
143
+ tokensOut: z.ZodOptional<z.ZodNumber>;
144
+ decisionID: z.ZodOptional<z.ZodString>;
145
+ agent: z.ZodOptional<z.ZodString>;
146
+ success: z.ZodOptional<z.ZodBoolean>;
147
+ batchID: z.ZodOptional<z.ZodString>;
148
+ failureReason: z.ZodOptional<z.ZodString>;
149
+ failureStage: z.ZodOptional<z.ZodString>;
150
+ }, z.core.$strip>, z.ZodObject<{
151
+ v: z.ZodLiteral<1>;
152
+ ts: z.ZodNumber;
153
+ sessionID: z.ZodString;
154
+ type: z.ZodLiteral<"message">;
155
+ providerID: z.ZodString;
156
+ modelID: z.ZodString;
157
+ agent: z.ZodOptional<z.ZodString>;
158
+ mode: z.ZodOptional<z.ZodString>;
159
+ messageID: z.ZodOptional<z.ZodString>;
160
+ costUSD: z.ZodNumber;
161
+ tokensIn: z.ZodNumber;
162
+ tokensOut: z.ZodNumber;
163
+ tokensReasoning: z.ZodNumber;
164
+ tokensCacheRead: z.ZodNumber;
165
+ tokensCacheWrite: z.ZodNumber;
166
+ durationMs: z.ZodNumber;
167
+ }, z.core.$strip>, z.ZodObject<{
168
+ v: z.ZodLiteral<1>;
169
+ ts: z.ZodNumber;
170
+ sessionID: z.ZodString;
171
+ type: z.ZodLiteral<"toolcall">;
172
+ tool: z.ZodString;
173
+ callID: z.ZodString;
174
+ agent: z.ZodOptional<z.ZodString>;
175
+ durationMs: z.ZodNumber;
176
+ ok: z.ZodBoolean;
177
+ title: z.ZodOptional<z.ZodString>;
178
+ }, z.core.$strip>, z.ZodObject<{
179
+ v: z.ZodLiteral<1>;
180
+ ts: z.ZodNumber;
181
+ sessionID: z.ZodString;
182
+ type: z.ZodLiteral<"meeting">;
183
+ batchID: z.ZodString;
184
+ purpose: z.ZodOptional<z.ZodString>;
185
+ roles: z.ZodArray<z.ZodString>;
186
+ decisionIDs: z.ZodOptional<z.ZodArray<z.ZodString>>;
187
+ }, z.core.$strip>, z.ZodObject<{
188
+ v: z.ZodLiteral<1>;
189
+ ts: z.ZodNumber;
190
+ sessionID: z.ZodString;
191
+ type: z.ZodLiteral<"decision">;
192
+ agent: z.ZodOptional<z.ZodString>;
193
+ summary: z.ZodString;
194
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
195
+ }, z.core.$strip>, z.ZodObject<{
196
+ v: z.ZodLiteral<1>;
197
+ ts: z.ZodNumber;
198
+ sessionID: z.ZodString;
199
+ type: z.ZodLiteral<"activity">;
200
+ kind: z.ZodEnum<{
201
+ route: "route";
202
+ agent: "agent";
203
+ decision: "decision";
204
+ commit: "commit";
205
+ }>;
206
+ agent: z.ZodOptional<z.ZodString>;
207
+ summary: z.ZodString;
208
+ }, z.core.$strip>], "type">;
209
+ export type OpenTeamEvent = z.infer<typeof OpenTeamEventSchema>;
210
+ export type RouteEvent = z.infer<typeof RouteEventSchema>;
211
+ export type MessageEvent = z.infer<typeof MessageEventSchema>;
212
+ export type ToolcallEvent = z.infer<typeof ToolcallEventSchema>;
213
+ export type MeetingEvent = z.infer<typeof MeetingEventSchema>;
214
+ export type DecisionEvent = z.infer<typeof DecisionEventSchema>;
215
+ export type ActivityEvent = z.infer<typeof ActivityEventSchema>;
216
+ export type OpenTeamEventType = OpenTeamEvent["type"];
217
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/telemetry/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAG,CAAU,CAAC;AAW/C,yEAAyE;AACzE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoB3B,CAAC;AAEH,+EAA+E;AAC/E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;iBAc7B,CAAC;AAEH,sEAAsE;AACtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAS9B,CAAC;AAEH,iEAAiE;AACjE,eAAO,MAAM,kBAAkB;;;;;;;;;iBAM7B,CAAC;AAEH,yEAAyE;AACzE,eAAO,MAAM,mBAAmB;;;;;;;;iBAK9B,CAAC;AAEH,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;iBAK9B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAO9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC"}
@@ -1,10 +1,12 @@
1
1
  import type { AgentFile } from "../commands/agents";
2
2
  import type { DashboardInputs } from "../dashboard/state";
3
- import type { ActivityEntry, CommitView } from "../dashboard/types";
3
+ import type { CommitView } from "../dashboard/types";
4
4
  /** Dependencias de I/O que el driver inyecta para leer las fuentes del dashboard. */
5
5
  export type SnapshotDeps = {
6
6
  /** Lee un fichero de texto; devuelve `undefined` si no existe (ENOENT). */
7
7
  readText: (path: string) => Promise<string | undefined>;
8
+ /** Lista los nombres de fichero de un directorio; `[]` si no existe. */
9
+ listFiles: (dir: string) => Promise<string[]>;
8
10
  /** Lista los ficheros `.md` de `.opencode/agent/`. */
9
11
  listAgentFiles: (dir: string) => Promise<AgentFile[]>;
10
12
  /** Reloj: ISO-8601. Fuera del core puro. */
@@ -13,13 +15,16 @@ export type SnapshotDeps = {
13
15
  gitLastCommit?: () => Promise<CommitView | undefined>;
14
16
  };
15
17
  export type SnapshotPaths = {
16
- telemetryPath: string;
18
+ /** Directorio de logs de sesión (`sessions/*.jsonl`). */
19
+ sessionsDir: string;
20
+ /** Fichero de decisiones del scribe (markdown). */
21
+ decisionsPath: string;
17
22
  backlogPath: string;
18
23
  agentDir: string;
24
+ /** Telemetry legacy (`openteam-telemetry.jsonl`) a fusionar como route events. */
25
+ legacyTelemetryPath?: string;
19
26
  };
20
27
  export type SnapshotContext = {
21
- /** Actividad viva (buffer del driver). */
22
- activity: () => ActivityEntry[];
23
28
  session?: {
24
29
  id?: string;
25
30
  startedAt?: string;
@@ -27,8 +32,9 @@ export type SnapshotContext = {
27
32
  recentRoutesLimit?: number;
28
33
  };
29
34
  /**
30
- * Crea un lector de snapshot: cada llamada relee las fuentes en disco y devuelve
31
- * los `DashboardInputs` crudos que `buildDashboardState` (puro) compondrá.
35
+ * Crea un lector de snapshot: cada llamada relee las fuentes en disco (todos los
36
+ * logs de sesión + decisiones + backlog + agentes) y devuelve los `DashboardInputs`
37
+ * crudos que `buildDashboardState` (puro) compondrá agregando las sesiones.
32
38
  */
33
- export declare function createSnapshotReader(deps: SnapshotDeps, paths: SnapshotPaths, context: SnapshotContext): () => Promise<DashboardInputs>;
39
+ export declare function createSnapshotReader(deps: SnapshotDeps, paths: SnapshotPaths, context?: SnapshotContext): () => Promise<DashboardInputs>;
34
40
  //# sourceMappingURL=snapshot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/web/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGpE,qFAAqF;AACrF,MAAM,MAAM,YAAY,GAAG;IACzB,2EAA2E;IAC3E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD,sDAAsD;IACtD,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,4CAA4C;IAC5C,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,aAAa,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,eAAe,GACvB,MAAM,OAAO,CAAC,eAAe,CAAC,CAwChC"}
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/web/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,oBAAoB,CAAC;AAG/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQrD,qFAAqF;AACrF,MAAM,MAAM,YAAY,GAAG;IACzB,2EAA2E;IAC3E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD,wEAAwE;IACxE,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,sDAAsD;IACtD,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,4CAA4C;IAC5C,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,eAAoB,GAC5B,MAAM,OAAO,CAAC,eAAe,CAAC,CAiDhC"}