oxe-cc 1.11.0 → 1.14.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/lib/sdk/index.cjs CHANGED
@@ -560,6 +560,8 @@ module.exports = {
560
560
  loadOxeConfigMerged: health.loadOxeConfigMerged,
561
561
  validateConfigShape: health.validateConfigShape,
562
562
  buildHealthReport: health.buildHealthReport,
563
+ buildStatusSummary: health.buildStatusSummary,
564
+ agentSkillsReport: health.agentSkillsReport,
563
565
  detectWorkspaceMode: health.detectWorkspaceMode,
564
566
  shouldSuppressExecutionWorkspaceGates: health.shouldSuppressExecutionWorkspaceGates,
565
567
  suggestNextStep: health.suggestNextStep,
@@ -45,6 +45,30 @@ export interface OxeNextSuggestion {
45
45
  artifacts: string[];
46
46
  }
47
47
 
48
+ /** Compact, host-facing projection of the health report (versioned). */
49
+ export interface OxeStatusSummary {
50
+ oxeSummarySchema: number;
51
+ workspaceMode: string;
52
+ phase: string | null;
53
+ healthStatus: string | null;
54
+ activeSession: string | null;
55
+ nextStep: string | null;
56
+ cursorCmd: string | null;
57
+ reason: string | null;
58
+ eventsCount: number;
59
+ warningsCount: number;
60
+ }
61
+
62
+ /** Per-agent OXE skills/integration status for a workspace. */
63
+ export interface AgentSkillsStatus {
64
+ agent: string;
65
+ detected: boolean;
66
+ skillsInstalled: boolean;
67
+ skillsPath: string;
68
+ status: string;
69
+ issues: string[];
70
+ }
71
+
48
72
  export interface AzureInventorySummary {
49
73
  total: number;
50
74
  servicebus: number;
@@ -146,54 +170,54 @@ export interface GateQueueSnapshot {
146
170
  all?: Array<Record<string, unknown>>;
147
171
  }
148
172
 
149
- export interface MultiAgentStatusSummary {
150
- path: string | null;
151
- enabled: boolean;
152
- runId: string | null;
153
- mode: string | null;
173
+ export interface MultiAgentStatusSummary {
174
+ path: string | null;
175
+ enabled: boolean;
176
+ runId: string | null;
177
+ mode: string | null;
154
178
  workspaceIsolationEnforced: boolean;
155
179
  agents: Array<Record<string, unknown>>;
156
- ownership: Array<Record<string, unknown>>;
157
- orphanReassignments: Array<Record<string, unknown>>;
158
- handoffs: Array<Record<string, unknown>>;
159
- arbitrationResults: Array<Record<string, unknown>>;
160
- summary?: Record<string, unknown> | null;
161
- }
162
-
163
- export type WorkspaceMode = 'product_package' | 'oxe_project';
164
-
165
- export interface ReleaseManifest {
166
- schema_version: number;
167
- generated_at: string;
168
- project_root: string;
169
- package_root: string;
170
- release_contract: Record<string, unknown>;
171
- versions: Record<string, unknown>;
172
- runtime_compiled: { path: string; ok: boolean };
173
- canonical_source?: Record<string, unknown>;
174
- semantics?: Record<string, unknown>;
175
- wrappers: Record<string, unknown>;
176
- reports: Record<string, unknown>;
177
- }
178
-
179
- export interface ReleaseConsistencyResult {
180
- ok: boolean;
181
- blockers: string[];
182
- warnings: string[];
183
- manifest: ReleaseManifest;
184
- manifestPath: string;
185
- }
186
-
187
- export interface RuntimeSmokeReport {
188
- path: string;
189
- present: boolean;
190
- ok: boolean;
191
- total: number;
192
- failures: string[];
193
- missingRequired: string[];
194
- results: Array<Record<string, unknown>>;
195
- raw: Record<string, unknown> | null;
196
- }
180
+ ownership: Array<Record<string, unknown>>;
181
+ orphanReassignments: Array<Record<string, unknown>>;
182
+ handoffs: Array<Record<string, unknown>>;
183
+ arbitrationResults: Array<Record<string, unknown>>;
184
+ summary?: Record<string, unknown> | null;
185
+ }
186
+
187
+ export type WorkspaceMode = 'product_package' | 'oxe_project';
188
+
189
+ export interface ReleaseManifest {
190
+ schema_version: number;
191
+ generated_at: string;
192
+ project_root: string;
193
+ package_root: string;
194
+ release_contract: Record<string, unknown>;
195
+ versions: Record<string, unknown>;
196
+ runtime_compiled: { path: string; ok: boolean };
197
+ canonical_source?: Record<string, unknown>;
198
+ semantics?: Record<string, unknown>;
199
+ wrappers: Record<string, unknown>;
200
+ reports: Record<string, unknown>;
201
+ }
202
+
203
+ export interface ReleaseConsistencyResult {
204
+ ok: boolean;
205
+ blockers: string[];
206
+ warnings: string[];
207
+ manifest: ReleaseManifest;
208
+ manifestPath: string;
209
+ }
210
+
211
+ export interface RuntimeSmokeReport {
212
+ path: string;
213
+ present: boolean;
214
+ ok: boolean;
215
+ total: number;
216
+ failures: string[];
217
+ missingRequired: string[];
218
+ results: Array<Record<string, unknown>>;
219
+ raw: Record<string, unknown> | null;
220
+ }
197
221
 
198
222
  export interface PolicyDecisionSummary {
199
223
  total: number;
@@ -229,67 +253,67 @@ export interface AuditSummary {
229
253
  actions: Record<string, number>;
230
254
  }
231
255
 
232
- export interface PromotionSummary {
233
- status: string | null;
234
- targetKind: string | null;
235
- remote: string | null;
236
- targetRef: string | null;
237
- prUrl: string | null;
238
- prNumber: number | null;
239
- coveragePercent: number | null;
240
- reasons: string[];
241
- path: string;
242
- }
243
-
244
- export interface ExecutionImplementationPackSummary {
245
- path: string | null;
246
- exists: boolean;
247
- parseError: string | null;
248
- ready: boolean;
249
- tasks: Array<Record<string, unknown>>;
250
- taskCount: number;
251
- mutatingTasks: number;
252
- criticalGaps: string[];
253
- }
254
-
255
- export interface ExecutionReferenceAnchorsSummary {
256
- path: string | null;
257
- exists: boolean;
258
- ready: boolean;
259
- anchors: Array<Record<string, unknown>>;
260
- missingCriticalCount: number;
261
- staleCount: number;
262
- criticalGaps: string[];
263
- }
264
-
265
- export interface ExecutionFixturePackSummary {
266
- path: string | null;
267
- exists: boolean;
268
- parseError: string | null;
269
- ready: boolean;
270
- fixtures: Array<Record<string, unknown>>;
271
- fixtureCount: number;
272
- criticalGaps: string[];
273
- }
274
-
275
- export interface ExecutionRationalitySummary {
276
- applicable: boolean;
277
- planTaskCount: number;
278
- externalReferenceCount: number;
279
- implementationPackReady: boolean;
280
- referenceAnchorsReady: boolean;
281
- fixturePackReady: boolean;
282
- executionRationalityReady: boolean;
283
- criticalExecutionGaps: string[];
284
- implementationPack: ExecutionImplementationPackSummary;
285
- referenceAnchors: ExecutionReferenceAnchorsSummary;
286
- fixturePack: ExecutionFixturePackSummary;
287
- }
256
+ export interface PromotionSummary {
257
+ status: string | null;
258
+ targetKind: string | null;
259
+ remote: string | null;
260
+ targetRef: string | null;
261
+ prUrl: string | null;
262
+ prNumber: number | null;
263
+ coveragePercent: number | null;
264
+ reasons: string[];
265
+ path: string;
266
+ }
267
+
268
+ export interface ExecutionImplementationPackSummary {
269
+ path: string | null;
270
+ exists: boolean;
271
+ parseError: string | null;
272
+ ready: boolean;
273
+ tasks: Array<Record<string, unknown>>;
274
+ taskCount: number;
275
+ mutatingTasks: number;
276
+ criticalGaps: string[];
277
+ }
278
+
279
+ export interface ExecutionReferenceAnchorsSummary {
280
+ path: string | null;
281
+ exists: boolean;
282
+ ready: boolean;
283
+ anchors: Array<Record<string, unknown>>;
284
+ missingCriticalCount: number;
285
+ staleCount: number;
286
+ criticalGaps: string[];
287
+ }
288
+
289
+ export interface ExecutionFixturePackSummary {
290
+ path: string | null;
291
+ exists: boolean;
292
+ parseError: string | null;
293
+ ready: boolean;
294
+ fixtures: Array<Record<string, unknown>>;
295
+ fixtureCount: number;
296
+ criticalGaps: string[];
297
+ }
298
+
299
+ export interface ExecutionRationalitySummary {
300
+ applicable: boolean;
301
+ planTaskCount: number;
302
+ externalReferenceCount: number;
303
+ implementationPackReady: boolean;
304
+ referenceAnchorsReady: boolean;
305
+ fixturePackReady: boolean;
306
+ executionRationalityReady: boolean;
307
+ criticalExecutionGaps: string[];
308
+ implementationPack: ExecutionImplementationPackSummary;
309
+ referenceAnchors: ExecutionReferenceAnchorsSummary;
310
+ fixturePack: ExecutionFixturePackSummary;
311
+ }
288
312
 
289
313
  /** Relatório retornado por `health.buildHealthReport` e incluído em `runDoctorChecks`.healthReport. */
290
- export interface OxeHealthReport {
291
- workspaceMode?: WorkspaceMode;
292
- configPath: string | null;
314
+ export interface OxeHealthReport {
315
+ workspaceMode?: WorkspaceMode;
316
+ configPath: string | null;
293
317
  configParseError: string | null;
294
318
  unknownConfigKeys: string[];
295
319
  typeErrors: string[];
@@ -310,16 +334,16 @@ export interface OxeHealthReport {
310
334
  copilotWarn?: string[];
311
335
  copilot?: CopilotIntegrationReport | null;
312
336
  summaryGapWarn: string | null;
313
- specWarn: string[];
314
- planWarn: string[];
315
- planSelfEvaluation?: Record<string, unknown> | null;
316
- implementationPackReady?: boolean;
317
- referenceAnchorsReady?: boolean;
318
- fixturePackReady?: boolean;
319
- executionRationalityReady?: boolean;
320
- criticalExecutionGaps?: string[];
321
- executionRationality?: ExecutionRationalitySummary | null;
322
- planReviewStatus?: string | null;
337
+ specWarn: string[];
338
+ planWarn: string[];
339
+ planSelfEvaluation?: Record<string, unknown> | null;
340
+ implementationPackReady?: boolean;
341
+ referenceAnchorsReady?: boolean;
342
+ fixturePackReady?: boolean;
343
+ executionRationalityReady?: boolean;
344
+ criticalExecutionGaps?: string[];
345
+ executionRationality?: ExecutionRationalitySummary | null;
346
+ planReviewStatus?: string | null;
323
347
  activeRun?: Record<string, unknown> | null;
324
348
  eventsSummary?: Record<string, unknown> | null;
325
349
  memoryLayers?: Record<string, unknown> | null;
@@ -339,10 +363,10 @@ export interface OxeHealthReport {
339
363
  contextWarn?: string[];
340
364
  semanticsWarn?: string[];
341
365
  contextPacks?: Record<string, ContextPackSummary>;
342
- contextQuality?: ContextQualitySummary;
343
- semanticsDrift?: SemanticsDriftSummary;
344
- releaseReadiness?: ReleaseConsistencyResult | null;
345
- packFreshness?: Record<string, PackFreshness>;
366
+ contextQuality?: ContextQualitySummary;
367
+ semanticsDrift?: SemanticsDriftSummary;
368
+ releaseReadiness?: ReleaseConsistencyResult | null;
369
+ packFreshness?: Record<string, PackFreshness>;
346
370
  activeSummaryRefs?: { project: string | null; session: string | null; phase: string | null };
347
371
  scanFocusGlobs?: unknown;
348
372
  scanIgnoreGlobs?: unknown;
@@ -673,12 +697,12 @@ export interface OxeSdk {
673
697
  readMinNode: (packageRoot: string) => number;
674
698
 
675
699
  /** Parsing de artefatos OXE. */
676
- parsePlan: (planMd: string) => ParsedPlan;
677
- parseHypotheses: (planText: string) => CriticalHypothesis[];
678
- parseConfidenceVector: (planText: string) => ConfidenceVector | null;
679
- parseExecutionPlanTasks: (planPath: string | null) => Array<Record<string, unknown>>;
680
- parseSpec: (specMd: string) => ParsedSpec;
681
- parseState: (stateMd: string) => ParsedState;
700
+ parsePlan: (planMd: string) => ParsedPlan;
701
+ parseHypotheses: (planText: string) => CriticalHypothesis[];
702
+ parseConfidenceVector: (planText: string) => ConfidenceVector | null;
703
+ parseExecutionPlanTasks: (planPath: string | null) => Array<Record<string, unknown>>;
704
+ parseSpec: (specMd: string) => ParsedSpec;
705
+ parseState: (stateMd: string) => ParsedState;
682
706
  validateDecisionFidelity: (discussMd: string, planMd: string) => DecisionFidelityResult;
683
707
  parseLessonsMetrics: (metricsJson: string) => LessonMetric[];
684
708
  updateLessonMetric: (metrics: LessonMetric[], lessonId: string, outcome: LessonOutcome) => LessonMetric[];
@@ -695,13 +719,15 @@ export interface OxeSdk {
695
719
  timeoutMs?: number;
696
720
  }) => Promise<Record<string, unknown>>;
697
721
 
698
- health: {
699
- loadOxeConfigMerged: (targetProject: string) => { config: Record<string, unknown>; path: string | null; parseError: string | null; sources: { system: string | null; user: string | null; project: string | null } };
700
- validateConfigShape: (cfg: Record<string, unknown>) => { unknownKeys: string[]; typeErrors: string[] };
701
- buildHealthReport: (target: string) => OxeHealthReport;
702
- detectWorkspaceMode: (target: string) => { workspaceMode: WorkspaceMode; packageName: string | null; canonicalTreePresent: boolean; commandsTreePresent: boolean };
703
- shouldSuppressExecutionWorkspaceGates: (workspaceMode: WorkspaceMode, phase?: string | null, activeSession?: string | null, activeRun?: Record<string, unknown> | null) => boolean;
704
- suggestNextStep: (target: string, cfg?: { discuss_before_plan?: boolean }) => OxeNextSuggestion;
722
+ health: {
723
+ loadOxeConfigMerged: (targetProject: string) => { config: Record<string, unknown>; path: string | null; parseError: string | null; sources: { system: string | null; user: string | null; project: string | null } };
724
+ validateConfigShape: (cfg: Record<string, unknown>) => { unknownKeys: string[]; typeErrors: string[] };
725
+ buildHealthReport: (target: string) => OxeHealthReport;
726
+ buildStatusSummary: (report: OxeHealthReport) => OxeStatusSummary;
727
+ agentSkillsReport: (target: string) => AgentSkillsStatus[];
728
+ detectWorkspaceMode: (target: string) => { workspaceMode: WorkspaceMode; packageName: string | null; canonicalTreePresent: boolean; commandsTreePresent: boolean };
729
+ shouldSuppressExecutionWorkspaceGates: (workspaceMode: WorkspaceMode, phase?: string | null, activeSession?: string | null, activeRun?: Record<string, unknown> | null) => boolean;
730
+ suggestNextStep: (target: string, cfg?: { discuss_before_plan?: boolean }) => OxeNextSuggestion;
705
731
  oxePaths: (target: string) => Record<string, string>;
706
732
  parseStatePhase: (stateText: string) => string | null;
707
733
  parseLastScanDate: (stateText: string) => Date | null;
@@ -714,12 +740,12 @@ export interface OxeSdk {
714
740
  copilotIntegrationReport: (target: string) => CopilotIntegrationReport;
715
741
  planAgentsWarnings: (target: string) => string[];
716
742
  phaseCoherenceWarnings: (phase: string, paths: Record<string, string>) => string[];
717
- specSectionWarnings: (specPath: string, requiredHeadings: string[]) => string[];
718
- planWaveWarningsFixed: (planPath: string, maxPerWave: number) => string[];
719
- planTaskAceiteWarnings: (planPath: string) => string[];
720
- buildExecutionRationality: (paths?: Record<string, string | null | undefined>) => ExecutionRationalitySummary;
721
- executionRationalityWarningsFromSummary: (summary: ExecutionRationalitySummary) => string[];
722
- verifyGapsWithoutSummaryWarning: (verifyPath: string, summaryPath: string) => string | null;
743
+ specSectionWarnings: (specPath: string, requiredHeadings: string[]) => string[];
744
+ planWaveWarningsFixed: (planPath: string, maxPerWave: number) => string[];
745
+ planTaskAceiteWarnings: (planPath: string) => string[];
746
+ buildExecutionRationality: (paths?: Record<string, string | null | undefined>) => ExecutionRationalitySummary;
747
+ executionRationalityWarningsFromSummary: (summary: ExecutionRationalitySummary) => string[];
748
+ verifyGapsWithoutSummaryWarning: (verifyPath: string, summaryPath: string) => string | null;
723
749
  expandExecutionProfile: (profile: string) => Record<string, unknown>;
724
750
  ALLOWED_CONFIG_KEYS: string[];
725
751
  EXECUTION_PROFILES: string[];
@@ -779,27 +805,27 @@ export interface OxeSdk {
779
805
  installNpmPlugin: (projectRoot: string, pkgName: string, version?: string) => { ok: boolean; path: string; error: string };
780
806
  };
781
807
 
782
- dashboard: {
783
- loadDashboardContext: (projectRoot: string, opts?: { activeSession?: string | null }) => Record<string, unknown>;
784
- savePlanReviewStatus: (projectRoot: string, input?: Record<string, unknown>) => Record<string, unknown>;
785
- addPlanReviewComment: (projectRoot: string, input?: Record<string, unknown>) => Record<string, unknown>;
786
- updatePlanReviewCommentStatus: (projectRoot: string, input?: Record<string, unknown>) => Record<string, unknown> | null;
787
- };
788
-
789
- release: {
790
- REQUIRED_RUNTIMES: string[];
791
- WRAPPER_TARGETS: Array<Record<string, unknown>>;
792
- releasePaths: (projectRoot: string) => Record<string, string>;
793
- collectWrapperHashes: (projectRoot: string) => Record<string, unknown>;
794
- loadRuntimeSmokeReport: (projectRoot: string) => RuntimeSmokeReport;
795
- loadRecoveryFixtureReport: (projectRoot: string) => RuntimeSmokeReport;
796
- loadMultiAgentSoakReport: (projectRoot: string) => RuntimeSmokeReport;
797
- buildReleaseManifest: (projectRoot: string, options?: Record<string, unknown>) => ReleaseManifest;
798
- inspectCanonicalSource: (projectRoot: string) => Record<string, unknown>;
799
- evaluateReleaseManifest: (manifest: ReleaseManifest, options?: Record<string, unknown>) => ReleaseConsistencyResult;
800
- inspectReleaseReadiness: (projectRoot: string, options?: Record<string, unknown>) => ReleaseConsistencyResult;
801
- checkReleaseConsistency: (projectRoot: string, options?: Record<string, unknown>) => ReleaseConsistencyResult;
802
- };
808
+ dashboard: {
809
+ loadDashboardContext: (projectRoot: string, opts?: { activeSession?: string | null }) => Record<string, unknown>;
810
+ savePlanReviewStatus: (projectRoot: string, input?: Record<string, unknown>) => Record<string, unknown>;
811
+ addPlanReviewComment: (projectRoot: string, input?: Record<string, unknown>) => Record<string, unknown>;
812
+ updatePlanReviewCommentStatus: (projectRoot: string, input?: Record<string, unknown>) => Record<string, unknown> | null;
813
+ };
814
+
815
+ release: {
816
+ REQUIRED_RUNTIMES: string[];
817
+ WRAPPER_TARGETS: Array<Record<string, unknown>>;
818
+ releasePaths: (projectRoot: string) => Record<string, string>;
819
+ collectWrapperHashes: (projectRoot: string) => Record<string, unknown>;
820
+ loadRuntimeSmokeReport: (projectRoot: string) => RuntimeSmokeReport;
821
+ loadRecoveryFixtureReport: (projectRoot: string) => RuntimeSmokeReport;
822
+ loadMultiAgentSoakReport: (projectRoot: string) => RuntimeSmokeReport;
823
+ buildReleaseManifest: (projectRoot: string, options?: Record<string, unknown>) => ReleaseManifest;
824
+ inspectCanonicalSource: (projectRoot: string) => Record<string, unknown>;
825
+ evaluateReleaseManifest: (manifest: ReleaseManifest, options?: Record<string, unknown>) => ReleaseConsistencyResult;
826
+ inspectReleaseReadiness: (projectRoot: string, options?: Record<string, unknown>) => ReleaseConsistencyResult;
827
+ checkReleaseConsistency: (projectRoot: string, options?: Record<string, unknown>) => ReleaseConsistencyResult;
828
+ };
803
829
 
804
830
  context: ContextAPI;
805
831
  runtimeSemantics: RuntimeSemanticsAPI;
@@ -0,0 +1,130 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "OXE Swarm Run",
4
+ "description": "Schema para SWARM-RUN.json — estado de um Swarm Mode run",
5
+ "type": "object",
6
+ "required": ["run_id", "started_at", "status", "objective", "agents"],
7
+ "properties": {
8
+ "run_id": {
9
+ "type": "string",
10
+ "pattern": "^swarm-\\d{8}-\\d{3}$",
11
+ "description": "ID único do swarm run (swarm-YYYYMMDD-NNN)"
12
+ },
13
+ "started_at": {
14
+ "type": "string",
15
+ "format": "date-time"
16
+ },
17
+ "completed_at": {
18
+ "type": ["string", "null"],
19
+ "format": "date-time"
20
+ },
21
+ "status": {
22
+ "type": "string",
23
+ "enum": ["running", "paused", "completed", "partial", "failed", "aborted"]
24
+ },
25
+ "objective": {
26
+ "type": "string",
27
+ "description": "Objetivo em linguagem natural fornecido pelo usuário"
28
+ },
29
+ "intent_tags": {
30
+ "type": "array",
31
+ "items": {"type": "string"},
32
+ "description": "Domínios detectados: backend, frontend, storage, auth, infra, test, docs, config"
33
+ },
34
+ "memory_applied": {
35
+ "type": "boolean"
36
+ },
37
+ "memory_sources": {
38
+ "type": "array",
39
+ "items": {"type": "string"},
40
+ "description": "Caminhos dos artefatos de memória injetados"
41
+ },
42
+ "agents": {
43
+ "type": "object",
44
+ "properties": {
45
+ "scout": {
46
+ "$ref": "#/definitions/AgentStatus"
47
+ },
48
+ "coordinator": {
49
+ "$ref": "#/definitions/AgentStatus"
50
+ },
51
+ "builders": {
52
+ "type": "array",
53
+ "items": {
54
+ "allOf": [
55
+ {"$ref": "#/definitions/AgentStatus"},
56
+ {
57
+ "properties": {
58
+ "id": {"type": "string"},
59
+ "persona": {"type": "string"},
60
+ "task_ids": {"type": "array", "items": {"type": "string"}},
61
+ "model_hint": {"type": "string", "enum": ["fast", "balanced", "powerful"]}
62
+ }
63
+ }
64
+ ]
65
+ }
66
+ },
67
+ "reviewer": {
68
+ "$ref": "#/definitions/AgentStatus"
69
+ },
70
+ "verifier": {
71
+ "$ref": "#/definitions/AgentStatus"
72
+ }
73
+ }
74
+ },
75
+ "task_graph": {
76
+ "type": ["object", "null"],
77
+ "description": "Referência ao TASK-GRAPH.json após decomposição pelo coordinator"
78
+ },
79
+ "file_ownership": {
80
+ "type": ["object", "null"],
81
+ "description": "Referência ao FILE-OWNERSHIP.json após atribuição"
82
+ },
83
+ "waves": {
84
+ "type": "array",
85
+ "items": {
86
+ "type": "object",
87
+ "properties": {
88
+ "wave": {"type": "integer"},
89
+ "task_ids": {"type": "array", "items": {"type": "string"}},
90
+ "status": {"type": "string", "enum": ["pending", "running", "done", "failed"]}
91
+ }
92
+ }
93
+ },
94
+ "quality_gates": {
95
+ "type": "array",
96
+ "items": {
97
+ "type": "object",
98
+ "properties": {
99
+ "id": {"type": "string"},
100
+ "condition": {"type": "string"},
101
+ "type": {"type": "string", "enum": ["auto", "human"]},
102
+ "status": {"type": "string", "enum": ["pending", "passed", "failed", "waived"]},
103
+ "resolved_at": {"type": ["string", "null"]},
104
+ "resolved_by": {"type": ["string", "null"]}
105
+ }
106
+ }
107
+ },
108
+ "learning": {
109
+ "type": "object",
110
+ "properties": {
111
+ "distill_status": {"type": "string", "enum": ["pending", "done", "skipped"]},
112
+ "lessons_added": {"type": "integer"},
113
+ "skill_candidates": {"type": "integer"}
114
+ }
115
+ }
116
+ },
117
+ "definitions": {
118
+ "AgentStatus": {
119
+ "type": "object",
120
+ "properties": {
121
+ "status": {
122
+ "type": "string",
123
+ "enum": ["pending", "running", "done", "failed", "skipped"]
124
+ },
125
+ "started_at": {"type": ["string", "null"]},
126
+ "completed_at": {"type": ["string", "null"]}
127
+ }
128
+ }
129
+ }
130
+ }