chore: formatting

This commit is contained in:
2026-07-15 20:17:37 +05:30
parent b5c5fa9f0a
commit 2cc89d2e3c
5 changed files with 126 additions and 81 deletions

View File

@@ -25,7 +25,7 @@ export function AttributeEditor({
const handleAttrChange = <K extends keyof AttributeData>(
index: number,
key: K,
val: AttributeData[K]
val: AttributeData[K],
) => {
const copy = [...attributes];
copy[index] = { ...copy[index], [key]: val };
@@ -46,7 +46,9 @@ export function AttributeEditor({
return (
<div className="space-y-4">
<div className="flex justify-between items-center border-b border-border/20 pb-2">
<h3 className="text-body-md font-mono text-foreground font-bold">{title}</h3>
<h3 className="text-body-md font-mono text-foreground font-bold">
{title}
</h3>
<Button
type="button"
size="sm"
@@ -58,7 +60,9 @@ export function AttributeEditor({
</Button>
</div>
{attributes.length === 0 ? (
<p className="text-xs text-muted-foreground italic">No attributes defined yet.</p>
<p className="text-xs text-muted-foreground italic">
No attributes defined yet.
</p>
) : (
<div className="space-y-3">
{attributes.map((attr, index) => (
@@ -71,13 +75,17 @@ export function AttributeEditor({
<Input
placeholder="Name (e.g. role)"
value={attr.name}
onChange={(e) => handleAttrChange(index, "name", e.target.value)}
onChange={(e) =>
handleAttrChange(index, "name", e.target.value)
}
className="h-8 font-mono text-xs"
/>
<Input
placeholder="Value (e.g. merchant)"
value={attr.value}
onChange={(e) => handleAttrChange(index, "value", e.target.value)}
onChange={(e) =>
handleAttrChange(index, "value", e.target.value)
}
className="h-8 text-xs"
/>
</div>
@@ -86,7 +94,9 @@ export function AttributeEditor({
variant="destructive"
size="icon"
className="size-8 shrink-0 cursor-pointer"
onClick={() => onChange(attributes.filter((_, i) => i !== index))}
onClick={() =>
onChange(attributes.filter((_, i) => i !== index))
}
>
<Trash2 className="size-4" />
</Button>
@@ -100,7 +110,7 @@ export function AttributeEditor({
handleAttrChange(
index,
"visibility",
checked ? "PUBLIC" : "PRIVATE"
checked ? "PUBLIC" : "PRIVATE",
)
}
/>
@@ -119,12 +129,15 @@ export function AttributeEditor({
) : (
<div className="flex flex-wrap gap-1">
{entityIds.map((entId) => {
const isAllowed = attr.allowedEntities?.includes(entId);
const isAllowed =
attr.allowedEntities?.includes(entId);
return (
<button
key={entId}
type="button"
onClick={() => handleToggleEntityAccess(index, entId)}
onClick={() =>
handleToggleEntityAccess(index, entId)
}
className={`px-2 py-0.5 rounded text-[10px] font-mono border transition-all cursor-pointer ${
isAllowed
? "bg-primary/20 border-primary text-primary font-bold"

View File

@@ -124,7 +124,8 @@ export function EntitiesTab({
value={selectedEnt.locationId || ""}
onChange={(e) => {
const copy = [...entities];
copy[selectedEntIndex].locationId = e.target.value || undefined;
copy[selectedEntIndex].locationId =
e.target.value || undefined;
setEntities(copy);
}}
>
@@ -151,7 +152,12 @@ export function EntitiesTab({
const copy = [...entities];
copy[selectedEntIndex].attributes = [
...copy[selectedEntIndex].attributes,
{ name: "", value: "", visibility: "PUBLIC", allowedEntities: [] },
{
name: "",
value: "",
visibility: "PUBLIC",
allowedEntities: [],
},
];
setEntities(copy);
}}
@@ -175,7 +181,7 @@ export function EntitiesTab({
onClick={() => {
const copy = [...entities];
const target = entityIds.find(
(id) => id !== selectedEnt.id && !selectedEnt.aliases[id]
(id) => id !== selectedEnt.id && !selectedEnt.aliases[id],
);
if (target) {
copy[selectedEntIndex].aliases = {
@@ -194,47 +200,50 @@ export function EntitiesTab({
{Object.keys(selectedEnt.aliases || {}).length === 0 ? (
<p className="text-xs text-muted-foreground italic">
No descriptive aliases configured. Defaults to actual entity ID.
No descriptive aliases configured. Defaults to actual entity
ID.
</p>
) : (
<div className="space-y-2">
{Object.entries(selectedEnt.aliases).map(([targetId, aliasText]) => (
<div
key={targetId}
className="flex gap-2 items-center bg-secondary/15 p-2 rounded"
>
<span className="text-[11px] font-mono text-muted-foreground w-1/3 truncate">
{targetId}
</span>
<ChevronRight className="size-3 text-muted-foreground shrink-0" />
<Input
placeholder="Descriptive name (e.g. the guard)"
value={aliasText}
onChange={(e) => {
const copy = [...entities];
copy[selectedEntIndex].aliases = {
...selectedEnt.aliases,
[targetId]: e.target.value,
};
setEntities(copy);
}}
className="h-7 text-xs flex-1"
/>
<button
type="button"
onClick={() => {
const copy = [...entities];
const updated = { ...selectedEnt.aliases };
delete updated[targetId];
copy[selectedEntIndex].aliases = updated;
setEntities(copy);
}}
className="text-muted-foreground hover:text-destructive cursor-pointer"
{Object.entries(selectedEnt.aliases).map(
([targetId, aliasText]) => (
<div
key={targetId}
className="flex gap-2 items-center bg-secondary/15 p-2 rounded"
>
<Trash2 className="size-3.5" />
</button>
</div>
))}
<span className="text-[11px] font-mono text-muted-foreground w-1/3 truncate">
{targetId}
</span>
<ChevronRight className="size-3 text-muted-foreground shrink-0" />
<Input
placeholder="Descriptive name (e.g. the guard)"
value={aliasText}
onChange={(e) => {
const copy = [...entities];
copy[selectedEntIndex].aliases = {
...selectedEnt.aliases,
[targetId]: e.target.value,
};
setEntities(copy);
}}
className="h-7 text-xs flex-1"
/>
<button
type="button"
onClick={() => {
const copy = [...entities];
const updated = { ...selectedEnt.aliases };
delete updated[targetId];
copy[selectedEntIndex].aliases = updated;
setEntities(copy);
}}
className="text-muted-foreground hover:text-destructive cursor-pointer"
>
<Trash2 className="size-3.5" />
</button>
</div>
),
)}
</div>
)}
</div>
@@ -275,7 +284,8 @@ export function EntitiesTab({
</Button>
</div>
{!selectedEnt.initialMemories || selectedEnt.initialMemories.length === 0 ? (
{!selectedEnt.initialMemories ||
selectedEnt.initialMemories.length === 0 ? (
<p className="text-xs text-muted-foreground italic">
No initial memories loaded. Entities will start blank.
</p>
@@ -291,7 +301,9 @@ export function EntitiesTab({
onClick={() => {
const copy = [...entities];
copy[selectedEntIndex].initialMemories =
selectedEnt.initialMemories.filter((_, i) => i !== memIdx);
selectedEnt.initialMemories.filter(
(_, i) => i !== memIdx,
);
setEntities(copy);
}}
className="absolute top-2 right-2 text-muted-foreground hover:text-destructive cursor-pointer"
@@ -309,8 +321,10 @@ export function EntitiesTab({
value={mem.intent.type}
onChange={(e) => {
const copy = [...entities];
copy[selectedEntIndex].initialMemories[memIdx].intent.type =
e.target.value as "dialogue" | "action" | "monologue";
copy[selectedEntIndex].initialMemories[
memIdx
].intent.type = e.target.value as
"dialogue" | "action" | "monologue";
setEntities(copy);
}}
>
@@ -329,8 +343,9 @@ export function EntitiesTab({
value={mem.locationId || ""}
onChange={(e) => {
const copy = [...entities];
copy[selectedEntIndex].initialMemories[memIdx].locationId =
e.target.value || null;
copy[selectedEntIndex].initialMemories[
memIdx
].locationId = e.target.value || null;
setEntities(copy);
}}
>
@@ -389,7 +404,8 @@ export function EntitiesTab({
{entityIds
.filter((id) => id !== selectedEnt.id)
.map((entId) => {
const isSelected = mem.intent.targetIds?.includes(entId);
const isSelected =
mem.intent.targetIds?.includes(entId);
return (
<button
key={entId}
@@ -397,13 +413,14 @@ export function EntitiesTab({
onClick={() => {
const copy = [...entities];
const targets =
copy[selectedEntIndex].initialMemories[memIdx]
.intent.targetIds || [];
copy[selectedEntIndex].initialMemories[
memIdx
].intent.targetIds || [];
if (targets.includes(entId)) {
copy[selectedEntIndex].initialMemories[
memIdx
].intent.targetIds = targets.filter(
(t) => t !== entId
(t) => t !== entId,
);
} else {
copy[selectedEntIndex].initialMemories[
@@ -434,8 +451,9 @@ export function EntitiesTab({
onCheckedChange={(checked) => {
const copy = [...entities];
if (checked) {
copy[selectedEntIndex].initialMemories[memIdx].outcome =
{ isValid: true, reason: "" };
copy[selectedEntIndex].initialMemories[
memIdx
].outcome = { isValid: true, reason: "" };
} else {
copy[selectedEntIndex].initialMemories[
memIdx
@@ -449,14 +467,17 @@ export function EntitiesTab({
{mem.outcome && (
<div className="grid grid-cols-3 gap-2 bg-secondary/15 p-2 rounded">
<div className="col-span-1 flex flex-col justify-center">
<Label className="text-[9px] mb-1">isValid</Label>
<Label className="text-[9px] mb-1">
isValid
</Label>
<Checkbox
checked={mem.outcome.isValid}
onCheckedChange={(checked) => {
const copy = [...entities];
if (
copy[selectedEntIndex].initialMemories[memIdx]
.outcome
copy[selectedEntIndex].initialMemories[
memIdx
].outcome
) {
copy[selectedEntIndex].initialMemories[
memIdx
@@ -474,8 +495,9 @@ export function EntitiesTab({
onChange={(e) => {
const copy = [...entities];
if (
copy[selectedEntIndex].initialMemories[memIdx]
.outcome
copy[selectedEntIndex].initialMemories[
memIdx
].outcome
) {
copy[selectedEntIndex].initialMemories[
memIdx

View File

@@ -20,7 +20,7 @@ export function JsonTab({ compiledScenario, onCopySuccess }: JsonTabProps) {
size="sm"
onClick={() => {
navigator.clipboard.writeText(
JSON.stringify(compiledScenario, null, 2)
JSON.stringify(compiledScenario, null, 2),
);
onCopySuccess();
}}

View File

@@ -32,7 +32,8 @@ export function LocationsTab({
copy[locIndex].connections = [
...copy[locIndex].connections,
{
targetId: locationIds.filter((id) => id !== locations[locIndex].id)[0] || "",
targetId:
locationIds.filter((id) => id !== locations[locIndex].id)[0] || "",
visionProp: 10,
soundProp: 10,
bidirectional: true,
@@ -45,7 +46,7 @@ export function LocationsTab({
locIndex: number,
connIndex: number,
key: K,
val: ConnectionData[K]
val: ConnectionData[K],
) => {
const copy = [...locations];
copy[locIndex].connections[connIndex] = {
@@ -58,7 +59,7 @@ export function LocationsTab({
const removeLocationConnection = (locIndex: number, connIndex: number) => {
const copy = [...locations];
copy[locIndex].connections = copy[locIndex].connections.filter(
(_, i) => i !== connIndex
(_, i) => i !== connIndex,
);
setLocations(copy);
};
@@ -181,7 +182,12 @@ export function LocationsTab({
const copy = [...locations];
copy[selectedLocIndex].attributes = [
...copy[selectedLocIndex].attributes,
{ name: "", value: "", visibility: "PUBLIC", allowedEntities: [] },
{
name: "",
value: "",
visibility: "PUBLIC",
allowedEntities: [],
},
];
setLocations(copy);
}}
@@ -207,7 +213,8 @@ export function LocationsTab({
</Button>
</div>
{!selectedLoc.connections || selectedLoc.connections.length === 0 ? (
{!selectedLoc.connections ||
selectedLoc.connections.length === 0 ? (
<p className="text-xs text-muted-foreground italic">
No connections leading from this location.
</p>
@@ -220,7 +227,9 @@ export function LocationsTab({
>
<button
type="button"
onClick={() => removeLocationConnection(selectedLocIndex, connIdx)}
onClick={() =>
removeLocationConnection(selectedLocIndex, connIdx)
}
className="absolute top-2 right-2 text-muted-foreground hover:text-destructive cursor-pointer"
title="Delete connection"
>
@@ -240,7 +249,7 @@ export function LocationsTab({
selectedLocIndex,
connIdx,
"targetId",
e.target.value
e.target.value,
)
}
>
@@ -267,7 +276,7 @@ export function LocationsTab({
selectedLocIndex,
connIdx,
"portalName",
e.target.value
e.target.value,
)
}
className="h-7 text-xs"
@@ -287,7 +296,7 @@ export function LocationsTab({
selectedLocIndex,
connIdx,
"portalStateDescriptor",
e.target.value
e.target.value,
)
}
className="h-7 text-xs"
@@ -309,7 +318,7 @@ export function LocationsTab({
selectedLocIndex,
connIdx,
"visionProp",
Number(e.target.value)
Number(e.target.value),
)
}
className="w-full h-1 bg-secondary rounded-lg appearance-none cursor-pointer accent-primary"
@@ -330,7 +339,7 @@ export function LocationsTab({
selectedLocIndex,
connIdx,
"soundProp",
Number(e.target.value)
Number(e.target.value),
)
}
className="w-full h-1 bg-secondary rounded-lg appearance-none cursor-pointer accent-primary"
@@ -347,11 +356,12 @@ export function LocationsTab({
selectedLocIndex,
connIdx,
"bidirectional",
!!checked
!!checked,
)
}
/>
Bidirectional Connection (creates reverse path automatically)
Bidirectional Connection (creates reverse path
automatically)
</Label>
</div>
</div>

View File

@@ -57,7 +57,7 @@ export function MetadataTab({
value={scenarioId}
onChange={(e) =>
setScenarioId(
e.target.value.toLowerCase().replace(/[^a-z0-9-_]/g, "")
e.target.value.toLowerCase().replace(/[^a-z0-9-_]/g, ""),
)
}
className="font-mono text-xs"