opencode-plugin-flow 4.4.0 → 5.1.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/README.md +60 -43
  3. package/dist/application/errors.d.ts +5 -0
  4. package/dist/application/flow-service.d.ts +339 -0
  5. package/dist/application/ports/evidence-artifact-store.d.ts +28 -0
  6. package/dist/application/ports/session-repository.d.ts +18 -0
  7. package/dist/application/ports/source-identity.d.ts +61 -0
  8. package/dist/application/replay/canonical-json.d.ts +7 -0
  9. package/dist/application/replay/contract.d.ts +2007 -0
  10. package/dist/application/replay/engine.d.ts +101 -0
  11. package/dist/application/replay/index.d.ts +7 -0
  12. package/dist/application/replay/privacy.d.ts +14 -0
  13. package/dist/{runtime → application}/schema.d.ts +1176 -370
  14. package/dist/cli.js +295 -2721
  15. package/dist/cli.js.map +7 -6
  16. package/dist/config-shared.d.ts +28 -14
  17. package/dist/config.d.ts +1 -1
  18. package/dist/distribution/legacy-cleanup.d.ts +25 -0
  19. package/dist/domain/feature-id.d.ts +3 -0
  20. package/dist/domain/limits.d.ts +1 -0
  21. package/dist/domain/orchestration-policy.d.ts +27 -0
  22. package/dist/domain/session.d.ts +355 -0
  23. package/dist/domain/transitions.d.ts +163 -0
  24. package/dist/domain/validation-command.d.ts +8 -0
  25. package/dist/guidance/catalog.d.ts +18 -0
  26. package/dist/guidance/ids.d.ts +4 -0
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +4495 -1817
  29. package/dist/index.js.map +30 -18
  30. package/dist/infrastructure/fs/evidence-artifact-store.d.ts +5 -0
  31. package/dist/infrastructure/fs/session-repository.d.ts +2 -0
  32. package/dist/infrastructure/fs/source-identity.d.ts +26 -0
  33. package/dist/infrastructure/fs/workspace-flow-service.d.ts +9 -0
  34. package/dist/{runtime → infrastructure/fs}/workspace.d.ts +12 -15
  35. package/dist/infrastructure/system/transition-environment.d.ts +2 -0
  36. package/dist/platform/opencode/config.d.ts +2 -0
  37. package/dist/{adapters → platform}/opencode/plugin.d.ts +1 -1
  38. package/dist/{adapters → platform}/opencode/sdk.d.ts +0 -1
  39. package/dist/platform/opencode/tools.d.ts +6 -0
  40. package/dist/prompt-model-evaluation.d.ts +19 -30
  41. package/dist/prompt-quality.d.ts +1 -1
  42. package/dist/version.d.ts +1 -0
  43. package/package.json +18 -11
  44. package/dist/adapters/opencode/config.d.ts +0 -3
  45. package/dist/adapters/opencode/tools.d.ts +0 -322
  46. package/dist/distribution/flow-skill-definitions.d.ts +0 -9
  47. package/dist/distribution/sync.d.ts +0 -69
  48. package/dist/runtime/api.d.ts +0 -211
  49. package/dist/runtime/time.d.ts +0 -2
  50. package/dist/runtime/transitions.d.ts +0 -230
  51. /package/dist/{runtime/json/strict-object.d.ts → infrastructure/fs/strict-json-object.d.ts} +0 -0
  52. /package/dist/{adapters → platform}/opencode/logging.d.ts +0 -0
@@ -1,69 +0,0 @@
1
- type FlowLog = (level: "info" | "warn" | "error", message: string) => void;
2
- export type FlowSkillSyncAction = "installed" | "updated" | "updated_with_backup" | "marker_updated" | "unchanged" | "skipped_foreign";
3
- export type FlowSkillSyncResult = {
4
- name: string;
5
- action: FlowSkillSyncAction;
6
- backupPaths?: string[];
7
- };
8
- export declare const CHANGED_SYNC_ACTIONS: readonly FlowSkillSyncAction[];
9
- export declare function isChangedSyncAction(action: FlowSkillSyncAction): boolean;
10
- export type FlowSkillSyncHealth = {
11
- status: "ok" | "restart_required" | "action_required" | "error";
12
- version: string;
13
- root: string;
14
- checkedAt: string;
15
- expectedSkills: string[];
16
- results: FlowSkillSyncResult[];
17
- changedSkills: string[];
18
- actionRequiredSkills: string[];
19
- restartRequired: boolean;
20
- summary: string;
21
- error?: string;
22
- };
23
- export type FlowSkillSetupStatus = {
24
- status: "restart_required" | "action_required" | "sync_failed";
25
- summary: string;
26
- version: string;
27
- root: string;
28
- changed?: string[];
29
- actionRequired?: string[];
30
- error?: string;
31
- };
32
- export type FlowSkillDoctorSkill = {
33
- name: string;
34
- path: string;
35
- status: "ok" | "missing" | "foreign" | "incomplete" | "edited" | "outdated";
36
- markerVersion: string | null;
37
- missingFiles: string[];
38
- editedFiles: string[];
39
- outdatedFiles: string[];
40
- backupFiles: string[];
41
- };
42
- export type FlowSkillDoctorReport = {
43
- status: "ok" | "sync_required" | "action_required";
44
- version: string;
45
- root: string;
46
- expectedSkills: string[];
47
- skills: FlowSkillDoctorSkill[];
48
- syncRequiredSkills: string[];
49
- actionRequiredSkills: string[];
50
- unmanagedFlowSkills: string[];
51
- };
52
- export declare function resolveFlowSkillsRoot(home?: string): string;
53
- export declare function getLatestFlowSkillSyncHealth(): FlowSkillSyncHealth | null;
54
- export declare function formatFlowDoctorCommand(version: string): string;
55
- export declare function getFlowSkillSetupStatus(health?: FlowSkillSyncHealth | null): FlowSkillSetupStatus | null;
56
- export declare function formatFlowSkillSetupWarning(health?: FlowSkillSyncHealth | null): string | null;
57
- export declare function resolveFlowPluginVersion(): string;
58
- export declare function syncFlowSkills(version: string, home?: string): Promise<FlowSkillSyncResult[]>;
59
- export declare function runFlowSkillSync(version: string, log: FlowLog, home?: string): Promise<void>;
60
- export declare function inspectFlowSkillInstall(version?: string, home?: string): Promise<FlowSkillDoctorReport>;
61
- export declare function formatFlowSkillDoctor(report: FlowSkillDoctorReport): string;
62
- export declare function uninstallFlowSkills(home?: string, options?: {
63
- dryRun?: boolean;
64
- }): Promise<{
65
- removed: string[];
66
- kept: string[];
67
- removedBackups: string[];
68
- }>;
69
- export {};
@@ -1,211 +0,0 @@
1
- import { z } from "zod";
2
- export type RuntimeResponse = Record<string, unknown>;
3
- export declare const FlowPlanSaveSchema: z.ZodObject<{
4
- goal: z.ZodOptional<z.ZodString>;
5
- plan: z.ZodOptional<z.ZodObject<{
6
- summary: z.ZodString;
7
- overview: z.ZodString;
8
- requirements: z.ZodDefault<z.ZodArray<z.ZodString>>;
9
- decisions: z.ZodDefault<z.ZodArray<z.ZodString>>;
10
- finalReviewPolicy: z.ZodOptional<z.ZodEnum<{
11
- broad: "broad";
12
- detailed: "detailed";
13
- }>>;
14
- features: z.ZodArray<z.ZodObject<{
15
- summary: z.ZodString;
16
- id: z.ZodString;
17
- title: z.ZodString;
18
- status: z.ZodOptional<z.ZodEnum<{
19
- pending: "pending";
20
- in_progress: "in_progress";
21
- completed: "completed";
22
- blocked: "blocked";
23
- }>>;
24
- reviewDepth: z.ZodOptional<z.ZodEnum<{
25
- quick: "quick";
26
- standard: "standard";
27
- detailed: "detailed";
28
- }>>;
29
- targets: z.ZodOptional<z.ZodArray<z.ZodString>>;
30
- validation: z.ZodOptional<z.ZodArray<z.ZodString>>;
31
- dependsOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
32
- }, z.core.$strict>>;
33
- }, z.core.$strict>>;
34
- }, z.core.$strict>;
35
- export declare const FlowRunStartSchema: z.ZodObject<{
36
- featureId: z.ZodOptional<z.ZodString>;
37
- phaseBoundaryAck: z.ZodOptional<z.ZodBoolean>;
38
- }, z.core.$strict>;
39
- export declare const FlowFeatureResetSchema: z.ZodObject<{
40
- featureId: z.ZodString;
41
- }, z.core.$strict>;
42
- export declare const FlowSessionCloseSchema: z.ZodObject<{
43
- kind: z.ZodEnum<{
44
- completed: "completed";
45
- deferred: "deferred";
46
- abandoned: "abandoned";
47
- }>;
48
- summary: z.ZodOptional<z.ZodString>;
49
- }, z.core.$strict>;
50
- export declare const FlowFeatureCompleteToolSchema: z.ZodObject<{
51
- status: z.ZodEnum<{
52
- ok: "ok";
53
- needs_input: "needs_input";
54
- }>;
55
- featureId: z.ZodString;
56
- summary: z.ZodString;
57
- artifactsChanged: z.ZodOptional<z.ZodArray<z.ZodObject<{
58
- path: z.ZodString;
59
- }, z.core.$strict>>>;
60
- validationRun: z.ZodOptional<z.ZodArray<z.ZodObject<{
61
- command: z.ZodString;
62
- status: z.ZodEnum<{
63
- passed: "passed";
64
- failed: "failed";
65
- }>;
66
- summary: z.ZodString;
67
- }, z.core.$strict>>>;
68
- validationScope: z.ZodOptional<z.ZodEnum<{
69
- targeted: "targeted";
70
- broad: "broad";
71
- }>>;
72
- featureReviewDepth: z.ZodOptional<z.ZodEnum<{
73
- quick: "quick";
74
- standard: "standard";
75
- detailed: "detailed";
76
- }>>;
77
- featureReview: z.ZodOptional<z.ZodObject<{
78
- status: z.ZodEnum<{
79
- passed: "passed";
80
- failed: "failed";
81
- }>;
82
- summary: z.ZodString;
83
- blockingFindings: z.ZodDefault<z.ZodArray<z.ZodObject<{
84
- summary: z.ZodString;
85
- severity: z.ZodDefault<z.ZodEnum<{
86
- blocking: "blocking";
87
- advisory: "advisory";
88
- }>>;
89
- }, z.core.$strict>>>;
90
- }, z.core.$strict>>;
91
- finalReview: z.ZodOptional<z.ZodObject<{
92
- status: z.ZodEnum<{
93
- passed: "passed";
94
- failed: "failed";
95
- }>;
96
- summary: z.ZodString;
97
- blockingFindings: z.ZodDefault<z.ZodArray<z.ZodObject<{
98
- summary: z.ZodString;
99
- severity: z.ZodDefault<z.ZodEnum<{
100
- blocking: "blocking";
101
- advisory: "advisory";
102
- }>>;
103
- }, z.core.$strict>>>;
104
- reviewDepth: z.ZodEnum<{
105
- broad: "broad";
106
- detailed: "detailed";
107
- }>;
108
- }, z.core.$strict>>;
109
- outcome: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
110
- kind: z.ZodDefault<z.ZodEnum<{
111
- completed: "completed";
112
- blocked: "blocked";
113
- needs_input: "needs_input";
114
- replan_required: "replan_required";
115
- }>>;
116
- summary: z.ZodOptional<z.ZodString>;
117
- resolutionHint: z.ZodOptional<z.ZodString>;
118
- }, z.core.$strict>, z.ZodObject<{
119
- kind: z.ZodDefault<z.ZodEnum<{
120
- blocked: "blocked";
121
- needs_input: "needs_input";
122
- replan_required: "replan_required";
123
- }>>;
124
- summary: z.ZodString;
125
- resolutionHint: z.ZodOptional<z.ZodString>;
126
- }, z.core.$strict>]>>;
127
- orchestrationPasses: z.ZodOptional<z.ZodArray<z.ZodObject<{
128
- id: z.ZodString;
129
- kind: z.ZodEnum<{
130
- validation: "validation";
131
- audit: "audit";
132
- candidate: "candidate";
133
- discovery: "discovery";
134
- review: "review";
135
- verification: "verification";
136
- "implementation-decision": "implementation-decision";
137
- }>;
138
- decision: z.ZodOptional<z.ZodEnum<{
139
- parallel: "parallel";
140
- serial: "serial";
141
- "candidate-exact-path": "candidate-exact-path";
142
- "candidate-worktree": "candidate-worktree";
143
- tournament: "tournament";
144
- skipped: "skipped";
145
- }>>;
146
- decisionReason: z.ZodOptional<z.ZodString>;
147
- candidateEligibility: z.ZodDefault<z.ZodEnum<{
148
- eligible: "eligible";
149
- not_eligible: "not_eligible";
150
- unknown: "unknown";
151
- }>>;
152
- candidateDecision: z.ZodOptional<z.ZodEnum<{
153
- skipped: "skipped";
154
- used: "used";
155
- serial_required: "serial_required";
156
- }>>;
157
- decisionFactors: z.ZodDefault<z.ZodArray<z.ZodEnum<{
158
- shared_state: "shared_state";
159
- overlapping_files: "overlapping_files";
160
- small_slice: "small_slice";
161
- needs_manager_judgment: "needs_manager_judgment";
162
- independent_surface: "independent_surface";
163
- validation_available: "validation_available";
164
- }>>>;
165
- modes: z.ZodDefault<z.ZodArray<z.ZodEnum<{
166
- evidence: "evidence";
167
- validation: "validation";
168
- audit: "audit";
169
- verifier: "verifier";
170
- review: "review";
171
- "candidate-implementation": "candidate-implementation";
172
- }>>>;
173
- workerCount: z.ZodDefault<z.ZodNumber>;
174
- candidateWorkerCount: z.ZodDefault<z.ZodNumber>;
175
- verifierWorkerCount: z.ZodDefault<z.ZodNumber>;
176
- sliceIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
177
- dependsOn: z.ZodDefault<z.ZodArray<z.ZodString>>;
178
- writeScope: z.ZodDefault<z.ZodEnum<{
179
- none: "none";
180
- "manager-serial": "manager-serial";
181
- "exact-path": "exact-path";
182
- "isolated-worktree": "isolated-worktree";
183
- mixed: "mixed";
184
- }>>;
185
- handoffRefs: z.ZodDefault<z.ZodArray<z.ZodString>>;
186
- verificationStatus: z.ZodDefault<z.ZodEnum<{
187
- pending: "pending";
188
- passed: "passed";
189
- failed: "failed";
190
- mixed: "mixed";
191
- "not-needed": "not-needed";
192
- downgraded: "downgraded";
193
- }>>;
194
- outcome: z.ZodDefault<z.ZodEnum<{
195
- accepted: "accepted";
196
- modified: "modified";
197
- rejected: "rejected";
198
- partial: "partial";
199
- "not-covered": "not-covered";
200
- superseded: "superseded";
201
- }>>;
202
- synthesisRef: z.ZodOptional<z.ZodString>;
203
- }, z.core.$strict>>>;
204
- }, z.core.$strict>;
205
- export declare function flowStatus(worktree: string): Promise<RuntimeResponse>;
206
- export declare function flowPlanSave(worktree: string, input: unknown): Promise<RuntimeResponse>;
207
- export declare function flowPlanApprove(worktree: string): Promise<RuntimeResponse>;
208
- export declare function flowRunStart(worktree: string, input: unknown): Promise<RuntimeResponse>;
209
- export declare function flowFeatureComplete(worktree: string, input: unknown): Promise<RuntimeResponse>;
210
- export declare function flowFeatureReset(worktree: string, input: unknown): Promise<RuntimeResponse>;
211
- export declare function flowSessionClose(worktree: string, input: unknown): Promise<RuntimeResponse>;
@@ -1,2 +0,0 @@
1
- export declare function setNowForTests(next: (() => string) | null): void;
2
- export declare function nowIso(): string;
@@ -1,230 +0,0 @@
1
- import { type Feature, type PlanInput, type Session } from "./schema";
2
- export type TransitionResult<T> = {
3
- ok: true;
4
- value: T;
5
- } | {
6
- ok: false;
7
- message: string;
8
- recovery?: string;
9
- session?: Session;
10
- };
11
- export declare function createSession(goal: string): Session;
12
- export declare function applyPlan(session: Session, planInput: PlanInput): TransitionResult<Session>;
13
- export declare function approvePlan(session: Session): TransitionResult<Session>;
14
- export declare function startRun(session: Session, featureId?: string, options?: {
15
- phaseBoundaryAck?: boolean;
16
- }): TransitionResult<{
17
- session: Session;
18
- feature: Feature;
19
- }>;
20
- export declare function completeFeature(session: Session, input: unknown): TransitionResult<Session>;
21
- export declare function resetFeature(session: Session, featureId: string): TransitionResult<Session>;
22
- export declare function closeSession(session: Session, kind: "completed" | "deferred" | "abandoned", summary?: string): TransitionResult<Session>;
23
- export declare function summarizeSession(session: Session | null): {
24
- status: string;
25
- summary: string;
26
- nextAction: string;
27
- statusSummary?: never;
28
- dataNote?: never;
29
- session?: never;
30
- } | {
31
- status: "completed" | "blocked" | "planning" | "ready" | "running";
32
- summary: string;
33
- statusSummary: string;
34
- nextAction: string;
35
- dataNote: string;
36
- session: {
37
- id: string;
38
- goal: string;
39
- status: "completed" | "blocked" | "planning" | "ready" | "running";
40
- approval: "pending" | "approved";
41
- activeFeature: {
42
- id: string;
43
- title: string;
44
- summary: string;
45
- status: "pending" | "in_progress" | "completed" | "blocked";
46
- reviewDepth: "quick" | "standard" | "detailed";
47
- targets: string[];
48
- validation: string[];
49
- dependsOn: string[];
50
- } | null;
51
- nextFeature: {
52
- id: string;
53
- title: string;
54
- summary: string;
55
- status: "pending" | "in_progress" | "completed" | "blocked";
56
- reviewDepth: "quick" | "standard" | "detailed";
57
- targets: string[];
58
- validation: string[];
59
- dependsOn: string[];
60
- } | null;
61
- pendingFeatures: {
62
- id: string;
63
- title: string;
64
- summary: string;
65
- status: "pending" | "in_progress" | "completed" | "blocked";
66
- reviewDepth: "quick" | "standard" | "detailed";
67
- targets: string[];
68
- validation: string[];
69
- dependsOn: string[];
70
- }[];
71
- progress: {
72
- completed: number;
73
- total: number;
74
- remaining: number;
75
- };
76
- features: {
77
- id: string;
78
- title: string;
79
- summary: string;
80
- status: "pending" | "in_progress" | "completed" | "blocked";
81
- reviewDepth: "quick" | "standard" | "detailed";
82
- targets: string[];
83
- validation: string[];
84
- dependsOn: string[];
85
- }[];
86
- budget: {
87
- phaseStartedAt: string;
88
- completedFeaturesSinceBoundary: number;
89
- reviewCount: number;
90
- failedReviewCount: number;
91
- failedReviewAttemptsByFeature: Record<string, number>;
92
- orchestration: {
93
- passCount: number;
94
- workerCount: number;
95
- candidatePassCount: number;
96
- verifierPassCount: number;
97
- candidateEligibleCount: number;
98
- candidateUsedDecisionCount: number;
99
- candidateSerialRequiredDecisionCount: number;
100
- skippedCandidateDecisionCount: number;
101
- recordedPassIds: string[];
102
- latestPasses: {
103
- id: string;
104
- kind: "validation" | "audit" | "candidate" | "discovery" | "review" | "verification" | "implementation-decision";
105
- candidateEligibility: "eligible" | "not_eligible" | "unknown";
106
- decisionFactors: ("shared_state" | "overlapping_files" | "small_slice" | "needs_manager_judgment" | "independent_surface" | "validation_available")[];
107
- modes: ("evidence" | "validation" | "audit" | "verifier" | "review" | "candidate-implementation")[];
108
- workerCount: number;
109
- candidateWorkerCount: number;
110
- verifierWorkerCount: number;
111
- sliceIds: string[];
112
- dependsOn: string[];
113
- writeScope: "none" | "manager-serial" | "exact-path" | "isolated-worktree" | "mixed";
114
- handoffRefs: string[];
115
- verificationStatus: "pending" | "passed" | "failed" | "mixed" | "not-needed" | "downgraded";
116
- outcome: "accepted" | "modified" | "rejected" | "partial" | "not-covered" | "superseded";
117
- decision?: "parallel" | "serial" | "candidate-exact-path" | "candidate-worktree" | "tournament" | "skipped" | undefined;
118
- decisionReason?: string | undefined;
119
- candidateDecision?: "skipped" | "used" | "serial_required" | undefined;
120
- synthesisRef?: string | undefined;
121
- }[];
122
- };
123
- tokenTelemetry: {
124
- note: string | undefined;
125
- source: "host_unavailable" | "reported";
126
- visibleTokens: number | null;
127
- cacheReadTokens: number | null;
128
- nonCacheTokens: number | null;
129
- };
130
- phaseBoundary: {
131
- reason: "feature_limit" | "token_limit" | "review_failure_limit";
132
- summary: string;
133
- resumeInstructions: string;
134
- recordedAt: string;
135
- } | null;
136
- };
137
- resumePacket: {
138
- sessionId: string;
139
- goal: string;
140
- status: "completed" | "blocked" | "planning" | "ready" | "running";
141
- activeFeatureId: string | null;
142
- progress: {
143
- completed: number;
144
- total: number;
145
- };
146
- phaseBoundary: {
147
- reason: "feature_limit" | "token_limit" | "review_failure_limit";
148
- summary: string;
149
- resumeInstructions: string;
150
- recordedAt: string;
151
- };
152
- nextAction: string;
153
- } | null;
154
- closure: {
155
- kind: "completed" | "deferred" | "abandoned";
156
- summary: string;
157
- recordedAt: string;
158
- } | null;
159
- lastError: {
160
- tool: string;
161
- summary: string;
162
- recordedAt: string;
163
- recovery?: string | undefined;
164
- } | null;
165
- latestHistoryEntry: {
166
- featureId: string;
167
- status: "completed" | "blocked" | "needs_input";
168
- summary: string;
169
- recordedAt: string;
170
- artifactsChanged: {
171
- path: string;
172
- }[];
173
- validationRun: {
174
- command: string;
175
- status: "passed" | "failed";
176
- summary: string;
177
- }[];
178
- orchestrationPasses: {
179
- id: string;
180
- kind: "validation" | "audit" | "candidate" | "discovery" | "review" | "verification" | "implementation-decision";
181
- candidateEligibility: "eligible" | "not_eligible" | "unknown";
182
- decisionFactors: ("shared_state" | "overlapping_files" | "small_slice" | "needs_manager_judgment" | "independent_surface" | "validation_available")[];
183
- modes: ("evidence" | "validation" | "audit" | "verifier" | "review" | "candidate-implementation")[];
184
- workerCount: number;
185
- candidateWorkerCount: number;
186
- verifierWorkerCount: number;
187
- sliceIds: string[];
188
- dependsOn: string[];
189
- writeScope: "none" | "manager-serial" | "exact-path" | "isolated-worktree" | "mixed";
190
- handoffRefs: string[];
191
- verificationStatus: "pending" | "passed" | "failed" | "mixed" | "not-needed" | "downgraded";
192
- outcome: "accepted" | "modified" | "rejected" | "partial" | "not-covered" | "superseded";
193
- decision?: "parallel" | "serial" | "candidate-exact-path" | "candidate-worktree" | "tournament" | "skipped" | undefined;
194
- decisionReason?: string | undefined;
195
- candidateDecision?: "skipped" | "used" | "serial_required" | undefined;
196
- synthesisRef?: string | undefined;
197
- }[];
198
- validationScope?: "targeted" | "broad" | undefined;
199
- featureReviewDepth?: "quick" | "standard" | "detailed" | undefined;
200
- featureReview?: {
201
- status: "passed" | "failed";
202
- summary: string;
203
- blockingFindings: {
204
- summary: string;
205
- severity: "blocking" | "advisory";
206
- }[];
207
- } | undefined;
208
- finalReview?: {
209
- status: "passed" | "failed";
210
- summary: string;
211
- blockingFindings: {
212
- summary: string;
213
- severity: "blocking" | "advisory";
214
- }[];
215
- reviewDepth: "broad" | "detailed";
216
- } | undefined;
217
- outcome?: {
218
- kind: "completed" | "blocked" | "needs_input" | "replan_required";
219
- summary?: string | undefined;
220
- resolutionHint?: string | undefined;
221
- } | undefined;
222
- } | null;
223
- historyCount: number;
224
- timestamps: {
225
- createdAt: string;
226
- updatedAt: string;
227
- completedAt: string | null;
228
- };
229
- };
230
- };