Implement Scene 7 evidence goal flow
This commit is contained in:
@@ -25,6 +25,17 @@ type MysteryNarrative = {
|
||||
cast: { key: string; name: string; role?: string; defaultPose?: string; poses?: { poseKey: string; assetId: string }[] }[]
|
||||
graph?: MysteryGraph
|
||||
}
|
||||
type MysteryGoal = {
|
||||
key:string; title:string; instructions?:string; completionMessage?:string; enabled?:boolean; requiredFlags:string[]
|
||||
}
|
||||
type MysteryEvidenceMatchRule = {
|
||||
name:string; sourceLabel?:string; sourceUri?:string; flagKey:string; minimumAnchorMatches?:number; enabled?:boolean
|
||||
anchors:{ phrase:string; minimumSimilarity?:number }[]
|
||||
}
|
||||
type MysterySemanticRule = {
|
||||
goalKey:string; name:string; targetSubject:string; relatedSubject?:string; assertion:string; successFlagKey:string
|
||||
relatedFlagKey?:string; minimumConfidence?:number; evaluatorVersion?:string; enabled?:boolean
|
||||
}
|
||||
type MysteryManifest = {
|
||||
slug: string
|
||||
name: string
|
||||
@@ -34,6 +45,9 @@ type MysteryManifest = {
|
||||
brief: { body: string; concepts: { label: string; context: string; expectedPartyKind: PartyKind }[] }
|
||||
documents: MysteryDocument[]
|
||||
folders: { key: string; title: string; content: string; x: number; y: number; width: number; members: string[] }[]
|
||||
goals?: MysteryGoal[]
|
||||
evidenceMatchRules?: MysteryEvidenceMatchRule[]
|
||||
evidenceSemanticRules?: MysterySemanticRule[]
|
||||
narrative?: MysteryNarrative
|
||||
}
|
||||
|
||||
@@ -108,6 +122,25 @@ export async function importMysteryTemplate(manifestPath: string, baseUrl = 'htt
|
||||
await requireOk(await fetch(`${baseUrl}/api/levels/${state.id}?edit=1`, {
|
||||
method: 'PUT', headers, body: JSON.stringify(state),
|
||||
}), 'Save authored mystery')
|
||||
|
||||
const goalIds = new Map<string,string>()
|
||||
for (const goal of manifest.goals || []) {
|
||||
const response = await requireOk(await fetch(`${baseUrl}/api/levels/${state.id}/goals`, {
|
||||
method:'POST',headers,body:JSON.stringify(goal),
|
||||
}), `Create goal ${goal.key}`)
|
||||
const created = await response.json() as { id:string;key:string }
|
||||
goalIds.set(created.key,created.id)
|
||||
}
|
||||
for (const rule of manifest.evidenceMatchRules || []) await requireOk(await fetch(
|
||||
`${baseUrl}/api/levels/${state.id}/evidence-match-rules`, { method:'POST',headers,body:JSON.stringify(rule) }),
|
||||
`Create evidence match rule ${rule.name}`)
|
||||
for (const rule of manifest.evidenceSemanticRules || []) {
|
||||
const goalId = goalIds.get(rule.goalKey)
|
||||
if (!goalId) throw new Error(`Semantic evidence rule ${rule.name} refers to unknown goal ${rule.goalKey}`)
|
||||
await requireOk(await fetch(`${baseUrl}/api/levels/${state.id}/evidence-semantic-rules`, {
|
||||
method:'POST',headers,body:JSON.stringify({ ...rule,goalKey:undefined,goalId }),
|
||||
}), `Create semantic evidence rule ${rule.name}`)
|
||||
}
|
||||
const templateResponse = await requireOk(await fetch(`${baseUrl}/api/levels/${state.id}/templates?edit=1`, {
|
||||
method: 'POST', headers, body: JSON.stringify({ slug: manifest.slug, name: manifest.name }),
|
||||
}), 'Freeze mystery template')
|
||||
|
||||
Reference in New Issue
Block a user