feat(P6/T01): Phase 6 schema — WidgetAdapterSpec, contracts, widgets.adapter_spec_id

Adds Phase 6 tables: envelope_emission_contracts, interaction_reporting_contracts,
widget_adapter_specs. Adds adapter_spec_id FK to widgets and api_key to hubs.
Seeds v1.0 contracts in migration. Registers Phase 6 controller types and routes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-29 21:03:00 +00:00
parent e00aa126c8
commit 55af11342d
5 changed files with 191 additions and 1 deletions

View File

@@ -17,6 +17,9 @@ import Web.Controller.Requirements ()
import Web.Controller.DecisionRecords ()
import Web.Controller.DeploymentRecords ()
import Web.Controller.AgentProposals ()
import Web.Controller.EnvelopeEmissionContracts ()
import Web.Controller.InteractionReportingContracts ()
import Web.Controller.WidgetAdapterSpecs ()
import Web.Controller.Sessions ()
instance FrontController WebApplication where
@@ -32,6 +35,9 @@ instance FrontController WebApplication where
, parseRoute @DecisionRecordsController
, parseRoute @DeploymentRecordsController
, parseRoute @AgentProposalsController
, parseRoute @EnvelopeEmissionContractsController
, parseRoute @InteractionReportingContractsController
, parseRoute @WidgetAdapterSpecsController
]
instance InitControllerContext WebApplication where
@@ -62,6 +68,7 @@ defaultLayout inner = [hsx|
<a href={DecisionRecordsAction} class="text-sm text-gray-600 hover:text-gray-900">Decisions</a>
<a href={DeploymentRecordsAction} class="text-sm text-gray-600 hover:text-gray-900">Deployments</a>
<a href={AgentProposalsAction} class="text-sm text-gray-600 hover:text-gray-900">Agent</a>
<a href={WidgetAdapterSpecsAction} class="text-sm text-gray-600 hover:text-gray-900">Adapters</a>
<div class="ml-auto">
<a href={DeleteSessionAction} class="text-sm text-gray-500 hover:text-gray-700">Sign out</a>
</div>

View File

@@ -34,5 +34,10 @@ instance AutoRoute DeploymentRecordsController
-- Agent Proposals (Phase 5)
instance AutoRoute AgentProposalsController
-- Phase 6 — Cross-Framework UI Adaptation
instance AutoRoute EnvelopeEmissionContractsController
instance AutoRoute InteractionReportingContractsController
instance AutoRoute WidgetAdapterSpecsController
-- Sessions
instance AutoRoute SessionsController

View File

@@ -26,7 +26,8 @@ data HubsController
| TriageDashboardAction { hubId :: !(Id Hub) }
| GovernanceDashboardAction { hubId :: !(Id Hub) }
| AntifragilityDashboardAction { hubId :: !(Id Hub) }
| AgentAuditDashboardAction { hubId :: !(Id Hub) }
| AgentAuditDashboardAction { hubId :: !(Id Hub) }
| AdapterCompatibilityDashboardAction { hubId :: !(Id Hub) }
deriving (Eq, Show, Data)
data WidgetsController
@@ -111,6 +112,25 @@ data AgentProposalsController
| RejectProposalAction { agentProposalId :: !(Id AgentProposal) }
deriving (Eq, Show, Data)
data EnvelopeEmissionContractsController
= EnvelopeEmissionContractsAction
| ShowEnvelopeEmissionContractAction { envelopeEmissionContractId :: !(Id EnvelopeEmissionContract) }
deriving (Eq, Show, Data)
data InteractionReportingContractsController
= InteractionReportingContractsAction
| ShowInteractionReportingContractAction { interactionReportingContractId :: !(Id InteractionReportingContract) }
deriving (Eq, Show, Data)
data WidgetAdapterSpecsController
= WidgetAdapterSpecsAction
| ShowWidgetAdapterSpecAction { widgetAdapterSpecId :: !(Id WidgetAdapterSpec) }
| NewWidgetAdapterSpecAction
| CreateWidgetAdapterSpecAction
| EditWidgetAdapterSpecAction { widgetAdapterSpecId :: !(Id WidgetAdapterSpec) }
| UpdateWidgetAdapterSpecAction { widgetAdapterSpecId :: !(Id WidgetAdapterSpec) }
deriving (Eq, Show, Data)
data SessionsController
= NewSessionAction
| CreateSessionAction