cli-jaw 2.1.2 → 2.1.3
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 +6 -5
- package/dist/bin/cli-jaw.js +14 -2
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/chat-search.js +71 -0
- package/dist/bin/commands/chat-search.js.map +1 -0
- package/dist/bin/commands/goal.js +48 -3
- package/dist/bin/commands/goal.js.map +1 -1
- package/dist/bin/commands/history.js +61 -0
- package/dist/bin/commands/history.js.map +1 -0
- package/dist/bin/commands/lock.js +104 -0
- package/dist/bin/commands/lock.js.map +1 -0
- package/dist/bin/commands/memory.js +23 -2
- package/dist/bin/commands/memory.js.map +1 -1
- package/dist/bin/commands/project.js +4 -1
- package/dist/bin/commands/project.js.map +1 -1
- package/dist/bin/commands/tui/simple-mode.js +0 -1
- package/dist/bin/commands/tui/simple-mode.js.map +1 -1
- package/dist/lib/upload.js +7 -0
- package/dist/lib/upload.js.map +1 -1
- package/dist/server.js +127 -19
- package/dist/server.js.map +1 -1
- package/dist/src/agent/agy-runtime.js +1 -0
- package/dist/src/agent/agy-runtime.js.map +1 -1
- package/dist/src/agent/agy-transcript-watcher.js +78 -0
- package/dist/src/agent/agy-transcript-watcher.js.map +1 -0
- package/dist/src/agent/agy-transcript.js +158 -0
- package/dist/src/agent/agy-transcript.js.map +1 -0
- package/dist/src/agent/args.js +18 -4
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/codex-app-client.js +1 -1
- package/dist/src/agent/codex-app-client.js.map +1 -1
- package/dist/src/agent/cursor-runtime.js +1 -0
- package/dist/src/agent/cursor-runtime.js.map +1 -1
- package/dist/src/agent/kiro-runtime.js +11 -3
- package/dist/src/agent/kiro-runtime.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +18 -11
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/memory-flush-controller.js +2 -1
- package/dist/src/agent/memory-flush-controller.js.map +1 -1
- package/dist/src/agent/session-persistence.js +2 -2
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +1 -1
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn-env.js +1 -1
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +76 -48
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/watchdog.js +1 -1
- package/dist/src/agent/watchdog.js.map +1 -1
- package/dist/src/browser/actions.js +0 -8
- package/dist/src/browser/actions.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +5 -29
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-runtime.js +5 -14
- package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-session.js +14 -28
- package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/challenge-detector.js +4 -26
- package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/content-scorer.js +5 -29
- package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +0 -64
- package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/fetcher.js +4 -19
- package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/human-loop.js +0 -26
- package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/index.js +74 -145
- package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/metadata.js +1 -41
- package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/output.js +1 -18
- package/dist/src/browser/adaptive-fetch/output.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/reader-adapters.js +43 -75
- package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/safety.js +5 -48
- package/dist/src/browser/adaptive-fetch/safety.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/third-party-readers.js +0 -11
- package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/trace.js +3 -18
- package/dist/src/browser/adaptive-fetch/trace.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/transforms.js +0 -23
- package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/types.js +3 -0
- package/dist/src/browser/adaptive-fetch/types.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/validators.js +0 -17
- package/dist/src/browser/adaptive-fetch/validators.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/waf-profiles.js +0 -10
- package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -1
- package/dist/src/browser/connection.js +1 -1
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-response.js +0 -1
- package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt.js +0 -33
- package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
- package/dist/src/browser/web-ai/diagnostics.js +0 -16
- package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
- package/dist/src/browser/web-ai/doctor.js.map +1 -1
- package/dist/src/browser/web-ai/errors.js +1 -1
- package/dist/src/browser/web-ai/errors.js.map +1 -1
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/commands.js +13 -2
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/compact.js +2 -1
- package/dist/src/cli/compact.js.map +1 -1
- package/dist/src/cli/handlers/session-handlers.js +34 -0
- package/dist/src/cli/handlers/session-handlers.js.map +1 -0
- package/dist/src/cli/handlers-project.js.map +1 -1
- package/dist/src/cli/handlers-workflows.js +76 -13
- package/dist/src/cli/handlers-workflows.js.map +1 -1
- package/dist/src/cli/handlers.js +37 -36
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/registry.js +7 -7
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/chat-sessions.js +63 -0
- package/dist/src/core/chat-sessions.js.map +1 -0
- package/dist/src/core/compact.js +43 -11
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +9 -1
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +48 -15
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/main-session.js +3 -2
- package/dist/src/core/main-session.js.map +1 -1
- package/dist/src/goal/heartbeat.js +88 -5
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/goal/store.js +38 -3
- package/dist/src/goal/store.js.map +1 -1
- package/dist/src/manager/lifecycle-store.js.map +1 -1
- package/dist/src/manager/lifecycle.js +45 -1
- package/dist/src/manager/lifecycle.js.map +1 -1
- package/dist/src/manager/preview-link-policy.js +11 -4
- package/dist/src/manager/preview-link-policy.js.map +1 -1
- package/dist/src/manager/server.js +25 -9
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/shutdown.js +8 -3
- package/dist/src/manager/shutdown.js.map +1 -1
- package/dist/src/memory/indexing.js +49 -1
- package/dist/src/memory/indexing.js.map +1 -1
- package/dist/src/memory/runtime.js +2 -1
- package/dist/src/memory/runtime.js.map +1 -1
- package/dist/src/messaging/send.js +66 -7
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +2 -2
- package/dist/src/orchestrator/gateway.js +4 -4
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +2 -1
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/sanitize.js +57 -7
- package/dist/src/orchestrator/sanitize.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +15 -8
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/prompt/builder.js +171 -86
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +94 -66
- package/dist/src/prompt/templates/employee.md +41 -59
- package/dist/src/prompt/templates/skills.md +6 -0
- package/dist/src/routes/browser.js +3 -3
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/routes/goal.js +38 -2
- package/dist/src/routes/goal.js.map +1 -1
- package/dist/src/routes/messaging.js +8 -3
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +3 -2
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota-agy-reverse.js +6 -0
- package/dist/src/routes/quota-agy-reverse.js.map +1 -1
- package/dist/src/routes/quota.js +68 -6
- package/dist/src/routes/quota.js.map +1 -1
- package/dist/src/routes/settings.js +6 -6
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/security/path-guards.js +0 -3
- package/dist/src/security/path-guards.js.map +1 -1
- package/dist/src/workflows/scope-sandbox.js +17 -5
- package/dist/src/workflows/scope-sandbox.js.map +1 -1
- package/package.json +1 -1
- package/public/css/chat.css +27 -0
- package/public/css/orc-state.css +10 -6
- package/public/css/variables.css +4 -0
- package/public/dist/assets/{Agent-DkH7eoHd.js → Agent-DBKNQ6tp.js} +1 -1
- package/public/dist/assets/{FolderPanel-DSkanaGN.js → FolderPanel-DT0fU8f2.js} +1 -1
- package/public/dist/assets/{Heartbeat-C3JS6gkF.js → Heartbeat-fsuLzY9c.js} +1 -1
- package/public/dist/assets/{Memory-C-EQubN2.js → Memory-CRR8kotI.js} +1 -1
- package/public/dist/assets/{ModelProvider-BD2KrypI.js → ModelProvider-DQgISbKw.js} +1 -1
- package/public/dist/assets/agent-meta-C4mauPL5.js +1 -0
- package/public/dist/assets/app-0OQhPpTG.css +1 -0
- package/public/dist/assets/app-CSqIyg9A.js +55 -0
- package/public/dist/assets/constants-BHMkzpN_.js +1 -0
- package/public/dist/assets/{employees-_A-p_bZg.js → employees-CZdWHH-r.js} +1 -1
- package/public/dist/assets/manager-CGTQ5EIm.js +12 -0
- package/public/dist/assets/manager-UBunDqMH.css +1 -0
- package/public/dist/assets/{memory-D9AUn8fG.js → memory-B3QSmj_e.js} +1 -1
- package/public/dist/assets/memory-DOBqiuPc.js +1 -0
- package/public/dist/assets/render-J11oxfnl.js +28 -0
- package/public/dist/assets/settings-BV_2Bh0_.js +1 -0
- package/public/dist/assets/settings-m_cim0ov.js +151 -0
- package/public/dist/assets/sidebar-ZBXdBgF7.js +49 -0
- package/public/dist/assets/{skills-BDVLIrVT.js → skills-CjaBmIPV.js} +1 -1
- package/public/dist/assets/skills-Xm3fl1zr.js +1 -0
- package/public/dist/assets/{slash-commands-C5da3q1p.js → slash-commands-71jc07Wf.js} +1 -1
- package/public/dist/assets/slash-commands-BO6ssnAz.js +1 -0
- package/public/dist/assets/{trace-drawer-5kqBzFMk.js → trace-drawer-Czvf2P2o.js} +1 -1
- package/public/dist/assets/ui-CverZJnd.js +1 -0
- package/public/dist/assets/ui-qKxy-4p9.js +142 -0
- package/public/dist/index.html +2 -2
- package/public/dist/manager/index.html +2 -2
- package/public/js/constants.ts +4 -4
- package/public/js/features/chat-messages.ts +13 -2
- package/public/js/features/chat.ts +86 -44
- package/public/js/features/media-lightbox.ts +40 -0
- package/public/js/features/pending-queue.ts +20 -2
- package/public/js/features/settings-cli-status-render.ts +2 -4
- package/public/js/features/settings-cli-status.ts +6 -2
- package/public/js/features/settings-types.ts +1 -0
- package/public/js/features/ui-status.ts +5 -1
- package/public/js/main.ts +2 -0
- package/public/js/render/markdown.ts +16 -0
- package/public/js/ui.ts +8 -4
- package/public/js/ws.ts +27 -16
- package/public/locales/en.json +1 -0
- package/public/locales/ja.json +1 -0
- package/public/locales/ko.json +1 -0
- package/public/locales/zh.json +1 -0
- package/public/manager/src/InstancePreview.tsx +21 -1
- package/public/manager/src/SidebarRailRouter.tsx +32 -4
- package/public/manager/src/components/InstanceRow.tsx +0 -1
- package/public/manager/src/components/WorkbenchHeader.tsx +17 -7
- package/public/manager/src/folder-panel/FolderPanel.tsx +13 -2
- package/public/manager/src/hooks/useElectronDroppedPaths.ts +89 -0
- package/public/manager/src/manager-components.css +34 -0
- package/public/manager/src/manager-polish.css +10 -0
- package/public/manager/src/panels/desktop-bridge.ts +11 -0
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +4 -4
- package/scripts/smoke/agy-transcript-tail-smoke.mjs +89 -0
- package/public/dist/assets/agent-meta-B1098B_a.js +0 -1
- package/public/dist/assets/app-ByHYOMZE.js +0 -48
- package/public/dist/assets/app-CYdhP6Vh.css +0 -1
- package/public/dist/assets/constants-s2UJodER.js +0 -1
- package/public/dist/assets/manager-B2qEQRxN.css +0 -1
- package/public/dist/assets/manager-CR9BA-wO.js +0 -12
- package/public/dist/assets/memory-D1RKYvyu.js +0 -1
- package/public/dist/assets/render-DFBujF8n.js +0 -28
- package/public/dist/assets/settings-B4ZkeaU-.js +0 -1
- package/public/dist/assets/settings-D9jTceN0.js +0 -151
- package/public/dist/assets/sidebar-DPPRNiTc.js +0 -48
- package/public/dist/assets/skills-8nHJkv-r.js +0 -1
- package/public/dist/assets/slash-commands-RJWO8wJZ.js +0 -1
- package/public/dist/assets/ui-Crnp79bG.js +0 -142
- package/public/dist/assets/ui-HtSKByR3.js +0 -1
- /package/public/dist/assets/{locale-DT1WRaeJ.js → locale-BHMJIzyw.js} +0 -0
- /package/public/dist/assets/{provider-icons-CVVK5xUP.js → provider-icons-Crv6yvlG.js} +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useCallback, useEffect } from 'react';
|
|
2
|
+
import { getDesktop, isElectron, type DroppedPathEntry } from '../panels/desktop-bridge';
|
|
3
|
+
|
|
4
|
+
export type ElectronDroppedPathsSource = 'manager' | 'preview';
|
|
5
|
+
|
|
6
|
+
export type ElectronDroppedPathsEvent = {
|
|
7
|
+
source: ElectronDroppedPathsSource;
|
|
8
|
+
entries: DroppedPathEntry[];
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
type UseElectronDroppedPathsOptions = {
|
|
12
|
+
onDroppedPaths: (event: ElectronDroppedPathsEvent) => void;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
type ClosestTarget = {
|
|
16
|
+
closest: (selector: string) => Element | null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export function isPreviewDropTarget(target: EventTarget | null): boolean {
|
|
20
|
+
const maybeElement = target as Partial<ClosestTarget> | null;
|
|
21
|
+
if (typeof maybeElement?.closest !== 'function') return false;
|
|
22
|
+
return Boolean(maybeElement.closest('.preview-panel, .preview-frame'));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function shouldConsumeManagerDrop(target: EventTarget | null): boolean {
|
|
26
|
+
return !isPreviewDropTarget(target);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function firstDirectory(entries: DroppedPathEntry[]): DroppedPathEntry | null {
|
|
30
|
+
return entries.find(entry => entry.kind === 'directory') ?? null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function firstFile(entries: DroppedPathEntry[]): DroppedPathEntry | null {
|
|
34
|
+
return entries.find(entry => entry.kind === 'file') ?? null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function hasFileTransfer(dataTransfer: DataTransfer | null): boolean {
|
|
38
|
+
if (!dataTransfer) return false;
|
|
39
|
+
if (dataTransfer.files.length > 0) return true;
|
|
40
|
+
return Array.from(dataTransfer.types).includes('Files');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function useElectronDroppedPaths(options: UseElectronDroppedPathsOptions): {
|
|
44
|
+
resolveDroppedFiles: (files: File[], source: ElectronDroppedPathsSource) => Promise<DroppedPathEntry[]>;
|
|
45
|
+
} {
|
|
46
|
+
const resolveDroppedFiles = useCallback(async (files: File[], source: ElectronDroppedPathsSource): Promise<DroppedPathEntry[]> => {
|
|
47
|
+
const bridge = getDesktop()?.dragDrop;
|
|
48
|
+
if (!bridge || files.length === 0) return [];
|
|
49
|
+
try {
|
|
50
|
+
const result = await bridge.resolveDroppedItems(files);
|
|
51
|
+
const entries = result.ok && result.entries ? result.entries : [];
|
|
52
|
+
if (entries.length > 0) options.onDroppedPaths({ source, entries });
|
|
53
|
+
return entries;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.warn('[electron-drop] failed to resolve dropped files', error);
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
}, [options]);
|
|
59
|
+
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!isElectron() || !getDesktop()?.dragDrop) return undefined;
|
|
62
|
+
|
|
63
|
+
function onDragOver(event: DragEvent): void {
|
|
64
|
+
const dataTransfer = event.dataTransfer;
|
|
65
|
+
if (!dataTransfer || !hasFileTransfer(dataTransfer)) return;
|
|
66
|
+
if (!shouldConsumeManagerDrop(event.target)) return;
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
dataTransfer.dropEffect = 'copy';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function onDrop(event: DragEvent): void {
|
|
72
|
+
const files = event.dataTransfer?.files ? Array.from(event.dataTransfer.files) : [];
|
|
73
|
+
if (files.length === 0) return;
|
|
74
|
+
if (!shouldConsumeManagerDrop(event.target)) return;
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
event.stopPropagation();
|
|
77
|
+
void resolveDroppedFiles(files, 'manager');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
document.addEventListener('dragover', onDragOver, true);
|
|
81
|
+
document.addEventListener('drop', onDrop, true);
|
|
82
|
+
return () => {
|
|
83
|
+
document.removeEventListener('dragover', onDragOver, true);
|
|
84
|
+
document.removeEventListener('drop', onDrop, true);
|
|
85
|
+
};
|
|
86
|
+
}, [resolveDroppedFiles]);
|
|
87
|
+
|
|
88
|
+
return { resolveDroppedFiles };
|
|
89
|
+
}
|
|
@@ -499,6 +499,40 @@ h2 { font-size: 13px; }
|
|
|
499
499
|
text-overflow: ellipsis;
|
|
500
500
|
white-space: nowrap;
|
|
501
501
|
}
|
|
502
|
+
.project-dirs {
|
|
503
|
+
display: flex;
|
|
504
|
+
flex-wrap: wrap;
|
|
505
|
+
min-width: 0;
|
|
506
|
+
max-width: min(100%, 520px);
|
|
507
|
+
align-items: center;
|
|
508
|
+
gap: 5px;
|
|
509
|
+
margin-top: 2px;
|
|
510
|
+
overflow: hidden;
|
|
511
|
+
}
|
|
512
|
+
.project-dirs .label {
|
|
513
|
+
flex: 0 0 auto;
|
|
514
|
+
color: var(--text-muted);
|
|
515
|
+
font-size: 11px;
|
|
516
|
+
font-weight: 650;
|
|
517
|
+
}
|
|
518
|
+
.project-dir {
|
|
519
|
+
min-width: 0;
|
|
520
|
+
flex: 0 1 220px;
|
|
521
|
+
max-width: 220px;
|
|
522
|
+
border: 1px solid var(--border-subtle);
|
|
523
|
+
border-radius: 6px;
|
|
524
|
+
background: var(--canvas-mid);
|
|
525
|
+
padding: 2px 6px;
|
|
526
|
+
color: var(--text-secondary);
|
|
527
|
+
font-family: "Geist Mono", "JetBrains Mono", monospace;
|
|
528
|
+
font-size: 11px;
|
|
529
|
+
}
|
|
530
|
+
.project-dirs.is-empty .project-dir {
|
|
531
|
+
border-style: dashed;
|
|
532
|
+
background: transparent;
|
|
533
|
+
color: var(--text-muted);
|
|
534
|
+
font-family: inherit;
|
|
535
|
+
}
|
|
502
536
|
.detail-tabs {
|
|
503
537
|
display: flex;
|
|
504
538
|
gap: 3px;
|
|
@@ -133,6 +133,16 @@
|
|
|
133
133
|
font-size: 12px;
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
+
.workbench-preview .project-dirs {
|
|
137
|
+
margin-top: 1px;
|
|
138
|
+
gap: 4px;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.workbench-preview .project-dir {
|
|
142
|
+
max-width: 180px;
|
|
143
|
+
padding: 1px 5px;
|
|
144
|
+
}
|
|
145
|
+
|
|
136
146
|
.workbench-preview .workbench-mode-tabs button {
|
|
137
147
|
min-height: 24px;
|
|
138
148
|
padding: 3px 8px;
|
|
@@ -47,6 +47,16 @@ export type FolderBridgeApi = {
|
|
|
47
47
|
onDirChange: (cb: (dirPath: string) => void) => () => void;
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
+
export type DroppedPathEntry = {
|
|
51
|
+
name: string;
|
|
52
|
+
path: string;
|
|
53
|
+
kind: 'file' | 'directory';
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export type DragDropBridgeApi = {
|
|
57
|
+
resolveDroppedItems: (files: File[]) => Promise<{ ok: boolean; entries?: DroppedPathEntry[]; rejected?: Array<{ path: string; reason: string }>; error?: string }>;
|
|
58
|
+
};
|
|
59
|
+
|
|
50
60
|
export type ShortcutBridgeApi = {
|
|
51
61
|
onAction: (cb: (action: DashboardShortcutAction) => void) => () => void;
|
|
52
62
|
};
|
|
@@ -87,6 +97,7 @@ export type CliJawDesktopApi = {
|
|
|
87
97
|
terminal?: TerminalBridgeApi | undefined;
|
|
88
98
|
diff?: DiffBridgeApi | undefined;
|
|
89
99
|
folder?: FolderBridgeApi | undefined;
|
|
100
|
+
dragDrop?: DragDropBridgeApi | undefined;
|
|
90
101
|
clipboard?: ClipboardBridgeApi | undefined;
|
|
91
102
|
permissions?: PermissionDiagnosticsBridgeApi | undefined;
|
|
92
103
|
shortcuts?: ShortcutBridgeApi | undefined;
|
|
@@ -38,13 +38,13 @@ export const CLI_META: Record<string, CliMeta> = {
|
|
|
38
38
|
label: 'AI-E',
|
|
39
39
|
defaultProvider: 'claude',
|
|
40
40
|
providers: ['claude', 'codex', 'gemini', 'grok', 'copilot', 'kiro'],
|
|
41
|
-
models: ['opus', 'sonnet', 'haiku', 'gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini', 'gemini-3-flash-preview', 'grok-build', 'gpt-5-mini'],
|
|
41
|
+
models: ['opus', 'sonnet', 'haiku', 'gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini', 'gemini-3-flash-preview', 'grok-build', 'grok-composer-2.5-fast', 'gpt-5-mini'],
|
|
42
42
|
efforts: ['low', 'medium', 'high', 'xhigh', 'max'],
|
|
43
43
|
modelsByProvider: {
|
|
44
44
|
claude: ['claude-opus-4-8', 'opus', 'sonnet', 'haiku'],
|
|
45
45
|
codex: ['gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini'],
|
|
46
46
|
gemini: ['gemini-3-flash-preview'],
|
|
47
|
-
grok: ['grok-build'],
|
|
47
|
+
grok: ['grok-build', 'grok-composer-2.5-fast'],
|
|
48
48
|
copilot: ['gpt-5-mini'],
|
|
49
49
|
kiro: ['auto', 'claude-sonnet-4.6', 'deepseek-3.2', 'minimax-m2.5', 'glm-5', 'qwen3-coder-next'],
|
|
50
50
|
},
|
|
@@ -147,9 +147,9 @@ export const CLI_META: Record<string, CliMeta> = {
|
|
|
147
147
|
},
|
|
148
148
|
grok: {
|
|
149
149
|
label: 'Grok',
|
|
150
|
-
models: ['grok-build'],
|
|
150
|
+
models: ['grok-build', 'grok-composer-2.5-fast'],
|
|
151
151
|
efforts: [],
|
|
152
|
-
effortNote: 'unsupported by grok-build; do not pass --effort',
|
|
152
|
+
effortNote: 'unsupported by grok-build/composer; do not pass --effort',
|
|
153
153
|
},
|
|
154
154
|
opencode: {
|
|
155
155
|
label: 'OpenCode',
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Smoke: resolve AGY brain transcript path + tail-parse new JSONL lines.
|
|
4
|
+
* Does not invoke agy (live tool steps require cascade; -p smokes often skip RUN_COMMAND).
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
|
|
10
|
+
const HOME = os.homedir();
|
|
11
|
+
const CACHE = path.join(HOME, '.gemini', 'antigravity-cli', 'cache', 'last_conversations.json');
|
|
12
|
+
const BRAIN = path.join(HOME, '.gemini', 'antigravity-cli', 'brain');
|
|
13
|
+
|
|
14
|
+
function resolveTranscriptPath(cwd) {
|
|
15
|
+
const map = JSON.parse(fs.readFileSync(CACHE, 'utf8'));
|
|
16
|
+
const uuid = map[cwd];
|
|
17
|
+
if (!uuid) return { ok: false, reason: 'no uuid in last_conversations.json for cwd' };
|
|
18
|
+
const transcript = path.join(BRAIN, uuid, '.system_generated', 'logs', 'transcript.jsonl');
|
|
19
|
+
if (!fs.existsSync(transcript)) return { ok: false, uuid, reason: 'transcript.jsonl missing' };
|
|
20
|
+
return { ok: true, uuid, transcript };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function parseStepLine(line) {
|
|
24
|
+
const d = JSON.parse(line);
|
|
25
|
+
const type = d.type;
|
|
26
|
+
const toolTypes = new Set(['RUN_COMMAND', 'VIEW_FILE', 'LIST_DIRECTORY', 'GREP_SEARCH', 'READ_FILE', 'WRITE_FILE']);
|
|
27
|
+
if (!toolTypes.has(type) && type !== 'PLANNER_RESPONSE') return null;
|
|
28
|
+
const label = type === 'PLANNER_RESPONSE' ? 'planner' : type.replace(/_/g, ' ').toLowerCase();
|
|
29
|
+
return { step_index: d.step_index, type, status: d.status, label };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function tailOnce(transcript, offset) {
|
|
33
|
+
const stat = fs.statSync(transcript);
|
|
34
|
+
if (stat.size <= offset) return { offset, events: [] };
|
|
35
|
+
const buf = Buffer.alloc(stat.size - offset);
|
|
36
|
+
const fd = fs.openSync(transcript, 'r');
|
|
37
|
+
fs.readSync(fd, buf, 0, buf.length, offset);
|
|
38
|
+
fs.closeSync(fd);
|
|
39
|
+
const text = buf.toString('utf8');
|
|
40
|
+
const events = [];
|
|
41
|
+
for (const line of text.split('\n')) {
|
|
42
|
+
if (!line.trim()) continue;
|
|
43
|
+
try {
|
|
44
|
+
const ev = parseStepLine(line);
|
|
45
|
+
if (ev) events.push(ev);
|
|
46
|
+
} catch {
|
|
47
|
+
/* skip malformed */
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { offset: stat.size, events };
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function histogram(transcript) {
|
|
54
|
+
const counts = {};
|
|
55
|
+
for (const line of fs.readFileSync(transcript, 'utf8').split('\n')) {
|
|
56
|
+
if (!line.trim()) continue;
|
|
57
|
+
try {
|
|
58
|
+
const t = JSON.parse(line).type;
|
|
59
|
+
counts[t] = (counts[t] || 0) + 1;
|
|
60
|
+
} catch { /* */ }
|
|
61
|
+
}
|
|
62
|
+
return counts;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const cwd = process.argv[2] || process.cwd();
|
|
66
|
+
const resolved = resolveTranscriptPath(cwd);
|
|
67
|
+
console.log(JSON.stringify({ phase: 'resolve', cwd, ...resolved }, null, 2));
|
|
68
|
+
if (!resolved.ok) process.exit(1);
|
|
69
|
+
|
|
70
|
+
const hist = histogram(resolved.transcript);
|
|
71
|
+
console.log(JSON.stringify({ phase: 'histogram', types: hist }, null, 2));
|
|
72
|
+
|
|
73
|
+
let offset = 0;
|
|
74
|
+
const first = tailOnce(resolved.transcript, offset);
|
|
75
|
+
offset = first.offset;
|
|
76
|
+
console.log(JSON.stringify({ phase: 'tail_baseline', offset, parsed_events: first.events.length }, null, 2));
|
|
77
|
+
|
|
78
|
+
const hasRun = (hist.RUN_COMMAND || 0) > 0;
|
|
79
|
+
console.log(JSON.stringify({
|
|
80
|
+
phase: 'verdict',
|
|
81
|
+
path_resolves: true,
|
|
82
|
+
tail_parser_runs: true,
|
|
83
|
+
corpus_has_RUN_COMMAND: hasRun,
|
|
84
|
+
note: hasRun
|
|
85
|
+
? 'Transcript tail is viable for jaw Stage 1 when conversation uuid is known.'
|
|
86
|
+
: 'This conversation has no RUN_COMMAND yet; use a cwd with tool-heavy history or resume cascade session.',
|
|
87
|
+
}, null, 2));
|
|
88
|
+
|
|
89
|
+
process.exit(hasRun ? 0 : 2);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=[`claude`,`claude-e`,`agy`,`codex`,`cursor`,`kiro-code`,`gemini`],t={agy:{label:`Antigravity`,models:[`gemini-3.5-flash`],efforts:[],effortNote:`AGY print mode uses the current AGY-selected model; switch models in native AGY UI, no --model/--effort flags in agy 1.0.0`},"ai-e":{label:`AI-E`,defaultProvider:`claude`,providers:[`claude`,`codex`,`gemini`,`grok`,`copilot`,`kiro`],models:[`opus`,`sonnet`,`haiku`,`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gemini-3-flash-preview`,`grok-build`,`gpt-5-mini`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`],modelsByProvider:{claude:[`claude-opus-4-8`,`opus`,`sonnet`,`haiku`],codex:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`],gemini:[`gemini-3-flash-preview`],grok:[`grok-build`],copilot:[`gpt-5-mini`],kiro:[`auto`,`claude-sonnet-4.6`,`deepseek-3.2`,`minimax-m2.5`,`glm-5`,`qwen3-coder-next`]},effortsByProvider:{claude:[`low`,`medium`,`high`,`xhigh`,`max`],codex:[`low`,`medium`,`high`,`xhigh`],gemini:[],grok:[],copilot:[`low`,`medium`,`high`],kiro:[]}},claude:{label:`Claude`,models:[`opus`,`sonnet`,`sonnet[1m]`,`haiku`,`claude-opus-4-8`,`claude-opus-4-8[1m]`,`claude-opus-4-7`,`claude-opus-4-7[1m]`,`claude-opus-4-6`,`claude-opus-4-6[1m]`,`claude-sonnet-4-6`,`claude-sonnet-4-6[1m]`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},"claude-e":{label:`Claude E`,models:[`opus`,`sonnet`,`haiku`,`claude-opus-4-8`,`claude-opus-4-7`,`claude-sonnet-4-6`,`claude-haiku-4-5`],efforts:[`low`,`medium`,`high`,`xhigh`,`max`]},codex:{label:`Codex`,models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex`],efforts:[`low`,`medium`,`high`,`xhigh`]},"codex-app":{label:`Codex App`,models:[`gpt-5.5`,`gpt-5.4`,`gpt-5.4-mini`,`gpt-5.3-codex`],efforts:[`low`,`medium`,`high`,`xhigh`]},cursor:{label:`Cursor`,models:`auto,composer-2.5,composer-2,gpt-5.5,gpt-5.4,gpt-5.4-mini,gpt-5.4-nano,gpt-5.3-codex,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex-mini,gpt-5.1,claude-opus-4-8,claude-opus-4-8-thinking,claude-opus-4-7,claude-opus-4-7-thinking,claude-4.6-opus,claude-4.6-sonnet,claude-4.5-opus-high,claude-4.5-sonnet,claude-4-sonnet,gemini-3.1-pro,gemini-3-flash,gemini-3.5-flash,grok-4.3,grok-build-0.1,gpt-5-mini,kimi-k2.5`.split(`,`),efforts:[`none`,`none-fast`,`low`,`low-fast`,`medium`,`medium-fast`,`high`,`high-fast`,`xhigh`,`xhigh-fast`,`max`,`max-fast`],effortNote:`Cursor effort resolves to model IDs; no separate --effort flag`},"kiro-code":{label:`Kiro`,models:[`auto`,`claude-opus-4.8`,`claude-opus-4.7`,`claude-opus-4.6`,`claude-sonnet-4.6`,`claude-opus-4.5`,`claude-sonnet-4.5`,`claude-sonnet-4`,`claude-haiku-4.5`,`deepseek-3.2`,`minimax-m2.5`,`minimax-m2.1`,`glm-5`,`qwen3-coder-next`],efforts:[],effortNote:`Kiro CLI has no separate effort flag`},gemini:{label:`Gemini`,models:[`gemini-3-pro-preview`,`gemini-2.5-pro`,`gemini-3-flash-preview`],efforts:[]},grok:{label:`Grok`,models:[`grok-build`],efforts:[],effortNote:`unsupported by grok-build; do not pass --effort`},opencode:{label:`OpenCode`,models:[`opencode-go/kimi-k2.6`,`opencode-go/glm-5.1`],efforts:[`minimal`,`low`,`high`,`max`]},copilot:{label:`Copilot`,models:[`gpt-5.5`,`claude-opus-4.8`,`claude-opus-4.7`,`claude-sonnet-4.6`,`gpt-5.4`],efforts:[`low`,`medium`,`high`]}};function n(e){return t[e]||{label:e,models:[],efforts:[]}}function r(e,t={},n={}){return n[e]?.model||t[e]?.model||``}function i(e,t={},n={}){return n[e]?.effort||t[e]?.effort||``}function a(e,t=``){let n=new Set;t&&n.add(t);for(let t of e)n.add(t);return Array.from(n).map(e=>({value:e,label:e}))}export{r as a,i,n,a as r,e as t};
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-Bjnw0wQ6.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{n as e,r as t}from"./vendor-render-DCb9B75Q.js";import{t as n}from"./state-D04-chBy.js";import{a as r,i,n as a,r as o,t as s}from"./api-tVoG39dL.js";import{t as c}from"./preload-helper-DuH3-WbD.js";import{C as l,S as u,_ as d,b as f,d as p,f as m,h as ee,i as te,n as ne,o as re,s as ie,u as ae,x as oe}from"./render-DFBujF8n.js";import{C as se,O as ce,S as le,_ as h,a as ue,d as de,g,k as fe,s as pe,u as me,v as he,w as ge,y as _e}from"./ui-Crnp79bG.js";import{n as ve,o as _}from"./idb-cache-0LNMskFB.js";import{a as ye,c as be,i as xe,l as Se,r as Ce,s as we,t as Te,u as Ee}from"./sidebar-DPPRNiTc.js";import{t as De}from"./provider-icons-CVVK5xUP.js";import{t as Oe}from"./locale-DT1WRaeJ.js";import{a as ke,i as Ae,n as je,o as Me,r as Ne,t as Pe}from"./slash-commands-C5da3q1p.js";import{i as Fe,o as Ie}from"./constants-s2UJodER.js";import{A as Le,B as Re,C as ze,E as v,G as Be,H as Ve,I as He,K as Ue,L as We,N as Ge,P as Ke,R as qe,S as Je,T as Ye,U as Xe,V as Ze,W as Qe,_ as $e,a as et,b as tt,c as nt,d as rt,f as it,g as at,h as ot,i as st,j as ct,k as lt,l as ut,m as dt,n as ft,o as pt,p as mt,r as ht,s as gt,t as y,u as _t,w as vt,x as yt,y as bt,z as xt}from"./settings-D9jTceN0.js";import{a as St,i as Ct,t as wt}from"./skills-BDVLIrVT.js";import{a as Tt,c as Et,d as Dt,f as Ot,i as kt,l as At,m as jt,n as Mt,o as Nt,p as Pt,r as Ft,s as It,t as Lt,u as Rt}from"./memory-D9AUn8fG.js";var b=[],zt=8e3;function Bt(e){return/^\/compact(?:\s|$)/i.test(String(e||``).trim())?300*1e3:1e4}function Vt(e){let t=re();return t?new Promise(n=>{let r=`preview-send-${Date.now()}-${Math.random().toString(36).slice(2)}`,i=!1,a=()=>{window.removeEventListener(`message`,s),window.clearTimeout(c)},o=e=>{i||(i=!0,a(),n(e))},s=e=>{if(e.source!==window.parent||!te(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-send-result`||t.requestId!==r||o({ok:!!t.ok,status:Number.isInteger(t.status)?t.status:t.ok?200:502,data:t.data||(t.error?{error:t.error}:{})})},c=window.setTimeout(()=>o(null),zt);window.addEventListener(`message`,s);try{window.parent.postMessage({type:`jaw-preview-send-message`,requestId:r,prompt:e},t)}catch{o(null)}}):Promise.resolve(null)}async function Ht(e){let t=await Vt(e);if(t?.ok)return t;try{let t=await fetch(`${s}/api/message`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({prompt:e})}),n=await t.json().catch(()=>({}));return{ok:t.ok,status:t.status,data:n}}catch(e){return{ok:!1,status:0,data:{error:e.message}}}}function Ut(e){let t=e.recovery;if(!t?.originalText)return e.text?d(e.text):``;let n=(t.suggestedCommands||[]).slice(0,5),r=n.length?`<div class="cmd-recovery-suggestions">${n.map(e=>`<code>${d(e)}</code>`).join(` `)}</div>`:``,i=d(t.originalText);return`${e.text?`<div>${d(e.text)}</div>`:``}
|
|
3
|
-
<div class="cmd-recovery" data-cmd-recovery>
|
|
4
|
-
<div class="cmd-recovery-label">${d(l(`cmd.recovery.originalPrompt`))}</div>
|
|
5
|
-
<pre class="cmd-recovery-text">${i}</pre>
|
|
6
|
-
${r}
|
|
7
|
-
<div class="cmd-recovery-actions">
|
|
8
|
-
<button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="reinsert" data-cmd-text="${i}">${d(l(`cmd.artifact.action.reinsert`))}</button>
|
|
9
|
-
<button type="button" class="cmd-recovery-btn" data-cmd-recovery-action="copy" data-cmd-text="${i}">${d(l(`cmd.artifact.action.copy`))}</button>
|
|
10
|
-
</div>
|
|
11
|
-
</div>`}document.addEventListener(`click`,async e=>{let t=e.target?.closest(`[data-cmd-recovery-action]`);if(!t)return;let n=t.dataset.cmdRecoveryAction||``,r=t.dataset.cmdText||``;if(r){if(n===`reinsert`){let e=document.getElementById(`chatInput`);if(!e)return;e.value=r,e.focus(),e.selectionStart=e.selectionEnd=e.value.length,e.dispatchEvent(new Event(`input`,{bubbles:!0}));return}n===`copy`&&await p(r)}});var Wt=!1;async function Gt(e=`enter`){let t=document.getElementById(`chatInput`),a=document.getElementById(`btnSend`);if(!t||!a)return;let u=e===`button`;if(a.classList.contains(`stop-mode`)&&u){o(`/api/stop`,`POST`);return}if(Wt)return;let f=t.value.trim();if(!f&&!n.attachedFiles.length)return;be(),Wt=!0;let p=a,ee=p.disabled;p.disabled=!0;try{await lt();let e=f.slice(1).trim().split(/\s+/)[0]||``,a=e.includes(`/`)||e.includes(`\\`);if(f.startsWith(`/`)&&!n.attachedFiles.length&&!a){t.value=``,S(),Pe();try{let e,t,n=Bt(f);if(typeof AbortSignal?.timeout==`function`)e=AbortSignal.timeout(n);else{let r=new AbortController;e=r.signal,t=setTimeout(()=>r.abort(),n)}let a=Oe(),o=await r(),c=await fetch(`${s}/api/command`,{method:`POST`,headers:{"Content-Type":`application/json`,"Accept-Language":a,...o?{Authorization:`Bearer ${o}`}:{}},body:JSON.stringify({text:f,locale:a}),signal:e});t&&clearTimeout(t);let l=await c.json().catch(()=>({}));if(l?.code===`not_command`){g(`user`,f),_({role:`user`,content:f,timestamp:Date.now()}),await i(`/api/message`,`POST`,{prompt:f});return}if(!c.ok&&!l?.text)throw Error(`HTTP ${c.status}`);if(l?.code===`clear_screen`){ne(),ce().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``)}(l?.text||l?.recovery)&&h(Ut(l),``,l.type),l?.steerPrompt&&await i(`/api/message`,`POST`,{prompt:l.steerPrompt})}catch(e){h(l(`chat.cmd.fail`,{msg:e.message}),``,`error`)}finally{we(`command`).catch(()=>{})}return}if(n.attachedFiles.length){let e=`📎 [${n.attachedFiles.map(e=>e.name).join(`, `)}] ${f}`;g(`user`,e),_({role:`user`,content:e,timestamp:Date.now()}),t.value=``,S();try{let e=(await Promise.all(n.attachedFiles.map(e=>qt(e)))).map(e=>l(`chat.file.sent`,{path:e})).join(`
|
|
12
|
-
`);f&&(e+=l(`chat.file.sentWithMsg`,{text:f})),x(),await i(`/api/message`,`POST`,{prompt:e})}catch(e){h(l(`chat.file.uploadFail`,{msg:e.message})),x()}}else{t.value=``,S();let e=await Ht(f),n=e.data;if(e.status===409&&n.error===`duplicate`)return;if(!e.ok){h(`${m.error} ${d(n.error||l(`chat.requestFail`,{status:e.status}))}`,``,`error`);return}if(n.queued){let{updateQueueBadge:e}=await c(async()=>{let{updateQueueBadge:e}=await import(`./ui-HtSKByR3.js`);return{updateQueueBadge:e}},__vite__mapDeps([0]));e(n.pending||1)}else n.noPendingContinue?(g(`user`,f),_({role:`user`,content:f,timestamp:Date.now()}),ge(!0)):n.continued?(g(`user`,f),_({role:`user`,content:f,timestamp:Date.now()}),h(l(`chat.continue`)),ge(!0)):(g(`user`,f),_({role:`user`,content:f,timestamp:Date.now()}),ge(!0))}}finally{Wt=!1,p.disabled=ee}}function Kt(e){e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&(e.preventDefault(),Gt(`enter`))}async function qt(e){let t=await fetch(`${s}/api/upload`,{method:`POST`,headers:{"X-Filename":encodeURIComponent(e.name)},body:e});if(!t.ok)throw Error(`upload failed`);return(await t.json()).path}function Jt(e){for(let t of e)n.attachedFiles.some(e=>e.name===t.name)||n.attachedFiles.push(t);Xt(),document.getElementById(`chatInput`)?.focus()}function Yt(e){n.attachedFiles.splice(e,1),Xt()}function x(){b.forEach(e=>URL.revokeObjectURL(e)),b=[],n.attachedFiles=[],Xt();let e=document.getElementById(`fileInput`);e&&(e.value=``)}function Xt(){let e=document.getElementById(`filePreview`),t=document.getElementById(`filePreviewList`);if(e){if(b.forEach(e=>URL.revokeObjectURL(e)),b=[],!n.attachedFiles.length){e.classList.remove(`visible`),t&&(t.innerHTML=``);return}e.classList.add(`visible`),t&&(t.innerHTML=n.attachedFiles.map((e,t)=>{let n=(e.size/1024).toFixed(1),r=e.type.startsWith(`image/`),i=``;if(r){let t=URL.createObjectURL(e);b.push(t),i=`<img src="${t}" class="file-chip-thumb" alt="">`}return`<div class="file-chip">
|
|
13
|
-
${i}
|
|
14
|
-
<span class="file-chip-name">${m.paperclip} ${d(e.name)} (${n}KB)</span>
|
|
15
|
-
<button class="file-chip-remove" data-file-idx="${t}" title="Remove">${m.close}</button>
|
|
16
|
-
</div>`}).join(``))}}async function Zt(){ne(),ce().clear();let e=document.getElementById(`chatMessages`);e&&(e.innerHTML=``);let{cleanupToolActivity:t}=await c(async()=>{let{cleanupToolActivity:e}=await import(`./ui-HtSKByR3.js`);return{cleanupToolActivity:e}},__vite__mapDeps([0]));t(),ve().catch(()=>{}),be()}var Qt=0;function $t(e){if(Qt)return;let t=le();Qt=requestAnimationFrame(()=>{if(Qt=0,e.style.height=`auto`,e.style.height=e.scrollHeight+`px`,t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,se())}})}function en(){let e=document.getElementById(`chatInput`);e&&e.addEventListener(`input`,()=>$t(e))}function S(){let e=document.getElementById(`chatInput`),t=le();if(e&&(e.style.height=`auto`),t){let e=document.getElementById(`chatMessages`);e&&(e.scrollTop=e.scrollHeight,se())}}function tn(){let e=document.querySelector(`.chat-area`),t=document.getElementById(`dragOverlay`);if(!e||!t)return;let n=0;e.addEventListener(`dragenter`,e=>{e.preventDefault(),n++,t.classList.add(`visible`)}),e.addEventListener(`dragleave`,e=>{e.preventDefault(),n--,n<=0&&(n=0,t.classList.remove(`visible`))}),e.addEventListener(`dragover`,e=>e.preventDefault()),e.addEventListener(`drop`,e=>{e.preventDefault(),n=0,t.classList.remove(`visible`);let r=[...e.dataTransfer?.files||[]];r.length&&Jt(r)}),document.getElementById(`fileInput`)?.addEventListener(`change`,e=>{let t=e.target,n=[...t.files||[]];n.length&&Jt(n),t.value=``}),document.addEventListener(`paste`,e=>{let t=e.clipboardData?.items;if(!t)return;let n=[];for(let e of t){if(e.kind!==`file`)continue;let t=e.getAsFile();if(t)if(!t.name||t.name===`image.png`){let e=new Date().toISOString().replace(/[:.]/g,`-`),r=t.type.split(`/`)[1]||`png`,i=new File([t],`pasted-${e}.${r}`,{type:t.type});n.push(i)}else n.push(t)}n.length&&(e.preventDefault(),Jt(n))})}async function nn(e,t,r){let a=document.getElementById(`chatInput`),o=a?.value.trim()||``,c=[...n.attachedFiles],u=[l(`chat.voice.label`)];c.length&&u.push(`📎 [${c.map(e=>e.name).join(`, `)}]`),o&&u.push(o),g(`user`,u.join(` `)),_({role:`user`,content:u.join(` `),timestamp:Date.now()}),a&&o&&(a.value=``,S()),c.length&&x();try{let n=await fetch(`${s}/api/voice`,{method:`POST`,headers:{"Content-Type":r,"X-Voice-Ext":t,"X-STT-Only":`true`},body:e});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}let a=await n.json().catch(()=>null);if(!a?.text)throw Error(`Empty STT result`);h(`${m.mic} STT (${d(a.engine||``)}, ${a.elapsed?.toFixed(1)}s): "${d(a.text.slice(0,100))}"`,``,`info`);let u=[];c.length&&(u=await Promise.all(c.map(e=>qt(e))));let f=[];for(let e of u)f.push(l(`chat.file.sent`,{path:e}));f.push(`🎤 ${a.text}`),o&&f.push(o),await i(`/api/message`,`POST`,{prompt:f.join(`
|
|
17
|
-
`)})}catch(e){h(l(`voice.sttFail`,{msg:e.message}),``,`error`)}}var rn={sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6},an={jan:1,feb:2,mar:3,apr:4,may:5,jun:6,jul:7,aug:8,sep:9,oct:10,nov:11,dec:12};function on(e){let t=typeof e==`string`?e.trim():``;if(t)try{return new Intl.DateTimeFormat(`en-US`,{timeZone:t}).format(new Date),t}catch{return}}function sn(e){let t=e&&typeof e==`object`?e:{},n=t.kind,r=typeof t.timeZone==`string`?t.timeZone.trim():``,i=on(t.timeZone);if(r&&!i)return{ok:!1,code:`invalid_timezone`,error:`invalid timeZone "${r}"`};if(n===`cron`){let e=typeof t.cron==`string`?t.cron.trim().replace(/\s+/g,` `):``;if(!e)return{ok:!1,code:`invalid_cron`,error:`cron expression required`};let n=cn(e);return n?{ok:!1,code:`invalid_cron`,error:n}:{ok:!0,schedule:i?{kind:`cron`,cron:e,timeZone:i}:{kind:`cron`,cron:e}}}if(n==null||n===`every`){let e=typeof t.minutes==`number`?t.minutes:Number(t.minutes);if(!Number.isInteger(e)||e<1)return{ok:!1,code:`invalid_minutes`,error:`minutes must be an integer >= 1`};let n=Math.max(1,Math.floor(e));return{ok:!0,schedule:i?{kind:`every`,minutes:n,timeZone:i}:{kind:`every`,minutes:n}}}return{ok:!1,code:`invalid_kind`,error:`invalid heartbeat schedule kind "${String(n)}"`}}function cn(e){try{let[t,n,r,i,a]=ln(e);return C(t,{min:0,max:59}),C(n,{min:0,max:23}),C(r,{min:1,max:31}),C(i,{min:1,max:12,aliases:an}),C(a,{min:0,max:7,aliases:rn,normalize:pn}),null}catch(e){return e.message}}function ln(e){let t=String(e||``).trim().replace(/\s+/g,` `).split(` `);if(t.length!==5)throw Error(`cron must have 5 fields, got ${t.length}`);return t}function C(e,t){for(let n of e.split(`,`))un(n.trim(),t)}function un(e,t){if(!e)throw Error(`empty cron segment`);let n=e;if(e.includes(`/`)){let[t,r,...i]=e.split(`/`);if(!t||!r||i.length>0)throw Error(`invalid cron step segment "${e}"`);n=t,fn(r,`invalid cron step "${r}"`)}if(n!==`*`){if(n.includes(`-`)){let[e,r,...i]=n.split(`-`);if(!e||!r||i.length>0||dn(e,t)>dn(r,t))throw Error(`invalid cron range "${n}"`);return}dn(n,t)}}function dn(e,t){let n=e.trim().toLowerCase(),r=t.aliases?.[n]??Number(n);if(!Number.isInteger(r))throw Error(`invalid cron value "${e}"`);let i=t.normalize?t.normalize(r):r;if(!mn(i,t.min,t.max))throw Error(`cron value "${e}" out of range ${t.min}-${t.max}`);return i}function fn(e,t){let n=Number(e);if(!Number.isInteger(n)||n<=0)throw Error(t);return n}function pn(e){return e===7?0:e}function mn(e,t,n){return e>=t&&e<=n}async function hn(){n.heartbeatJobs=((await a(`/api/heartbeat`))?.jobs||[]).map(E),n.heartbeatErrors=D(n.heartbeatJobs),w(),document.getElementById(`heartbeatModal`)?.classList.add(`open`)}function gn(e){e&&e.target!==e.currentTarget||document.getElementById(`heartbeatModal`)?.classList.remove(`open`)}function w(){let e=document.getElementById(`hbJobsList`);if(!e)return;let t=n.heartbeatJobs.map(E);n.heartbeatJobs=t,n.heartbeatErrors=D(t),t.length===0?e.innerHTML=`<p style="color:var(--text-dim);font-size:12px;text-align:center">${l(`hb.empty`)}</p>`:e.innerHTML=t.map((e,t)=>{let r=xn(e.schedule),i=r.kind===`cron`,a=n.heartbeatErrors[e.id],o=a||On(r),s=a?`hb-schedule-meta hb-error`:`hb-schedule-meta hb-help`,c=i?`<input type="text" value="${d(r.cron)}" placeholder="${d(l(`hb.cronPlaceholder`))}"
|
|
18
|
-
data-hb-cron="${t}">`:`<input type="number" value="${r.minutes}" min="1" data-hb-minutes="${t}">`,u=i?`<span class="hb-chip">${d(l(`hb.cronLabel`))}</span>`:`<span class="hb-chip">${d(l(`hb.minutesLabel`))}</span>`;return`
|
|
19
|
-
<div class="hb-job-card">
|
|
20
|
-
<div class="hb-job-header">
|
|
21
|
-
<input type="text" value="${d(String(e.name||``))}" placeholder="${d(l(`hb.name`))}"
|
|
22
|
-
data-hb-name="${t}">
|
|
23
|
-
<button class="hb-toggle ${e.enabled?`on`:`off`}"
|
|
24
|
-
data-hb-toggle="${t}" aria-label="${d(String(e.name||`job`)+` toggle`)}"></button>
|
|
25
|
-
<button class="hb-del" data-hb-remove="${t}">${m.close}</button>
|
|
26
|
-
</div>
|
|
27
|
-
<div class="hb-job-schedule">
|
|
28
|
-
<select data-hb-kind="${t}">
|
|
29
|
-
<option value="every"${i?``:` selected`}>${d(l(`hb.kindEvery`))}</option>
|
|
30
|
-
<option value="cron"${i?` selected`:``}>${d(l(`hb.kindCron`))}</option>
|
|
31
|
-
</select>
|
|
32
|
-
${c}
|
|
33
|
-
${u}
|
|
34
|
-
<input type="text" value="${d(r.timeZone||``)}" placeholder="${d(Tn())}"
|
|
35
|
-
data-hb-timezone="${t}">
|
|
36
|
-
</div>
|
|
37
|
-
<p class="${s}">${d(o)}</p>
|
|
38
|
-
<textarea class="hb-prompt" rows="2" placeholder="${d(l(`hb.prompt`))}"
|
|
39
|
-
data-hb-prompt="${t}">${d(String(e.prompt||``))}</textarea>
|
|
40
|
-
</div>
|
|
41
|
-
`}).join(``);let r=t.filter(e=>e.enabled).length,i=document.getElementById(`hbSidebarBtn`);i&&(i.innerHTML=`${m.heartPulse} Heartbeat (${r})`)}function _n(){n.heartbeatJobs.push({id:`hb_`+Date.now(),name:``,enabled:!0,schedule:Cn({kind:`every`,minutes:5}),prompt:``}),w(),T()}function vn(e){n.heartbeatJobs.splice(e,1),w(),T()}function yn(e){let t=n.heartbeatJobs[e];t&&(t.enabled=!t.enabled,w(),T())}async function T(){let e=n.heartbeatJobs.map(E);if(n.heartbeatJobs=e,n.heartbeatErrors=D(e),Object.keys(n.heartbeatErrors).length>0){w();return}let t=await i(`/api/heartbeat`,`PUT`,{jobs:e});t?.jobs&&(n.heartbeatJobs=t.jobs.map(E),n.heartbeatErrors=D(n.heartbeatJobs),w())}async function bn(){try{let e=((await a(`/api/heartbeat`))?.jobs||[]).map(E).filter(e=>e.enabled).length,t=document.getElementById(`hbSidebarBtn`);t&&(t.innerHTML=`${m.heartPulse} Heartbeat (${e})`)}catch{}}function E(e){return{id:String(e.id||`hb_${Date.now()}`),name:String(e.name||``),enabled:e.enabled!==!1,schedule:xn(e.schedule),prompt:String(e.prompt||``)}}function xn(e){let t=Sn(e?.timeZone);if(e?.kind===`cron`){let n=typeof e.cron==`string`?e.cron.trim().replace(/\s+/g,` `):`0 9 * * *`;return t?{kind:`cron`,cron:n,timeZone:t}:{kind:`cron`,cron:n}}let n=typeof e?.minutes==`number`&&Number.isFinite(e.minutes)&&e.minutes>0?Math.max(1,Math.floor(e.minutes)):5;return t?{kind:`every`,minutes:n,timeZone:t}:{kind:`every`,minutes:n}}function Sn(e){return(typeof e==`string`?e.trim():``)||void 0}function Cn(e){let t=wn();return t?{...e,timeZone:t}:e}function wn(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||void 0}catch{return}}function Tn(){let e=wn();return e?`${l(`hb.timezoneAuto`)} ${e}`:l(`hb.timezoneAuto`)}function D(e){let t={};for(let n of e){let e=En(n);e&&(t[n.id]=e)}return t}function En(e){let t=sn(e.schedule);return t.ok?null:Dn(t.code,t.error)}function Dn(e,t){switch(e){case`invalid_cron`:return l(`hb.invalidCron`);case`invalid_timezone`:return l(`hb.invalidTimeZone`);case`invalid_minutes`:return l(`hb.invalidMinutes`);default:return t||l(`hb.invalidSchedule`)}}function On(e){let t=e.timeZone||wn()||`Asia/Seoul`;return e.kind===`cron`?l(`hb.scheduleHintCron`,{cron:`0 9 * * *`,timeZone:t}):l(`hb.scheduleHintEvery`,{minutes:e.minutes,timeZone:t})}var O=`jaw.uiTheme`,k=null;function kn(e){return e===`dark`||e===`light`||e===`auto`}function An(e){return e===`light`||e===`auto`&&typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`}function jn(n){let r=n===`light`?e:t;k||(k=document.createElement(`style`),k.id=`hljsTheme`,document.head.appendChild(k)),k.textContent=r}function Mn(){!localStorage.getItem(O)&&localStorage.getItem(`theme`)&&(localStorage.setItem(O,localStorage.getItem(`theme`)),localStorage.removeItem(`theme`));let e=Pn(),t=localStorage.getItem(O),n=window.matchMedia(`(prefers-color-scheme: light)`).matches?`light`:`dark`;A(e||t||n),document.getElementById(`toggleTheme`)?.addEventListener(`click`,Nn),window.addEventListener(`message`,In),window.matchMedia(`(prefers-color-scheme: dark)`).addEventListener(`change`,()=>{let e=localStorage.getItem(O);(!e||e===`auto`)&&A(e||`auto`)}),window.addEventListener(`storage`,e=>{e.key===O&&e.newValue&&A(e.newValue)})}function Nn(){let e=(document.documentElement.getAttribute(`data-theme`)||`dark`)===`dark`?`light`:`dark`;A(e),localStorage.setItem(O,e)}function A(e){let t=An(e);document.documentElement.setAttribute(`data-theme`,t);let n=document.getElementById(`toggleTheme`);n&&n.classList.toggle(`is-light`,t===`light`),jn(t),_e(),ae()}function Pn(){let e=new URLSearchParams(window.location.search).get(`jawTheme`);return kn(e)?e:null}function Fn(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function In(e){if(window.parent===window||e.source!==window.parent||!Fn(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-theme-sync`||!kn(t.theme)||A(t.theme)}var Ln=new Set([`j`,`k`,`i`,`n`,`p`]);function Rn(e){if(e.altKey&&!e.ctrlKey&&!e.metaKey){let t=e.key.toLowerCase();return(t.length!==1||!Ln.has(t))&&e.code?.startsWith(`Key`)&&(t=e.code.slice(3).toLowerCase()),Ln.has(t)}return e.ctrlKey&&e.shiftKey&&!e.metaKey&&!e.altKey?e.code===`Backquote`:!!(e.metaKey&&!e.ctrlKey&&!e.altKey&&(!e.shiftKey&&(e.code===`Backquote`||e.code===`KeyB`||e.code===`KeyJ`)||e.shiftKey&&(e.code===`KeyB`||e.code===`KeyD`||e.code===`KeyE`)))}function zn(){window.parent!==window&&document.addEventListener(`keydown`,e=>{if(Rn(e)){e.preventDefault();try{window.parent.postMessage({type:`jaw-preview-shortcut`,key:e.key,code:e.code,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey},`*`)}catch{}}})}var Bn=50,Vn=30,Hn=80,Un=500,j=null,Wn=!1;function Gn(){if(Wn||!(`ontouchstart`in window))return;Wn=!0;let e=document.querySelector(`.chat-area`);e&&(e.addEventListener(`touchstart`,Kn,{passive:!0}),e.addEventListener(`touchend`,qn,{passive:!0}))}function Kn(e){let t=e.touches[0],n=window.innerWidth,r=null;t.clientX<Vn?r=`left`:t.clientX>n-Vn&&(r=`right`),j={startX:t.clientX,startY:t.clientY,startTime:Date.now(),isEdge:r}}function qn(e){if(!j)return;let t=e.changedTouches[0],n=t.clientX-j.startX,r=Math.abs(t.clientY-j.startY),i=Date.now()-j.startTime,a=j;j=null,!(r>Hn||i>Un||Math.abs(n)<Bn)&&(n>0&&a.isEdge===`left`&&Ce(),n<0&&a.isEdge===`right`&&xe())}var M=!1,N=null,P=[],Jn=null,Yn=null,Xn=0,F=!1,I=`stopped`,Zn=15e3;function Qn(){if(typeof MediaRecorder>`u`)return``;for(let e of[`audio/webm;codecs=opus`,`audio/mp4`,`audio/ogg;codecs=opus`])if(MediaRecorder.isTypeSupported(e))return e;return``}function $n(e){let t=e;switch(t.name){case`NotAllowedError`:return l(`voice.micDenied`);case`NotFoundError`:return l(`voice.micNotFound`);case`NotReadableError`:case`AbortError`:return l(`voice.micBusy`);case`TimeoutError`:return ir();default:return t instanceof TypeError||!navigator.mediaDevices?l(`voice.httpsRequired`):l(`voice.micDenied`)}}function er(){let e=document;return e.permissionsPolicy||e.featurePolicy||null}function tr(){try{return er()?.allowsFeature?.(`microphone`)===!1}catch{return!1}}async function nr(){try{return navigator.permissions?.query?(await navigator.permissions.query({name:`microphone`})).state:null}catch{return null}}function rr(){let e=new URL(window.location.href),t=new URL(e.href);e.hostname===`127.0.0.1`?t.hostname=`localhost`:e.hostname===`localhost`&&(t.hostname=`127.0.0.1`);let n=t.origin===e.origin?``:t.origin;return{origin:e.origin,alternateOrigin:n}}function ir(){let e=rr();return e.alternateOrigin?l(`voice.requestTimeoutLoopback`,e):l(`voice.requestTimeout`,e)}function ar(e){let t=e;return t.name===`NotSupportedError`?l(`voice.unsupported`):t.name===`NotReadableError`||t.name===`AbortError`?l(`voice.micBusy`):t instanceof TypeError?l(`voice.httpsRequired`):l(`voice.interrupted`)}function L(e){if(window.parent!==window)try{window.parent.postMessage({type:`jaw-preview-stt-recording`,action:e},`*`)}catch{}}function or(){return new DOMException(`Timed out waiting for microphone permission prompt`,`TimeoutError`)}async function sr(){let e=!1,t=null,n=navigator.mediaDevices.getUserMedia({audio:!0}).then(t=>e?(t.getTracks().forEach(e=>e.stop()),null):t,t=>{if(e)return null;throw t}),r=new Promise((n,r)=>{t=setTimeout(()=>{e=!0,r(or())},Zn)});try{let e=await Promise.race([n,r]);if(!e)throw or();return e}finally{t!==null&&clearTimeout(t)}}async function cr(){if(n.isRecording||F)return;if(typeof MediaRecorder>`u`||!navigator.mediaDevices?.getUserMedia){h(l(`voice.unsupported`),``,`error`);return}if(tr()){h(l(`voice.policyBlocked`),``,`error`);return}if(await nr()===`denied`){h(l(`voice.permissionDeniedBrowser`,rr()),``,`error`);return}F=!0,M=!1,I=`stopped`,z(!1),L(`request`);let e=null;try{e=await sr(),Jn=e}catch(e){F=!1,z(!1),L(`failed`),h($n(e),``,`error`);return}try{let t=Qn(),r=new MediaRecorder(e,t?{mimeType:t}:{});N=r,P=[],r.ondataavailable=e=>{e.data.size>0&&P.push(e.data)},r.onerror=()=>{M=!0,I=`failed`,n.isRecording=!1,pr(),z(!1),r.state===`recording`?r.stop():(P=[],R(),N=null,L(`failed`)),h(l(`voice.interrupted`),``,`error`)},r.onstop=async()=>{let e=I,n=M||e!==`stopped`;if(I=`stopped`,n){P=[],R(),N=null,M=!1,L(e);return}let i=r.mimeType||t||`audio/webm`,a=i.includes(`mp4`)?`.m4a`:i.includes(`ogg`)?`.ogg`:`.webm`,o=new Blob(P,{type:i});if(P=[],R(),N=null,M=!1,L(`stopped`),o.size>20*1024*1024){h(l(`voice.tooLarge`),``,`error`);return}if(o.size<1e3){h(l(`voice.tooShort`),``,`error`);return}await nn(o,a,i)},r.start(),n.isRecording=!0,F=!1,Xn=Date.now(),z(!0),fr(),L(`started`)}catch(e){F=!1,n.isRecording=!1,P=[],N=null,R(),z(!1),L(`failed`),h(ar(e),``,`error`)}}function lr(){!n.isRecording||!N||(I=`stopped`,N.state===`recording`?N.stop():(R(),N=null,L(`stopped`)),n.isRecording=!1,pr(),z(!1))}function ur(){!n.isRecording||!N||(M=!0,I=`cancelled`,N.state===`recording`?N.stop():(P=[],R(),N=null,L(`cancelled`)),n.isRecording=!1,pr(),z(!1))}function dr(){n.isRecording?lr():cr()}function R(){Jn?.getTracks().forEach(e=>e.stop()),Jn=null}function fr(){let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`inline`,Yn=setInterval(()=>{let t=Math.floor((Date.now()-Xn)/1e3);e.textContent=`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},500))}function pr(){Yn&&=(clearInterval(Yn),null);let e=document.getElementById(`voiceTimer`);e&&(e.style.display=`none`,e.textContent=`00:00`)}function z(e){let t=document.getElementById(`btnVoice`),n=document.getElementById(`btnVoiceCancel`),r=F&&!e;t&&(t.classList.toggle(`recording`,e),t.classList.toggle(`arming`,r),t.innerHTML=e?m.stop:m.mic,t.title=l(r?`voice.requesting`:e?`voice.stop`:`voice.start`),t.toggleAttribute(`aria-busy`,r),t instanceof HTMLButtonElement&&(t.disabled=r)),n&&(n.style.display=e?`inline-block`:`none`)}var B={activeCli:V(`activeCli`,2,1,2),model:V(`model`,2,1,1),effort:V(`effort`,2,1,1),permissions:V(`permissions`,2,1,1),flushAgent:V(`flushAgent`,2,1,1),employees:V(`employees`,3,3,2),skills:V(`skills`,2,1,1),activeChannel:V(`activeChannel`,2,1,1),telegram:{...V(`telegram`,2,1,2,8),docLinks:[{url:`https://t.me/BotFather`,labelKey:`help.telegram.link.botfather`},{url:`https://core.telegram.org/bots/tutorial`,labelKey:`help.telegram.link.docs`}]},discord:{...V(`discord`,2,1,2,9),docLinks:[{url:`https://discord.com/developers/applications`,labelKey:`help.discord.link.portal`},{url:`https://discord.com/developers/docs/getting-started`,labelKey:`help.discord.link.docs`}]},fallbackOrder:V(`fallbackOrder`,2,1,1),mcp:V(`mcp`,2,1,1),memory:V(`memory`,2,1,2),stt:V(`stt`,2,1,1),promptTemplates:V(`promptTemplates`,2,1,1),chatInput:V(`chatInput`,3,2,2),orchestration:V(`orchestration`,3,2,2),attachments:V(`attachments`,3,2,2),diagrams:V(`diagrams`,3,2,2),keyboardShortcuts:V(`keyboardShortcuts`,3,2,2,3,2)};function mr(e){return typeof e==`string`&&Object.prototype.hasOwnProperty.call(B,e)}function V(e,t,n,r,i=2,a=1){return{titleKey:`help.${e}.title`,introKey:`help.${e}.intro`,effectKey:`help.${e}.effect`,useWhenKeys:H(`help.${e}.use`,t),howToKeys:H(`help.${e}.howTo`,i),exampleKeys:H(`help.${e}.example`,a),avoidWhenKeys:H(`help.${e}.avoid`,n),relatedKeys:H(`help.${e}.related`,r)}}function H(e,t){return Array.from({length:t},(t,n)=>`${e}.${n+1}`)}var hr=!1,U=null,W=null,G=null,K=null,gr=null,q=!1;function _r(){hr||(hr=!0,document.addEventListener(`click`,yr),document.addEventListener(`keydown`,br,!0))}function vr(e,t=null,n=[e]){if(!B[e]){console.warn(`[help-dialog] unknown topic:`,e);return}xr(),gr=t,Sr(e,Er(n,e)),U?.classList.add(`open`),U?.setAttribute(`aria-hidden`,`false`),q=!0,requestAnimationFrame(()=>K?.focus())}function J(){if(!q)return;U?.classList.remove(`open`),U?.setAttribute(`aria-hidden`,`true`),q=!1;let e=gr;gr=null,e?.focus()}function yr(e){let t=e.target?.closest(`[data-help-topic]`);if(!t)return;let n=t.getAttribute(`data-help-topic`);if(!mr(n)){console.warn(`[help-dialog] invalid topic:`,n);return}e.preventDefault(),vr(n,t,Tr(t.getAttribute(`data-help-topics`),n))}function br(e){!q||e.key!==`Escape`||(e.preventDefault(),e.stopImmediatePropagation(),J())}function xr(){if(U&&W&&G&&K)return;U=document.createElement(`div`),U.id=`helpDialog`,U.className=`modal-overlay help-dialog-overlay`,U.setAttribute(`role`,`presentation`),U.setAttribute(`aria-hidden`,`true`),U.addEventListener(`click`,e=>{e.target===U&&J()});let e=document.createElement(`div`);e.className=`modal-box help-dialog-box`,e.setAttribute(`role`,`dialog`),e.setAttribute(`aria-modal`,`true`),e.setAttribute(`aria-labelledby`,`helpDialogTitle`),e.addEventListener(`click`,e=>e.stopPropagation());let t=document.createElement(`div`);t.className=`modal-header help-dialog-header`,W=document.createElement(`span`),W.id=`helpDialogTitle`,K=document.createElement(`button`),K.type=`button`,K.className=`btn-modal-close help-dialog-close`,K.setAttribute(`aria-label`,l(`help.close`)),K.textContent=`x`,K.addEventListener(`click`,()=>J()),G=document.createElement(`div`),G.className=`help-dialog-body`;let n=document.createElement(`div`);n.className=`modal-footer help-dialog-footer`;let r=document.createElement(`button`);r.type=`button`,r.className=`btn-save help-dialog-done`,r.textContent=l(`help.close`),r.addEventListener(`click`,()=>J()),t.append(W,K),n.append(r),e.append(t,G,n),U.append(e),document.body.append(U)}function Sr(e,t=[e]){if(!W||!G||!K)return;let n=B[e];W.textContent=l(n.titleKey),K.setAttribute(`aria-label`,l(`help.close`)),G.replaceChildren();let r=document.createElement(`div`);if(r.className=`help-dialog-content`,Cr(r,n),t.length<=1){G.append(r);return}let i=document.createElement(`div`);i.className=`help-dialog-layout`,i.append(wr(t,e),r),G.append(i)}function Cr(e,t){t.docLinks?.length&&Dr(e,t.docLinks),Or(e,l(`help.section.what`),l(t.introKey)),Or(e,l(`help.section.effect`),l(t.effectKey),`help-effect-text`),Y(e,l(`help.section.useWhen`),t.useWhenKeys),Ar(e,l(`help.section.howTo`),t.howToKeys),Y(e,l(`help.section.example`),t.exampleKeys,!1,`help-example-list`),t.avoidWhenKeys?.length&&Y(e,l(`help.section.avoidWhen`),t.avoidWhenKeys),t.relatedKeys?.length&&Y(e,l(`help.section.related`),t.relatedKeys,!0)}function wr(e,t){let n=document.createElement(`nav`);n.className=`help-dialog-nav`,n.setAttribute(`aria-label`,l(`help.section.related`));for(let r of e){let i=B[r],a=document.createElement(`button`);a.type=`button`,a.className=`help-dialog-nav-item`,a.textContent=l(i.titleKey),r===t&&(a.classList.add(`active`),a.setAttribute(`aria-current`,`page`)),a.addEventListener(`click`,()=>Sr(r,e)),n.append(a)}return n}function Tr(e,t){return Er(e?.split(/[\s,]+/).filter(Boolean)??[],t)}function Er(e,t){let n=[];for(let t of e)mr(t)&&!n.includes(t)&&n.push(t);return n.includes(t)||n.unshift(t),n}function Dr(e,t){let n=document.createElement(`section`);n.className=`help-dialog-section help-doc-links`;let r=document.createElement(`nav`);r.className=`help-doc-links-nav`;for(let e of t){let t=document.createElement(`a`);t.href=e.url,t.target=`_blank`,t.rel=`noopener noreferrer`,t.className=`help-doc-link`,t.textContent=l(e.labelKey);let n=document.createElement(`span`);n.className=`help-doc-link-icon`,n.textContent=`↗`,t.append(n),r.append(t)}n.append(r),e.append(n)}function Or(e,t,n,r){let i=kr(t),a=document.createElement(`p`);r&&(a.className=r),a.textContent=n,i.append(a),e.append(i)}function Y(e,t,n,r=!1,i){let a=kr(t),o=document.createElement(`ul`);o.className=i??(r?`help-related-list`:`help-dialog-list`);for(let e of n){let t=document.createElement(`li`);t.textContent=l(e),o.append(t)}a.append(o),e.append(a)}function kr(e){let t=document.createElement(`section`);t.className=`help-dialog-section`;let n=document.createElement(`h3`);return n.textContent=e,t.append(n),t}function Ar(e,t,n){let r=kr(t),i=document.createElement(`ol`);i.className=`help-dialog-list help-howto-list`;for(let e of n){let t=document.createElement(`li`);t.textContent=l(e),i.append(t)}r.append(i),e.append(r)}window.parent;var jr=null,Mr=``,X=null;function Nr(){let e=document.getElementById(`chatSearchInput`),t=document.getElementById(`chatSearchClose`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);!e||!t||!n||!r||(window.addEventListener(`message`,e=>{e.data?.type===`jaw-preview-search`&&Pr()}),e.addEventListener(`input`,()=>{let t=e.value.trim();if(jr&&clearTimeout(jr),!t){Hr(n,r);return}jr=setTimeout(()=>void Ir(t,n,r),250)}),e.addEventListener(`keydown`,e=>{if(e.key===`Escape`){Z();return}e.key===`Enter`&&(e.preventDefault(),n.querySelector(`.chat-search-result`)?.click()),e.key===`ArrowDown`&&(e.preventDefault(),Vr(n,1)),e.key===`ArrowUp`&&(e.preventDefault(),Vr(n,-1))}),n.addEventListener(`wheel`,e=>{let t=n,r=t.scrollTop===0&&e.deltaY<0,i=t.scrollTop+t.clientHeight>=t.scrollHeight&&e.deltaY>0;!r&&!i&&e.stopPropagation(),(r||i)&&e.preventDefault()},{passive:!1}),t.addEventListener(`click`,Z))}function Pr(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`);!e||!t||(e.classList.contains(`open`)?Z():(e.classList.add(`open`),t.focus(),Fr()))}function Z(){let e=document.getElementById(`chatSearch`),t=document.getElementById(`chatSearchInput`),n=document.getElementById(`chatSearchResults`),r=document.getElementById(`chatSearchCount`);e&&(e.classList.remove(`open`),t&&(t.value=``),n&&r&&Hr(n,r),Mr=``)}function Fr(){X=new Map,a(`/api/messages${de()}`).then(e=>{e&&(X=new Map,e.forEach((e,t)=>X.set(e.id,t)))}).catch(()=>{})}async function Ir(e,t,n){Mr=e;let r=await a(`/api/messages/search?q=${encodeURIComponent(e)}&limit=20`);if(!(!r||Mr!==e)){if(n.textContent=r.length>0?`${r.length} found`:`no results`,r.length===0){t.classList.remove(`has-results`),t.innerHTML=``;return}t.innerHTML=r.map(t=>Lr(t,e)).join(``),t.classList.add(`has-results`),t.querySelectorAll(`.chat-search-result`).forEach(e=>{e.addEventListener(`click`,()=>{Br(Number(e.dataset.msgId))})})}}function Lr(e,t){let n=e.role===`assistant`?`agent`:e.role,r=n===`agent`?e.cli||`agent`:`you`,i=e.match_field===`tool_log`,a=i?`<span class="chat-search-result-badge">tool</span>`:``,o=zr(i?Rr(e.tool_log,t):e.content,t),s=Ur(e.created_at);return`<div class="chat-search-result" data-msg-id="${e.id}" tabindex="-1">
|
|
42
|
-
<div class="chat-search-result-meta">
|
|
43
|
-
<span class="chat-search-result-role ${n}">${d(r)}</span>
|
|
44
|
-
${a}
|
|
45
|
-
<span>${d(s)}</span>
|
|
46
|
-
</div>
|
|
47
|
-
<div class="chat-search-result-snippet">${o}</div>
|
|
48
|
-
</div>`}function Rr(e,t){if(!e)return``;try{let n=JSON.parse(e),r=t.toLowerCase();for(let e of n){let t=`${e.label||``} ${e.detail||``}`;if(t.toLowerCase().includes(r))return t}}catch{}return e.slice(0,300)}function zr(e,t){let n=e.toLowerCase().indexOf(t.toLowerCase());if(n===-1)return d(e.slice(0,120));let r=Math.max(0,n-40),i=Math.min(e.length,n+t.length+80),a=d(e.slice(r,n)),o=d(e.slice(n,n+t.length)),s=d(e.slice(n+t.length,i));return`${r>0?`…`:``}${a}<mark>${o}</mark>${s}${i<e.length?`…`:``}`}function Br(e){if(!X)return;let t=X.get(e);t!=null&&(ce().scrollToIndex(t,`center`),requestAnimationFrame(()=>{setTimeout(()=>{let e=document.getElementById(`chatMessages`);if(!e)return;e.querySelectorAll(`.msg.search-highlight`).forEach(e=>e.classList.remove(`search-highlight`));let n=e.querySelectorAll(`.msg`);for(let e of n){let n=e.getAttribute(`data-turn-index`);if(n!=null&&Number(n)===t){e.classList.add(`search-highlight`);break}}},150)}))}function Vr(e,t){let n=Array.from(e.querySelectorAll(`.chat-search-result`));if(n.length===0)return;let r=e.querySelector(`.chat-search-result.active`),i=r?n.indexOf(r)+t:0;i<0&&(i=n.length-1),i>=n.length&&(i=0),n.forEach(e=>e.classList.remove(`active`)),n[i].classList.add(`active`),n[i].scrollIntoView({block:`nearest`}),n[i].click()}function Hr(e,t){e.classList.remove(`has-results`),e.innerHTML=``,t.textContent=``}function Ur(e){try{let t=new Date(e),n=new Date;return t.toDateString()===n.toDateString()?t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`}):t.toLocaleDateString([],{month:`short`,day:`numeric`})+` `+t.toLocaleTimeString([],{hour:`2-digit`,minute:`2-digit`})}catch{return``}}var Wr=`jaw:stale-bundle-reload-pending`;function Gr(e){let t=typeof e==`string`?e:e instanceof Error||typeof e?.message==`string`?e.message:``;if(!/(failed to fetch dynamically imported module|error loading dynamically imported module|importing a module script failed|chunkloaderror)/i.test(t))return!1;console.warn(`[stale-bundle] detected dynamic import failure:`,t);try{if(sessionStorage.getItem(Wr)===`1`)return!0;sessionStorage.setItem(Wr,`1`)}catch{}let n=()=>window.location.reload();return`serviceWorker`in navigator?(navigator.serviceWorker.getRegistration().then(e=>e?.update()).catch(()=>{}).finally(n),!0):(n(),!0)}window.addEventListener(`unhandledrejection`,e=>{if(Gr(e.reason)){e.preventDefault();return}console.error(`[unhandled]`,e.reason),e.preventDefault()}),window.addEventListener(`error`,e=>{if(Gr(e.error||e.message)){e.preventDefault();return}console.error(`[error]`,e.message,e.filename,e.lineno)});var{loadEmployees:Kr,addEmployee:qr,deleteEmployee:Jr,updateEmployee:Q,onEmpCliChange:Yr,onEmpRoleChange:Xr}=await c(async()=>{let{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}=await import(`./employees-_A-p_bZg.js`);return{loadEmployees:e,addEmployee:t,deleteEmployee:n,updateEmployee:r,onEmpCliChange:i,onEmpRoleChange:a}},__vite__mapDeps([0]));function Zr(e){if(e===window.location.origin)return!0;try{let t=new URL(e).hostname;return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function Qr(e){let t=(e.ctrlKey||e.metaKey)&&e.shiftKey&&e.code===`Space`,n=e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey&&e.code===`KeyM`;return t||n}document.getElementById(`btnSend`)?.addEventListener(`click`,()=>{Gt(`button`)});var $r=document.getElementById(`chatInput`);$r?.addEventListener(`keydown`,e=>{Ne(e)||Kt(e)});var $=0;$r?.addEventListener(`input`,e=>{e.isComposing||($&&cancelAnimationFrame($),$=requestAnimationFrame(()=>{Me(e.target?.value||``),$=0}))}),$r?.addEventListener(`cmd-execute`,()=>{Gt(`cmd-execute`)}),document.getElementById(`cmdDropdown`)?.addEventListener(`click`,je),document.addEventListener(`click`,Ae),Ee(),document.getElementById(`filePreviewClear`)?.addEventListener(`click`,x),document.getElementById(`filePreviewList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-file-idx]`);t&&Yt(+(t.dataset.fileIdx||`0`))}),document.querySelector(`.btn-attach`)?.addEventListener(`click`,()=>{document.getElementById(`fileInput`)?.click()}),document.getElementById(`btnVoice`)?.addEventListener(`click`,()=>dr()),document.getElementById(`btnVoiceCancel`)?.addEventListener(`click`,()=>ur()),window.addEventListener(`message`,e=>{if(window.parent===window||e.source!==window.parent||!Zr(e.origin))return;let t=e.data;!t||t.type!==`jaw-preview-stt-toggle`||dr()}),document.getElementById(`memorySidebarBtn`)?.addEventListener(`click`,kt),document.getElementById(`btnClearChat`)?.addEventListener(`click`,Zt),document.getElementById(`hbSidebarBtn`)?.addEventListener(`click`,hn),document.getElementById(`langSelect`)?.addEventListener(`change`,async e=>{let t=e.target.value;[`ko`,`en`,`zh`,`ja`].includes(t)&&(await u(t),n.ws&&n.ws.close())}),document.querySelector(`.tab-bar`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.tab-btn`);if(!t)return;let n=[...t.parentElement?.children||[]].filter(e=>e.classList.contains(`tab-btn`)).indexOf(t),r=[`agents`,`skills`,`settings`];r[n]&&me(r[n],t)}),document.querySelector(`.sidebar-save-bar .btn-save`)?.addEventListener(`click`,ue);function ei(e){let t=(e instanceof HTMLSelectElement?e:document.getElementById(`selAiEProvider`))?.value||``,n=document.getElementById(`providerAiE`);!t||!n||Array.from(n.options).some(e=>e.value===t)&&(n.value=t)}document.getElementById(`selCli`)?.addEventListener(`change`,()=>Je()),document.getElementById(`selAiEProvider`)?.addEventListener(`change`,e=>{ei(e.target),Je(),Ye()}),document.getElementById(`selModel`)?.addEventListener(`change`,()=>Ye()),document.getElementById(`selEffort`)?.addEventListener(`change`,()=>Ye()),document.getElementById(`flushCli`)?.addEventListener(`change`,()=>ze()),document.getElementById(`flushModel`)?.addEventListener(`change`,()=>ze()),document.querySelector(`[data-action="addEmployee"]`)?.addEventListener(`click`,qr),document.getElementById(`employeesList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-emp-delete]`);if(t){Jr(t.dataset.empDelete||``);return}}),document.getElementById(`employeesList`)?.addEventListener(`change`,e=>{let t=e.target,n=t.closest(`[data-emp-name]`);if(n){Q(n.dataset.empName||``,{name:t.value});return}let r=t.closest(`[data-emp-cli]`);if(r){Yr(r.dataset.empCli||``,t.value);return}let i=t.closest(`[data-emp-model]`);if(i){if(t.value===`__custom__`){let e=prompt(l(`model.promptInput`));if(e?.trim()){let n=document.createElement(`option`);n.value=e.trim(),n.textContent=e.trim();let r=t.querySelector(`option[value="__custom__"]`);r&&t.insertBefore(n,r),t.value=e.trim(),Q(i.dataset.empModel||``,{model:e.trim()})}else t.value=`default`}else Q(i.dataset.empModel||``,{model:t.value});return}let a=t.closest(`[data-emp-role]`);if(a){Xr(a.dataset.empRole||``,t.value);return}let o=t.closest(`[data-emp-custom]`);if(o){Q(o.dataset.empCustom||``,{role:t.value});return}}),document.getElementById(`skillsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-skill-id]`);t&&St(t.dataset.skillId||``,t.dataset.skillEnabled===`true`)}),document.querySelector(`#tabSkills`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`.skill-filter`);t&&wt(t.dataset.filter||`all`,t)}),document.getElementById(`skillSearchInput`)?.addEventListener(`input`,e=>{Ct(e.target.value)}),document.querySelector(`[data-action="openPrompt"]`)?.addEventListener(`click`,ht),document.getElementById(`tgOff`)?.addEventListener(`click`,()=>Be(!1)),document.getElementById(`tgOn`)?.addEventListener(`click`,()=>Be(!0)),document.getElementById(`tgForwardOff`)?.addEventListener(`click`,()=>Qe(!1)),document.getElementById(`tgForwardOn`)?.addEventListener(`click`,()=>Qe(!0)),document.getElementById(`tgMentionOff`)?.addEventListener(`click`,()=>Ue(!1)),document.getElementById(`tgMentionOn`)?.addEventListener(`click`,()=>Ue(!0)),document.getElementById(`tgToken`)?.addEventListener(`change`,Xe),document.getElementById(`tgChatIds`)?.addEventListener(`change`,Xe),document.getElementById(`chTelegram`)?.addEventListener(`click`,()=>We(`telegram`)),document.getElementById(`chDiscord`)?.addEventListener(`click`,()=>We(`discord`)),document.getElementById(`dcOff`)?.addEventListener(`click`,()=>xt(!1)),document.getElementById(`dcOn`)?.addEventListener(`click`,()=>xt(!0)),document.getElementById(`dcForwardOff`)?.addEventListener(`click`,()=>Ze(!1)),document.getElementById(`dcForwardOn`)?.addEventListener(`click`,()=>Ze(!0)),document.getElementById(`dcAllowBotsOff`)?.addEventListener(`click`,()=>Re(!1)),document.getElementById(`dcAllowBotsOn`)?.addEventListener(`click`,()=>Re(!0)),document.getElementById(`dcMentionOff`)?.addEventListener(`click`,()=>Ve(!1)),document.getElementById(`dcMentionOn`)?.addEventListener(`click`,()=>Ve(!0)),document.getElementById(`dcToken`)?.addEventListener(`change`,qe),document.getElementById(`dcGuildId`)?.addEventListener(`change`,qe),document.getElementById(`dcChannelIds`)?.addEventListener(`change`,qe),document.getElementById(`fallbackOrderList`)?.addEventListener(`change`,He);function ti(e){let t=document.getElementById(`codexFastOn`),n=document.getElementById(`codexFastOff`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),v()}document.getElementById(`codexFastOn`)?.addEventListener(`click`,()=>ti(!0)),document.getElementById(`codexFastOff`)?.addEventListener(`click`,()=>ti(!1));function ni(e){let t=document.getElementById(`codexCtxOn`),n=document.getElementById(`codexCtxOff`),r=document.getElementById(`codexCtxValues`);t&&n&&(t.classList.toggle(`active`,e),n.classList.toggle(`active`,!e)),r&&(r.style.display=e?``:`none`),v()}document.getElementById(`codexCtxOn`)?.addEventListener(`click`,()=>ni(!0)),document.getElementById(`codexCtxOff`)?.addEventListener(`click`,()=>ni(!1)),document.getElementById(`codexCtxWindow`)?.addEventListener(`change`,v),document.getElementById(`codexCtxCompact`)?.addEventListener(`change`,v);function ri(e){let t=document.getElementById(`claude1mOn`),n=document.getElementById(`claude1mOff`),r=document.getElementById(`modelClaude`),i=e;if(r){let t=r.value||``;if(e&&!t.endsWith(`[1m]`)){let e=t+`[1m]`;Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!1}else if(!e&&t.endsWith(`[1m]`)){let e=t.replace(/\[1m\]$/,``);Array.from(r.options).some(t=>t.value===e)?r.value=e:i=!0}else i=t.endsWith(`[1m]`)}t&&n&&(t.classList.toggle(`active`,i),n.classList.toggle(`active`,!i)),v()}document.getElementById(`claude1mOn`)?.addEventListener(`click`,()=>ri(!0)),document.getElementById(`claude1mOff`)?.addEventListener(`click`,()=>ri(!1));function ii(e){return e.split(/[^a-zA-Z0-9]+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function ai(){for(let e of Fe()){let t=ii(e),n=document.getElementById(`model`+t);n&&n.addEventListener(`change`,function(){bt(e,this)});let r=document.getElementById(`customModel`+t);r&&r.addEventListener(`change`,function(){$e(e,this)});let i=document.getElementById(`effort`+t);i&&i.addEventListener(`change`,v)}document.getElementById(`providerAiE`)?.addEventListener(`change`,vt)}document.querySelector(`[data-action="openMcpModal"]`)?.addEventListener(`click`,Ge),document.querySelector(`[data-action="syncMcp"]`)?.addEventListener(`click`,Ke),document.querySelector(`[data-action="installMcp"]`)?.addEventListener(`click`,ct),Le(),document.querySelector(`[data-action="refreshCli"]`)?.addEventListener(`click`,()=>{it()?dt(!0):ut()}),document.getElementById(`cliStatusInterval`)?.addEventListener(`change`,function(){at(this.value)}),document.getElementById(`promptModal`)?.addEventListener(`click`,e=>y(e)),document.querySelector(`#promptModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closePrompt"]`)?.addEventListener(`click`,()=>y()),document.querySelector(`[data-action="cancelPrompt"]`)?.addEventListener(`click`,()=>y()),document.querySelector(`[data-action="savePrompt"]`)?.addEventListener(`click`,et),document.addEventListener(`keydown`,e=>{e.key===`Escape`&&!n.isRecording&&y()}),document.querySelector(`[data-action="openTemplates"]`)?.addEventListener(`click`,st),document.querySelector(`[data-action="saveTemplate"]`)?.addEventListener(`click`,pt),document.querySelector(`[data-action="closeTemplate"]`)?.addEventListener(`click`,()=>ft()),document.getElementById(`templateModal`)?.addEventListener(`click`,e=>ft(e)),document.querySelector(`#templateModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.getElementById(`templateBack`)?.addEventListener(`click`,gt),document.getElementById(`templateDevToggle`)?.addEventListener(`click`,nt),document.getElementById(`heartbeatModal`)?.addEventListener(`click`,e=>gn(e)),document.querySelector(`#heartbeatModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeHeartbeat"]`)?.addEventListener(`click`,()=>gn()),document.querySelector(`[data-action="addHeartbeat"]`)?.addEventListener(`click`,_n),document.getElementById(`hbJobsList`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-hb-toggle]`);if(t){yn(+(t.dataset.hbToggle||`0`));return}let n=e.target?.closest(`[data-hb-remove]`);if(n){vn(+(n.dataset.hbRemove||`0`));return}}),document.getElementById(`hbJobsList`)?.addEventListener(`change`,e=>{let t=e.target,r=t.closest(`[data-hb-name]`);if(r){n.heartbeatJobs[+(r.dataset.hbName||`0`)].name=t.value,T();return}let i=t.closest(`[data-hb-kind]`);if(i){let e=+(i.dataset.hbKind||`0`),r=n.heartbeatJobs[e]?.schedule,a=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule=t.value===`cron`?{kind:`cron`,cron:typeof r?.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...a?{timeZone:a}:{}}:{kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...a?{timeZone:a}:{}},w(),T();return}let a=t.closest(`[data-hb-minutes]`);if(a){let e=+(a.dataset.hbMinutes||`0`),r=n.heartbeatJobs[e]?.schedule,i=Math.max(1,Math.floor(Number(t.value)||5)),o=typeof r?.timeZone==`string`?r.timeZone:void 0;n.heartbeatJobs[e].schedule={kind:`every`,minutes:i,...o?{timeZone:o}:{}},w(),T();return}let o=t.closest(`[data-hb-cron]`);if(o){let e=+(o.dataset.hbCron||`0`),r=n.heartbeatJobs[e]?.schedule,i=typeof r?.timeZone==`string`?r.timeZone:void 0,a=t.value.trim().replace(/\s+/g,` `);n.heartbeatJobs[e].schedule={kind:`cron`,cron:a,...i?{timeZone:i}:{}},w(),T();return}let s=t.closest(`[data-hb-timezone]`);if(s){let e=+(s.dataset.hbTimezone||`0`),r=n.heartbeatJobs[e]?.schedule;r?.kind===`cron`?n.heartbeatJobs[e].schedule={kind:`cron`,cron:typeof r.cron==`string`&&r.cron.trim()?r.cron:`0 9 * * *`,...t.value.trim()?{timeZone:t.value.trim()}:{}}:n.heartbeatJobs[e].schedule={kind:`every`,minutes:typeof r?.minutes==`number`&&r.minutes>0?Math.floor(r.minutes):5,...t.value.trim()?{timeZone:t.value.trim()}:{}},w(),T();return}let c=t.closest(`[data-hb-prompt]`);if(c){n.heartbeatJobs[+(c.dataset.hbPrompt||`0`)].prompt=t.value,T();return}}),document.getElementById(`memoryModal`)?.addEventListener(`click`,e=>Lt(e)),document.querySelector(`#memoryModal .modal-box`)?.addEventListener(`click`,e=>e.stopPropagation()),document.querySelector(`[data-action="closeMemory"]`)?.addEventListener(`click`,()=>Lt()),document.getElementById(`memTabBtnSettings`)?.addEventListener(`click`,()=>Rt(`settings`)),document.getElementById(`memTabBtnAdvOps`)?.addEventListener(`click`,()=>Rt(`status`)),document.getElementById(`memTabBtnFiles`)?.addEventListener(`click`,()=>Rt(`files`)),document.getElementById(`memOn`)?.addEventListener(`click`,()=>At(!0)),document.getElementById(`memOff`)?.addEventListener(`click`,()=>At(!1)),document.getElementById(`memFlushEvery`)?.addEventListener(`change`,Et),document.getElementById(`memRetention`)?.addEventListener(`change`,Et),document.getElementById(`memFlushLang`)?.addEventListener(`change`,Et),document.getElementById(`memFlushNowBtn`)?.addEventListener(`click`,Ot),document.getElementById(`advBootstrapBtn`)?.addEventListener(`click`,It),document.getElementById(`advReindexBtn`)?.addEventListener(`click`,Nt),document.getElementById(`advReimportBtn`)?.addEventListener(`click`,It),document.getElementById(`advOpenCorruptedBtn`)?.addEventListener(`click`,Ft),document.getElementById(`advStatusBanner`)?.addEventListener(`click`,e=>{e.target?.id===`advUpgradeSoulBtn`&&Pt(),e.target?.id===`advSynthesizeSoulBtn`&&Dt()}),document.getElementById(`basicMemoryFiles`)?.addEventListener(`click`,e=>{let t=e.target?.closest(`[data-mem-delete]`);if(t){e.stopPropagation(),Mt(t.dataset.memDelete||``);return}let n=e.target?.closest(`[data-mem-view]`);if(n){jt(n.dataset.memView||``);return}if(e.target?.closest(`[data-mem-back]`)){kt();return}});async function oi(){ee(),De(),Mn(),zn(),await oe();let e=document.getElementById(`langSelect`);e&&(e.value=f()),await Ie(),ai(),_r(),Nr(),document.getElementById(`chatSearchTrigger`)?.addEventListener(`click`,Pr),Se(),ye(),tn(),en(),await ke(),await yt(),tt(),ot(),rt(),_t(),it()&&dt(),Te(),Kr(),bn(),Tt(),he(),await fe(),pe(),Gn();try{sessionStorage.removeItem(Wr)}catch{}ie(),`serviceWorker`in navigator&&!mt()&&navigator.serviceWorker.register(`/sw.js`).catch(()=>{})}oi().catch(e=>{console.error(`[bootstrap]`,e)}),document.addEventListener(`keydown`,e=>{(e.ctrlKey||e.metaKey)&&e.key===`f`&&(e.preventDefault(),e.stopPropagation(),Pr())},!0),document.addEventListener(`keydown`,e=>{if(e.key===`Escape`){if(document.getElementById(`chatSearch`)?.classList.contains(`open`)){e.preventDefault(),Z();return}if(n.isRecording){e.preventDefault(),ur();return}document.querySelectorAll(`.modal-overlay.open`).forEach(e=>{e.classList.remove(`open`)})}Qr(e)&&(e.preventDefault(),dr())}),document.getElementById(`mobileMenuLeft`)?.addEventListener(`click`,Ce),document.getElementById(`mobileMenuRight`)?.addEventListener(`click`,xe);
|