@parhelia/core 0.1.12719 → 0.1.12737
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/ItemInfo.js +2 -1
- package/dist/editor/ItemInfo.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +95 -50
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/ToolCallDisplay.js +14 -9
- package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
- package/dist/editor/client/EditorShell.js +70 -35
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +2 -3
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +3 -0
- package/dist/editor/client/hooks/useSocketMessageHandler.js +42 -3
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/operations.js +0 -24
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/commands/itemCommands.js +2 -0
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js +3 -2
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.js +3 -3
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +3 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/editor/ui/ItemNameDialogNew.d.ts +4 -0
- package/dist/editor/ui/ItemNameDialogNew.js +7 -5
- package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
package/dist/editor/ItemInfo.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from "react";
|
|
4
|
-
import { GitBranch, Pencil, RefreshCw } from "lucide-react";
|
|
4
|
+
import { GitBranch, Pencil, RefreshCw, Type } from "lucide-react";
|
|
5
5
|
import { useEditContext } from "./client/editContext";
|
|
6
6
|
import { CopyButton } from "../components/ui/copy-button";
|
|
7
7
|
import { Section } from "./ui/Section";
|
|
@@ -51,6 +51,7 @@ export function ItemInfo({ item }) {
|
|
|
51
51
|
name: item.displayName || "",
|
|
52
52
|
title: "Edit Display Name",
|
|
53
53
|
message: "Enter a display name for the item:",
|
|
54
|
+
headerIcon: _jsx(Type, { strokeWidth: 1 }),
|
|
54
55
|
validateAsItemName: false,
|
|
55
56
|
allowEmpty: true,
|
|
56
57
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemInfo.js","sourceRoot":"","sources":["../../src/editor/ItemInfo.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ItemInfo.js","sourceRoot":"","sources":["../../src/editor/ItemInfo.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import React, { useEffect, useState, useRef, useCallback, useLayoutEffect, useMemo, } from "react";
|
|
3
3
|
import { flushSync } from "react-dom";
|
|
4
4
|
import { Send, AlertCircle, Loader2, User, Wand2, Square, Mic, MicOff, ChevronDown, ChevronUp, ListTodo, ArrowLeft, DollarSign, ExternalLink, Settings2, Target, X, Plus, } from "lucide-react";
|
|
5
|
-
import { getAgent, startAgent, claimAgentBrowser, cancelAgentDialog, assignAgentSkill, persistDraftAgent, updateAgentSettings, updateAgentCostLimit, updateAgentContext, getAgentSkillCatalog, getAgentAvailableTools, getAgentOperationAllowances, getAgentTriggerSubscriptions, cancelAgent, canonicalizeAgentMetadata, getPendingPrompts, releaseAgentBrowser, revokeAgentSkill, } from "../services/agentService";
|
|
5
|
+
import { getAgent, startAgent, claimAgentBrowser, cancelAgentDialog, assignAgentSkill, persistDraftAgent, updateAgentSettings, updateAgentCostLimit, updateAgentContext, getAgentSkillCatalog, getAgentAvailableTools, getAgentOperationAllowances, getAgentTriggerSubscriptions, cancelAgent, canonicalizeAgentMetadata, getPendingPrompts, getAgentDiagnostics, releaseAgentBrowser, revokeAgentSkill, } from "../services/agentService";
|
|
6
6
|
import { parseAgentStatus } from "../services/agentStatus";
|
|
7
7
|
import { useEditContext, useFieldsEditContext } from "../client/editContext";
|
|
8
8
|
import { localStorageService } from "../services/localStorageService";
|
|
@@ -83,6 +83,13 @@ function buildPlaceholderAgentDetails(agentStub) {
|
|
|
83
83
|
function normalizeDialogAgentId(value) {
|
|
84
84
|
return value?.trim().toLowerCase() || "";
|
|
85
85
|
}
|
|
86
|
+
function normalizeServerExecutionStatus(value) {
|
|
87
|
+
return (value || "").replace(/\s+/g, "").toLowerCase();
|
|
88
|
+
}
|
|
89
|
+
function isFinishedServerExecutionStatus(value) {
|
|
90
|
+
const normalized = normalizeServerExecutionStatus(value);
|
|
91
|
+
return normalized === "completed" || normalized === "cancelled";
|
|
92
|
+
}
|
|
86
93
|
const MACHINE_CAPACITY_REASON = "machineCapacity";
|
|
87
94
|
const MACHINE_CAPACITY_DETAIL = "waitingForCapacity";
|
|
88
95
|
function formatAllowanceSource(source) {
|
|
@@ -2183,6 +2190,37 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
2183
2190
|
return updated;
|
|
2184
2191
|
});
|
|
2185
2192
|
}, [stripHeartbeatMessages]);
|
|
2193
|
+
const settleCompletedRun = useCallback((finalStatus = "completed") => {
|
|
2194
|
+
clearStopGuard();
|
|
2195
|
+
setError(null);
|
|
2196
|
+
lastSeqRef.current = 0;
|
|
2197
|
+
setLastRunStatusReason(null);
|
|
2198
|
+
clearHeartbeatMessages();
|
|
2199
|
+
setMessages((prev) => {
|
|
2200
|
+
const updated = prev.map((msg) => msg.role === "assistant" && !msg.isCompleted
|
|
2201
|
+
? {
|
|
2202
|
+
...msg,
|
|
2203
|
+
isCompleted: true,
|
|
2204
|
+
messageType: "completed",
|
|
2205
|
+
}
|
|
2206
|
+
: msg);
|
|
2207
|
+
messagesRef.current = updated;
|
|
2208
|
+
return updated;
|
|
2209
|
+
});
|
|
2210
|
+
setAgent((prev) => prev
|
|
2211
|
+
? {
|
|
2212
|
+
...prev,
|
|
2213
|
+
status: "idle",
|
|
2214
|
+
statusMessage: finalStatus === "cancelled" ? "Run cancelled" : undefined,
|
|
2215
|
+
}
|
|
2216
|
+
: prev);
|
|
2217
|
+
setIsWaitingForResponse(false);
|
|
2218
|
+
isWaitingRef.current = false;
|
|
2219
|
+
setIsConnecting(false);
|
|
2220
|
+
setIsSubmitting(false);
|
|
2221
|
+
shouldCreateNewMessage.current = false;
|
|
2222
|
+
setIsAgentThinking(false);
|
|
2223
|
+
}, [clearHeartbeatMessages]);
|
|
2186
2224
|
const handleContentChunk = useCallback((message, agentData) => {
|
|
2187
2225
|
// Get messageId from data, or generate one from agent ID (for backward compatibility)
|
|
2188
2226
|
// If no messageId is provided, we'll use the last assistant message or create a new one
|
|
@@ -3484,6 +3522,7 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
3484
3522
|
}
|
|
3485
3523
|
// Deduplicate by sequence
|
|
3486
3524
|
if (seq && seq <= lastSeqRef.current) {
|
|
3525
|
+
appendToolUiEvent("ui:stream-seq-dropped", `agent:run:delta seq=${seq} lastSeq=${lastSeqRef.current}`, seq);
|
|
3487
3526
|
return; // Already processed
|
|
3488
3527
|
}
|
|
3489
3528
|
if (seq) {
|
|
@@ -3552,6 +3591,7 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
3552
3591
|
const { seq, data: statusData } = message.payload;
|
|
3553
3592
|
// Deduplicate by sequence
|
|
3554
3593
|
if (seq && seq <= lastSeqRef.current) {
|
|
3594
|
+
appendToolUiEvent("ui:stream-seq-dropped", `agent:run:status seq=${seq} lastSeq=${lastSeqRef.current}`, seq);
|
|
3555
3595
|
return;
|
|
3556
3596
|
}
|
|
3557
3597
|
if (seq) {
|
|
@@ -3809,31 +3849,7 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
3809
3849
|
}
|
|
3810
3850
|
// Handle "completed" state (fallback for legacy code paths that send status instead of lifecycle event)
|
|
3811
3851
|
if (normalizedStatus === "completed") {
|
|
3812
|
-
|
|
3813
|
-
setError(null);
|
|
3814
|
-
// Reset deduplication for the next run
|
|
3815
|
-
lastSeqRef.current = 0;
|
|
3816
|
-
clearHeartbeatMessages();
|
|
3817
|
-
// Mark the last assistant message as completed
|
|
3818
|
-
setMessages((prev) => {
|
|
3819
|
-
const updated = prev.map((msg) => msg.role === "assistant" && !msg.isCompleted
|
|
3820
|
-
? {
|
|
3821
|
-
...msg,
|
|
3822
|
-
isCompleted: true,
|
|
3823
|
-
messageType: "completed",
|
|
3824
|
-
}
|
|
3825
|
-
: msg);
|
|
3826
|
-
messagesRef.current = updated;
|
|
3827
|
-
return updated;
|
|
3828
|
-
});
|
|
3829
|
-
// Update agent status to idle
|
|
3830
|
-
setAgent((prev) => (prev ? { ...prev, status: "idle" } : prev));
|
|
3831
|
-
setIsWaitingForResponse(false);
|
|
3832
|
-
isWaitingRef.current = false;
|
|
3833
|
-
setIsConnecting(false);
|
|
3834
|
-
shouldCreateNewMessage.current = false;
|
|
3835
|
-
// Server says agent finished thinking
|
|
3836
|
-
setIsAgentThinking(false);
|
|
3852
|
+
settleCompletedRun("completed");
|
|
3837
3853
|
return;
|
|
3838
3854
|
}
|
|
3839
3855
|
// Handle "Running" state - agent is actively processing
|
|
@@ -3895,30 +3911,8 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
3895
3911
|
}
|
|
3896
3912
|
// Lifecycle: agent:run:complete
|
|
3897
3913
|
if (messageType === "agent:run:complete") {
|
|
3898
|
-
|
|
3899
|
-
|
|
3900
|
-
setLastRunStatusReason(null);
|
|
3901
|
-
clearHeartbeatMessages();
|
|
3902
|
-
// Mark the last assistant message as completed
|
|
3903
|
-
setMessages((prev) => {
|
|
3904
|
-
const updated = prev.map((msg) => msg.role === "assistant" && !msg.isCompleted
|
|
3905
|
-
? {
|
|
3906
|
-
...msg,
|
|
3907
|
-
isCompleted: true,
|
|
3908
|
-
messageType: "completed",
|
|
3909
|
-
}
|
|
3910
|
-
: msg);
|
|
3911
|
-
messagesRef.current = updated;
|
|
3912
|
-
return updated;
|
|
3913
|
-
});
|
|
3914
|
-
// Update agent status to idle
|
|
3915
|
-
setAgent((prev) => (prev ? { ...prev, status: "idle" } : prev));
|
|
3916
|
-
setIsWaitingForResponse(false);
|
|
3917
|
-
isWaitingRef.current = false;
|
|
3918
|
-
setIsConnecting(false);
|
|
3919
|
-
shouldCreateNewMessage.current = false;
|
|
3920
|
-
// Server says agent finished thinking
|
|
3921
|
-
setIsAgentThinking(false);
|
|
3914
|
+
const finalStatus = normalizeServerExecutionStatus(message.payload?.finalStatus);
|
|
3915
|
+
settleCompletedRun(finalStatus === "cancelled" ? "cancelled" : "completed");
|
|
3922
3916
|
return;
|
|
3923
3917
|
}
|
|
3924
3918
|
// Lifecycle: agent:run:error
|
|
@@ -3941,12 +3935,14 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
3941
3935
|
}
|
|
3942
3936
|
}, [
|
|
3943
3937
|
agent,
|
|
3938
|
+
appendToolUiEvent,
|
|
3944
3939
|
clearHeartbeatMessages,
|
|
3945
3940
|
handleContentChunk,
|
|
3946
3941
|
handleHeartbeatMessage,
|
|
3947
3942
|
handleToolCall,
|
|
3948
3943
|
handleToolResult,
|
|
3949
3944
|
onAgentUpdate,
|
|
3945
|
+
settleCompletedRun,
|
|
3950
3946
|
]);
|
|
3951
3947
|
// Keep refs for latest agent to avoid adding them to effect deps
|
|
3952
3948
|
const agentRef = useRef(agent);
|
|
@@ -4607,6 +4603,17 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
4607
4603
|
// Don't set isWaitingForResponse since the agent is already running
|
|
4608
4604
|
setIsWaitingForResponse(false);
|
|
4609
4605
|
isWaitingRef.current = false;
|
|
4606
|
+
// Remove the optimistic user message: a queued prompt must not be
|
|
4607
|
+
// inserted into the conversation now, because the still-running agent's
|
|
4608
|
+
// assistant response is going to be appended after it. The queued
|
|
4609
|
+
// prompts UI displays it via agent:prompt:queued, and when the server
|
|
4610
|
+
// dequeues and processes it, agent:user:message will append it in the
|
|
4611
|
+
// correct position (after the prior assistant response).
|
|
4612
|
+
setMessages((prev) => {
|
|
4613
|
+
const updated = prev.filter((m) => m.id !== tempMessageId);
|
|
4614
|
+
messagesRef.current = updated;
|
|
4615
|
+
return updated;
|
|
4616
|
+
});
|
|
4610
4617
|
}
|
|
4611
4618
|
else {
|
|
4612
4619
|
setLastRunStatusReason(null);
|
|
@@ -5479,6 +5486,44 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
5479
5486
|
totalToolCallCount,
|
|
5480
5487
|
agent?.statusMessage,
|
|
5481
5488
|
]);
|
|
5489
|
+
useEffect(() => {
|
|
5490
|
+
if (!isActive || !isExecuting || !currentAgentId) {
|
|
5491
|
+
return;
|
|
5492
|
+
}
|
|
5493
|
+
let disposed = false;
|
|
5494
|
+
const checkServerCompletion = async () => {
|
|
5495
|
+
try {
|
|
5496
|
+
const diagnostics = await getAgentDiagnostics(currentAgentId, editContext?.sessionId);
|
|
5497
|
+
if (disposed) {
|
|
5498
|
+
return;
|
|
5499
|
+
}
|
|
5500
|
+
const serverStatus = diagnostics.execution?.status;
|
|
5501
|
+
if (isFinishedServerExecutionStatus(serverStatus)) {
|
|
5502
|
+
settleCompletedRun(normalizeServerExecutionStatus(serverStatus) === "cancelled"
|
|
5503
|
+
? "cancelled"
|
|
5504
|
+
: "completed");
|
|
5505
|
+
}
|
|
5506
|
+
}
|
|
5507
|
+
catch (error) {
|
|
5508
|
+
console.warn("[AgentTerminal] Failed to reconcile agent run status", error);
|
|
5509
|
+
}
|
|
5510
|
+
};
|
|
5511
|
+
// Avoid racing a freshly submitted run before the backend has registered it.
|
|
5512
|
+
const timeoutId = window.setTimeout(checkServerCompletion, 10_000);
|
|
5513
|
+
const intervalId = window.setInterval(checkServerCompletion, 15_000);
|
|
5514
|
+
return () => {
|
|
5515
|
+
disposed = true;
|
|
5516
|
+
window.clearTimeout(timeoutId);
|
|
5517
|
+
window.clearInterval(intervalId);
|
|
5518
|
+
};
|
|
5519
|
+
}, [
|
|
5520
|
+
currentAgentId,
|
|
5521
|
+
editContext?.sessionId,
|
|
5522
|
+
editContext?.socketConnectionVersion,
|
|
5523
|
+
isActive,
|
|
5524
|
+
isExecuting,
|
|
5525
|
+
settleCompletedRun,
|
|
5526
|
+
]);
|
|
5482
5527
|
const showInitialThinkingSplash = messages.length === 0 &&
|
|
5483
5528
|
!error &&
|
|
5484
5529
|
hideGreeting &&
|