@mohanscodex/spectra-code 0.4.5
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/README.md +275 -0
- package/dist/package.json +62 -0
- package/dist/src/agents/definitions.d.ts +16 -0
- package/dist/src/agents/definitions.d.ts.map +1 -0
- package/dist/src/agents/definitions.js +148 -0
- package/dist/src/agents/definitions.js.map +1 -0
- package/dist/src/agents/registry.d.ts +11 -0
- package/dist/src/agents/registry.d.ts.map +1 -0
- package/dist/src/agents/registry.js +13 -0
- package/dist/src/agents/registry.js.map +1 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +436 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/commands/agent.d.ts +3 -0
- package/dist/src/commands/agent.d.ts.map +1 -0
- package/dist/src/commands/agent.js +28 -0
- package/dist/src/commands/agent.js.map +1 -0
- package/dist/src/commands/db.d.ts +3 -0
- package/dist/src/commands/db.d.ts.map +1 -0
- package/dist/src/commands/db.js +47 -0
- package/dist/src/commands/db.js.map +1 -0
- package/dist/src/commands/doctor.d.ts +12 -0
- package/dist/src/commands/doctor.d.ts.map +1 -0
- package/dist/src/commands/doctor.js +59 -0
- package/dist/src/commands/doctor.js.map +1 -0
- package/dist/src/commands/mcp.d.ts +9 -0
- package/dist/src/commands/mcp.d.ts.map +1 -0
- package/dist/src/commands/mcp.js +208 -0
- package/dist/src/commands/mcp.js.map +1 -0
- package/dist/src/commands/plugin.d.ts +3 -0
- package/dist/src/commands/plugin.d.ts.map +1 -0
- package/dist/src/commands/plugin.js +36 -0
- package/dist/src/commands/plugin.js.map +1 -0
- package/dist/src/commands/session.d.ts +3 -0
- package/dist/src/commands/session.d.ts.map +1 -0
- package/dist/src/commands/session.js +49 -0
- package/dist/src/commands/session.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/acp/index.d.ts +2 -0
- package/dist/src/integrations/acp/index.d.ts.map +1 -0
- package/dist/src/integrations/acp/index.js +2 -0
- package/dist/src/integrations/acp/index.js.map +1 -0
- package/dist/src/integrations/acp/server.d.ts +11 -0
- package/dist/src/integrations/acp/server.d.ts.map +1 -0
- package/dist/src/integrations/acp/server.js +220 -0
- package/dist/src/integrations/acp/server.js.map +1 -0
- package/dist/src/integrations/custom-tools/index.d.ts +3 -0
- package/dist/src/integrations/custom-tools/index.d.ts.map +1 -0
- package/dist/src/integrations/custom-tools/index.js +2 -0
- package/dist/src/integrations/custom-tools/index.js.map +1 -0
- package/dist/src/integrations/custom-tools/loader.d.ts +16 -0
- package/dist/src/integrations/custom-tools/loader.d.ts.map +1 -0
- package/dist/src/integrations/custom-tools/loader.js +95 -0
- package/dist/src/integrations/custom-tools/loader.js.map +1 -0
- package/dist/src/integrations/mcp/client.d.ts +32 -0
- package/dist/src/integrations/mcp/client.d.ts.map +1 -0
- package/dist/src/integrations/mcp/client.js +117 -0
- package/dist/src/integrations/mcp/client.js.map +1 -0
- package/dist/src/integrations/mcp/index.d.ts +3 -0
- package/dist/src/integrations/mcp/index.d.ts.map +1 -0
- package/dist/src/integrations/mcp/index.js +2 -0
- package/dist/src/integrations/mcp/index.js.map +1 -0
- package/dist/src/security/doom-loop.d.ts +22 -0
- package/dist/src/security/doom-loop.d.ts.map +1 -0
- package/dist/src/security/doom-loop.js +72 -0
- package/dist/src/security/doom-loop.js.map +1 -0
- package/dist/src/security/index.d.ts +46 -0
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +362 -0
- package/dist/src/security/index.js.map +1 -0
- package/dist/src/security/path-safety.d.ts +15 -0
- package/dist/src/security/path-safety.d.ts.map +1 -0
- package/dist/src/security/path-safety.js +57 -0
- package/dist/src/security/path-safety.js.map +1 -0
- package/dist/src/security/permissions.d.ts +7 -0
- package/dist/src/security/permissions.d.ts.map +1 -0
- package/dist/src/security/permissions.js +41 -0
- package/dist/src/security/permissions.js.map +1 -0
- package/dist/src/security/read-tracker.d.ts +20 -0
- package/dist/src/security/read-tracker.d.ts.map +1 -0
- package/dist/src/security/read-tracker.js +73 -0
- package/dist/src/security/read-tracker.js.map +1 -0
- package/dist/src/security/ssrf-guard.d.ts +19 -0
- package/dist/src/security/ssrf-guard.d.ts.map +1 -0
- package/dist/src/security/ssrf-guard.js +98 -0
- package/dist/src/security/ssrf-guard.js.map +1 -0
- package/dist/src/security/types.d.ts +70 -0
- package/dist/src/security/types.d.ts.map +1 -0
- package/dist/src/security/types.js +2 -0
- package/dist/src/security/types.js.map +1 -0
- package/dist/src/security/wildcard.d.ts +5 -0
- package/dist/src/security/wildcard.d.ts.map +1 -0
- package/dist/src/security/wildcard.js +50 -0
- package/dist/src/security/wildcard.js.map +1 -0
- package/dist/src/services/auth-store.d.ts +25 -0
- package/dist/src/services/auth-store.d.ts.map +1 -0
- package/dist/src/services/auth-store.js +40 -0
- package/dist/src/services/auth-store.js.map +1 -0
- package/dist/src/services/config.d.ts +66 -0
- package/dist/src/services/config.d.ts.map +1 -0
- package/dist/src/services/config.js +83 -0
- package/dist/src/services/config.js.map +1 -0
- package/dist/src/services/context.d.ts +7 -0
- package/dist/src/services/context.d.ts.map +1 -0
- package/dist/src/services/context.js +23 -0
- package/dist/src/services/context.js.map +1 -0
- package/dist/src/services/custom-providers.d.ts +5 -0
- package/dist/src/services/custom-providers.d.ts.map +1 -0
- package/dist/src/services/custom-providers.js +213 -0
- package/dist/src/services/custom-providers.js.map +1 -0
- package/dist/src/services/session-store.d.ts +76 -0
- package/dist/src/services/session-store.d.ts.map +1 -0
- package/dist/src/services/session-store.js +199 -0
- package/dist/src/services/session-store.js.map +1 -0
- package/dist/src/services/snapshot-manager.d.ts +46 -0
- package/dist/src/services/snapshot-manager.d.ts.map +1 -0
- package/dist/src/services/snapshot-manager.js +183 -0
- package/dist/src/services/snapshot-manager.js.map +1 -0
- package/dist/src/tools/edit.d.ts +3 -0
- package/dist/src/tools/edit.d.ts.map +1 -0
- package/dist/src/tools/edit.js +57 -0
- package/dist/src/tools/edit.js.map +1 -0
- package/dist/src/tools/glob.d.ts +3 -0
- package/dist/src/tools/glob.d.ts.map +1 -0
- package/dist/src/tools/glob.js +46 -0
- package/dist/src/tools/glob.js.map +1 -0
- package/dist/src/tools/grep.d.ts +3 -0
- package/dist/src/tools/grep.d.ts.map +1 -0
- package/dist/src/tools/grep.js +50 -0
- package/dist/src/tools/grep.js.map +1 -0
- package/dist/src/tools/index.d.ts +26 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +202 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/mcp-tool.d.ts +5 -0
- package/dist/src/tools/mcp-tool.d.ts.map +1 -0
- package/dist/src/tools/mcp-tool.js +82 -0
- package/dist/src/tools/mcp-tool.js.map +1 -0
- package/dist/src/tools/read.d.ts +3 -0
- package/dist/src/tools/read.d.ts.map +1 -0
- package/dist/src/tools/read.js +48 -0
- package/dist/src/tools/read.js.map +1 -0
- package/dist/src/tools/shell.d.ts +3 -0
- package/dist/src/tools/shell.d.ts.map +1 -0
- package/dist/src/tools/shell.js +266 -0
- package/dist/src/tools/shell.js.map +1 -0
- package/dist/src/tools/task.d.ts +3 -0
- package/dist/src/tools/task.d.ts.map +1 -0
- package/dist/src/tools/task.js +75 -0
- package/dist/src/tools/task.js.map +1 -0
- package/dist/src/tools/types.d.ts +18 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/tools/types.js +2 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/tools/utils.d.ts +4 -0
- package/dist/src/tools/utils.d.ts.map +1 -0
- package/dist/src/tools/utils.js +10 -0
- package/dist/src/tools/utils.js.map +1 -0
- package/dist/src/tools/web-fetch.d.ts +3 -0
- package/dist/src/tools/web-fetch.d.ts.map +1 -0
- package/dist/src/tools/web-fetch.js +81 -0
- package/dist/src/tools/web-fetch.js.map +1 -0
- package/dist/src/tools/write.d.ts +3 -0
- package/dist/src/tools/write.d.ts.map +1 -0
- package/dist/src/tools/write.js +28 -0
- package/dist/src/tools/write.js.map +1 -0
- package/dist/src/tui/app-constants.d.ts +3 -0
- package/dist/src/tui/app-constants.d.ts.map +1 -0
- package/dist/src/tui/app-constants.js +4 -0
- package/dist/src/tui/app-constants.js.map +1 -0
- package/dist/src/tui/app.d.ts +5 -0
- package/dist/src/tui/app.d.ts.map +1 -0
- package/dist/src/tui/app.js +322 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/tui/commands.d.ts +61 -0
- package/dist/src/tui/commands.d.ts.map +1 -0
- package/dist/src/tui/commands.js +95 -0
- package/dist/src/tui/commands.js.map +1 -0
- package/dist/src/tui/components/chat-area.d.ts +9 -0
- package/dist/src/tui/components/chat-area.d.ts.map +1 -0
- package/dist/src/tui/components/chat-area.js +12 -0
- package/dist/src/tui/components/chat-area.js.map +1 -0
- package/dist/src/tui/components/command-palette.d.ts +18 -0
- package/dist/src/tui/components/command-palette.d.ts.map +1 -0
- package/dist/src/tui/components/command-palette.js +50 -0
- package/dist/src/tui/components/command-palette.js.map +1 -0
- package/dist/src/tui/components/message.d.ts +9 -0
- package/dist/src/tui/components/message.d.ts.map +1 -0
- package/dist/src/tui/components/message.js +116 -0
- package/dist/src/tui/components/message.js.map +1 -0
- package/dist/src/tui/components/slash-autocomplete.d.ts +14 -0
- package/dist/src/tui/components/slash-autocomplete.d.ts.map +1 -0
- package/dist/src/tui/components/slash-autocomplete.js +29 -0
- package/dist/src/tui/components/slash-autocomplete.js.map +1 -0
- package/dist/src/tui/components/toast.d.ts +8 -0
- package/dist/src/tui/components/toast.d.ts.map +1 -0
- package/dist/src/tui/components/toast.js +29 -0
- package/dist/src/tui/components/toast.js.map +1 -0
- package/dist/src/tui/hooks/use-agent.d.ts +20 -0
- package/dist/src/tui/hooks/use-agent.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-agent.js +129 -0
- package/dist/src/tui/hooks/use-agent.js.map +1 -0
- package/dist/src/tui/hooks/use-app-keyboard.d.ts +53 -0
- package/dist/src/tui/hooks/use-app-keyboard.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-app-keyboard.js +155 -0
- package/dist/src/tui/hooks/use-app-keyboard.js.map +1 -0
- package/dist/src/tui/hooks/use-chat-submit.d.ts +61 -0
- package/dist/src/tui/hooks/use-chat-submit.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-chat-submit.js +269 -0
- package/dist/src/tui/hooks/use-chat-submit.js.map +1 -0
- package/dist/src/tui/hooks/use-permission-queue.d.ts +10 -0
- package/dist/src/tui/hooks/use-permission-queue.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-permission-queue.js +26 -0
- package/dist/src/tui/hooks/use-permission-queue.js.map +1 -0
- package/dist/src/tui/hooks/use-revert.d.ts +26 -0
- package/dist/src/tui/hooks/use-revert.d.ts.map +1 -0
- package/dist/src/tui/hooks/use-revert.js +88 -0
- package/dist/src/tui/hooks/use-revert.js.map +1 -0
- package/dist/src/tui/index.d.ts +5 -0
- package/dist/src/tui/index.d.ts.map +1 -0
- package/dist/src/tui/index.js +38 -0
- package/dist/src/tui/index.js.map +1 -0
- package/dist/src/tui/prompt-bar.d.ts +29 -0
- package/dist/src/tui/prompt-bar.d.ts.map +1 -0
- package/dist/src/tui/prompt-bar.js +41 -0
- package/dist/src/tui/prompt-bar.js.map +1 -0
- package/dist/src/tui/slash-commands.d.ts +20 -0
- package/dist/src/tui/slash-commands.d.ts.map +1 -0
- package/dist/src/tui/slash-commands.js +30 -0
- package/dist/src/tui/slash-commands.js.map +1 -0
- package/dist/src/tui/theme.d.ts +29 -0
- package/dist/src/tui/theme.d.ts.map +1 -0
- package/dist/src/tui/theme.js +54 -0
- package/dist/src/tui/theme.js.map +1 -0
- package/dist/src/tui/tips.d.ts +2 -0
- package/dist/src/tui/tips.d.ts.map +1 -0
- package/dist/src/tui/tips.js +40 -0
- package/dist/src/tui/tips.js.map +1 -0
- package/dist/src/tui/types.d.ts +34 -0
- package/dist/src/tui/types.d.ts.map +1 -0
- package/dist/src/tui/types.js +2 -0
- package/dist/src/tui/types.js.map +1 -0
- package/dist/src/tui/ui/about-dialog.d.ts +8 -0
- package/dist/src/tui/ui/about-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/about-dialog.js +21 -0
- package/dist/src/tui/ui/about-dialog.js.map +1 -0
- package/dist/src/tui/ui/agent-switcher.d.ts +10 -0
- package/dist/src/tui/ui/agent-switcher.d.ts.map +1 -0
- package/dist/src/tui/ui/agent-switcher.js +77 -0
- package/dist/src/tui/ui/agent-switcher.js.map +1 -0
- package/dist/src/tui/ui/debug-dialog.d.ts +15 -0
- package/dist/src/tui/ui/debug-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/debug-dialog.js +74 -0
- package/dist/src/tui/ui/debug-dialog.js.map +1 -0
- package/dist/src/tui/ui/doctor-dialog.d.ts +9 -0
- package/dist/src/tui/ui/doctor-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/doctor-dialog.js +45 -0
- package/dist/src/tui/ui/doctor-dialog.js.map +1 -0
- package/dist/src/tui/ui/manage-providers-dialog.d.ts +10 -0
- package/dist/src/tui/ui/manage-providers-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/manage-providers-dialog.js +257 -0
- package/dist/src/tui/ui/manage-providers-dialog.js.map +1 -0
- package/dist/src/tui/ui/mcp-toggle-dialog.d.ts +8 -0
- package/dist/src/tui/ui/mcp-toggle-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/mcp-toggle-dialog.js +89 -0
- package/dist/src/tui/ui/mcp-toggle-dialog.js.map +1 -0
- package/dist/src/tui/ui/message-controls.d.ts +16 -0
- package/dist/src/tui/ui/message-controls.d.ts.map +1 -0
- package/dist/src/tui/ui/message-controls.js +102 -0
- package/dist/src/tui/ui/message-controls.js.map +1 -0
- package/dist/src/tui/ui/model-switcher.d.ts +10 -0
- package/dist/src/tui/ui/model-switcher.d.ts.map +1 -0
- package/dist/src/tui/ui/model-switcher.js +139 -0
- package/dist/src/tui/ui/model-switcher.js.map +1 -0
- package/dist/src/tui/ui/permission-dialog.d.ts +12 -0
- package/dist/src/tui/ui/permission-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/permission-dialog.js +37 -0
- package/dist/src/tui/ui/permission-dialog.js.map +1 -0
- package/dist/src/tui/ui/provider-dialog.d.ts +11 -0
- package/dist/src/tui/ui/provider-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/provider-dialog.js +232 -0
- package/dist/src/tui/ui/provider-dialog.js.map +1 -0
- package/dist/src/tui/ui/session-list.d.ts +23 -0
- package/dist/src/tui/ui/session-list.d.ts.map +1 -0
- package/dist/src/tui/ui/session-list.js +147 -0
- package/dist/src/tui/ui/session-list.js.map +1 -0
- package/dist/src/tui/ui/thinking-effort-dialog.d.ts +11 -0
- package/dist/src/tui/ui/thinking-effort-dialog.d.ts.map +1 -0
- package/dist/src/tui/ui/thinking-effort-dialog.js +79 -0
- package/dist/src/tui/ui/thinking-effort-dialog.js.map +1 -0
- package/dist/src/tui/utils/model-config.d.ts +9 -0
- package/dist/src/tui/utils/model-config.d.ts.map +1 -0
- package/dist/src/tui/utils/model-config.js +63 -0
- package/dist/src/tui/utils/model-config.js.map +1 -0
- package/dist/src/tui/utils/session-messages.d.ts +22 -0
- package/dist/src/tui/utils/session-messages.d.ts.map +1 -0
- package/dist/src/tui/utils/session-messages.js +62 -0
- package/dist/src/tui/utils/session-messages.js.map +1 -0
- package/dist/src/tui/utils.d.ts +6 -0
- package/dist/src/tui/utils.d.ts.map +1 -0
- package/dist/src/tui/utils.js +23 -0
- package/dist/src/tui/utils.js.map +1 -0
- package/dist/src/tui/variant-cycle.d.ts +10 -0
- package/dist/src/tui/variant-cycle.d.ts.map +1 -0
- package/dist/src/tui/variant-cycle.js +64 -0
- package/dist/src/tui/variant-cycle.js.map +1 -0
- package/dist/src/utils/paths.d.ts +10 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +106 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/platform.d.ts +10 -0
- package/dist/src/utils/platform.d.ts.map +1 -0
- package/dist/src/utils/platform.js +133 -0
- package/dist/src/utils/platform.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { useRef, useCallback } from "react";
|
|
2
|
+
import { genId, getMessageBlocks } from "../utils.js";
|
|
3
|
+
import { AGENT_DEFINITIONS } from "../../agents/definitions.js";
|
|
4
|
+
import { parseSlashCommand } from "../slash-commands.js";
|
|
5
|
+
import { showToast } from "../components/toast.js";
|
|
6
|
+
export function useChatSubmit(deps) {
|
|
7
|
+
const { sessionStore, sessionId, agentRef, securityRef, loadedSessionMessages, snapshotManager, lastAgentRef, isStreamingRef, currentTurnStartRef, currentTurnMsgIdRef, revertPoint, getOrCreateAgent, selectedModel, provider, selectedAgent, customProviders, thinkingEffort, cmdItems, slashNames, addMessage, updateMessage, setMessages, setIsLoading, setStatus, setRoute, setElapsedMs, setTokPerSec, setTokenUsage, setDraftText, setSlashSelected, setSubmitKey, setPromptHistory, setHistoryIdx, setInterruptKey, setRevertPoint, discardRevert, } = deps;
|
|
8
|
+
const shownToolCalls = useRef(new Set());
|
|
9
|
+
const toolMsgMap = useRef(new Map());
|
|
10
|
+
const toolArgsMap = useRef(new Map());
|
|
11
|
+
const streamingIdRef = useRef(null);
|
|
12
|
+
const queuedMessageRef = useRef(null);
|
|
13
|
+
function persistMessage(sdkMsg) {
|
|
14
|
+
if (!sessionId.current)
|
|
15
|
+
return;
|
|
16
|
+
sessionStore.current.addMessage(sessionId.current, sdkMsg);
|
|
17
|
+
}
|
|
18
|
+
function updateLastAssistantMeta(meta) {
|
|
19
|
+
if (!sessionId.current)
|
|
20
|
+
return;
|
|
21
|
+
const sess = sessionStore.current.get(sessionId.current);
|
|
22
|
+
if (!sess)
|
|
23
|
+
return;
|
|
24
|
+
for (let i = sess.messages.length - 1; i >= 0; i--) {
|
|
25
|
+
const msg = sess.messages[i];
|
|
26
|
+
if (msg.role === "assistant") {
|
|
27
|
+
msg.metadata = { ...msg.metadata, ...meta };
|
|
28
|
+
sessionStore.current.save(sess);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const handleSubmit = useCallback(async (text) => {
|
|
34
|
+
const trimmed = text.trim();
|
|
35
|
+
if (!trimmed)
|
|
36
|
+
return;
|
|
37
|
+
if (isStreamingRef.current) {
|
|
38
|
+
queuedMessageRef.current = trimmed;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const parsed = parseSlashCommand(trimmed, slashNames);
|
|
42
|
+
if (parsed.type === "command") {
|
|
43
|
+
const cmd = cmdItems.find((item) => {
|
|
44
|
+
if (item.slashName === parsed.command.name)
|
|
45
|
+
return true;
|
|
46
|
+
if (item.slashAliases?.includes(parsed.command.name))
|
|
47
|
+
return true;
|
|
48
|
+
return false;
|
|
49
|
+
});
|
|
50
|
+
if (cmd) {
|
|
51
|
+
cmd.action();
|
|
52
|
+
setDraftText("");
|
|
53
|
+
setSlashSelected(0);
|
|
54
|
+
setSubmitKey((k) => k + 1);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (!selectedModel || !provider) {
|
|
59
|
+
showToast("Connect a provider to send prompts", "warn");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (revertPoint !== null) {
|
|
63
|
+
discardRevert();
|
|
64
|
+
}
|
|
65
|
+
setDraftText("");
|
|
66
|
+
setSlashSelected(0);
|
|
67
|
+
setTokPerSec(null);
|
|
68
|
+
setElapsedMs(null);
|
|
69
|
+
shownToolCalls.current.clear();
|
|
70
|
+
toolMsgMap.current.clear();
|
|
71
|
+
toolArgsMap.current.clear();
|
|
72
|
+
setPromptHistory((prev) => {
|
|
73
|
+
if (prev[0] === trimmed)
|
|
74
|
+
return prev;
|
|
75
|
+
return [trimmed, ...prev].slice(0, 50);
|
|
76
|
+
});
|
|
77
|
+
setHistoryIdx(-1);
|
|
78
|
+
const uid = genId();
|
|
79
|
+
const userMsg = { role: "user", content: trimmed, timestamp: Date.now() };
|
|
80
|
+
addMessage({ id: uid, role: "user", content: trimmed, model: selectedModel });
|
|
81
|
+
setIsLoading(true);
|
|
82
|
+
setStatus("Streaming...");
|
|
83
|
+
setRoute("chat");
|
|
84
|
+
isStreamingRef.current = true;
|
|
85
|
+
streamingIdRef.current = "pending";
|
|
86
|
+
if (!sessionId.current) {
|
|
87
|
+
agentRef.current = null;
|
|
88
|
+
loadedSessionMessages.current = [];
|
|
89
|
+
const sess = sessionStore.current.create({ agent: selectedAgent, model: selectedModel, provider, thinkingEffort: thinkingEffort || undefined });
|
|
90
|
+
sess.title = `Session ${new Date().toISOString()}`;
|
|
91
|
+
sessionStore.current.save(sess);
|
|
92
|
+
sessionId.current = sess.id;
|
|
93
|
+
setTokenUsage(() => ({ input: 0, output: 0 }));
|
|
94
|
+
}
|
|
95
|
+
persistMessage(userMsg);
|
|
96
|
+
const sess = sessionStore.current.get(sessionId.current);
|
|
97
|
+
if (sess && sess.messages.length === 1) {
|
|
98
|
+
sess.title = trimmed.length > 60 ? trimmed.slice(0, 57) + "..." : trimmed;
|
|
99
|
+
sessionStore.current.save(sess);
|
|
100
|
+
}
|
|
101
|
+
const start = performance.now();
|
|
102
|
+
let currentAssistantId = null;
|
|
103
|
+
currentTurnStartRef.current = start;
|
|
104
|
+
try {
|
|
105
|
+
const agent = await getOrCreateAgent(selectedModel, provider, selectedAgent, customProviders, thinkingEffort);
|
|
106
|
+
let promptInput = trimmed;
|
|
107
|
+
const prevAgent = lastAgentRef.current;
|
|
108
|
+
if (prevAgent && prevAgent !== selectedAgent) {
|
|
109
|
+
const def = AGENT_DEFINITIONS[selectedAgent];
|
|
110
|
+
const prevDef = AGENT_DEFINITIONS[prevAgent];
|
|
111
|
+
if (prevDef?.mode === "primary" && def?.mode === "primary") {
|
|
112
|
+
if (prevAgent === "plan" && selectedAgent !== "plan") {
|
|
113
|
+
promptInput = `<system-reminder>\nYou are now in ${selectedAgent} mode. The previous agent was in plan mode — a plan may have been created. Execute on it if one exists.\n</system-reminder>\n\n${trimmed}`;
|
|
114
|
+
}
|
|
115
|
+
else if (selectedAgent === "plan") {
|
|
116
|
+
promptInput = `<system-reminder>\nPlan mode active. You are in read-only analysis mode — do NOT make edits, do NOT run destructive commands. Use read, glob, grep, and web_fetch only. When done, call plan_exit so the user can switch to build mode.\n</system-reminder>\n\n${trimmed}`;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
promptInput = `<system-reminder>\nYou are now in ${selectedAgent} mode (was ${prevAgent}). Your available tools and behavior have changed to match this mode.\n</system-reminder>\n\n${trimmed}`;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
for await (const ev of agent.run(promptInput)) {
|
|
124
|
+
if (ev.type === "message_start" && ev.message.role === "assistant") {
|
|
125
|
+
const newId = genId();
|
|
126
|
+
currentAssistantId = newId;
|
|
127
|
+
currentTurnMsgIdRef.current = newId;
|
|
128
|
+
streamingIdRef.current = newId;
|
|
129
|
+
addMessage({ id: newId, role: "assistant", content: "", blocks: [], streaming: true, model: selectedModel, agent: selectedAgent });
|
|
130
|
+
}
|
|
131
|
+
if (ev.type === "message_update" && ev.message.role === "assistant" && currentAssistantId) {
|
|
132
|
+
const m = ev.message;
|
|
133
|
+
const blocks = getMessageBlocks(m);
|
|
134
|
+
const textContent = blocks.filter((b) => b.type === "text").map((b) => b.content).join("\n");
|
|
135
|
+
updateMessage(currentAssistantId, { content: textContent, blocks });
|
|
136
|
+
if (ev.assistantMessageEvent.type === "toolcall_end") {
|
|
137
|
+
const tc = ev.assistantMessageEvent.toolCall;
|
|
138
|
+
if (tc && !shownToolCalls.current.has(tc.id)) {
|
|
139
|
+
shownToolCalls.current.add(tc.id);
|
|
140
|
+
toolArgsMap.current.set(tc.id, tc.arguments);
|
|
141
|
+
const tuiId = genId();
|
|
142
|
+
toolMsgMap.current.set(tc.id, tuiId);
|
|
143
|
+
addMessage({ id: tuiId, role: "tool", content: "", meta: `${tc.name}(${JSON.stringify(tc.arguments || {})})`, agent: selectedAgent });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (ev.type === "message_end" && ev.message.role === "assistant" && currentAssistantId) {
|
|
148
|
+
const m = ev.message;
|
|
149
|
+
const blocks = getMessageBlocks(m);
|
|
150
|
+
const textContent = blocks.filter((b) => b.type === "text").map((b) => b.content).join("\n");
|
|
151
|
+
const duration = performance.now() - (currentTurnStartRef.current ?? start);
|
|
152
|
+
updateMessage(currentAssistantId, {
|
|
153
|
+
content: textContent,
|
|
154
|
+
blocks,
|
|
155
|
+
streaming: false,
|
|
156
|
+
turnTokens: { input: m.usage.input, output: m.usage.output },
|
|
157
|
+
turnDurationMs: Math.round(duration),
|
|
158
|
+
});
|
|
159
|
+
persistMessage({
|
|
160
|
+
...m,
|
|
161
|
+
metadata: {
|
|
162
|
+
...m.metadata,
|
|
163
|
+
turnDurationMs: Math.round(duration),
|
|
164
|
+
turnTokens: { input: m.usage.input, output: m.usage.output },
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
const e = performance.now() - start;
|
|
168
|
+
setElapsedMs(e);
|
|
169
|
+
const ot = m.usage.output;
|
|
170
|
+
if (ot > 0 && e > 0)
|
|
171
|
+
setTokPerSec(ot / (e / 1000));
|
|
172
|
+
setTokenUsage((p) => ({ input: m.usage.input, output: p.output + ot }));
|
|
173
|
+
currentAssistantId = null;
|
|
174
|
+
streamingIdRef.current = null;
|
|
175
|
+
}
|
|
176
|
+
if (ev.type === "tool_execution_start") {
|
|
177
|
+
if (ev.args && typeof ev.args === "object") {
|
|
178
|
+
const args = ev.args;
|
|
179
|
+
const filePath = (args.path || args.file_path || args.filePath);
|
|
180
|
+
if (filePath && typeof filePath === "string") {
|
|
181
|
+
snapshotManager.current.note(filePath);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (!shownToolCalls.current.has(ev.toolCallId)) {
|
|
185
|
+
shownToolCalls.current.add(ev.toolCallId);
|
|
186
|
+
toolArgsMap.current.set(ev.toolCallId, ev.args);
|
|
187
|
+
const tuiId = genId();
|
|
188
|
+
toolMsgMap.current.set(ev.toolCallId, tuiId);
|
|
189
|
+
addMessage({ id: tuiId, role: "tool", content: "", meta: `${ev.toolName}(${JSON.stringify(ev.args || {})})`, agent: selectedAgent });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (ev.type === "tool_execution_end") {
|
|
193
|
+
const args = toolArgsMap.current.get(ev.toolCallId) || {};
|
|
194
|
+
const resultDetails = ev.result?.details ?? {};
|
|
195
|
+
const toolMsg = {
|
|
196
|
+
role: "toolResult",
|
|
197
|
+
toolCallId: ev.toolCallId,
|
|
198
|
+
toolName: ev.toolName,
|
|
199
|
+
content: ev.result?.content || [],
|
|
200
|
+
details: { args, ...resultDetails },
|
|
201
|
+
isError: ev.isError || false,
|
|
202
|
+
timestamp: Date.now(),
|
|
203
|
+
};
|
|
204
|
+
persistMessage(toolMsg);
|
|
205
|
+
const tuiId = toolMsgMap.current.get(ev.toolCallId);
|
|
206
|
+
if (tuiId) {
|
|
207
|
+
const toolOutput = ev.result?.content?.[0]?.text || "";
|
|
208
|
+
const exitCode = typeof resultDetails.exitCode === "number" ? resultDetails.exitCode : undefined;
|
|
209
|
+
updateMessage(tuiId, { content: toolOutput, exitCode });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (ev.type === "agent_end") {
|
|
213
|
+
setStatus("Ready");
|
|
214
|
+
if (currentTurnMsgIdRef.current) {
|
|
215
|
+
updateMessage(currentTurnMsgIdRef.current, { turnStatus: "completed" });
|
|
216
|
+
}
|
|
217
|
+
updateLastAssistantMeta({ turnStatus: "completed" });
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
const errId = currentAssistantId || genId();
|
|
223
|
+
updateMessage(errId, { content: `Error: ${err instanceof Error ? err.message : String(err)}`, streaming: false, role: "error" });
|
|
224
|
+
if (currentTurnMsgIdRef.current) {
|
|
225
|
+
updateMessage(currentTurnMsgIdRef.current, { turnStatus: "error", streaming: false });
|
|
226
|
+
}
|
|
227
|
+
updateLastAssistantMeta({ turnStatus: "error" });
|
|
228
|
+
setStatus("Error");
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
if (snapshotManager.current.isActive()) {
|
|
232
|
+
snapshotManager.current.commit();
|
|
233
|
+
}
|
|
234
|
+
setIsLoading(false);
|
|
235
|
+
setSubmitKey((k) => k + 1);
|
|
236
|
+
setInterruptKey(0);
|
|
237
|
+
isStreamingRef.current = false;
|
|
238
|
+
streamingIdRef.current = null;
|
|
239
|
+
currentTurnStartRef.current = null;
|
|
240
|
+
currentTurnMsgIdRef.current = null;
|
|
241
|
+
const queued = queuedMessageRef.current;
|
|
242
|
+
if (queued) {
|
|
243
|
+
queuedMessageRef.current = null;
|
|
244
|
+
await handleSubmit(queued);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}, [
|
|
248
|
+
selectedModel, provider, selectedAgent, customProviders, thinkingEffort,
|
|
249
|
+
cmdItems, slashNames, getOrCreateAgent, revertPoint,
|
|
250
|
+
addMessage, updateMessage, sessionStore, sessionId, agentRef,
|
|
251
|
+
loadedSessionMessages, snapshotManager, lastAgentRef, isStreamingRef,
|
|
252
|
+
currentTurnStartRef, currentTurnMsgIdRef,
|
|
253
|
+
setIsLoading, setStatus, setRoute, setElapsedMs, setTokPerSec,
|
|
254
|
+
setTokenUsage, setDraftText, setSlashSelected, setSubmitKey,
|
|
255
|
+
setPromptHistory, setHistoryIdx, setInterruptKey, setRevertPoint,
|
|
256
|
+
discardRevert, securityRef,
|
|
257
|
+
]);
|
|
258
|
+
return {
|
|
259
|
+
shownToolCalls,
|
|
260
|
+
toolMsgMap,
|
|
261
|
+
toolArgsMap,
|
|
262
|
+
streamingIdRef,
|
|
263
|
+
queuedMessageRef,
|
|
264
|
+
handleSubmit,
|
|
265
|
+
persistMessage,
|
|
266
|
+
updateLastAssistantMeta,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=use-chat-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chat-submit.js","sourceRoot":"","sources":["../../../../src/tui/hooks/use-chat-submit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SecurityManager } from "../../security/index.js";
|
|
2
|
+
import type { PermissionRequest } from "../../security/types.js";
|
|
3
|
+
export declare function usePermissionQueue(securityRef: React.MutableRefObject<SecurityManager | null>): {
|
|
4
|
+
permissionRequest: PermissionRequest | null;
|
|
5
|
+
enqueuePermission: (req: PermissionRequest) => void;
|
|
6
|
+
resolvePermission: (id: string, response: {
|
|
7
|
+
action: "once" | "always" | "deny";
|
|
8
|
+
}) => void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=use-permission-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-permission-queue.d.ts","sourceRoot":"","sources":["../../../../src/tui/hooks/use-permission-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAEhE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC;;6BAShD,iBAAiB;4BAOlB,MAAM,YAAY;QAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;KAAE;EAWpG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useRef, useState, useCallback } from "react";
|
|
2
|
+
export function usePermissionQueue(securityRef) {
|
|
3
|
+
const permissionQueueRef = useRef([]);
|
|
4
|
+
const [permissionRequest, setPermissionRequest] = useState(null);
|
|
5
|
+
const showNextPermission = useCallback(() => {
|
|
6
|
+
const next = permissionQueueRef.current[0] ?? null;
|
|
7
|
+
setPermissionRequest(next);
|
|
8
|
+
}, []);
|
|
9
|
+
const enqueuePermission = useCallback((req) => {
|
|
10
|
+
permissionQueueRef.current.push(req);
|
|
11
|
+
if (!permissionRequest) {
|
|
12
|
+
showNextPermission();
|
|
13
|
+
}
|
|
14
|
+
}, [permissionRequest, showNextPermission]);
|
|
15
|
+
const resolvePermission = useCallback((id, response) => {
|
|
16
|
+
securityRef.current?.respondToRequest(id, response);
|
|
17
|
+
permissionQueueRef.current = permissionQueueRef.current.filter((r) => r.id !== id);
|
|
18
|
+
showNextPermission();
|
|
19
|
+
}, [showNextPermission]);
|
|
20
|
+
return {
|
|
21
|
+
permissionRequest,
|
|
22
|
+
enqueuePermission,
|
|
23
|
+
resolvePermission,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=use-permission-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-permission-queue.js","sourceRoot":"","sources":["../../../../src/tui/hooks/use-permission-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAIrD,MAAM,UAAU,kBAAkB,CAAC,WAA2D;IAC5F,MAAM,kBAAkB,GAAG,MAAM,CAAsB,EAAE,CAAC,CAAA;IAC1D,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAA2B,IAAI,CAAC,CAAA;IAE1F,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAClD,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,GAAsB,EAAE,EAAE;QAC/D,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,kBAAkB,EAAE,CAAA;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE3C,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,EAAU,EAAE,QAAgD,EAAE,EAAE;QACrG,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;QACnD,kBAAkB,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QAClF,kBAAkB,EAAE,CAAA;IACtB,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAA;IAExB,OAAO;QACL,iBAAiB;QACjB,iBAAiB;QACjB,iBAAiB;KAClB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ChatMessage } from "../types.js";
|
|
2
|
+
import type { Message } from "@mohanscodex/spectra-ai";
|
|
3
|
+
import type { SessionStore } from "../../services/session-store.js";
|
|
4
|
+
import type { SnapshotManager } from "../../services/snapshot-manager.js";
|
|
5
|
+
interface RevertDeps {
|
|
6
|
+
sessionStore: React.MutableRefObject<SessionStore>;
|
|
7
|
+
sessionId: React.MutableRefObject<string | null>;
|
|
8
|
+
agentRef: React.MutableRefObject<any>;
|
|
9
|
+
loadedSessionMessages: React.MutableRefObject<Message[]>;
|
|
10
|
+
setMessages: (fn: (prev: ChatMessage[]) => ChatMessage[]) => void;
|
|
11
|
+
setRevertPoint: (id: string | null) => void;
|
|
12
|
+
setHistoryIdx: (idx: number) => void;
|
|
13
|
+
setNavKey: (fn: (k: number) => number) => void;
|
|
14
|
+
snapshotManager: React.MutableRefObject<SnapshotManager>;
|
|
15
|
+
}
|
|
16
|
+
export declare function useRevert(deps: RevertDeps): {
|
|
17
|
+
revertedMessagesRef: import("react").RefObject<ChatMessage[]>;
|
|
18
|
+
revertedSdkMessagesRef: import("react").RefObject<Message[]>;
|
|
19
|
+
revertDraftRef: import("react").RefObject<string>;
|
|
20
|
+
runRevert: (messages: ChatMessage[], msgId: string) => void;
|
|
21
|
+
runRedo: () => void;
|
|
22
|
+
runRollbackFiles: () => void;
|
|
23
|
+
discardRevert: () => void;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=use-revert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-revert.d.ts","sourceRoot":"","sources":["../../../../src/tui/hooks/use-revert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAGzE,UAAU,UAAU;IAClB,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;IAClD,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAChD,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;IACrC,qBAAqB,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAA;IACxD,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,CAAA;IACjE,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;IAC3C,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAAK,IAAI,CAAA;IAC9C,eAAe,EAAE,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAA;CACzD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU;;;;0BAiBC,WAAW,EAAE,SAAS,MAAM;;;;EA4FtE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useRef, useCallback } from "react";
|
|
2
|
+
import { showToast } from "../components/toast.js";
|
|
3
|
+
export function useRevert(deps) {
|
|
4
|
+
const { sessionStore, sessionId, agentRef, loadedSessionMessages, setMessages, setRevertPoint, setHistoryIdx, setNavKey, snapshotManager, } = deps;
|
|
5
|
+
const revertedMessagesRef = useRef([]);
|
|
6
|
+
const revertedSdkMessagesRef = useRef([]);
|
|
7
|
+
const revertDraftRef = useRef("");
|
|
8
|
+
const runRevert = useCallback((messages, msgId) => {
|
|
9
|
+
const targetIdx = messages.findIndex(m => m.id === msgId);
|
|
10
|
+
if (targetIdx < 0)
|
|
11
|
+
return;
|
|
12
|
+
const keptMessages = messages.slice(0, targetIdx);
|
|
13
|
+
const removedMessages = messages.slice(targetIdx);
|
|
14
|
+
revertedMessagesRef.current = removedMessages;
|
|
15
|
+
setRevertPoint(messages[targetIdx].id);
|
|
16
|
+
revertDraftRef.current = messages[targetIdx].content;
|
|
17
|
+
setMessages(() => keptMessages);
|
|
18
|
+
const sess = sessionStore.current.get(sessionId.current);
|
|
19
|
+
if (sess) {
|
|
20
|
+
const keptSdkMessages = sess.messages.slice(0, targetIdx);
|
|
21
|
+
revertedSdkMessagesRef.current = sess.messages.slice(targetIdx);
|
|
22
|
+
sess.messages = keptSdkMessages;
|
|
23
|
+
sessionStore.current.save(sess);
|
|
24
|
+
loadedSessionMessages.current = keptSdkMessages;
|
|
25
|
+
}
|
|
26
|
+
if (agentRef.current) {
|
|
27
|
+
agentRef.current.reset();
|
|
28
|
+
if (loadedSessionMessages.current.length > 0) {
|
|
29
|
+
agentRef.current.restoreHistory(loadedSessionMessages.current);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
setHistoryIdx(-1);
|
|
33
|
+
setNavKey((k) => k + 1);
|
|
34
|
+
showToast("Reverted — Ctrl+Y to redo", "success");
|
|
35
|
+
}, [sessionStore, sessionId, agentRef, loadedSessionMessages, setMessages, setRevertPoint, setHistoryIdx, setNavKey]);
|
|
36
|
+
const runRedo = useCallback(() => {
|
|
37
|
+
if (revertedMessagesRef.current.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
setMessages((prev) => [...prev, ...revertedMessagesRef.current]);
|
|
40
|
+
const sess = sessionStore.current.get(sessionId.current);
|
|
41
|
+
if (sess) {
|
|
42
|
+
sess.messages = [...sess.messages, ...revertedSdkMessagesRef.current];
|
|
43
|
+
sessionStore.current.save(sess);
|
|
44
|
+
loadedSessionMessages.current = sess.messages;
|
|
45
|
+
}
|
|
46
|
+
if (agentRef.current) {
|
|
47
|
+
agentRef.current.reset();
|
|
48
|
+
if (loadedSessionMessages.current.length > 0) {
|
|
49
|
+
agentRef.current.restoreHistory(loadedSessionMessages.current);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
setRevertPoint(null);
|
|
53
|
+
revertDraftRef.current = "";
|
|
54
|
+
revertedMessagesRef.current = [];
|
|
55
|
+
revertedSdkMessagesRef.current = [];
|
|
56
|
+
setHistoryIdx(-1);
|
|
57
|
+
setNavKey((k) => k + 1);
|
|
58
|
+
showToast("Messages restored", "success");
|
|
59
|
+
}, [sessionStore, sessionId, agentRef, loadedSessionMessages, setMessages, setRevertPoint, setHistoryIdx, setNavKey]);
|
|
60
|
+
const runRollbackFiles = useCallback(() => {
|
|
61
|
+
const result = snapshotManager.current.rollback("user requested file rollback");
|
|
62
|
+
if (result.restored > 0 || result.deleted > 0) {
|
|
63
|
+
showToast(`Files rolled back: ${result.restored} restored, ${result.deleted} deleted`, "success");
|
|
64
|
+
}
|
|
65
|
+
else if (result.errors.length > 0) {
|
|
66
|
+
showToast(`Rollback errors: ${result.errors.map((e) => e.error).join(", ")}`, "warn");
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
showToast("No files to rollback", "info");
|
|
70
|
+
}
|
|
71
|
+
}, [snapshotManager]);
|
|
72
|
+
const discardRevert = useCallback(() => {
|
|
73
|
+
revertedMessagesRef.current = [];
|
|
74
|
+
revertedSdkMessagesRef.current = [];
|
|
75
|
+
revertDraftRef.current = "";
|
|
76
|
+
setRevertPoint(null);
|
|
77
|
+
}, [setRevertPoint]);
|
|
78
|
+
return {
|
|
79
|
+
revertedMessagesRef,
|
|
80
|
+
revertedSdkMessagesRef,
|
|
81
|
+
revertDraftRef,
|
|
82
|
+
runRevert,
|
|
83
|
+
runRedo,
|
|
84
|
+
runRollbackFiles,
|
|
85
|
+
discardRevert,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=use-revert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-revert.js","sourceRoot":"","sources":["../../../../src/tui/hooks/use-revert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tui/index.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,SAAS,CAAC,QAAQ,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCxE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { createCliRenderer } from "@opentui/core";
|
|
3
|
+
import { createRoot } from "@opentui/react";
|
|
4
|
+
import { App } from "./app.js";
|
|
5
|
+
export async function launchTui(_options = {}) {
|
|
6
|
+
console.error = (() => {
|
|
7
|
+
const orig = console.error.bind(console);
|
|
8
|
+
return (...args) => {
|
|
9
|
+
orig("[spectra]", ...args);
|
|
10
|
+
};
|
|
11
|
+
})();
|
|
12
|
+
process.on("unhandledRejection", (err) => {
|
|
13
|
+
console.error("Unhandled rejection:", err);
|
|
14
|
+
});
|
|
15
|
+
process.on("uncaughtException", (err) => {
|
|
16
|
+
console.error("Uncaught exception:", err);
|
|
17
|
+
});
|
|
18
|
+
try {
|
|
19
|
+
const renderer = await createCliRenderer({
|
|
20
|
+
exitOnCtrlC: false,
|
|
21
|
+
targetFps: 30,
|
|
22
|
+
useMouse: true,
|
|
23
|
+
screenMode: "alternate-screen",
|
|
24
|
+
});
|
|
25
|
+
const root = createRoot(renderer);
|
|
26
|
+
root.render(_jsx(App, { renderer: renderer }));
|
|
27
|
+
await new Promise((resolve) => {
|
|
28
|
+
renderer.on("destroy", () => {
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error("TUI launch failed:", err);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tui/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAM9B,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAuB,EAAE;IACvD,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5B,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,CAAA;QAC5B,CAAC,CAAA;IACH,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;QACvC,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;YACvC,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,kBAAkB;SAC/B,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;QACjC,IAAI,CAAC,MAAM,CAAC,KAAC,GAAG,IAAC,QAAQ,EAAE,QAAQ,GAAI,CAAC,CAAA;QAExC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC1B,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;QACxC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface PromptBarProps {
|
|
2
|
+
isLoading: boolean;
|
|
3
|
+
spinnerFrame: number;
|
|
4
|
+
inputKey: string | number;
|
|
5
|
+
placeholder: string;
|
|
6
|
+
onSubmit: (text: string) => void;
|
|
7
|
+
hasModel: boolean;
|
|
8
|
+
agent: string;
|
|
9
|
+
model: string;
|
|
10
|
+
provider: string;
|
|
11
|
+
thinkingEffort?: string;
|
|
12
|
+
initialValue?: string;
|
|
13
|
+
width?: number | "auto";
|
|
14
|
+
elapsedMs?: number | null;
|
|
15
|
+
tokenUsage?: {
|
|
16
|
+
input: number;
|
|
17
|
+
output: number;
|
|
18
|
+
};
|
|
19
|
+
focused?: boolean;
|
|
20
|
+
onTextChange?: (text: string) => void;
|
|
21
|
+
onGetTextarea?: (ref: any) => void;
|
|
22
|
+
onPositionChange?: (pos: {
|
|
23
|
+
top: number;
|
|
24
|
+
left: number;
|
|
25
|
+
width: number;
|
|
26
|
+
}) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function PromptBar(props: PromptBarProps): import("react").ReactNode;
|
|
29
|
+
//# sourceMappingURL=prompt-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-bar.d.ts","sourceRoot":"","sources":["../../../src/tui/prompt-bar.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAA;IAClC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CAC/E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,6BA2F9C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect } from "react";
|
|
3
|
+
import { c } from "./theme.js";
|
|
4
|
+
import { titlecase } from "./utils.js";
|
|
5
|
+
export function PromptBar(props) {
|
|
6
|
+
const { isLoading, spinnerFrame, inputKey, placeholder, onSubmit, hasModel, agent, model, provider, thinkingEffort, initialValue, width, elapsedMs, tokenUsage, focused = true, onTextChange, onGetTextarea, onPositionChange } = props;
|
|
7
|
+
const textareaRef = useRef(null);
|
|
8
|
+
const boxRef = useRef(null);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (onPositionChange && boxRef.current) {
|
|
11
|
+
const updatePosition = () => {
|
|
12
|
+
const el = boxRef.current;
|
|
13
|
+
if (el) {
|
|
14
|
+
onPositionChange({
|
|
15
|
+
top: el.y ?? 0,
|
|
16
|
+
left: el.x ?? 0,
|
|
17
|
+
width: el.width ?? 0
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
updatePosition();
|
|
22
|
+
const interval = setInterval(updatePosition, 100);
|
|
23
|
+
return () => clearInterval(interval);
|
|
24
|
+
}
|
|
25
|
+
}, [onPositionChange]);
|
|
26
|
+
if (!hasModel && !isLoading) {
|
|
27
|
+
return (_jsxs("box", { flexDirection: "row", children: [_jsx("box", { width: 1, backgroundColor: c.accent, height: "auto" }), _jsxs("box", { flexDirection: "row", alignItems: "center", backgroundColor: c.bgBar, paddingLeft: 2, paddingRight: 2, paddingTop: 1, paddingBottom: 1, width: width ?? "auto", children: [_jsx("text", { fg: c.warn, children: "\u25CF" }), _jsx("text", { fg: c.dim, children: " Connect a provider to get started \u2014 " }), _jsx("text", { fg: c.accent, children: "Ctrl+P" }), _jsx("text", { fg: c.dim, children: " \u2192 connect provider" })] })] }));
|
|
28
|
+
}
|
|
29
|
+
return (_jsx("box", { flexDirection: "column", ref: boxRef, children: _jsxs("box", { flexDirection: "row", children: [_jsx("box", { width: 1, backgroundColor: c.accent, height: "auto" }), _jsx("box", { flexDirection: "row", alignItems: "center", backgroundColor: c.bgBar, paddingLeft: 2, paddingRight: 2, paddingTop: 1, paddingBottom: 1, width: width ?? "auto", children: _jsxs("box", { flexDirection: "column", flexGrow: 1, paddingLeft: 2, children: [_jsx("box", { minHeight: 1, maxHeight: 6, children: _jsxs("box", { flexDirection: "row", flexGrow: 1, gap: 1, children: [_jsx("text", { fg: c.accent, children: "\u203A" }), _jsx("box", { flexGrow: 1, children: _jsx("textarea", { placeholder: isLoading ? "Streaming..." : placeholder, minHeight: 1, maxHeight: 6, width: "100%", initialValue: initialValue, keyBindings: [
|
|
30
|
+
{ name: "return", action: "submit" },
|
|
31
|
+
{ name: "return", shift: true, action: "newline" },
|
|
32
|
+
], ref: (r) => { textareaRef.current = r; onGetTextarea?.(r); }, onContentChange: () => {
|
|
33
|
+
if (textareaRef.current && onTextChange) {
|
|
34
|
+
onTextChange(textareaRef.current.plainText);
|
|
35
|
+
}
|
|
36
|
+
}, onSubmit: () => {
|
|
37
|
+
if (textareaRef.current)
|
|
38
|
+
onSubmit(textareaRef.current.plainText);
|
|
39
|
+
}, focused: focused }, inputKey) })] }) }), _jsx("box", { height: 1 }), _jsxs("box", { flexDirection: "row", justifyContent: "space-between", alignItems: "center", height: 1, children: [_jsxs("box", { flexDirection: "row", gap: 2, alignItems: "center", children: [_jsx("text", { fg: c.accent, children: titlecase(agent) }), _jsx("text", { fg: c.dim, children: model }), _jsx("text", { fg: c.subtext, children: provider }), thinkingEffort && thinkingEffort !== "none" && (_jsx("text", { fg: c.warn, children: thinkingEffort }))] }), tokenUsage && (_jsxs("box", { flexDirection: "row", gap: 1, height: 1, children: [elapsedMs !== null && elapsedMs !== undefined && _jsxs("text", { fg: c.dim, children: [(elapsedMs / 1000).toFixed(1), "s"] }), _jsxs("text", { fg: c.dim, children: ["\u2191", tokenUsage.input, " \u2193", tokenUsage.output] })] }))] })] }) })] }) }));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=prompt-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-bar.js","sourceRoot":"","sources":["../../../src/tui/prompt-bar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface SlashHead {
|
|
2
|
+
name: string;
|
|
3
|
+
arguments: string;
|
|
4
|
+
end: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ParsedSlashCommand {
|
|
7
|
+
type: "command";
|
|
8
|
+
command: {
|
|
9
|
+
name: string;
|
|
10
|
+
arguments: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface ParsedSlashNone {
|
|
14
|
+
type: "none";
|
|
15
|
+
}
|
|
16
|
+
export type ParsedSlash = ParsedSlashCommand | ParsedSlashNone;
|
|
17
|
+
export declare function slashHead(text: string): SlashHead | undefined;
|
|
18
|
+
export declare function slashQuery(text: string, cursor: number): string | undefined;
|
|
19
|
+
export declare function parseSlashCommand(text: string, commands: Set<string> | undefined): ParsedSlash;
|
|
20
|
+
//# sourceMappingURL=slash-commands.d.ts.map
|