@jmanuelcorral/openteam 0.1.42 → 0.2.0
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/.opencode/openteam.example.json +6 -1
- package/README.es.md +1 -1
- package/README.md +1 -1
- package/dist/capabilities/types.d.ts +4 -4
- package/dist/classifier/types.d.ts +3 -3
- package/dist/cli.js +11 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/graph.d.ts +28 -2
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/config/graphFeatureGate.d.ts +96 -0
- package/dist/config/graphFeatureGate.d.ts.map +1 -0
- package/dist/config/migrations.d.ts.map +1 -1
- package/dist/config/resolve.d.ts +20 -1
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/schema.d.ts +22 -19
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/console/render.d.ts.map +1 -1
- package/dist/context/redaction.d.ts +23 -0
- package/dist/context/redaction.d.ts.map +1 -1
- package/dist/context/schema.d.ts +3 -3
- package/dist/contract/opencode.d.ts +2 -2
- package/dist/contract/opencode.d.ts.map +1 -1
- package/dist/graph/certificate.d.ts +505 -0
- package/dist/graph/certificate.d.ts.map +1 -0
- package/dist/graph/ids.d.ts +9 -0
- package/dist/graph/ids.d.ts.map +1 -1
- package/dist/graph/privacyPolicy.d.ts.map +1 -1
- package/dist/graph/reducer.d.ts.map +1 -1
- package/dist/graph/replay.d.ts.map +1 -1
- package/dist/graph/reviewerPolicy.d.ts.map +1 -1
- package/dist/graph/schema.d.ts +33 -33
- package/dist/graph/schema.d.ts.map +1 -1
- package/dist/graph/soakLedger.d.ts +144 -0
- package/dist/graph/soakLedger.d.ts.map +1 -0
- package/dist/graph/types.d.ts +2 -0
- package/dist/graph/types.d.ts.map +1 -1
- package/dist/graph/validate.d.ts.map +1 -1
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2343 -178
- package/dist/local/registry.d.ts.map +1 -1
- package/dist/memory/types.d.ts +2 -2
- package/dist/orchestrator/graphFacade.d.ts +39 -0
- package/dist/orchestrator/graphFacade.d.ts.map +1 -0
- package/dist/orchestrator/graphIngress.d.ts +136 -0
- package/dist/orchestrator/graphIngress.d.ts.map +1 -0
- package/dist/orchestrator/graphShadow.d.ts +121 -0
- package/dist/orchestrator/graphShadow.d.ts.map +1 -0
- package/dist/orchestrator/ledger.d.ts +14 -2
- package/dist/orchestrator/ledger.d.ts.map +1 -1
- package/dist/orchestrator/opencodeSessionAdapter.d.ts.map +1 -1
- package/dist/orchestrator/roles.d.ts +3 -3
- package/dist/orchestrator/sdd.d.ts +55 -1
- package/dist/orchestrator/sdd.d.ts.map +1 -1
- package/dist/orchestrator/sddCompiler.d.ts +6 -2
- package/dist/orchestrator/sddCompiler.d.ts.map +1 -1
- package/dist/orchestrator/worktreeAdapter.d.ts.map +1 -1
- package/dist/orchestrator/worktreeDispatch.d.ts.map +1 -1
- package/dist/plugin/graphShadowIngress.d.ts +165 -0
- package/dist/plugin/graphShadowIngress.d.ts.map +1 -0
- package/dist/plugin/graphTool.d.ts +63 -0
- package/dist/plugin/graphTool.d.ts.map +1 -0
- package/dist/plugin/hooks.d.ts +6 -0
- package/dist/plugin/hooks.d.ts.map +1 -1
- package/dist/plugin/legacyRunProducer.d.ts +60 -0
- package/dist/plugin/legacyRunProducer.d.ts.map +1 -0
- package/dist/plugin/reportRunSchema.d.ts +60 -0
- package/dist/plugin/reportRunSchema.d.ts.map +1 -0
- package/dist/plugin/sessionTracker.d.ts +42 -0
- package/dist/plugin/sessionTracker.d.ts.map +1 -0
- package/dist/plugin/shadowPipeline.d.ts +49 -0
- package/dist/plugin/shadowPipeline.d.ts.map +1 -0
- package/dist/plugin/soakObserver.d.ts +73 -0
- package/dist/plugin/soakObserver.d.ts.map +1 -0
- package/dist/storage/graph/codec.d.ts.map +1 -1
- package/dist/storage/graph/migrateLegacyBriefs.d.ts.map +1 -1
- package/dist/storage/graph/migration.d.ts +91 -0
- package/dist/storage/graph/migration.d.ts.map +1 -0
- package/dist/storage/graph/provider.d.ts +1 -0
- package/dist/storage/graph/provider.d.ts.map +1 -1
- package/dist/storage/graph/recovery.d.ts.map +1 -1
- package/dist/storage/graph/runRegistry.d.ts.map +1 -1
- package/dist/storage/graph/soakRecorder.d.ts +59 -0
- package/dist/storage/graph/soakRecorder.d.ts.map +1 -0
- package/dist/storage/graph/workspaceLease.d.ts.map +1 -1
- package/dist/storage/graph/worktreeRegistry.d.ts.map +1 -1
- package/dist/storage/graph/writer.d.ts +15 -0
- package/dist/storage/graph/writer.d.ts.map +1 -1
- package/dist/storage/path.d.ts.map +1 -1
- package/dist/telemetry/events.d.ts +12 -12
- package/dist/telemetry/graphRuntimeHealth.d.ts +53 -0
- package/dist/telemetry/graphRuntimeHealth.d.ts.map +1 -0
- package/dist/telemetry/graphView.d.ts +1 -0
- package/dist/telemetry/graphView.d.ts.map +1 -1
- package/dist/telemetry/types.d.ts +4 -4
- package/package.json +7 -5
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { GraphMode } from "../config/schema";
|
|
3
|
+
/**
|
|
4
|
+
* **Ingesta shadow productiva** (GE-042): observa **una** ejecución legacy real
|
|
5
|
+
* y la proyecta a un `LegacyExecutionTraceV1` **reference-only**, sin duplicar
|
|
6
|
+
* trabajo.
|
|
7
|
+
*
|
|
8
|
+
* El trace es el input que el espejo sin efectos (GE-043) compila para que el
|
|
9
|
+
* comparador de paridad (GE-044) lo contraste. Por eso transporta exactamente
|
|
10
|
+
* las dimensiones que el comparador normaliza —estado terminal, orden de nodos,
|
|
11
|
+
* roles, modelos, nº de fixes y outcome— y **nada de contenido crudo**: ni
|
|
12
|
+
* brief, ni prompt, ni argumentos de tool, ni salida del modelo. Solo ids,
|
|
13
|
+
* roles, referencias de modelo/sesión, clases de error y contadores.
|
|
14
|
+
*
|
|
15
|
+
* Garantías estructurales del boundary:
|
|
16
|
+
* - **Sin efectos ni LLM:** este módulo solo mapea una observación ya
|
|
17
|
+
* producida; nunca despacha una tool, ejecuta un efecto ni llama al modelo,
|
|
18
|
+
* así que no puede duplicar la ejecución legacy que observa.
|
|
19
|
+
* - **Sin trace sintético:** una observación que no ejecutó de verdad
|
|
20
|
+
* (reanudada o `skipped`) o sin nodos es **inelegible de forma explícita**;
|
|
21
|
+
* el builder nunca fabrica un run.
|
|
22
|
+
* - **Gate dormant:** solo observa con `graph.mode` en `shadow`/`active` y sin
|
|
23
|
+
* `killSwitch`; con `off` (o sección ausente) o kill-switch, inelegible.
|
|
24
|
+
* - **Reference-only:** un guard final rechaza cualquier campo crudo y el
|
|
25
|
+
* parser de boundary rechaza además claves desconocidas.
|
|
26
|
+
*
|
|
27
|
+
* Módulo **puro y determinista**: sin I/O, red, reloj, random ni env vars.
|
|
28
|
+
*/
|
|
29
|
+
/** Versión del trace de ejecución legacy. */
|
|
30
|
+
export declare const LEGACY_EXECUTION_TRACE_VERSION: 1;
|
|
31
|
+
/** Estado terminal normalizado de la ejecución legacy observada. */
|
|
32
|
+
export declare const LegacyExecutionStatusSchema: z.ZodEnum<{
|
|
33
|
+
cancelled: "cancelled";
|
|
34
|
+
completed: "completed";
|
|
35
|
+
failed: "failed";
|
|
36
|
+
}>;
|
|
37
|
+
export type LegacyExecutionStatus = z.infer<typeof LegacyExecutionStatusSchema>;
|
|
38
|
+
/** Outcome normalizado del review de la ejecución legacy observada. */
|
|
39
|
+
export declare const LegacyReviewOutcomeSchema: z.ZodEnum<{
|
|
40
|
+
approved: "approved";
|
|
41
|
+
inconclusive: "inconclusive";
|
|
42
|
+
rejected: "rejected";
|
|
43
|
+
}>;
|
|
44
|
+
export type LegacyReviewOutcome = z.infer<typeof LegacyReviewOutcomeSchema>;
|
|
45
|
+
/**
|
|
46
|
+
* Nodo del trace: solo referencias y etiquetas acotadas. `model` es la
|
|
47
|
+
* referencia normalizada del modelo (p. ej. `provider/model`); `sessionRef` es
|
|
48
|
+
* el id de la subsesión de opencode, nunca su contenido; `errorClass` es la
|
|
49
|
+
* taxonomía acotada de fallo que comparte el runtime del grafo.
|
|
50
|
+
*/
|
|
51
|
+
export declare const LegacyTraceNodeV1Schema: z.ZodObject<{
|
|
52
|
+
id: z.ZodString;
|
|
53
|
+
role: z.ZodEnum<{
|
|
54
|
+
implementer: "implementer";
|
|
55
|
+
reviewer: "reviewer";
|
|
56
|
+
}>;
|
|
57
|
+
model: z.ZodString;
|
|
58
|
+
sessionRef: z.ZodOptional<z.ZodString>;
|
|
59
|
+
errorClass: z.ZodOptional<z.ZodEnum<{
|
|
60
|
+
cancelled: "cancelled";
|
|
61
|
+
permanent: "permanent";
|
|
62
|
+
timeout: "timeout";
|
|
63
|
+
transient: "transient";
|
|
64
|
+
unknown: "unknown";
|
|
65
|
+
}>>;
|
|
66
|
+
}, z.core.$strict>;
|
|
67
|
+
export type LegacyTraceNodeV1 = z.infer<typeof LegacyTraceNodeV1Schema>;
|
|
68
|
+
/**
|
|
69
|
+
* Trace versionado y reference-only de una única ejecución legacy productiva.
|
|
70
|
+
* `nodes` conserva el **orden** de despacho (implementer, reviewer, fixes...),
|
|
71
|
+
* que es una de las dimensiones de paridad.
|
|
72
|
+
*/
|
|
73
|
+
export declare const LegacyExecutionTraceV1Schema: z.ZodObject<{
|
|
74
|
+
version: z.ZodLiteral<1>;
|
|
75
|
+
runID: z.ZodString;
|
|
76
|
+
status: z.ZodEnum<{
|
|
77
|
+
cancelled: "cancelled";
|
|
78
|
+
completed: "completed";
|
|
79
|
+
failed: "failed";
|
|
80
|
+
}>;
|
|
81
|
+
outcome: z.ZodEnum<{
|
|
82
|
+
approved: "approved";
|
|
83
|
+
inconclusive: "inconclusive";
|
|
84
|
+
rejected: "rejected";
|
|
85
|
+
}>;
|
|
86
|
+
fixes: z.ZodNumber;
|
|
87
|
+
nodes: z.ZodArray<z.ZodObject<{
|
|
88
|
+
id: z.ZodString;
|
|
89
|
+
role: z.ZodEnum<{
|
|
90
|
+
implementer: "implementer";
|
|
91
|
+
reviewer: "reviewer";
|
|
92
|
+
}>;
|
|
93
|
+
model: z.ZodString;
|
|
94
|
+
sessionRef: z.ZodOptional<z.ZodString>;
|
|
95
|
+
errorClass: z.ZodOptional<z.ZodEnum<{
|
|
96
|
+
cancelled: "cancelled";
|
|
97
|
+
permanent: "permanent";
|
|
98
|
+
timeout: "timeout";
|
|
99
|
+
transient: "transient";
|
|
100
|
+
unknown: "unknown";
|
|
101
|
+
}>>;
|
|
102
|
+
}, z.core.$strict>>;
|
|
103
|
+
parentSessionRef: z.ZodOptional<z.ZodString>;
|
|
104
|
+
}, z.core.$strict>;
|
|
105
|
+
export type LegacyExecutionTraceV1 = z.infer<typeof LegacyExecutionTraceV1Schema>;
|
|
106
|
+
/** Gate de elegibilidad: subconjunto observado de la config `graph`. */
|
|
107
|
+
export type ShadowIngressGate = {
|
|
108
|
+
readonly mode: GraphMode;
|
|
109
|
+
readonly killSwitch: boolean;
|
|
110
|
+
};
|
|
111
|
+
/** Motivo **explícito** por el que una observación no produce trace. */
|
|
112
|
+
export type ShadowIngressIneligibleReason = "graph-disabled" | "kill-switch" | "not-executed" | "no-observation";
|
|
113
|
+
/** Nodo observado de la ejecución legacy real (puerto de entrada acotado). */
|
|
114
|
+
export type ObservedLegacyNode = {
|
|
115
|
+
readonly id: string;
|
|
116
|
+
readonly role: LegacyTraceNodeV1["role"];
|
|
117
|
+
readonly model: string;
|
|
118
|
+
/** Éxito terminal del nodo; deriva el outcome cuando el nodo es reviewer. */
|
|
119
|
+
readonly ok: boolean;
|
|
120
|
+
readonly sessionRef?: string;
|
|
121
|
+
readonly errorClass?: LegacyTraceNodeV1["errorClass"];
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Observación de **una** ejecución legacy real, correlada por el orquestador a
|
|
125
|
+
* partir de los hooks de evento/tool. `executed: false` marca una reanudación o
|
|
126
|
+
* un `skipped` (sin ejecución real): inelegible explícito.
|
|
127
|
+
*/
|
|
128
|
+
export type ObservedLegacyRun = {
|
|
129
|
+
readonly runID: string;
|
|
130
|
+
readonly executed: boolean;
|
|
131
|
+
readonly status: LegacyExecutionStatus;
|
|
132
|
+
readonly fixes: number;
|
|
133
|
+
readonly nodes: readonly ObservedLegacyNode[];
|
|
134
|
+
readonly parentSessionRef?: string;
|
|
135
|
+
};
|
|
136
|
+
/** Resultado de la ingesta: trace elegible o inelegibilidad explícita. */
|
|
137
|
+
export type ShadowIngressResult = {
|
|
138
|
+
readonly eligible: true;
|
|
139
|
+
readonly trace: LegacyExecutionTraceV1;
|
|
140
|
+
} | {
|
|
141
|
+
readonly eligible: false;
|
|
142
|
+
readonly reason: ShadowIngressIneligibleReason;
|
|
143
|
+
};
|
|
144
|
+
/** El gate está abierto cuando la observación shadow es elegible. */
|
|
145
|
+
export declare function shadowIngressGateOpen(gate: ShadowIngressGate | undefined): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Ingesta la observación de una ejecución legacy real y devuelve un
|
|
148
|
+
* `LegacyExecutionTraceV1` reference-only, o la inelegibilidad explícita. No
|
|
149
|
+
* ejecuta efectos, no llama al modelo y no fabrica traces: solo proyecta lo
|
|
150
|
+
* observado cuando el gate está abierto y la ejecución fue real.
|
|
151
|
+
*/
|
|
152
|
+
export declare function ingestLegacyExecution(observation: ObservedLegacyRun, gate: ShadowIngressGate | undefined): ShadowIngressResult;
|
|
153
|
+
/** Error tipado de validación del trace legacy en el boundary. */
|
|
154
|
+
export declare class LegacyTraceError extends Error {
|
|
155
|
+
readonly code: "invalid-legacy-trace";
|
|
156
|
+
readonly issues: string[];
|
|
157
|
+
constructor(error: z.ZodError);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Valida y parsea un trace legacy en el boundary (lo consume GE-043). Lanza
|
|
161
|
+
* `LegacyTraceError` si la forma es inválida o transporta claves desconocidas,
|
|
162
|
+
* incluidos los campos de contenido crudo.
|
|
163
|
+
*/
|
|
164
|
+
export declare function parseLegacyExecutionTrace(input: unknown): LegacyExecutionTraceV1;
|
|
165
|
+
//# sourceMappingURL=graphShadowIngress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphShadowIngress.d.ts","sourceRoot":"","sources":["../../src/plugin/graphShadowIngress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type ToolDefinition } from "@opencode-ai/plugin";
|
|
2
|
+
import type { GraphIngress, IngressDecision, IngressOutcome, IngressPolicy } from "../orchestrator/graphIngress";
|
|
3
|
+
import type { SessionTracker } from "./sessionTracker";
|
|
4
|
+
import { type ShadowObserver, type ShadowPipelineDeps } from "./shadowPipeline";
|
|
5
|
+
/**
|
|
6
|
+
* GE-050 — superficie de opencode del ingress activo de SDD.
|
|
7
|
+
*
|
|
8
|
+
* En R1 la herramienta se registra pero la puerta interna está cerrada, así que
|
|
9
|
+
* responde siempre "no disponible" y **explica el bloqueo más externo**. Se
|
|
10
|
+
* registra igualmente porque el punto de entrada es justo lo que faltaba: sin
|
|
11
|
+
* él, "activar el grafo" seguiría sin significar nada operativamente y R2 no
|
|
12
|
+
* tendría dónde enchufar el piloto.
|
|
13
|
+
*
|
|
14
|
+
* `ingress` es opcional a propósito: R1 no tiene ejecutor de efectos de sesión
|
|
15
|
+
* (lo aporta GE-030/GE-051), y fabricar uno falso en producción sería peor que
|
|
16
|
+
* declarar la ausencia. Mientras no exista, ninguna acción mutante es posible.
|
|
17
|
+
*
|
|
18
|
+
* Este módulo no nombra el otorgante interno de la capability: la puerta solo se
|
|
19
|
+
* abre desde el módulo que la declara, y eso se verifica estructuralmente en g5.
|
|
20
|
+
*/
|
|
21
|
+
/** Acciones expuestas por la herramienta `openteam-graph`. */
|
|
22
|
+
export type GraphToolAction = "status" | "start" | "cancel" | "report-run";
|
|
23
|
+
export type GraphToolDeps = {
|
|
24
|
+
readonly policy: IngressPolicy;
|
|
25
|
+
/** Ingress real; ausente mientras el runtime activo no esté enchufado. */
|
|
26
|
+
readonly ingress?: GraphIngress;
|
|
27
|
+
/** Shadow pipeline deps; absent under mode "off" or when kill switch is active. */
|
|
28
|
+
readonly shadow?: ShadowPipelineDeps | undefined;
|
|
29
|
+
/** Session/model tracker for cross-verification of agent-reported fields. */
|
|
30
|
+
readonly tracker: SessionTracker;
|
|
31
|
+
};
|
|
32
|
+
/** Surface returned by createGraphTool: the tool definition plus the shadow observer. */
|
|
33
|
+
export type GraphToolSurface = {
|
|
34
|
+
/** The opencode tool definition for registration. */
|
|
35
|
+
readonly definition: ToolDefinition;
|
|
36
|
+
/**
|
|
37
|
+
* Observe a legacy execution through the shadow pipeline. Returns a result
|
|
38
|
+
* indicating whether an observation was persisted, was ineligible, or
|
|
39
|
+
* failed with containment. If shadow deps were not provided, returns
|
|
40
|
+
* ineligible with reason "shadow-not-configured".
|
|
41
|
+
*/
|
|
42
|
+
readonly observeLegacyExecution: ShadowObserver;
|
|
43
|
+
};
|
|
44
|
+
/** Texto estable para una decisión de enrutado. Puro y total. */
|
|
45
|
+
export declare function describeDecision(decision: IngressDecision): string;
|
|
46
|
+
/** Texto estable para el resultado de una operación. Puro y total. */
|
|
47
|
+
export declare function describeOutcome(outcome: IngressOutcome): string;
|
|
48
|
+
/** Motivo por el que una acción mutante no puede ejecutarse todavía. */
|
|
49
|
+
export declare function unavailableReason(deps: GraphToolDeps, taskID: string): string;
|
|
50
|
+
export declare function createGraphTool(deps: GraphToolDeps): GraphToolSurface;
|
|
51
|
+
/**
|
|
52
|
+
* Despacha la acción `report-run`: valida, contrasta y produce una
|
|
53
|
+
* observación shadow. Contenido por try/catch: un fallo aquí nunca
|
|
54
|
+
* se propaga como excepción al agente.
|
|
55
|
+
*
|
|
56
|
+
* `tracker` es obligatorio: sin él no hay capacidad de contraverificación
|
|
57
|
+
* y todos los nodos quedan como no verificables. El compilador caza la
|
|
58
|
+
* omisión; el guard runtime maneja el caso dinámico imposible.
|
|
59
|
+
*
|
|
60
|
+
* Exportado para testing directo de la capa de contención externa.
|
|
61
|
+
*/
|
|
62
|
+
export declare function handleReportRun(args: Record<string, unknown>, observe: ShadowObserver, tracker: SessionTracker): Promise<string>;
|
|
63
|
+
//# sourceMappingURL=graphTool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphTool.d.ts","sourceRoot":"","sources":["../../src/plugin/graphTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAQ,MAAM,qBAAqB,CAAC;AAEhE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,8BAA8B,CAAC;AAUtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AAEH,8DAA8D;AAC9D,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC,CAAC;AAEF,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,sBAAsB,EAAE,cAAc,CAAC;CACjD,CAAC;AAEF,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAclE;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAe/D;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,CA6FrE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CAwDjB"}
|
package/dist/plugin/hooks.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export type ChatMessageHookOptions = {
|
|
|
14
14
|
* altera el determinismo del router ni el hash del prompt.
|
|
15
15
|
*/
|
|
16
16
|
injectMemory?: (queryText: string) => Promise<string | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Callback de routing (issue #53): notifica la sesión y el modelo enrutado
|
|
19
|
+
* tras cada decisión de `chat.message`. Usado por el `SessionTracker` para
|
|
20
|
+
* contraverificar los campos auto-reportados del agente en `report-run`.
|
|
21
|
+
*/
|
|
22
|
+
onRoute?: (sessionID: string, model: string) => void;
|
|
17
23
|
};
|
|
18
24
|
export declare function deriveTaskSignals(input: Parameters<ChatMessageHook>[0], output: Parameters<ChatMessageHook>[1]): TaskSignals;
|
|
19
25
|
/**
|
|
@@ -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;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;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;
|
|
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;IACnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD,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;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACtC,KAAK,EAAE,MAAM,GACZ,OAAO,CAQT;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CA0DjB;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,oBAAoB,EAClC,OAAO,GAAE,sBAA2B,GACnC,KAAK,CAIP"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ObservedLegacyRun } from "./graphShadowIngress";
|
|
2
|
+
import type { ReportRunPayload } from "./reportRunSchema";
|
|
3
|
+
import type { SessionTracker } from "./sessionTracker";
|
|
4
|
+
import type { ShadowPipelineResult } from "./shadowPipeline";
|
|
5
|
+
/**
|
|
6
|
+
* **Productor de `ObservedLegacyRun`** (issue #53, ADR Option D §3–4).
|
|
7
|
+
*
|
|
8
|
+
* Recibe un `ReportRunPayload` validado por Zod en la frontera, contrasta
|
|
9
|
+
* los campos `model` y `sessionRef` contra la telemetría de sesión/routing
|
|
10
|
+
* acumulada por el `SessionTracker`, construye un `ObservedLegacyRun` y lo
|
|
11
|
+
* pasa al observador shadow.
|
|
12
|
+
*
|
|
13
|
+
* Módulo puro (sin I/O, reloj ni azar). La contención de fallos la da el
|
|
14
|
+
* shadow pipeline; aquí solo se construye la observación.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Resultado de la producción de la observación legacy. Extiende el
|
|
18
|
+
* `ShadowPipelineResult` con metadatos de contraverificación.
|
|
19
|
+
*/
|
|
20
|
+
export type ProducerResult = {
|
|
21
|
+
/** Resultado del pipeline shadow. */
|
|
22
|
+
readonly pipeline: ShadowPipelineResult;
|
|
23
|
+
/** Nodos con modelo no verificable (sessionRef ausente o sin routing). */
|
|
24
|
+
readonly unverifiedModels: readonly string[];
|
|
25
|
+
/** Nodos con modelo verificado y discrepancia. */
|
|
26
|
+
readonly modelMismatches: readonly string[];
|
|
27
|
+
/** Nodos con sessionRef desconocida. */
|
|
28
|
+
readonly unknownSessions: readonly string[];
|
|
29
|
+
};
|
|
30
|
+
/** Resultado conciso devuelto a la herramienta como texto. */
|
|
31
|
+
export type ReportRunResponse = {
|
|
32
|
+
readonly result: "observed" | "observation-rejected" | "ineligible" | "contained-failure";
|
|
33
|
+
readonly detail?: string;
|
|
34
|
+
/** Avisos de contraverificación, si hubo. */
|
|
35
|
+
readonly warnings?: readonly string[];
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Produce una `ObservedLegacyRun` a partir de un reporte validado del agente.
|
|
39
|
+
* El run se marca como `executed: true` porque la acción solo se invoca al
|
|
40
|
+
* completar una ejecución real.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildObservedRun(payload: ReportRunPayload): ObservedLegacyRun;
|
|
43
|
+
/**
|
|
44
|
+
* Contrasta los campos del reporte contra la telemetría acumulada.
|
|
45
|
+
* Devuelve avisos de contraverificación (warnings), nunca bloquea.
|
|
46
|
+
*/
|
|
47
|
+
export declare function crossVerify(payload: ReportRunPayload, tracker: SessionTracker): {
|
|
48
|
+
unverifiedModels: string[];
|
|
49
|
+
modelMismatches: string[];
|
|
50
|
+
unknownSessions: string[];
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Formatea los warnings de contraverificación para la respuesta al agente.
|
|
54
|
+
*/
|
|
55
|
+
export declare function formatWarnings(verification: ReturnType<typeof crossVerify>): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Construye la respuesta de texto que la herramienta devuelve al agente.
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatResponse(response: ReportRunResponse): string;
|
|
60
|
+
//# sourceMappingURL=legacyRunProducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacyRunProducer.d.ts","sourceRoot":"","sources":["../../src/plugin/legacyRunProducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D;;;;;;;;;;GAUG;AAEH;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,kDAAkD;IAClD,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,wCAAwC;IACxC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C,CAAC;AAEF,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,MAAM,EACX,UAAU,GACV,sBAAsB,GACtB,YAAY,GACZ,mBAAmB,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC,CAAC;AAmBF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAW7E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,GACtB;IACD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CA8BA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAC3C,MAAM,EAAE,CAkBV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CASlE"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* **Esquema Zod de la acción `report-run`** (issue #53, ADR Option D).
|
|
4
|
+
*
|
|
5
|
+
* Valida la forma estructural del reporte que el agente orquestador envía
|
|
6
|
+
* a través de la herramienta `openteam-graph`. Claves desconocidas se
|
|
7
|
+
* rechazan (`.strict()`): el payload del agente solo transporta campos
|
|
8
|
+
* documentados.
|
|
9
|
+
*
|
|
10
|
+
* Módulo puro: sin I/O, reloj ni azar.
|
|
11
|
+
*/
|
|
12
|
+
/** Nodo reportado por el agente: identidad + rol + modelo + éxito. */
|
|
13
|
+
export declare const ReportRunNodeSchema: z.ZodObject<{
|
|
14
|
+
id: z.ZodString;
|
|
15
|
+
role: z.ZodEnum<{
|
|
16
|
+
implementer: "implementer";
|
|
17
|
+
reviewer: "reviewer";
|
|
18
|
+
}>;
|
|
19
|
+
model: z.ZodString;
|
|
20
|
+
ok: z.ZodBoolean;
|
|
21
|
+
sessionRef: z.ZodOptional<z.ZodString>;
|
|
22
|
+
errorClass: z.ZodOptional<z.ZodEnum<{
|
|
23
|
+
cancelled: "cancelled";
|
|
24
|
+
permanent: "permanent";
|
|
25
|
+
timeout: "timeout";
|
|
26
|
+
transient: "transient";
|
|
27
|
+
unknown: "unknown";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$strict>;
|
|
30
|
+
export type ReportRunNode = z.infer<typeof ReportRunNodeSchema>;
|
|
31
|
+
/** Payload completo de `report-run`. */
|
|
32
|
+
export declare const ReportRunPayloadSchema: z.ZodObject<{
|
|
33
|
+
runID: z.ZodString;
|
|
34
|
+
status: z.ZodEnum<{
|
|
35
|
+
cancelled: "cancelled";
|
|
36
|
+
completed: "completed";
|
|
37
|
+
failed: "failed";
|
|
38
|
+
}>;
|
|
39
|
+
fixes: z.ZodNumber;
|
|
40
|
+
nodes: z.ZodArray<z.ZodObject<{
|
|
41
|
+
id: z.ZodString;
|
|
42
|
+
role: z.ZodEnum<{
|
|
43
|
+
implementer: "implementer";
|
|
44
|
+
reviewer: "reviewer";
|
|
45
|
+
}>;
|
|
46
|
+
model: z.ZodString;
|
|
47
|
+
ok: z.ZodBoolean;
|
|
48
|
+
sessionRef: z.ZodOptional<z.ZodString>;
|
|
49
|
+
errorClass: z.ZodOptional<z.ZodEnum<{
|
|
50
|
+
cancelled: "cancelled";
|
|
51
|
+
permanent: "permanent";
|
|
52
|
+
timeout: "timeout";
|
|
53
|
+
transient: "transient";
|
|
54
|
+
unknown: "unknown";
|
|
55
|
+
}>>;
|
|
56
|
+
}, z.core.$strict>>;
|
|
57
|
+
parentSessionRef: z.ZodOptional<z.ZodString>;
|
|
58
|
+
}, z.core.$strict>;
|
|
59
|
+
export type ReportRunPayload = z.infer<typeof ReportRunPayloadSchema>;
|
|
60
|
+
//# sourceMappingURL=reportRunSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportRunSchema.d.ts","sourceRoot":"","sources":["../../src/plugin/reportRunSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB;;;;;;;;;GASG;AAEH,sEAAsE;AACtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;kBASrB,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wCAAwC;AACxC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;kBAQxB,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **Rastreador de sesiones y modelos** (issue #53, ADR Option D §1).
|
|
3
|
+
*
|
|
4
|
+
* Acumula en memoria las sesiones conocidas (de eventos de ciclo de vida) y
|
|
5
|
+
* el modelo enrutado por sesión (de decisiones de `chat.message`). Ambos
|
|
6
|
+
* datos se usan para contraverificar los campos auto-reportados del agente
|
|
7
|
+
* en la acción `report-run`.
|
|
8
|
+
*
|
|
9
|
+
* Módulo con estado mutable (in-memory map); vive en `plugin/` porque es
|
|
10
|
+
* parte de la superficie de producción del plugin, no del router puro.
|
|
11
|
+
*/
|
|
12
|
+
/** Resultado de la contraverificación de modelo para un nodo. */
|
|
13
|
+
export type ModelVerification = {
|
|
14
|
+
readonly verified: true;
|
|
15
|
+
readonly match: boolean;
|
|
16
|
+
} | {
|
|
17
|
+
readonly verified: false;
|
|
18
|
+
};
|
|
19
|
+
/** Resultado de la contraverificación de sessionRef. */
|
|
20
|
+
export type SessionRefVerification = {
|
|
21
|
+
readonly known: true;
|
|
22
|
+
} | {
|
|
23
|
+
readonly known: false;
|
|
24
|
+
} | {
|
|
25
|
+
readonly known: null;
|
|
26
|
+
};
|
|
27
|
+
export type SessionTracker = {
|
|
28
|
+
/** Registra una sesión conocida (de session.created, session.idle, etc.). */
|
|
29
|
+
readonly trackSession: (sessionID: string) => void;
|
|
30
|
+
/** Registra el modelo enrutado para una sesión (de chat.message). */
|
|
31
|
+
readonly trackRoutedModel: (sessionID: string, model: string) => void;
|
|
32
|
+
/** Verifica si un modelo reportado coincide con el enrutado. */
|
|
33
|
+
readonly verifyModel: (sessionRef: string, reportedModel: string) => ModelVerification;
|
|
34
|
+
/** Verifica si una referencia de sesión corresponde a una sesión conocida. */
|
|
35
|
+
readonly verifySessionRef: (sessionRef: string | undefined) => SessionRefVerification;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Crea un rastreador de sesiones y modelos. El estado es efímero: vive
|
|
39
|
+
* mientras el plugin esté cargado, no se persiste.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createSessionTracker(): SessionTracker;
|
|
42
|
+
//# sourceMappingURL=sessionTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionTracker.d.ts","sourceRoot":"","sources":["../../src/plugin/sessionTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iEAAiE;AACjE,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,CAAC;AAEjC,wDAAwD;AACxD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,qEAAqE;IACrE,QAAQ,CAAC,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,CACpB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,KAClB,iBAAiB,CAAC;IACvB,8EAA8E;IAC9E,QAAQ,CAAC,gBAAgB,EAAE,CACzB,UAAU,EAAE,MAAM,GAAG,SAAS,KAC3B,sBAAsB,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CA4BrD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ShadowDivergenceCode } from "../graph/certificate";
|
|
2
|
+
import type { SoakModelVerificationPair } from "../graph/soakLedger";
|
|
3
|
+
import type { RecorderPorts } from "../storage/graph/soakRecorder";
|
|
4
|
+
import { type ObservedLegacyRun, type ShadowIngressGate } from "./graphShadowIngress";
|
|
5
|
+
/**
|
|
6
|
+
* **Shadow pipeline** (GE-055/issue #51): connects the four dead modules
|
|
7
|
+
* into a single failure-contained chain that produces a persisted soak
|
|
8
|
+
* observation from an eligible legacy execution.
|
|
9
|
+
*
|
|
10
|
+
* Chain: ingestLegacyExecution → mirrorLegacyTrace → compareShadowRun →
|
|
11
|
+
* recordSoakObservation. Every step is failure-contained: a mirror crash,
|
|
12
|
+
* a full disk, or a rejected observation never propagates to the caller.
|
|
13
|
+
*
|
|
14
|
+
* This module lives in `plugin/` because it composes I/O (recorder ports)
|
|
15
|
+
* with pure logic (ingress, mirror, comparator). It is the only production
|
|
16
|
+
* call site for the four symbols.
|
|
17
|
+
*/
|
|
18
|
+
/** Result of the shadow pipeline. */
|
|
19
|
+
export type ShadowPipelineResult = {
|
|
20
|
+
readonly kind: "observed";
|
|
21
|
+
} | {
|
|
22
|
+
readonly kind: "observation-rejected";
|
|
23
|
+
readonly reason: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly kind: "ineligible";
|
|
26
|
+
readonly reason: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly kind: "contained-failure";
|
|
29
|
+
readonly detail: string;
|
|
30
|
+
};
|
|
31
|
+
/** Dependencies for the shadow pipeline, all injected. */
|
|
32
|
+
export type ShadowPipelineDeps = {
|
|
33
|
+
readonly gate: ShadowIngressGate;
|
|
34
|
+
readonly ports: RecorderPorts;
|
|
35
|
+
readonly evidenceDir: string;
|
|
36
|
+
readonly recorderId: string;
|
|
37
|
+
readonly opencodeVersion: string;
|
|
38
|
+
readonly criticalCodes: readonly ShadowDivergenceCode[];
|
|
39
|
+
/** Override process.platform for testing. Production callers omit this. */
|
|
40
|
+
readonly platformOverride?: string | undefined;
|
|
41
|
+
};
|
|
42
|
+
/** Callable observer: takes a legacy run and verification, returns the pipeline result. */
|
|
43
|
+
export type ShadowObserver = (observation: ObservedLegacyRun, modelVerification?: SoakModelVerificationPair | null) => Promise<ShadowPipelineResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Creates the shadow pipeline from injected deps. The returned function
|
|
46
|
+
* orchestrates the full chain with failure containment: no error escapes.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createShadowPipeline(deps: ShadowPipelineDeps): ShadowObserver;
|
|
49
|
+
//# sourceMappingURL=shadowPipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadowPipeline.d.ts","sourceRoot":"","sources":["../../src/plugin/shadowPipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAOrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAG9B;;;;;;;;;;;;GAYG;AAEH,qCAAqC;AACrC,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,0DAA0D;AAC1D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACxD,2EAA2E;IAC3E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChD,CAAC;AAEF,2FAA2F;AAC3F,MAAM,MAAM,cAAc,GAAG,CAC3B,WAAW,EAAE,iBAAiB,EAC9B,iBAAiB,CAAC,EAAE,yBAAyB,GAAG,IAAI,KACjD,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAEnC;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAoD7E"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { ShadowDivergenceCode } from "../graph/certificate";
|
|
2
|
+
import type { SoakDuplicateEffectPair, SoakModelVerificationPair, SoakPlatform, SoakPrivacyPair } from "../graph/soakLedger";
|
|
3
|
+
import { type ObservationInput, type RecorderPorts } from "../storage/graph/soakRecorder";
|
|
4
|
+
import type { LegacyExecutionTraceV1 } from "./graphShadowIngress";
|
|
5
|
+
/**
|
|
6
|
+
* **Observador soak** (GE-055a): superficie confiable mínima.
|
|
7
|
+
*
|
|
8
|
+
* Recibe un `LegacyExecutionTraceV1` validado de la ingesta shadow,
|
|
9
|
+
* extrae un resumen reference-only (digest, plataforma, pin, contadores),
|
|
10
|
+
* y delega la persistencia al `soakRecorder`. No emite veredictos, no
|
|
11
|
+
* evalúa puertas, no construye certificados.
|
|
12
|
+
*
|
|
13
|
+
* Este módulo usa I/O real (filesystem, clock) — vive fuera de `src/graph/`.
|
|
14
|
+
*/
|
|
15
|
+
/** Shadow parity result plumbed from the comparator. */
|
|
16
|
+
export type SoakParityInput = {
|
|
17
|
+
/** Divergence codes detected between legacy and shadow runs. */
|
|
18
|
+
readonly divergences: readonly string[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Maps a platform string to a supported observation platform.
|
|
22
|
+
* Returns null for unrecognized platforms — the observation is rejected.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolvePlatform(platform: string): SoakPlatform | null;
|
|
25
|
+
/**
|
|
26
|
+
* Scans a trace for privacy violations using the counting scanner.
|
|
27
|
+
*
|
|
28
|
+
* **Surface definition:** one surface = the entire trace object. Each
|
|
29
|
+
* observation scans exactly one trace, so the denominator equals the number
|
|
30
|
+
* of observations that ran the scanner. This is not trivially inflatable:
|
|
31
|
+
* the trace is the logical unit of work per observation.
|
|
32
|
+
*/
|
|
33
|
+
export declare function scanTracePrivacy(trace: LegacyExecutionTraceV1): SoakPrivacyPair;
|
|
34
|
+
/**
|
|
35
|
+
* Detects duplicate effects within a trace.
|
|
36
|
+
*
|
|
37
|
+
* **Effect identity:** a node's `id` field. Each node in `LegacyExecutionTraceV1.nodes`
|
|
38
|
+
* represents one dispatched effect. If the same `id` appears more than once in a
|
|
39
|
+
* single trace, the same logical step was dispatched multiple times — a duplicate
|
|
40
|
+
* effect. This identity is chosen because `id` is the plan-level identifier of a
|
|
41
|
+
* step; legitimate re-executions (fix loops) produce distinct node IDs.
|
|
42
|
+
*
|
|
43
|
+
* **Denominator:** total number of nodes (effects examined). This measures how
|
|
44
|
+
* much of the trace was inspected. A trace with zero nodes cannot express
|
|
45
|
+
* duplication — return null (unmeasured) rather than a vacuous zero.
|
|
46
|
+
*
|
|
47
|
+
* **duplicatesFound:** number of extra occurrences (total − distinct). A trace
|
|
48
|
+
* [A, B, A, C] has effectsExamined=4, duplicatesFound=1.
|
|
49
|
+
*/
|
|
50
|
+
export declare function detectDuplicateEffects(trace: LegacyExecutionTraceV1): SoakDuplicateEffectPair | null;
|
|
51
|
+
/**
|
|
52
|
+
* Extrae una observación de un trace legacy. Solo digests y contadores.
|
|
53
|
+
*
|
|
54
|
+
* @param parity - Shadow parity result if the comparator ran; undefined otherwise.
|
|
55
|
+
* @param criticalCodes - Which divergence codes count as critical (from policy).
|
|
56
|
+
* Required: the caller must supply the policy's critical-code set. An empty
|
|
57
|
+
* array is treated as unmeasured (null), not as "zero critical codes found."
|
|
58
|
+
* @param modelVerification - Cross-verification result from the session tracker.
|
|
59
|
+
* null = verification did not run. Required: the caller must supply the result
|
|
60
|
+
* or explicitly pass null.
|
|
61
|
+
* @param platformOverride - Override process.platform for testing.
|
|
62
|
+
* @returns The observation input, or null if the platform is unrecognized.
|
|
63
|
+
*/
|
|
64
|
+
export declare function traceToObservationInput(trace: LegacyExecutionTraceV1, opencodeVersion: string, parity: SoakParityInput | undefined, criticalCodes: readonly ShadowDivergenceCode[], modelVerification: SoakModelVerificationPair | null, platformOverride?: string): ObservationInput | null;
|
|
65
|
+
/**
|
|
66
|
+
* Registra una observación soak a partir de un trace validado.
|
|
67
|
+
* Llamado por la hook de ingesta shadow al completar una ejecución elegible.
|
|
68
|
+
* Returns false if the observation was rejected (unrecognized platform).
|
|
69
|
+
*
|
|
70
|
+
* @param platformOverride - Override process.platform for testing.
|
|
71
|
+
*/
|
|
72
|
+
export declare function recordSoakObservation(ports: RecorderPorts, evidenceDir: string, recorderId: string, trace: LegacyExecutionTraceV1, opencodeVersion: string, parity: SoakParityInput | undefined, criticalCodes: readonly ShadowDivergenceCode[], modelVerification: SoakModelVerificationPair | null, platformOverride?: string): Promise<boolean>;
|
|
73
|
+
//# sourceMappingURL=soakObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soakObserver.d.ts","sourceRoot":"","sources":["../../src/plugin/soakObserver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EACV,uBAAuB,EACvB,yBAAyB,EACzB,YAAY,EACZ,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAEnE;;;;;;;;;GASG;AAEH,wDAAwD;AACxD,MAAM,MAAM,eAAe,GAAG;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKrE;AAsBD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,sBAAsB,GAC5B,eAAe,CAMjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,sBAAsB,GAC5B,uBAAuB,GAAG,IAAI,CAehC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,sBAAsB,EAC7B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,aAAa,EAAE,SAAS,oBAAoB,EAAE,EAC9C,iBAAiB,EAAE,yBAAyB,GAAG,IAAI,EACnD,gBAAgB,CAAC,EAAE,MAAM,GACxB,gBAAgB,GAAG,IAAI,CAezB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,sBAAsB,EAC7B,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,aAAa,EAAE,SAAS,oBAAoB,EAAE,EAC9C,iBAAiB,EAAE,yBAAyB,GAAG,IAAI,EACnD,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CAYlB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../src/storage/graph/codec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,aAAa,EAAG,CAAU,CAAC;AAExC,yDAAyD;AACzD,eAAO,MAAM,cAAc,QAAiD,CAAC;AAsB7E,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAErE;AAED,mEAAmE;AACnE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,aAAa,GACb,cAAc,GACd,aAAa,GACb,cAAc,CAAC;AAEnB,yDAAyD;AACzD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../src/storage/graph/codec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,aAAa,EAAG,CAAU,CAAC;AAExC,yDAAyD;AACzD,eAAO,MAAM,cAAc,QAAiD,CAAC;AAsB7E,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAErE;AAED,mEAAmE;AACnE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,aAAa,GACb,cAAc,GACd,aAAa,GACb,cAAc,CAAC;AAEnB,yDAAyD;AACzD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,EAKtD;CACF;AAED,+DAA+D;AAC/D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wEAAwE;AACxE,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,GAClB,YAAY,CAId;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CASrE;AAED,+EAA+E;AAC/E,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAkDF,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAc1D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrateLegacyBriefs.d.ts","sourceRoot":"","sources":["../../../src/storage/graph/migrateLegacyBriefs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA4BnD,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAEjE,sEAAsE;AACtE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"migrateLegacyBriefs.d.ts","sourceRoot":"","sources":["../../../src/storage/graph/migrateLegacyBriefs.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AA4BnD,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAEjE,sEAAsE;AACtE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAKjD;CACF;AA6CD;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,CAAC,CAM7B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAuB/B"}
|