diff --git a/contracts/work/long_running.go b/contracts/work/long_running.go new file mode 100644 index 0000000..369b76c --- /dev/null +++ b/contracts/work/long_running.go @@ -0,0 +1,35 @@ +package work + +type LongRunningWorkID string +type LongRunningState string + +const ( + LongRunningProposed LongRunningState = "PROPOSED" + LongRunningRunning LongRunningState = "RUNNING" + LongRunningPaused LongRunningState = "PAUSED" + LongRunningBlocked LongRunningState = "BLOCKED" + LongRunningCompleted LongRunningState = "COMPLETED" + LongRunningExhausted LongRunningState = "EXHAUSTED" + LongRunningCancelled LongRunningState = "CANCELLED" +) + +type Investigation struct { + ID LongRunningWorkID + Objective string + HypothesisRefs []EvidenceRef + AttemptRefs []AgentRunID + FindingRefs []EvidenceRef + Blockers []string + CheckpointRefs []AgentCheckpointID + NextStep string + State LongRunningState + Revision int64 + TimeBudgetMillis int64 + CostBudgetMicros int64 + MaxAttempts int + RecordedAtUnixMillis int64 +} + +func (w Investigation) Valid() bool { + return w.ID != "" && w.Objective != "" && w.State != "" && w.Revision > 0 && w.TimeBudgetMillis >= 0 && w.CostBudgetMicros >= 0 && w.MaxAttempts >= 0 && w.RecordedAtUnixMillis > 0 +} diff --git a/dev/ACTIVE_TASK.json b/dev/ACTIVE_TASK.json index ac473f6..688a1fc 100644 --- a/dev/ACTIVE_TASK.json +++ b/dev/ACTIVE_TASK.json @@ -1 +1 @@ -{"task_file":"dev/tasks/GEN2-016-intelligence-strategy-resource-cost-policy-and-personal-benchmark.json","task_id":"GEN2-016","task_revision":1} \ No newline at end of file +{"task_file":"dev/tasks/GEN2-017-extend-work-into-durable-longrunningwork-investigation.json","task_id":"GEN2-017","task_revision":1} diff --git a/modules/work/domain/long_running.go b/modules/work/domain/long_running.go new file mode 100644 index 0000000..8346a23 --- /dev/null +++ b/modules/work/domain/long_running.go @@ -0,0 +1,18 @@ +package domain + +import "git.cin.su/m/Assistant/contracts/work" + +func PauseInvestigation(value work.Investigation) work.Investigation { + if value.Valid() { + value.State = work.LongRunningPaused + value.Revision++ + } + return value +} +func ResumeInvestigation(value work.Investigation) work.Investigation { + if value.Valid() && value.State == work.LongRunningPaused { + value.State = work.LongRunningRunning + value.Revision++ + } + return value +} diff --git a/modules/work/domain/long_running_test.go b/modules/work/domain/long_running_test.go new file mode 100644 index 0000000..9d702a5 --- /dev/null +++ b/modules/work/domain/long_running_test.go @@ -0,0 +1,16 @@ +package domain_test + +import ( + "git.cin.su/m/Assistant/contracts/work" + "git.cin.su/m/Assistant/modules/work/domain" + "testing" +) + +func TestInvestigationPauseResumeIsDurableStateTransition(t *testing.T) { + w := work.Investigation{ID: "i", Objective: "diagnose", State: work.LongRunningRunning, Revision: 1, RecordedAtUnixMillis: 1} + w = domain.PauseInvestigation(w) + w = domain.ResumeInvestigation(w) + if w.State != work.LongRunningRunning || w.Revision != 3 { + t.Fatalf("%#v", w) + } +}