Compare commits

..

2 Commits

Author SHA1 Message Date
Haileyesus
3cd89956ba fix: update naming convention 2026-06-08 16:10:24 +03:00
Haileyesus
01dbe2a8bf chore: add prism plugin 2026-06-08 15:55:40 +03:00
6 changed files with 18 additions and 52 deletions

View File

@@ -279,16 +279,6 @@ export async function queryCodex(command, options = {}, ws) {
startedAt: new Date().toISOString()
});
};
const markSessionFinished = (id) => {
if (!id) {
return;
}
const session = activeCodexSessions.get(id);
if (session && session.status !== 'aborted') {
session.status = 'completed';
}
};
// Existing sessions can be tracked immediately; new sessions are tracked after thread.started.
if (capturedSessionId) {
@@ -334,10 +324,6 @@ export async function queryCodex(command, options = {}, ws) {
continue;
}
if (event.type === 'turn.completed' || event.type === 'turn.failed') {
markSessionFinished(capturedSessionId || sessionId);
}
const transformed = transformCodexEvent(event);
// Normalize the transformed event into NormalizedMessage(s) via adapter
@@ -368,8 +354,6 @@ export async function queryCodex(command, options = {}, ws) {
// Send completion event
if (!terminalFailure) {
markSessionFinished(capturedSessionId || sessionId);
sendMessage(ws, createNormalizedMessage({
kind: 'complete',
actualSessionId: capturedSessionId || thread.id || sessionId || null,

View File

@@ -1,7 +1,8 @@
import fs from 'fs';
import path from 'path';
import os from 'os';
import { spawn } from 'child_process';
import { spawn } from 'cross-spawn';
const PLUGINS_DIR = path.join(os.homedir(), '.claude-code-ui', 'plugins');
const PLUGINS_CONFIG_PATH = path.join(os.homedir(), '.claude-code-ui', 'plugins.json');

View File

@@ -98,7 +98,6 @@ export function useChatRealtimeHandlers({
}: UseChatRealtimeHandlersArgs) {
const paletteOps = usePaletteOps();
const lastProcessedMessageRef = useRef<LatestChatMessage | null>(null);
const terminalSessionIdsRef = useRef<Set<string>>(new Set());
useEffect(() => {
if (!latestMessage) return;
@@ -152,17 +151,6 @@ export function useChatRealtimeHandlers({
const isCurrentSession =
statusSessionId === currentSessionId || (selectedSession && statusSessionId === selectedSession.id);
if (msg.isProcessing && terminalSessionIdsRef.current.has(statusSessionId)) {
onSessionInactive?.(statusSessionId);
onSessionNotProcessing?.(statusSessionId);
if (isCurrentSession) {
setIsLoading(false);
setCanAbortSession(false);
setClaudeStatus(null);
}
return;
}
if (msg.isProcessing) {
onSessionActive?.(statusSessionId);
onSessionProcessing?.(statusSessionId);
@@ -192,10 +180,6 @@ export function useChatRealtimeHandlers({
const sid = msg.sessionId || activeViewSessionId;
if (sid && msg.kind === 'session_created') {
terminalSessionIdsRef.current.delete(sid);
}
// --- Streaming: buffer for performance ---
if (msg.kind === 'stream_delta') {
const text = msg.content || '';
@@ -274,10 +258,6 @@ export function useChatRealtimeHandlers({
}
case 'complete': {
if (sid) {
terminalSessionIdsRef.current.add(sid);
}
// Flush any remaining streaming state
if (streamTimerRef.current) {
clearTimeout(streamTimerRef.current);
@@ -333,10 +313,6 @@ export function useChatRealtimeHandlers({
}
case 'error': {
if (sid) {
terminalSessionIdsRef.current.add(sid);
}
setIsLoading(false);
setCanAbortSession(false);
setClaudeStatus(null);

View File

@@ -131,8 +131,6 @@ export function useChatSessionState({
const pendingInitialScrollRef = useRef(true);
const messagesOffsetRef = useRef(0);
const scrollPositionRef = useRef({ height: 0, top: 0 });
const previousProcessingSessionsRef = useRef<Set<string> | null>(null);
const previousProcessingSessionViewIdRef = useRef<string | null>(null);
const loadAllFinishedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const loadAllOverlayTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
const lastLoadedSessionKeyRef = useRef<string | null>(null);
@@ -695,17 +693,9 @@ export function useChatSessionState({
useEffect(() => {
const activeViewSessionId = selectedSession?.id || currentSessionId;
const previousProcessingSessions = previousProcessingSessionsRef.current;
const previousProcessingSessionViewId = previousProcessingSessionViewIdRef.current;
previousProcessingSessionsRef.current = processingSessions ?? null;
previousProcessingSessionViewIdRef.current = activeViewSessionId ?? null;
if (!activeViewSessionId || !processingSessions) return;
const activeViewSessionChanged = previousProcessingSessionViewId !== activeViewSessionId;
const wasProcessing = previousProcessingSessions?.has(activeViewSessionId) ?? false;
const shouldBeProcessing = processingSessions.has(activeViewSessionId);
if (shouldBeProcessing && (!wasProcessing || activeViewSessionChanged) && !isLoading) {
if (shouldBeProcessing && !isLoading) {
setIsLoading(true);
setCanAbortSession(true);
}

View File

@@ -26,6 +26,7 @@ const STARTER_PLUGIN_URL = 'https://github.com/cloudcli-ai/cloudcli-plugin-start
const TERMINAL_PLUGIN_URL = 'https://github.com/cloudcli-ai/cloudcli-plugin-terminal';
const SCHEDULED_PROMPT_PLUGIN_URL = 'https://github.com/grostim/cloudcli-cron';
const CLAUDE_WATCH_PLUGIN_URL = 'https://github.com/satsuki19980613/cloudcli-claude-watch';
const PRISM_CLOUDCLI_PLUGIN_URL = 'https://github.com/jakeefr/cloudcli-plugin-prism';
type PluginRecommendation = {
id: string;
@@ -72,6 +73,14 @@ const UNOFFICIAL_PLUGIN_RECOMMENDATIONS: PluginRecommendation[] = [
icon: Clock,
source: 'unofficial',
},
{
id: 'prism-cloudcli',
translationKey: 'prismCloudCLI',
repoUrl: PRISM_CLOUDCLI_PLUGIN_URL,
installedNames: ['prism-cloudcli'],
icon: Activity,
source: 'unofficial'
}
];
function repoSlug(repoUrl: string) {

View File

@@ -502,6 +502,12 @@
"description": "Watch long-running Claude Code sessions for hangs and expose process controls.",
"install": "Install"
},
"prismCloudCLI": {
"name": "PRISM CloudCLI",
"badge": "unofficial",
"description": "Session intelligence for Claude Code, inside CloudCLI. See why your sessions are burning tokens without leaving the browser.",
"install": "Install"
},
"morePlugins": "More",
"enable": "Enable",
"disable": "Disable",