@intrect/openswarm 0.4.4 β 0.8.0
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 +46 -26
- package/config.example.yaml +22 -10
- package/dist/adapters/agenticLoop.d.ts +45 -2
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +209 -61
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/chatStream.d.ts +55 -0
- package/dist/adapters/chatStream.d.ts.map +1 -0
- package/dist/adapters/chatStream.js +116 -0
- package/dist/adapters/chatStream.js.map +1 -0
- package/dist/adapters/codex.d.ts +7 -0
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +67 -6
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexModels.d.ts +20 -0
- package/dist/adapters/codexModels.d.ts.map +1 -0
- package/dist/adapters/codexModels.js +195 -0
- package/dist/adapters/codexModels.js.map +1 -0
- package/dist/adapters/codexResponses.d.ts +97 -0
- package/dist/adapters/codexResponses.d.ts.map +1 -0
- package/dist/adapters/codexResponses.js +302 -0
- package/dist/adapters/codexResponses.js.map +1 -0
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +20 -120
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/index.d.ts +10 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +19 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/lmstudio.d.ts +8 -0
- package/dist/adapters/lmstudio.d.ts.map +1 -0
- package/dist/adapters/lmstudio.js +41 -0
- package/dist/adapters/lmstudio.js.map +1 -0
- package/dist/adapters/local.d.ts +16 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +51 -127
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts +37 -0
- package/dist/adapters/openrouter.d.ts.map +1 -0
- package/dist/adapters/openrouter.js +193 -0
- package/dist/adapters/openrouter.js.map +1 -0
- package/dist/adapters/resultParsing.d.ts +6 -0
- package/dist/adapters/resultParsing.d.ts.map +1 -0
- package/dist/adapters/resultParsing.js +139 -0
- package/dist/adapters/resultParsing.js.map +1 -0
- package/dist/adapters/tools.d.ts +21 -2
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +153 -12
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +40 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/webTools.d.ts +9 -0
- package/dist/adapters/webTools.d.ts.map +1 -0
- package/dist/adapters/webTools.js +195 -0
- package/dist/adapters/webTools.js.map +1 -0
- package/dist/agents/draftAnalyzer.d.ts +1 -1
- package/dist/agents/draftAnalyzer.d.ts.map +1 -1
- package/dist/agents/draftAnalyzer.js +3 -3
- package/dist/agents/draftAnalyzer.js.map +1 -1
- package/dist/agents/pairPipeline.d.ts +26 -1
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +184 -17
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/reflection.d.ts +56 -0
- package/dist/agents/reflection.d.ts.map +1 -0
- package/dist/agents/reflection.js +120 -0
- package/dist/agents/reflection.js.map +1 -0
- package/dist/agents/worker.d.ts +8 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +23 -2
- package/dist/agents/worker.js.map +1 -1
- package/dist/auth/index.d.ts +3 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/linearPkce.d.ts +22 -0
- package/dist/auth/linearPkce.d.ts.map +1 -0
- package/dist/auth/linearPkce.js +208 -0
- package/dist/auth/linearPkce.js.map +1 -0
- package/dist/auth/oauthPkce.d.ts +4 -3
- package/dist/auth/oauthPkce.d.ts.map +1 -1
- package/dist/auth/oauthPkce.js +39 -12
- package/dist/auth/oauthPkce.js.map +1 -1
- package/dist/auth/oauthStore.d.ts +11 -1
- package/dist/auth/oauthStore.d.ts.map +1 -1
- package/dist/auth/oauthStore.js +14 -2
- package/dist/auth/oauthStore.js.map +1 -1
- package/dist/auth/openrouterPkce.d.ts +29 -0
- package/dist/auth/openrouterPkce.d.ts.map +1 -0
- package/dist/auth/openrouterPkce.js +222 -0
- package/dist/auth/openrouterPkce.js.map +1 -0
- package/dist/automation/autonomousRunner.d.ts +17 -7
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +69 -70
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/backlogGrooming.d.ts +21 -0
- package/dist/automation/backlogGrooming.d.ts.map +1 -0
- package/dist/automation/backlogGrooming.js +80 -0
- package/dist/automation/backlogGrooming.js.map +1 -0
- package/dist/automation/localCI.d.ts +24 -0
- package/dist/automation/localCI.d.ts.map +1 -0
- package/dist/automation/localCI.js +84 -0
- package/dist/automation/localCI.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +33 -7
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +202 -154
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +5 -1
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/taskSource.d.ts +101 -0
- package/dist/automation/taskSource.d.ts.map +1 -0
- package/dist/automation/taskSource.js +136 -0
- package/dist/automation/taskSource.js.map +1 -0
- package/dist/automation/workerAuditLog.d.ts +29 -0
- package/dist/automation/workerAuditLog.d.ts.map +1 -0
- package/dist/automation/workerAuditLog.js +82 -0
- package/dist/automation/workerAuditLog.js.map +1 -0
- package/dist/cli/authHandler.d.ts +14 -5
- package/dist/cli/authHandler.d.ts.map +1 -1
- package/dist/cli/authHandler.js +131 -36
- package/dist/cli/authHandler.js.map +1 -1
- package/dist/cli/daemon.d.ts +5 -0
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +13 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctorHandler.d.ts +2 -0
- package/dist/cli/doctorHandler.d.ts.map +1 -0
- package/dist/cli/doctorHandler.js +114 -0
- package/dist/cli/doctorHandler.js.map +1 -0
- package/dist/cli/initWizard.d.ts +13 -0
- package/dist/cli/initWizard.d.ts.map +1 -0
- package/dist/cli/initWizard.js +314 -0
- package/dist/cli/initWizard.js.map +1 -0
- package/dist/cli.js +112 -38
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +89 -15
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +100 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/envFile.d.ts +6 -0
- package/dist/core/envFile.d.ts.map +1 -1
- package/dist/core/envFile.js +39 -1
- package/dist/core/envFile.js.map +1 -1
- package/dist/core/eventHub.d.ts +22 -0
- package/dist/core/eventHub.d.ts.map +1 -1
- package/dist/core/eventHub.js.map +1 -1
- package/dist/core/providerOverride.d.ts +6 -0
- package/dist/core/providerOverride.d.ts.map +1 -0
- package/dist/core/providerOverride.js +37 -0
- package/dist/core/providerOverride.js.map +1 -0
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +43 -20
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +16 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/discord/discordCore.d.ts.map +1 -1
- package/dist/discord/discordCore.js +16 -103
- package/dist/discord/discordCore.js.map +1 -1
- package/dist/discord/discordHandlers.d.ts.map +1 -1
- package/dist/discord/discordHandlers.js +15 -12
- package/dist/discord/discordHandlers.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/issues/sqliteStore.d.ts.map +1 -1
- package/dist/issues/sqliteStore.js +7 -2
- package/dist/issues/sqliteStore.js.map +1 -1
- package/dist/knowledge/scanner.d.ts.map +1 -1
- package/dist/knowledge/scanner.js +5 -0
- package/dist/knowledge/scanner.js.map +1 -1
- package/dist/linear/linear.d.ts +45 -2
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +154 -3
- package/dist/linear/linear.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +40 -20
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +39 -20
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/locale/types.d.ts +6 -0
- package/dist/locale/types.d.ts.map +1 -1
- package/dist/mcp/mcpClient.d.ts +27 -0
- package/dist/mcp/mcpClient.d.ts.map +1 -0
- package/dist/mcp/mcpClient.js +145 -0
- package/dist/mcp/mcpClient.js.map +1 -0
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +8 -2
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/memory/repoKnowledge.d.ts +33 -0
- package/dist/memory/repoKnowledge.d.ts.map +1 -0
- package/dist/memory/repoKnowledge.js +97 -0
- package/dist/memory/repoKnowledge.js.map +1 -0
- package/dist/notify/notifier.d.ts +26 -0
- package/dist/notify/notifier.d.ts.map +1 -0
- package/dist/notify/notifier.js +131 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/orchestration/conflictDetector.d.ts +5 -2
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +35 -6
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/decisionEngine.d.ts +20 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -1
- package/dist/orchestration/decisionEngine.js +45 -0
- package/dist/orchestration/decisionEngine.js.map +1 -1
- package/dist/support/banner.d.ts +7 -0
- package/dist/support/banner.d.ts.map +1 -0
- package/dist/support/banner.js +32 -0
- package/dist/support/banner.js.map +1 -0
- package/dist/support/chat.js +36 -27
- package/dist/support/chat.js.map +1 -1
- package/dist/support/chatBackend.d.ts +6 -0
- package/dist/support/chatBackend.d.ts.map +1 -1
- package/dist/support/chatBackend.js +105 -83
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatTui.d.ts.map +1 -1
- package/dist/support/chatTui.js +217 -27
- package/dist/support/chatTui.js.map +1 -1
- package/dist/support/colors.d.ts +15 -0
- package/dist/support/colors.d.ts.map +1 -0
- package/dist/support/colors.js +23 -0
- package/dist/support/colors.js.map +1 -0
- package/dist/support/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +318 -65
- package/dist/support/dashboardHtml.js.map +1 -1
- package/dist/support/planCommand.d.ts +17 -0
- package/dist/support/planCommand.d.ts.map +1 -0
- package/dist/support/planCommand.js +114 -0
- package/dist/support/planCommand.js.map +1 -0
- package/dist/support/planner.d.ts +9 -2
- package/dist/support/planner.d.ts.map +1 -1
- package/dist/support/planner.js +43 -111
- package/dist/support/planner.js.map +1 -1
- package/dist/support/projectMapper.d.ts.map +1 -1
- package/dist/support/projectMapper.js +29 -1
- package/dist/support/projectMapper.js.map +1 -1
- package/dist/support/promptHelper.d.ts +24 -0
- package/dist/support/promptHelper.d.ts.map +1 -0
- package/dist/support/promptHelper.js +94 -0
- package/dist/support/promptHelper.js.map +1 -0
- package/dist/support/rateLimiter.d.ts.map +1 -1
- package/dist/support/rateLimiter.js +6 -0
- package/dist/support/rateLimiter.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +51 -0
- package/dist/support/repoMetadata.d.ts.map +1 -0
- package/dist/support/repoMetadata.js +91 -0
- package/dist/support/repoMetadata.js.map +1 -0
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +196 -71
- package/dist/support/web.js.map +1 -1
- package/dist/support/worktreeManager.d.ts +6 -1
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +23 -1
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/taskState/store.d.ts +1 -0
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +22 -1
- package/dist/taskState/store.js.map +1 -1
- package/package.json +3 -1
|
@@ -6,37 +6,53 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
7
|
<title>OpenSwarm :: Supervisor</title>
|
|
8
8
|
<style>
|
|
9
|
+
/*
|
|
10
|
+
* Design tokens β adapted from VEGA (GitHub Dark inspired).
|
|
11
|
+
* Legacy variable names are preserved so the rest of the stylesheet keeps
|
|
12
|
+
* working unchanged; only the values shifted to a calmer, more readable
|
|
13
|
+
* palette while keeping the semantic intent (--green = primary action,
|
|
14
|
+
* --amber = warning, --red = destructive, --dim = secondary text).
|
|
15
|
+
*/
|
|
9
16
|
:root {
|
|
10
|
-
--bg: #
|
|
11
|
-
--bg2: #
|
|
12
|
-
--bg3: #
|
|
13
|
-
--green: #
|
|
14
|
-
--green-dim:
|
|
15
|
-
--green-mid: #
|
|
16
|
-
--green-lo: #
|
|
17
|
-
--cyan: #
|
|
18
|
-
--cyan-dim:
|
|
19
|
-
--amber: #
|
|
20
|
-
--red: #
|
|
21
|
-
--white: #
|
|
22
|
-
--dim: #
|
|
23
|
-
--border: #
|
|
24
|
-
--border2:
|
|
17
|
+
--bg: #0d1117; /* page background */
|
|
18
|
+
--bg2: #161b22; /* surface (cards, header) */
|
|
19
|
+
--bg3: #1c2128; /* surface raised (hover) */
|
|
20
|
+
--green: #58a6ff; /* primary accent (was matrix green) */
|
|
21
|
+
--green-dim: rgba(88, 166, 255, 0.12);
|
|
22
|
+
--green-mid: #58a6ff;
|
|
23
|
+
--green-lo: #30363d;
|
|
24
|
+
--cyan: #79c0ff;
|
|
25
|
+
--cyan-dim: rgba(121, 192, 255, 0.14);
|
|
26
|
+
--amber: #d29922;
|
|
27
|
+
--red: #f85149;
|
|
28
|
+
--white: #c9d1d9; /* primary text */
|
|
29
|
+
--dim: #8b949e; /* muted text */
|
|
30
|
+
--border: #30363d;
|
|
31
|
+
--border2: rgba(48, 54, 61, 0.55);
|
|
32
|
+
--radius-sm: 6px;
|
|
33
|
+
--radius-md: 8px;
|
|
34
|
+
--radius-lg: 12px;
|
|
25
35
|
}
|
|
26
36
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
27
37
|
html, body { height: 100%; overflow: hidden; }
|
|
28
38
|
body {
|
|
29
|
-
font-family:
|
|
39
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
|
|
30
40
|
background: var(--bg);
|
|
31
41
|
color: var(--white);
|
|
32
|
-
font-size:
|
|
33
|
-
line-height: 1.
|
|
42
|
+
font-size: 14px;
|
|
43
|
+
line-height: 1.5;
|
|
44
|
+
-webkit-font-smoothing: antialiased;
|
|
45
|
+
}
|
|
46
|
+
/* Monospace contexts (logs, paths, IDs) still use a mono stack */
|
|
47
|
+
code, pre, .mono, .log-line, .repo-item-path, .scan-path-row .path, .issue-id {
|
|
48
|
+
font-family: "SF Mono", "JetBrains Mono", "Fira Code", Consolas, monospace;
|
|
34
49
|
}
|
|
35
50
|
|
|
36
51
|
/* ===== SCROLLBAR ===== */
|
|
37
|
-
::-webkit-scrollbar { width:
|
|
38
|
-
::-webkit-scrollbar-track { background:
|
|
39
|
-
::-webkit-scrollbar-thumb { background: var(--
|
|
52
|
+
::-webkit-scrollbar { width: 8px; height: 8px; }
|
|
53
|
+
::-webkit-scrollbar-track { background: transparent; }
|
|
54
|
+
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
|
|
55
|
+
::-webkit-scrollbar-thumb:hover { background: var(--dim); }
|
|
40
56
|
|
|
41
57
|
/* ===== HEADER ===== */
|
|
42
58
|
header {
|
|
@@ -70,17 +86,21 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
70
86
|
#sse-status.disconnected { border-color: var(--red); color: var(--red); }
|
|
71
87
|
.btn {
|
|
72
88
|
font-family: inherit;
|
|
73
|
-
font-size:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
font-size: 11px;
|
|
90
|
+
font-weight: 500;
|
|
91
|
+
padding: 4px 12px;
|
|
92
|
+
background: var(--bg2);
|
|
93
|
+
border: 1px solid var(--border);
|
|
94
|
+
border-radius: var(--radius-sm);
|
|
95
|
+
color: var(--white);
|
|
78
96
|
cursor: pointer;
|
|
79
|
-
letter-spacing: 0.
|
|
80
|
-
transition:
|
|
97
|
+
letter-spacing: 0.04em;
|
|
98
|
+
transition: border-color 0.15s, background 0.15s, color 0.15s;
|
|
81
99
|
}
|
|
82
100
|
.btn:hover:not(:disabled) { border-color: var(--green); color: var(--green); background: var(--green-dim); }
|
|
83
101
|
.btn:disabled { opacity: 0.4; cursor: default; }
|
|
102
|
+
.btn.primary { background: var(--green); border-color: var(--green); color: #0d1117; font-weight: 600; }
|
|
103
|
+
.btn.primary:hover:not(:disabled) { opacity: 0.88; background: var(--green); color: #0d1117; }
|
|
84
104
|
.btn-active { border-color: var(--amber); color: var(--amber); }
|
|
85
105
|
.btn-active:hover:not(:disabled) { background: #332200; border-color: var(--amber); }
|
|
86
106
|
.btn-danger { border-color: #551111; color: var(--red); }
|
|
@@ -312,22 +332,58 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
312
332
|
.proc-kill:hover { background: #220000; border-color: var(--red); }
|
|
313
333
|
|
|
314
334
|
/* ===== PIPELINE ===== */
|
|
335
|
+
.stage-block {
|
|
336
|
+
border-bottom: 1px solid var(--border2);
|
|
337
|
+
}
|
|
315
338
|
.stage-row {
|
|
316
339
|
display: flex; align-items: center; gap: 6px;
|
|
317
|
-
padding:
|
|
340
|
+
padding: 4px 8px;
|
|
318
341
|
font-size: 11px;
|
|
342
|
+
cursor: pointer;
|
|
343
|
+
transition: background 0.12s;
|
|
344
|
+
}
|
|
345
|
+
.stage-row:hover { background: var(--bg3); }
|
|
346
|
+
.stage-row.has-details::after {
|
|
347
|
+
content: "βΊ"; color: var(--dim); margin-left: 4px;
|
|
348
|
+
transition: transform 0.15s;
|
|
349
|
+
}
|
|
350
|
+
.stage-block.expanded .stage-row.has-details::after {
|
|
351
|
+
transform: rotate(90deg); display: inline-block;
|
|
319
352
|
}
|
|
320
353
|
.sdot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; background: var(--dim); }
|
|
321
354
|
.sdot.start { background: var(--amber); }
|
|
322
355
|
.sdot.complete { background: var(--green); }
|
|
323
356
|
.sdot.fail { background: var(--red); }
|
|
324
357
|
.sname { color: var(--white); min-width: 70px; }
|
|
325
|
-
.srepo { color: var(--
|
|
358
|
+
.srepo { color: var(--dim); font-size: 10px; min-width: 50px; max-width: 90px; flex-shrink: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
326
359
|
.stask { color: var(--cyan); font-size: 10px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
360
|
+
.ssummary {
|
|
361
|
+
color: var(--white); font-size: 11px; flex: 2;
|
|
362
|
+
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
363
|
+
opacity: 0.85;
|
|
364
|
+
}
|
|
327
365
|
.selapsed { color: var(--amber); font-size: 9px; flex-shrink: 0; min-width: 36px; text-align: right; }
|
|
328
366
|
.smodel { color: var(--dim); font-size: 9px; flex-shrink: 0; min-width: 56px; text-align: right; }
|
|
329
367
|
.stokens { color: var(--amber); font-size: 9px; flex-shrink: 0; min-width: 80px; text-align: right; white-space: nowrap; }
|
|
330
|
-
.sstatus {
|
|
368
|
+
.sstatus { font-size: 9px; color: var(--dim); text-transform: uppercase; letter-spacing: 0.06em; flex-shrink: 0; }
|
|
369
|
+
/* Expanded details */
|
|
370
|
+
.stage-details {
|
|
371
|
+
display: none;
|
|
372
|
+
padding: 8px 14px 10px 22px;
|
|
373
|
+
background: rgba(0,0,0,0.18);
|
|
374
|
+
font-size: 11px;
|
|
375
|
+
color: var(--white);
|
|
376
|
+
border-top: 1px dashed var(--border2);
|
|
377
|
+
}
|
|
378
|
+
.stage-block.expanded .stage-details { display: block; }
|
|
379
|
+
.stage-details .sd-line { display: flex; gap: 8px; padding: 1px 0; align-items: baseline; }
|
|
380
|
+
.stage-details .sd-key { color: var(--dim); font-size: 10px; min-width: 70px; text-transform: uppercase; letter-spacing: 0.06em; }
|
|
381
|
+
.stage-details .sd-val { color: var(--white); font-size: 11px; flex: 1; word-break: break-all; }
|
|
382
|
+
.stage-details ul { margin: 2px 0 4px 14px; padding: 0; }
|
|
383
|
+
.stage-details li { font-family: "SF Mono", "JetBrains Mono", monospace; font-size: 10px; color: var(--cyan); padding: 1px 0; }
|
|
384
|
+
.sd-decision-approve { color: var(--green); font-weight: 600; }
|
|
385
|
+
.sd-decision-revise { color: var(--amber); font-weight: 600; }
|
|
386
|
+
.sd-decision-reject { color: var(--red); font-weight: 600; }
|
|
331
387
|
|
|
332
388
|
/* ===== LOG TAB BAR ===== */
|
|
333
389
|
.log-tab-bar {
|
|
@@ -632,31 +688,55 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
632
688
|
</div>
|
|
633
689
|
|
|
634
690
|
<!-- REPO PICKER OVERLAY -->
|
|
635
|
-
<div id="repo-picker" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.
|
|
636
|
-
<div style="background
|
|
637
|
-
<div style="padding:
|
|
638
|
-
<span style="color
|
|
639
|
-
<button onclick="closeRepoPicker()" style="margin-left:auto;background:transparent;border:none;color
|
|
691
|
+
<div id="repo-picker" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.65);backdrop-filter:blur(4px);z-index:100;align-items:center;justify-content:center">
|
|
692
|
+
<div style="background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius-lg);width:560px;max-height:75vh;display:flex;flex-direction:column;box-shadow:0 10px 32px rgba(0,0,0,0.5)">
|
|
693
|
+
<div style="padding:14px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px">
|
|
694
|
+
<span style="color:var(--white);font-size:13px;font-weight:600;letter-spacing:.04em">Add repository</span>
|
|
695
|
+
<button onclick="closeRepoPicker()" style="margin-left:auto;background:transparent;border:none;color:var(--dim);cursor:pointer;font-size:18px;line-height:1;padding:0 4px;border-radius:4px" onmouseover="this.style.color='var(--white)'" onmouseout="this.style.color='var(--dim)'">β</button>
|
|
640
696
|
</div>
|
|
641
|
-
<div style="padding:
|
|
642
|
-
<input id="repo-search" type="text" placeholder="
|
|
643
|
-
style="width:100%;background:
|
|
697
|
+
<div style="padding:10px 18px;border-bottom:1px solid var(--border2)">
|
|
698
|
+
<input id="repo-search" type="text" placeholder="Filter repositoriesβ¦"
|
|
699
|
+
style="width:100%;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);outline:none;font-family:inherit;font-size:13px;color:var(--white);padding:7px 10px;caret-color:var(--green)"
|
|
644
700
|
oninput="filterRepos(this.value)" onkeydown="if(event.key==='Escape')closeRepoPicker()">
|
|
645
701
|
</div>
|
|
646
|
-
<div id="repo-picker-list" style="overflow-y:auto;flex:1;padding:
|
|
647
|
-
<div id="scan-paths-section" style="border-top:1px solid
|
|
648
|
-
<div style="color
|
|
702
|
+
<div id="repo-picker-list" style="overflow-y:auto;flex:1;padding:6px 0"></div>
|
|
703
|
+
<div id="scan-paths-section" style="border-top:1px solid var(--border);padding:12px 18px;background:rgba(13,17,23,0.4)">
|
|
704
|
+
<div style="color:var(--dim);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:8px">Scan paths</div>
|
|
649
705
|
<div id="scan-paths-list"></div>
|
|
650
|
-
<div style="display:flex;gap:
|
|
651
|
-
<
|
|
652
|
-
|
|
706
|
+
<div style="display:flex;gap:6px;margin-top:10px">
|
|
707
|
+
<button class="btn" style="flex:1;justify-content:center" onclick="openFolderBrowser()">π Browse for folderβ¦</button>
|
|
708
|
+
<button class="btn" style="font-size:11px" onclick="toggleManualPathInput()" title="Type a path manually">β¨</button>
|
|
709
|
+
</div>
|
|
710
|
+
<div id="manual-path-row" style="display:none;gap:6px;margin-top:6px">
|
|
711
|
+
<input id="scan-path-input" type="text" placeholder="/absolute/path/to/scan"
|
|
712
|
+
style="flex:1;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);outline:none;font-family:inherit;font-size:12px;color:var(--white);padding:5px 8px;caret-color:var(--green)"
|
|
653
713
|
onkeydown="if(event.key==='Enter')addScanPath()">
|
|
654
|
-
<button class="btn" style="font-size:
|
|
714
|
+
<button class="btn primary" style="font-size:11px" onclick="addScanPath()">Add</button>
|
|
655
715
|
</div>
|
|
656
716
|
</div>
|
|
657
717
|
</div>
|
|
658
718
|
</div>
|
|
659
719
|
|
|
720
|
+
<!-- FOLDER BROWSER OVERLAY (native-style picker, server-side fs) -->
|
|
721
|
+
<div id="folder-browser" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,0.65);backdrop-filter:blur(4px);z-index:110;align-items:center;justify-content:center">
|
|
722
|
+
<div style="background:var(--bg2);border:1px solid var(--border);border-radius:var(--radius-lg);width:620px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 10px 32px rgba(0,0,0,0.5)">
|
|
723
|
+
<div style="padding:14px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px">
|
|
724
|
+
<span style="color:var(--white);font-size:13px;font-weight:600;letter-spacing:.04em">Choose folder to scan</span>
|
|
725
|
+
<button onclick="closeFolderBrowser()" style="margin-left:auto;background:transparent;border:none;color:var(--dim);cursor:pointer;font-size:18px;line-height:1;padding:0 4px;border-radius:4px" onmouseover="this.style.color='var(--white)'" onmouseout="this.style.color='var(--dim)'">β</button>
|
|
726
|
+
</div>
|
|
727
|
+
<div style="padding:10px 18px;border-bottom:1px solid var(--border2);display:flex;align-items:center;gap:6px">
|
|
728
|
+
<button class="btn" id="fb-up" style="font-size:11px;padding:3px 10px" onclick="folderBrowserUp()" title="Parent directory">β Up</button>
|
|
729
|
+
<input id="fb-path" type="text" readonly
|
|
730
|
+
style="flex:1;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-sm);outline:none;font-family:'SF Mono',monospace;font-size:12px;color:var(--white);padding:5px 10px">
|
|
731
|
+
</div>
|
|
732
|
+
<div id="fb-list" style="overflow-y:auto;flex:1;padding:4px 0"></div>
|
|
733
|
+
<div style="padding:12px 18px;border-top:1px solid var(--border);display:flex;gap:8px;justify-content:flex-end">
|
|
734
|
+
<button class="btn" onclick="closeFolderBrowser()">Cancel</button>
|
|
735
|
+
<button class="btn primary" id="fb-select" onclick="folderBrowserSelect()">Select this folder</button>
|
|
736
|
+
</div>
|
|
737
|
+
</div>
|
|
738
|
+
</div>
|
|
739
|
+
|
|
660
740
|
<!-- MIDDLE: PIPELINE + LOG -->
|
|
661
741
|
<div class="col">
|
|
662
742
|
<div class="panel" style="flex: 0 0 38%">
|
|
@@ -1384,9 +1464,13 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
1384
1464
|
}
|
|
1385
1465
|
function shortModel(name) {
|
|
1386
1466
|
if (!name) return "";
|
|
1467
|
+
// Order matters: most specific suffix first so 'sonnet-4-6' isn't
|
|
1468
|
+
// captured by the generic 'sonnet-4' fallback below.
|
|
1469
|
+
if (name.includes("opus-4-7")) return "opus-4.7";
|
|
1470
|
+
if (name.includes("opus-4-6")) return "opus-4.6";
|
|
1471
|
+
if (name.includes("sonnet-4-6")) return "sonnet-4.6";
|
|
1387
1472
|
if (name.includes("sonnet-4-5")) return "sonnet-4.5";
|
|
1388
1473
|
if (name.includes("haiku-4-5")) return "haiku-4.5";
|
|
1389
|
-
if (name.includes("opus-4-6")) return "opus-4.6";
|
|
1390
1474
|
if (name.includes("opus-4")) return "opus-4";
|
|
1391
1475
|
if (name.includes("sonnet-4")) return "sonnet-4";
|
|
1392
1476
|
var parts = name.split("-");
|
|
@@ -1398,12 +1482,73 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
1398
1482
|
if (n >= 1000) return (n / 1000).toFixed(1) + "k";
|
|
1399
1483
|
return String(n);
|
|
1400
1484
|
}
|
|
1485
|
+
function buildStageDetails(r) {
|
|
1486
|
+
// Builds the expanded "what did the worker actually do" panel for
|
|
1487
|
+
// a pipeline:stage payload. Returns "" when there's nothing to show.
|
|
1488
|
+
const lines = [];
|
|
1489
|
+
function addLine(key, valHtml) {
|
|
1490
|
+
lines.push(
|
|
1491
|
+
"<div class=\\"sd-line\\"><div class=\\"sd-key\\">" + escapeHtml(key) + "</div>" +
|
|
1492
|
+
"<div class=\\"sd-val\\">" + valHtml + "</div></div>"
|
|
1493
|
+
);
|
|
1494
|
+
}
|
|
1495
|
+
function addList(key, items) {
|
|
1496
|
+
const ul = items.map(function(s) { return "<li>" + escapeHtml(String(s)) + "</li>"; }).join("");
|
|
1497
|
+
lines.push(
|
|
1498
|
+
"<div class=\\"sd-line\\"><div class=\\"sd-key\\">" + escapeHtml(key) + "</div>" +
|
|
1499
|
+
"<div class=\\"sd-val\\"><ul>" + ul + "</ul></div></div>"
|
|
1500
|
+
);
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
if (r.summary) addLine("Summary", escapeHtml(r.summary));
|
|
1504
|
+
if (r.decision) {
|
|
1505
|
+
const cls = "sd-decision-" + r.decision;
|
|
1506
|
+
addLine("Decision", "<span class=\\"" + cls + "\\">" + escapeHtml(r.decision.toUpperCase()) + "</span>");
|
|
1507
|
+
}
|
|
1508
|
+
if (r.feedback) addLine("Feedback", escapeHtml(r.feedback));
|
|
1509
|
+
if (Array.isArray(r.filesChanged) && r.filesChanged.length > 0) {
|
|
1510
|
+
const label = "Files (" + (r.filesChangedCount || r.filesChanged.length) + ")";
|
|
1511
|
+
addList(label, r.filesChanged);
|
|
1512
|
+
}
|
|
1513
|
+
if (Array.isArray(r.commands) && r.commands.length > 0) {
|
|
1514
|
+
const label = "Commands (" + (r.commandsCount || r.commands.length) + ")";
|
|
1515
|
+
addList(label, r.commands);
|
|
1516
|
+
}
|
|
1517
|
+
if (Array.isArray(r.issues) && r.issues.length > 0) {
|
|
1518
|
+
const label = "Issues (" + (r.issuesCount || r.issues.length) + ")";
|
|
1519
|
+
addList(label, r.issues);
|
|
1520
|
+
}
|
|
1521
|
+
if (Array.isArray(r.failedTests) && r.failedTests.length > 0) {
|
|
1522
|
+
addList("Failed tests", r.failedTests);
|
|
1523
|
+
}
|
|
1524
|
+
if (r.passed != null || r.failed != null) {
|
|
1525
|
+
addLine("Tests", escapeHtml((r.passed || 0) + " passed, " + (r.failed || 0) + " failed" + (r.coverage != null ? " β coverage " + r.coverage + "%" : "")));
|
|
1526
|
+
}
|
|
1527
|
+
if (r.confidencePercent != null) addLine("Confidence", escapeHtml(r.confidencePercent + "%"));
|
|
1528
|
+
if (r.haltReason) addLine("Halt", escapeHtml(r.haltReason));
|
|
1529
|
+
if (r.bsScore != null) addLine("BS score", escapeHtml(String(r.bsScore)));
|
|
1530
|
+
if (r.criticalCount || r.warningCount) {
|
|
1531
|
+
addLine("Audit", escapeHtml((r.criticalCount || 0) + " critical, " + (r.warningCount || 0) + " warnings"));
|
|
1532
|
+
}
|
|
1533
|
+
if (r.changelogEntry) addLine("Changelog", escapeHtml(r.changelogEntry));
|
|
1534
|
+
if (r.durationMs != null) addLine("Duration", escapeHtml((r.durationMs / 1000).toFixed(1) + "s"));
|
|
1535
|
+
if (r.error) {
|
|
1536
|
+
addLine("Error", "<span style=\\"color:var(--red)\\">" + escapeHtml(r.error) + "</span>");
|
|
1537
|
+
}
|
|
1538
|
+
return lines.join("");
|
|
1539
|
+
}
|
|
1540
|
+
|
|
1541
|
+
function toggleStageDetails(idx) {
|
|
1542
|
+
const block = document.querySelector("[data-stage-idx=\\"" + idx + "\\"]");
|
|
1543
|
+
if (block) block.classList.toggle("expanded");
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1401
1546
|
function renderStages() {
|
|
1402
1547
|
const el = document.getElementById("stage-list");
|
|
1403
1548
|
const cnt = document.getElementById("stage-count");
|
|
1404
1549
|
if (!stageRows.length) { el.innerHTML = "<div class=\\"empty\\">no pipeline events</div>"; return; }
|
|
1405
1550
|
if (cnt) cnt.textContent = stageRows.length + "/" + MAX_STAGE;
|
|
1406
|
-
el.innerHTML = stageRows.slice().reverse().map(r => {
|
|
1551
|
+
el.innerHTML = stageRows.slice().reverse().map((r, i) => {
|
|
1407
1552
|
const info = r.taskId ? taskTitleMap.get(r.taskId) : null;
|
|
1408
1553
|
let taskLabel = "";
|
|
1409
1554
|
if (info) {
|
|
@@ -1413,10 +1558,8 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
1413
1558
|
} else if (r.taskId) {
|
|
1414
1559
|
taskLabel = r.taskId.slice(0, 8);
|
|
1415
1560
|
}
|
|
1416
|
-
// repo name from projectPath
|
|
1417
1561
|
const projPath = r.taskId ? taskProjectMap.get(r.taskId) : null;
|
|
1418
1562
|
const repoName = projPath ? projPath.split("/").pop() : "";
|
|
1419
|
-
// elapsed time
|
|
1420
1563
|
const startTs = r.taskId ? taskStartMap.get(r.taskId) : null;
|
|
1421
1564
|
let elapsed = "";
|
|
1422
1565
|
if (startTs) {
|
|
@@ -1425,23 +1568,48 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
1425
1568
|
else if (sec < 3600) elapsed = Math.floor(sec / 60) + "m" + (sec % 60) + "s";
|
|
1426
1569
|
else elapsed = Math.floor(sec / 3600) + "h" + Math.floor((sec % 3600) / 60) + "m";
|
|
1427
1570
|
}
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
var tokenStr = "";
|
|
1571
|
+
const modelStr = r.model ? shortModel(r.model) : "";
|
|
1572
|
+
let tokenStr = "";
|
|
1431
1573
|
if (r.inputTokens || r.outputTokens) {
|
|
1432
1574
|
tokenStr = fmtTokens(r.inputTokens) + "/" + fmtTokens(r.outputTokens);
|
|
1433
1575
|
if (r.costUsd != null) tokenStr += " $" + r.costUsd.toFixed(2);
|
|
1434
1576
|
}
|
|
1577
|
+
|
|
1578
|
+
// Inline summary on the row itself, so the user sees *what* happened
|
|
1579
|
+
// without having to expand.
|
|
1580
|
+
let inlineSummary = "";
|
|
1581
|
+
if (r.decision) {
|
|
1582
|
+
const cls = "sd-decision-" + r.decision;
|
|
1583
|
+
inlineSummary = "<span class=\\"" + cls + "\\">" + escapeHtml(r.decision.toUpperCase()) + "</span>" +
|
|
1584
|
+
(r.feedback ? " Β· " + escapeHtml(r.feedback.slice(0, 80)) : "");
|
|
1585
|
+
} else if (r.summary) {
|
|
1586
|
+
inlineSummary = escapeHtml(r.summary);
|
|
1587
|
+
if (r.filesChangedCount > 0) inlineSummary += " Β· " + r.filesChangedCount + " files";
|
|
1588
|
+
} else if (r.passed != null || r.failed != null) {
|
|
1589
|
+
inlineSummary = "β " + (r.passed || 0) + " β " + (r.failed || 0);
|
|
1590
|
+
} else if (r.error) {
|
|
1591
|
+
inlineSummary = "<span style=\\"color:var(--red)\\">" + escapeHtml(r.error.slice(0, 120)) + "</span>";
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
const detailsHtml = buildStageDetails(r);
|
|
1595
|
+
const hasDetails = detailsHtml.length > 0;
|
|
1596
|
+
const rowClass = "stage-row" + (hasDetails ? " has-details" : "");
|
|
1597
|
+
const onclick = hasDetails ? " onclick=\\"toggleStageDetails(" + i + ")\\"" : "";
|
|
1598
|
+
|
|
1435
1599
|
return (
|
|
1436
|
-
"<div class=\\"stage-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1600
|
+
"<div class=\\"stage-block\\" data-stage-idx=\\"" + i + "\\">" +
|
|
1601
|
+
"<div class=\\"" + rowClass + "\\"" + onclick + ">" +
|
|
1602
|
+
"<div class=\\"sdot " + (r.status || "") + "\\"></div>" +
|
|
1603
|
+
"<div class=\\"srepo\\">" + escapeHtml(repoName) + "</div>" +
|
|
1604
|
+
"<div class=\\"sname\\">" + escapeHtml(r.stage) + "</div>" +
|
|
1605
|
+
"<div class=\\"stask\\" title=\\"" + escapeAttr(r.taskId || "") + "\\">" + escapeHtml(taskLabel) + "</div>" +
|
|
1606
|
+
"<div class=\\"ssummary\\">" + inlineSummary + "</div>" +
|
|
1607
|
+
"<div class=\\"smodel\\">" + escapeHtml(modelStr) + "</div>" +
|
|
1608
|
+
"<div class=\\"stokens\\">" + escapeHtml(tokenStr) + "</div>" +
|
|
1609
|
+
"<div class=\\"selapsed\\">" + elapsed + "</div>" +
|
|
1610
|
+
"<div class=\\"sstatus\\">" + (r.status || "") + "</div>" +
|
|
1611
|
+
"</div>" +
|
|
1612
|
+
(hasDetails ? "<div class=\\"stage-details\\">" + detailsHtml + "</div>" : "") +
|
|
1445
1613
|
"</div>"
|
|
1446
1614
|
);
|
|
1447
1615
|
}).join("");
|
|
@@ -1786,11 +1954,11 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
1786
1954
|
list.innerHTML = rows.length > 0 ? rows.join("") : "<div style=\\"color:#334433;font-size:10px\\">no scan paths configured</div>";
|
|
1787
1955
|
}
|
|
1788
1956
|
|
|
1789
|
-
async function addScanPath() {
|
|
1957
|
+
async function addScanPath(explicitPath) {
|
|
1790
1958
|
const input = document.getElementById("scan-path-input");
|
|
1791
|
-
const path = input.value.trim();
|
|
1959
|
+
const path = (explicitPath ?? input.value).trim();
|
|
1792
1960
|
if (!path) return;
|
|
1793
|
-
input.value = "";
|
|
1961
|
+
if (!explicitPath) input.value = "";
|
|
1794
1962
|
try {
|
|
1795
1963
|
await fetch("/api/scan-paths", {
|
|
1796
1964
|
method: "POST",
|
|
@@ -1807,6 +1975,91 @@ const DASHBOARD_HTML = `<!DOCTYPE html>
|
|
|
1807
1975
|
}
|
|
1808
1976
|
}
|
|
1809
1977
|
|
|
1978
|
+
function toggleManualPathInput() {
|
|
1979
|
+
const row = document.getElementById("manual-path-row");
|
|
1980
|
+
if (!row) return;
|
|
1981
|
+
if (row.style.display === "none" || row.style.display === "") {
|
|
1982
|
+
row.style.display = "flex";
|
|
1983
|
+
const input = document.getElementById("scan-path-input");
|
|
1984
|
+
if (input) input.focus();
|
|
1985
|
+
} else {
|
|
1986
|
+
row.style.display = "none";
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
// ---- Folder Browser (native-style picker via /api/fs/list) ----
|
|
1991
|
+
var folderBrowserCurrent = null;
|
|
1992
|
+
var folderBrowserParent = null;
|
|
1993
|
+
|
|
1994
|
+
async function openFolderBrowser(startPath) {
|
|
1995
|
+
const modal = document.getElementById("folder-browser");
|
|
1996
|
+
if (!modal) return;
|
|
1997
|
+
modal.style.display = "flex";
|
|
1998
|
+
await loadFolderBrowser(startPath || "~/dev");
|
|
1999
|
+
}
|
|
2000
|
+
|
|
2001
|
+
function closeFolderBrowser() {
|
|
2002
|
+
const modal = document.getElementById("folder-browser");
|
|
2003
|
+
if (modal) modal.style.display = "none";
|
|
2004
|
+
}
|
|
2005
|
+
|
|
2006
|
+
async function loadFolderBrowser(path) {
|
|
2007
|
+
const list = document.getElementById("fb-list");
|
|
2008
|
+
const pathEl = document.getElementById("fb-path");
|
|
2009
|
+
const upBtn = document.getElementById("fb-up");
|
|
2010
|
+
const selectBtn = document.getElementById("fb-select");
|
|
2011
|
+
if (!list || !pathEl) return;
|
|
2012
|
+
list.innerHTML = "<div style=\\"padding:18px;color:var(--dim);font-size:12px;text-align:center\\">Loadingβ¦</div>";
|
|
2013
|
+
try {
|
|
2014
|
+
const res = await fetch("/api/fs/list?path=" + encodeURIComponent(path));
|
|
2015
|
+
if (!res.ok) {
|
|
2016
|
+
const err = await res.json().catch(() => ({}));
|
|
2017
|
+
list.innerHTML = "<div style=\\"padding:18px;color:var(--red);font-size:12px;text-align:center\\">" + escapeHtml(err.error || ("HTTP " + res.status)) + "</div>";
|
|
2018
|
+
return;
|
|
2019
|
+
}
|
|
2020
|
+
const data = await res.json();
|
|
2021
|
+
folderBrowserCurrent = data.path;
|
|
2022
|
+
folderBrowserParent = data.parent;
|
|
2023
|
+
pathEl.value = data.path;
|
|
2024
|
+
if (upBtn) upBtn.disabled = !data.parent;
|
|
2025
|
+
if (selectBtn) selectBtn.textContent = "Select \\"" + (data.name || data.path) + "\\"";
|
|
2026
|
+
|
|
2027
|
+
const dirs = (data.entries || []).filter(function(e) { return e.isDir; });
|
|
2028
|
+
if (dirs.length === 0) {
|
|
2029
|
+
list.innerHTML = "<div style=\\"padding:18px;color:var(--dim);font-size:12px;text-align:center\\">No subfolders</div>";
|
|
2030
|
+
return;
|
|
2031
|
+
}
|
|
2032
|
+
list.innerHTML = dirs.map(function(e) {
|
|
2033
|
+
return "<div class=\\"fb-row\\" data-name=\\"" + escapeAttr(e.name) + "\\" onclick=\\"folderBrowserEnter(this.getAttribute('data-name'))\\"" +
|
|
2034
|
+
" style=\\"padding:7px 18px;cursor:pointer;font-size:13px;color:var(--white);display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--border2);transition:background .12s\\"" +
|
|
2035
|
+
" onmouseover=\\"this.style.background='var(--bg3)'\\" onmouseout=\\"this.style.background=''\\">" +
|
|
2036
|
+
"<span style=\\"color:var(--green)\\">π</span>" +
|
|
2037
|
+
"<span>" + escapeHtml(e.name) + "</span>" +
|
|
2038
|
+
"</div>";
|
|
2039
|
+
}).join("");
|
|
2040
|
+
} catch (e) {
|
|
2041
|
+
list.innerHTML = "<div style=\\"padding:18px;color:var(--red);font-size:12px;text-align:center\\">" + escapeHtml(String(e)) + "</div>";
|
|
2042
|
+
}
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
function folderBrowserEnter(name) {
|
|
2046
|
+
if (!folderBrowserCurrent || !name) return;
|
|
2047
|
+
// Join via the server side by sending the absolute path of the child
|
|
2048
|
+
const sep = folderBrowserCurrent.endsWith("/") ? "" : "/";
|
|
2049
|
+
loadFolderBrowser(folderBrowserCurrent + sep + name);
|
|
2050
|
+
}
|
|
2051
|
+
|
|
2052
|
+
function folderBrowserUp() {
|
|
2053
|
+
if (folderBrowserParent) loadFolderBrowser(folderBrowserParent);
|
|
2054
|
+
}
|
|
2055
|
+
|
|
2056
|
+
async function folderBrowserSelect() {
|
|
2057
|
+
if (!folderBrowserCurrent) return;
|
|
2058
|
+
const picked = folderBrowserCurrent;
|
|
2059
|
+
closeFolderBrowser();
|
|
2060
|
+
await addScanPath(picked);
|
|
2061
|
+
}
|
|
2062
|
+
|
|
1810
2063
|
async function removeScanPath(path) {
|
|
1811
2064
|
try {
|
|
1812
2065
|
await fetch("/api/scan-paths/" + encodeURIComponent(path), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardHtml.js","sourceRoot":"","sources":["../../src/support/dashboardHtml.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"dashboardHtml.js","sourceRoot":"","sources":["../../src/support/dashboardHtml.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAgxEf,CAAC;AAGT,OAAO,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface PlanIO {
|
|
2
|
+
/** Print one line to the surface (chatLog / stdout). */
|
|
3
|
+
print(line: string): void;
|
|
4
|
+
/** Ask the user to approve the plan. Returns the chosen action. */
|
|
5
|
+
confirm(prompt: string): Promise<'yes' | 'no' | 'edit'>;
|
|
6
|
+
/** Optional free-text prompt β used by 'edit' to drop sub-tasks. If absent, 'edit' cancels. */
|
|
7
|
+
promptText?(prompt: string): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
export interface PlanCommandOptions {
|
|
10
|
+
projectPath?: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Run the `/plan <goal>` flow: plan β render β approve/edit β dispatch.
|
|
15
|
+
*/
|
|
16
|
+
export declare function runPlanCommand(goal: string, io: PlanIO, opts?: PlanCommandOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=planCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planCommand.d.ts","sourceRoot":"","sources":["../../src/support/planCommand.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,MAAM;IACrB,wDAAwD;IACxD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mEAAmE;IACnE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;IACxD,+FAA+F;IAC/F,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqEf"}
|