summaryrefslogblamecommitdiff
path: root/frontend/src/components/ContractCreateModal.tsx
blob: e1d973255071ee2cb7b5c42d6a31bbffd16db7dd (plain) (tree)
























































































































































































                                                                                                                                                                                                          
import React, { useState } from 'react'

interface ContractCreateModalProps {
  isOpen: boolean
  onClose: () => void
  onCreated: () => void
}

interface CreateContractForm {
  name: string
  description: string
  contractType: string
  redTeamEnabled: boolean
  redTeamPrompt: string
}

export function ContractCreateModal({ isOpen, onClose, onCreated }: ContractCreateModalProps) {
  const [form, setForm] = useState<CreateContractForm>({
    name: '',
    description: '',
    contractType: 'simple',
    redTeamEnabled: false,
    redTeamPrompt: '',
  })
  const [loading, setLoading] = useState(false)
  const [error, setError] = useState<string | null>(null)

  if (!isOpen) return null

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault()
    setLoading(true)
    setError(null)

    try {
      const response = await fetch('/api/v1/contracts', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({
          name: form.name,
          description: form.description || undefined,
          contract_type: form.contractType,
          red_team_enabled: form.redTeamEnabled,
          red_team_prompt: form.redTeamEnabled && form.redTeamPrompt ? form.redTeamPrompt : undefined,
        }),
      })

      if (!response.ok) {
        const errorData = await response.json().catch(() => ({}))
        throw new Error(errorData.message || `Failed to create contract: ${response.statusText}`)
      }

      // Reset form and close modal
      setForm({
        name: '',
        description: '',
        contractType: 'simple',
        redTeamEnabled: false,
        redTeamPrompt: '',
      })
      onCreated()
      onClose()
    } catch (err) {
      setError(err instanceof Error ? err.message : 'Unknown error')
    } finally {
      setLoading(false)
    }
  }

  return (
    <div className="modal-overlay" onClick={onClose}>
      <div className="settings-modal contract-create-modal" onClick={(e) => e.stopPropagation()}>
        <div className="modal-header">
          <h2 className="modal-title">Create Contract</h2>
          <button className="modal-close-btn" onClick={onClose}>
            ×
          </button>
        </div>

        <form onSubmit={handleSubmit}>
          <div className="modal-content">
            {error && (
              <div className="form-error">
                {error}
              </div>
            )}

            <div className="settings-section">
              <h3>Contract Details</h3>

              <div className="setting-item">
                <label>
                  Name
                  <input
                    type="text"
                    value={form.name}
                    onChange={(e) => setForm({ ...form, name: e.target.value })}
                    placeholder="Enter contract name"
                    required
                    className="form-input"
                  />
                </label>
              </div>

              <div className="setting-item">
                <label>
                  Description
                  <textarea
                    value={form.description}
                    onChange={(e) => setForm({ ...form, description: e.target.value })}
                    placeholder="Enter contract description (optional)"
                    className="form-textarea"
                    rows={3}
                  />
                </label>
              </div>

              <div className="setting-item">
                <label>
                  Contract Type
                  <select
                    value={form.contractType}
                    onChange={(e) => setForm({ ...form, contractType: e.target.value })}
                    className="form-select"
                  >
                    <option value="simple">Simple</option>
                    <option value="specification">Specification</option>
                    <option value="execute">Execute</option>
                  </select>
                </label>
              </div>
            </div>

            <div className="settings-section">
              <h3>Red Team Monitoring</h3>

              <div className="setting-item">
                <label className="checkbox-label">
                  <input
                    type="checkbox"
                    checked={form.redTeamEnabled}
                    onChange={(e) => setForm({ ...form, redTeamEnabled: e.target.checked })}
                  />
                  <span>Enable Red Team monitoring</span>
                </label>
                <div className="setting-description">
                  Spawns a parallel task that monitors work output for quality and compliance
                </div>
              </div>

              {form.redTeamEnabled && (
                <div className="setting-item red-team-prompt-container">
                  <label>
                    Custom review criteria (optional)
                    <textarea
                      value={form.redTeamPrompt}
                      onChange={(e) => setForm({ ...form, redTeamPrompt: e.target.value })}
                      placeholder="Enter custom criteria for the red team to evaluate against... (e.g., 'Ensure all functions have proper error handling', 'Verify security best practices are followed')"
                      className="form-textarea"
                      rows={4}
                    />
                  </label>
                  <div className="setting-description">
                    Provide specific criteria for the red team to focus on during reviews
                  </div>
                </div>
              )}
            </div>
          </div>

          <div className="modal-footer">
            <button type="button" className="modal-btn secondary" onClick={onClose} disabled={loading}>
              Cancel
            </button>
            <button type="submit" className="modal-btn primary" disabled={loading || !form.name.trim()}>
              {loading ? 'Creating...' : 'Create Contract'}
            </button>
          </div>
        </form>
      </div>
    </div>
  )
}