Skip to content

Commit b69e884

Browse files
committed
feat: v1.2.1
1 parent f7f0492 commit b69e884

6 files changed

Lines changed: 84 additions & 58 deletions

File tree

.claude/settings.local.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
"allow": [
44
"Bash(node:*)",
55
"Bash(npm run build:client:*)",
6-
"Bash(ls:*)"
6+
"Bash(ls:*)",
7+
"Bash(npm run build)",
8+
"Bash(npm run)"
79
]
810
},
911
"enableAllProjectMcpServers": true,

client/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ const App = () => {
164164
onSelectSession={setSelectedSessionId}
165165
/>
166166
<TodoPanel todos={todos} />
167-
<AgentPanel selectedAgent={selectedAgent} />
167+
<AgentPanel selectedAgent={selectedAgent} sessions={sessions} />
168168
</aside>
169169
</main>
170170
</div>
Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,85 @@
1-
import type { Agent } from "../useOfficeState";
1+
import type { Agent, SessionInfo } from "../useOfficeState";
22

33
type AgentPanelProps = {
44
selectedAgent: Agent | null;
5+
sessions: SessionInfo[];
56
};
67

7-
const AgentPanel = ({ selectedAgent }: AgentPanelProps) => (
8-
<div className="data-panel">
9-
<div className="gamish-panel-title">
10-
<span>AGENT PROFILE</span>
11-
</div>
8+
const AgentPanel = ({ selectedAgent, sessions }: AgentPanelProps) => {
9+
// Get repo name from the agent's session
10+
const agentSession = selectedAgent?.sessionId
11+
? sessions.find((s) => s.id === selectedAgent.sessionId)
12+
: null;
13+
const repoName = agentSession?.directory?.split("/").pop()
14+
|| agentSession?.title
15+
|| agentSession?.slug
16+
|| "";
1217

13-
{selectedAgent ? (
14-
<div className="flex flex-col gap-4">
15-
<div className="flex gap-3 items-center">
16-
<div className="w-10 h-10 bg-slate-900 border-2 border-slate-600 rounded flex items-center justify-center">
17-
<span className="text-xl">👾</span>
18-
</div>
19-
<div className="flex flex-col">
20-
<span className="text-primary font-bold text-xs uppercase tracking-wider">{selectedAgent.alias || selectedAgent.name || "Unknown Agent"}</span>
21-
<span className="text-[9px] text-slate-400 uppercase">{selectedAgent.role || "Operative"}</span>
22-
</div>
23-
</div>
18+
return (
19+
<div className="data-panel">
20+
<div className="gamish-panel-title">
21+
<span>AGENT PROFILE</span>
22+
</div>
2423

25-
<div className="agent-stats">
26-
<div className="stat-box">
27-
<span className="stat-label">Model</span>
28-
<span className="stat-value truncate block">{selectedAgent.model || "N/A"}</span>
29-
</div>
30-
<div className="stat-box">
31-
<span className="stat-label">Status</span>
32-
<span className={`stat-value uppercase ${selectedAgent.status === 'working' ? 'text-amber-400' : 'text-slate-400'}`}>
33-
{selectedAgent.status || "IDLE"}
34-
</span>
35-
</div>
36-
<div className="stat-box col-span-2">
37-
<span className="stat-label">Provider</span>
38-
<span className="stat-value">{selectedAgent.provider || "Unknown"}</span>
24+
{selectedAgent ? (
25+
<div className="flex flex-col gap-4">
26+
<div className="flex gap-3 items-center">
27+
<div className="w-10 h-10 bg-slate-900 border-2 border-slate-600 rounded flex items-center justify-center">
28+
<span className="text-xl">👾</span>
29+
</div>
30+
<div className="flex flex-col">
31+
<span className="text-primary font-bold text-xs uppercase tracking-wider">
32+
{repoName
33+
? `${selectedAgent.alias || selectedAgent.name || "Agent"} · ${repoName}`
34+
: selectedAgent.alias || selectedAgent.name || "Unknown Agent"}
35+
</span>
36+
<span className="text-[9px] text-slate-400 uppercase">{selectedAgent.role || "Operative"}</span>
37+
</div>
3938
</div>
40-
</div>
4139

42-
{selectedAgent.sessionId && (
43-
<div className="border-t border-slate-700 pt-2">
44-
<span className="stat-label mb-1">Assigned Session</span>
45-
<div className="text-[9px] font-mono text-emerald-400/80 bg-emerald-950/30 p-1.5 rounded border border-emerald-900/50 truncate">
46-
{selectedAgent.sessionId}
40+
<div className="agent-stats">
41+
<div className="stat-box">
42+
<span className="stat-label">Model</span>
43+
<span className="stat-value truncate block">{selectedAgent.model || "N/A"}</span>
44+
</div>
45+
<div className="stat-box">
46+
<span className="stat-label">Status</span>
47+
<span className={`stat-value uppercase ${selectedAgent.status === 'working' ? 'text-amber-400' : 'text-slate-400'}`}>
48+
{selectedAgent.status || "IDLE"}
49+
</span>
50+
</div>
51+
<div className="stat-box col-span-2">
52+
<span className="stat-label">Provider</span>
53+
<span className="stat-value">{selectedAgent.provider || "Unknown"}</span>
4754
</div>
4855
</div>
49-
)}
5056

51-
{selectedAgent.lastMessageSnippet && (
52-
<div className="bg-slate-900/50 p-2 rounded border border-slate-700/50">
53-
<span className="stat-label mb-1 text-slate-500">Last Transmission</span>
54-
<p className="text-[9px] text-slate-300 italic">"{selectedAgent.lastMessageSnippet.slice(0, 100)}{selectedAgent.lastMessageSnippet.length > 100 ? '...' : ''}"</p>
55-
</div>
56-
)}
57-
</div>
58-
) : (
59-
<div className="flex flex-col items-center justify-center py-6 text-slate-600 gap-2">
60-
<span className="text-2xl opacity-20">?</span>
61-
<span className="text-[9px] uppercase">Select an agent</span>
62-
</div>
63-
)}
64-
</div>
65-
);
57+
{selectedAgent.sessionId && (
58+
<div className="border-t border-slate-700 pt-2">
59+
<span className="stat-label mb-1">Assigned Session</span>
60+
<div className="text-[9px] font-mono text-emerald-400/80 bg-emerald-950/30 p-1.5 rounded border border-emerald-900/50 truncate">
61+
{repoName
62+
? `${repoName} · ${selectedAgent.sessionId.slice(0, 6)}`
63+
: selectedAgent.sessionId.slice(0, 6)}
64+
</div>
65+
</div>
66+
)}
67+
68+
{selectedAgent.lastMessageSnippet && (
69+
<div className="bg-slate-900/50 p-2 rounded border border-slate-700/50">
70+
<span className="stat-label mb-1 text-slate-500">Last Transmission</span>
71+
<p className="text-[9px] text-slate-300 italic">"{selectedAgent.lastMessageSnippet.slice(0, 100)}{selectedAgent.lastMessageSnippet.length > 100 ? '...' : ''}"</p>
72+
</div>
73+
)}
74+
</div>
75+
) : (
76+
<div className="flex flex-col items-center justify-center py-6 text-slate-600 gap-2">
77+
<span className="text-2xl opacity-20">?</span>
78+
<span className="text-[9px] uppercase">Select an agent</span>
79+
</div>
80+
)}
81+
</div>
82+
);
83+
};
6684

6785
export { AgentPanel };

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "opencode-pixel-office",
3-
"version": "1.2.0",
3+
"version": "1.2.1",
44
"type": "module",
55
"files": [
66
"bin",

server/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,7 @@ const updateSessionStatus = (event: EventPayload) => {
581581
return;
582582
}
583583
const props = event?.properties || {};
584+
const info = props.info || {};
584585
const sessionId = safeString(props.sessionID ?? "", "");
585586
if (!sessionId) {
586587
return;
@@ -595,7 +596,12 @@ const updateSessionStatus = (event: EventPayload) => {
595596
}
596597
: {
597598
id: sessionId,
599+
title: safeString(info.title ?? "", ""),
600+
slug: safeString(info.slug ?? "", ""),
598601
status,
602+
version: safeString(info.version ?? "", ""),
603+
directory: safeString(info.directory ?? "", ""),
604+
projectId: safeString(info.projectID ?? "", ""),
599605
updatedAt: Date.now(),
600606
};
601607
officeState.sessions.set(sessionId, nextInfo);

0 commit comments

Comments
 (0)