233 lines
8.7 KiB
Plaintext
233 lines
8.7 KiB
Plaintext
generator client {
|
|
provider = "prisma-client-js"
|
|
output = "./generated/client"
|
|
}
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
}
|
|
|
|
model Task {
|
|
id String @id @default(uuid())
|
|
title String
|
|
description String
|
|
status String // Enum: TaskStatus (OPEN, EXECUTING, VERIFYING, COMPLETED, FAILED, etc)
|
|
difficulty String // Enum: TaskDifficulty (HELLO_WORLD, COMPONENT, VIEW, EPIC)
|
|
scope_clarity_score Float
|
|
error_classification String? // Enum: TaskErrorClassification
|
|
reward_amount Int // Stored in cents
|
|
reward_currency String // USD, TWD, USDC
|
|
acceptance_criteria Json // Contains validation_mode, test_file_content, rules
|
|
required_stack String[]
|
|
retry_count Int @default(0)
|
|
stripe_payment_intent_id String?
|
|
stripe_checkout_session_id String? // Used for Scout flow
|
|
expires_at DateTime?
|
|
github_pr_url String? // PR URL for PENDING_REVIEW tasks
|
|
reward_points Int @default(10) // Points awarded upon PR merge
|
|
is_priority Boolean @default(false)
|
|
is_private Boolean @default(false)
|
|
referred_by_agent String?
|
|
parent_task_id String?
|
|
created_by_agent String?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
scout_id String?
|
|
scout_agent AgentProfile? @relation("ScoutTasks", fields: [scout_id], references: [agent_id])
|
|
builder_id String?
|
|
builder_agent AgentProfile? @relation("BuilderTasks", fields: [builder_id], references: [agent_id])
|
|
|
|
claims Claim[]
|
|
submissions Submission[]
|
|
affiliate_ledger AffiliateLedger[]
|
|
bid_proposals BidProposal[]
|
|
arbitrations Arbitration[]
|
|
}
|
|
|
|
model Claim {
|
|
id String @id @default(uuid())
|
|
task_id String
|
|
task Task @relation(fields: [task_id], references: [id])
|
|
agent_id String
|
|
agent AgentProfile @relation(fields: [agent_id], references: [agent_id])
|
|
developer_wallet String
|
|
status String // EXECUTING, CANCELLED, VERIFYING, COMPLETED
|
|
claim_token String @unique // Idempotency token for this claim
|
|
held_amount Int
|
|
held_currency String
|
|
expires_at DateTime
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
submissions Submission[]
|
|
}
|
|
|
|
model Submission {
|
|
id String @id @default(uuid())
|
|
task_id String
|
|
task Task @relation(fields: [task_id], references: [id])
|
|
claim_id String
|
|
claim Claim @relation(fields: [claim_id], references: [id])
|
|
status String // VERIFYING, JUDGED
|
|
deliverables Json // Files and notes submitted
|
|
estimated_judge_complete_at DateTime?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
judge_results JudgeResult[]
|
|
}
|
|
|
|
model JudgeResult {
|
|
id String @id @default(uuid())
|
|
submission_id String
|
|
submission Submission @relation(fields: [submission_id], references: [id])
|
|
overall_result String // PASS, FAIL, TIMEOUT
|
|
tests Json // Array of test results
|
|
artifacts Json? // screenshot_url, logs_url, diff_url
|
|
error_classification String? // Enum: JudgeErrorClassification
|
|
error_signature String?
|
|
retryable Boolean @default(false)
|
|
resource_usage Json // cpu_ms, mem_peak_mb, io_bytes
|
|
judge_completed_at DateTime @default(now())
|
|
}
|
|
|
|
model AuditEvent {
|
|
id String @id @default(uuid())
|
|
actorType String
|
|
actorId String?
|
|
action String
|
|
entityType String
|
|
entityId String
|
|
beforeState Json?
|
|
afterState Json?
|
|
reason String?
|
|
metadata Json?
|
|
createdAt DateTime @default(now())
|
|
}
|
|
|
|
model LedgerEntry {
|
|
id String @id @default(cuid())
|
|
task_id String
|
|
phase String
|
|
idempotency_key String @unique
|
|
stripe_object_id String?
|
|
response_status String
|
|
http_status Int
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
}
|
|
|
|
model AgentProfile {
|
|
id String @id @default(uuid())
|
|
agent_id String @unique
|
|
type String // BUILDER or SCOUT
|
|
wallet_address String?
|
|
status String // WHITELISTED, BANNED, PENDING
|
|
capabilities Json?
|
|
contact_endpoints Json?
|
|
discovery_source String?
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
tasks_as_scout Task[] @relation("ScoutTasks")
|
|
tasks_as_builder Task[] @relation("BuilderTasks")
|
|
claims Claim[]
|
|
scout_reputation ScoutReputation?
|
|
affiliate_ledger AffiliateLedger[]
|
|
bid_proposals BidProposal[]
|
|
|
|
arbitrations_as_builder Arbitration[] @relation("ArbitrationBuilder")
|
|
arbitrations_as_evaluator Arbitration[] @relation("ArbitrationEvaluator")
|
|
arbitration_votes ArbitrationVote[]
|
|
}
|
|
|
|
model AffiliateLedger {
|
|
id String @id @default(uuid())
|
|
scout_id String
|
|
scout_agent AgentProfile @relation(fields: [scout_id], references: [agent_id])
|
|
task_id String
|
|
task Task @relation(fields: [task_id], references: [id])
|
|
amount Int // Amount in cents (10% of reward)
|
|
currency String
|
|
status String // PENDING, PAID, REFUNDED
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
}
|
|
|
|
model ScoutReputation {
|
|
id String @id @default(uuid())
|
|
scout_id String @unique
|
|
scout_agent AgentProfile @relation(fields: [scout_id], references: [agent_id])
|
|
successful_conversions Int @default(0)
|
|
spam_score Float @default(0.0) // 0 to 1
|
|
chargeback_count Int @default(0)
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
}
|
|
|
|
model BidProposal {
|
|
id String @id @default(uuid())
|
|
task_id String
|
|
task Task @relation(fields: [task_id], references: [id])
|
|
agent_id String
|
|
agent AgentProfile @relation(fields: [agent_id], references: [agent_id])
|
|
proposed_reward Int // Proposed reward in cents
|
|
estimated_duration_hours Float
|
|
quality_guarantee String?
|
|
status String // PENDING, ACCEPTED, REJECTED, NEGOTIATING
|
|
counter_offer_amount Int? // Platform's counter offer in cents
|
|
|
|
// Phase 9 Broker Routing Fields
|
|
broker_agent_id String?
|
|
broker_fee_percentage Float?
|
|
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
}
|
|
|
|
model AgentWebhook {
|
|
id String @id @default(uuid())
|
|
task_id String
|
|
agent_id String
|
|
webhook_url String
|
|
events String[] // e.g. ["COMPLETED", "FAILED"]
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
@@unique([task_id, agent_id])
|
|
}
|
|
|
|
// Phase 9: Arbitration Models
|
|
model Arbitration {
|
|
id String @id @default(uuid())
|
|
task_id String
|
|
task Task @relation(fields: [task_id], references: [id])
|
|
builder_id String
|
|
builder AgentProfile @relation("ArbitrationBuilder", fields: [builder_id], references: [agent_id])
|
|
evaluator_id String
|
|
evaluator AgentProfile @relation("ArbitrationEvaluator", fields: [evaluator_id], references: [agent_id])
|
|
status String @default("PENDING") // PENDING, RESOLVED
|
|
builder_evidence String?
|
|
evaluator_reason String?
|
|
winning_party String? // "BUILDER" or "EVALUATOR"
|
|
created_at DateTime @default(now())
|
|
updated_at DateTime @updatedAt
|
|
|
|
votes ArbitrationVote[]
|
|
}
|
|
|
|
model ArbitrationVote {
|
|
id String @id @default(uuid())
|
|
arbitration_id String
|
|
arbitration Arbitration @relation(fields: [arbitration_id], references: [id])
|
|
judge_id String
|
|
judge AgentProfile @relation(fields: [judge_id], references: [agent_id])
|
|
vote_for String // "BUILDER" or "EVALUATOR"
|
|
reasoning String?
|
|
created_at DateTime @default(now())
|
|
|
|
@@unique([arbitration_id, judge_id])
|
|
}
|