@doriandev/devcc 0.1.2
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/LICENSE +15 -0
- package/README.md +659 -0
- package/bin/devcc.mjs +66 -0
- package/dist/devcc/app/App.d.ts +178 -0
- package/dist/devcc/app/App.d.ts.map +1 -0
- package/dist/devcc/app/App.js +1255 -0
- package/dist/devcc/app/App.js.map +1 -0
- package/dist/devcc/app/builtinCommands.d.ts +17 -0
- package/dist/devcc/app/builtinCommands.d.ts.map +1 -0
- package/dist/devcc/app/builtinCommands.js +389 -0
- package/dist/devcc/app/builtinCommands.js.map +1 -0
- package/dist/devcc/app/keymap.d.ts +21 -0
- package/dist/devcc/app/keymap.d.ts.map +1 -0
- package/dist/devcc/app/keymap.js +162 -0
- package/dist/devcc/app/keymap.js.map +1 -0
- package/dist/devcc/app/theme.d.ts +49 -0
- package/dist/devcc/app/theme.d.ts.map +1 -0
- package/dist/devcc/app/theme.js +68 -0
- package/dist/devcc/app/theme.js.map +1 -0
- package/dist/devcc/cli.d.ts +3 -0
- package/dist/devcc/cli.d.ts.map +1 -0
- package/dist/devcc/cli.js +113 -0
- package/dist/devcc/cli.js.map +1 -0
- package/dist/devcc/components/CommandPalette.d.ts +26 -0
- package/dist/devcc/components/CommandPalette.d.ts.map +1 -0
- package/dist/devcc/components/CommandPalette.js +113 -0
- package/dist/devcc/components/CommandPalette.js.map +1 -0
- package/dist/devcc/components/ConfirmDialog.d.ts +31 -0
- package/dist/devcc/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/devcc/components/ConfirmDialog.js +147 -0
- package/dist/devcc/components/ConfirmDialog.js.map +1 -0
- package/dist/devcc/components/Footer.d.ts +22 -0
- package/dist/devcc/components/Footer.d.ts.map +1 -0
- package/dist/devcc/components/Footer.js +72 -0
- package/dist/devcc/components/Footer.js.map +1 -0
- package/dist/devcc/components/Header.d.ts +12 -0
- package/dist/devcc/components/Header.d.ts.map +1 -0
- package/dist/devcc/components/Header.js +84 -0
- package/dist/devcc/components/Header.js.map +1 -0
- package/dist/devcc/components/HelpOverlay.d.ts +18 -0
- package/dist/devcc/components/HelpOverlay.d.ts.map +1 -0
- package/dist/devcc/components/HelpOverlay.js +48 -0
- package/dist/devcc/components/HelpOverlay.js.map +1 -0
- package/dist/devcc/components/Overlay.d.ts +31 -0
- package/dist/devcc/components/Overlay.d.ts.map +1 -0
- package/dist/devcc/components/Overlay.js +60 -0
- package/dist/devcc/components/Overlay.js.map +1 -0
- package/dist/devcc/components/ProjectPicker.d.ts +26 -0
- package/dist/devcc/components/ProjectPicker.d.ts.map +1 -0
- package/dist/devcc/components/ProjectPicker.js +114 -0
- package/dist/devcc/components/ProjectPicker.js.map +1 -0
- package/dist/devcc/components/Sidebar.d.ts +42 -0
- package/dist/devcc/components/Sidebar.d.ts.map +1 -0
- package/dist/devcc/components/Sidebar.js +127 -0
- package/dist/devcc/components/Sidebar.js.map +1 -0
- package/dist/devcc/components/StatusBadge.d.ts +16 -0
- package/dist/devcc/components/StatusBadge.d.ts.map +1 -0
- package/dist/devcc/components/StatusBadge.js +30 -0
- package/dist/devcc/components/StatusBadge.js.map +1 -0
- package/dist/devcc/components/primitives.d.ts +62 -0
- package/dist/devcc/components/primitives.d.ts.map +1 -0
- package/dist/devcc/components/primitives.js +169 -0
- package/dist/devcc/components/primitives.js.map +1 -0
- package/dist/devcc/components/styled.d.ts +16 -0
- package/dist/devcc/components/styled.d.ts.map +1 -0
- package/dist/devcc/components/styled.js +35 -0
- package/dist/devcc/components/styled.js.map +1 -0
- package/dist/devcc/core/commands.d.ts +89 -0
- package/dist/devcc/core/commands.d.ts.map +1 -0
- package/dist/devcc/core/commands.js +68 -0
- package/dist/devcc/core/commands.js.map +1 -0
- package/dist/devcc/core/config.d.ts +81 -0
- package/dist/devcc/core/config.d.ts.map +1 -0
- package/dist/devcc/core/config.js +313 -0
- package/dist/devcc/core/config.js.map +1 -0
- package/dist/devcc/core/events.d.ts +21 -0
- package/dist/devcc/core/events.d.ts.map +1 -0
- package/dist/devcc/core/events.js +27 -0
- package/dist/devcc/core/events.js.map +1 -0
- package/dist/devcc/core/state.d.ts +104 -0
- package/dist/devcc/core/state.d.ts.map +1 -0
- package/dist/devcc/core/state.js +139 -0
- package/dist/devcc/core/state.js.map +1 -0
- package/dist/devcc/deps/DependencyService.d.ts +50 -0
- package/dist/devcc/deps/DependencyService.d.ts.map +1 -0
- package/dist/devcc/deps/DependencyService.js +109 -0
- package/dist/devcc/deps/DependencyService.js.map +1 -0
- package/dist/devcc/deps/parse.d.ts +49 -0
- package/dist/devcc/deps/parse.d.ts.map +1 -0
- package/dist/devcc/deps/parse.js +158 -0
- package/dist/devcc/deps/parse.js.map +1 -0
- package/dist/devcc/git/GitService.d.ts +60 -0
- package/dist/devcc/git/GitService.d.ts.map +1 -0
- package/dist/devcc/git/GitService.js +160 -0
- package/dist/devcc/git/GitService.js.map +1 -0
- package/dist/devcc/git/parse.d.ts +57 -0
- package/dist/devcc/git/parse.d.ts.map +1 -0
- package/dist/devcc/git/parse.js +174 -0
- package/dist/devcc/git/parse.js.map +1 -0
- package/dist/devcc/index.d.ts +37 -0
- package/dist/devcc/index.d.ts.map +1 -0
- package/dist/devcc/index.js +36 -0
- package/dist/devcc/index.js.map +1 -0
- package/dist/devcc/logs/LogBuffer.d.ts +86 -0
- package/dist/devcc/logs/LogBuffer.d.ts.map +1 -0
- package/dist/devcc/logs/LogBuffer.js +200 -0
- package/dist/devcc/logs/LogBuffer.js.map +1 -0
- package/dist/devcc/logs/merge.d.ts +36 -0
- package/dist/devcc/logs/merge.d.ts.map +1 -0
- package/dist/devcc/logs/merge.js +71 -0
- package/dist/devcc/logs/merge.js.map +1 -0
- package/dist/devcc/processes/ManagedProcess.d.ts +129 -0
- package/dist/devcc/processes/ManagedProcess.d.ts.map +1 -0
- package/dist/devcc/processes/ManagedProcess.js +80 -0
- package/dist/devcc/processes/ManagedProcess.js.map +1 -0
- package/dist/devcc/processes/ProcessManager.d.ts +112 -0
- package/dist/devcc/processes/ProcessManager.d.ts.map +1 -0
- package/dist/devcc/processes/ProcessManager.js +525 -0
- package/dist/devcc/processes/ProcessManager.js.map +1 -0
- package/dist/devcc/processes/graph.d.ts +35 -0
- package/dist/devcc/processes/graph.d.ts.map +1 -0
- package/dist/devcc/processes/graph.js +68 -0
- package/dist/devcc/processes/graph.js.map +1 -0
- package/dist/devcc/projects/ProjectRegistry.d.ts +52 -0
- package/dist/devcc/projects/ProjectRegistry.d.ts.map +1 -0
- package/dist/devcc/projects/ProjectRegistry.js +177 -0
- package/dist/devcc/projects/ProjectRegistry.js.map +1 -0
- package/dist/devcc/services/ServiceManager.d.ts +48 -0
- package/dist/devcc/services/ServiceManager.d.ts.map +1 -0
- package/dist/devcc/services/ServiceManager.js +146 -0
- package/dist/devcc/services/ServiceManager.js.map +1 -0
- package/dist/devcc/services/docker.d.ts +37 -0
- package/dist/devcc/services/docker.d.ts.map +1 -0
- package/dist/devcc/services/docker.js +179 -0
- package/dist/devcc/services/docker.js.map +1 -0
- package/dist/devcc/services/node.d.ts +40 -0
- package/dist/devcc/services/node.d.ts.map +1 -0
- package/dist/devcc/services/node.js +107 -0
- package/dist/devcc/services/node.js.map +1 -0
- package/dist/devcc/services/ollama.d.ts +27 -0
- package/dist/devcc/services/ollama.d.ts.map +1 -0
- package/dist/devcc/services/ollama.js +66 -0
- package/dist/devcc/services/ollama.js.map +1 -0
- package/dist/devcc/services/postgres.d.ts +30 -0
- package/dist/devcc/services/postgres.d.ts.map +1 -0
- package/dist/devcc/services/postgres.js +47 -0
- package/dist/devcc/services/postgres.js.map +1 -0
- package/dist/devcc/services/redis.d.ts +20 -0
- package/dist/devcc/services/redis.d.ts.map +1 -0
- package/dist/devcc/services/redis.js +39 -0
- package/dist/devcc/services/redis.js.map +1 -0
- package/dist/devcc/services/types.d.ts +51 -0
- package/dist/devcc/services/types.d.ts.map +1 -0
- package/dist/devcc/services/types.js +10 -0
- package/dist/devcc/services/types.js.map +1 -0
- package/dist/devcc/system/SystemMonitor.d.ts +87 -0
- package/dist/devcc/system/SystemMonitor.d.ts.map +1 -0
- package/dist/devcc/system/SystemMonitor.js +142 -0
- package/dist/devcc/system/SystemMonitor.js.map +1 -0
- package/dist/devcc/utils/errors.d.ts +31 -0
- package/dist/devcc/utils/errors.d.ts.map +1 -0
- package/dist/devcc/utils/errors.js +52 -0
- package/dist/devcc/utils/errors.js.map +1 -0
- package/dist/devcc/utils/exec.d.ts +41 -0
- package/dist/devcc/utils/exec.d.ts.map +1 -0
- package/dist/devcc/utils/exec.js +112 -0
- package/dist/devcc/utils/exec.js.map +1 -0
- package/dist/devcc/utils/format.d.ts +18 -0
- package/dist/devcc/utils/format.d.ts.map +1 -0
- package/dist/devcc/utils/format.js +85 -0
- package/dist/devcc/utils/format.js.map +1 -0
- package/dist/devcc/utils/fuzzy.d.ts +12 -0
- package/dist/devcc/utils/fuzzy.d.ts.map +1 -0
- package/dist/devcc/utils/fuzzy.js +20 -0
- package/dist/devcc/utils/fuzzy.js.map +1 -0
- package/dist/devcc/utils/logger.d.ts +41 -0
- package/dist/devcc/utils/logger.d.ts.map +1 -0
- package/dist/devcc/utils/logger.js +117 -0
- package/dist/devcc/utils/logger.js.map +1 -0
- package/dist/devcc/utils/packageManager.d.ts +39 -0
- package/dist/devcc/utils/packageManager.d.ts.map +1 -0
- package/dist/devcc/utils/packageManager.js +85 -0
- package/dist/devcc/utils/packageManager.js.map +1 -0
- package/dist/devcc/utils/paths.d.ts +12 -0
- package/dist/devcc/utils/paths.d.ts.map +1 -0
- package/dist/devcc/utils/paths.js +39 -0
- package/dist/devcc/utils/paths.js.map +1 -0
- package/dist/devcc/views/DependenciesView.d.ts +34 -0
- package/dist/devcc/views/DependenciesView.d.ts.map +1 -0
- package/dist/devcc/views/DependenciesView.js +170 -0
- package/dist/devcc/views/DependenciesView.js.map +1 -0
- package/dist/devcc/views/GitView.d.ts +29 -0
- package/dist/devcc/views/GitView.d.ts.map +1 -0
- package/dist/devcc/views/GitView.js +226 -0
- package/dist/devcc/views/GitView.js.map +1 -0
- package/dist/devcc/views/LogsView.d.ts +39 -0
- package/dist/devcc/views/LogsView.d.ts.map +1 -0
- package/dist/devcc/views/LogsView.js +249 -0
- package/dist/devcc/views/LogsView.js.map +1 -0
- package/dist/devcc/views/OverviewView.d.ts +16 -0
- package/dist/devcc/views/OverviewView.d.ts.map +1 -0
- package/dist/devcc/views/OverviewView.js +135 -0
- package/dist/devcc/views/OverviewView.js.map +1 -0
- package/dist/devcc/views/ProcessesView.d.ts +26 -0
- package/dist/devcc/views/ProcessesView.d.ts.map +1 -0
- package/dist/devcc/views/ProcessesView.js +161 -0
- package/dist/devcc/views/ProcessesView.js.map +1 -0
- package/dist/devcc/views/ScriptsView.d.ts +30 -0
- package/dist/devcc/views/ScriptsView.d.ts.map +1 -0
- package/dist/devcc/views/ScriptsView.js +168 -0
- package/dist/devcc/views/ScriptsView.js.map +1 -0
- package/dist/devcc/views/ServicesView.d.ts +28 -0
- package/dist/devcc/views/ServicesView.d.ts.map +1 -0
- package/dist/devcc/views/ServicesView.js +153 -0
- package/dist/devcc/views/ServicesView.js.map +1 -0
- package/dist/devcc/views/SettingsView.d.ts +20 -0
- package/dist/devcc/views/SettingsView.d.ts.map +1 -0
- package/dist/devcc/views/SettingsView.js +114 -0
- package/dist/devcc/views/SettingsView.js.map +1 -0
- package/dist/devcc/views/SystemView.d.ts +13 -0
- package/dist/devcc/views/SystemView.d.ts.map +1 -0
- package/dist/devcc/views/SystemView.js +82 -0
- package/dist/devcc/views/SystemView.js.map +1 -0
- package/dist/devcc/views/View.d.ts +35 -0
- package/dist/devcc/views/View.d.ts.map +1 -0
- package/dist/devcc/views/View.js +42 -0
- package/dist/devcc/views/View.js.map +1 -0
- package/package.json +79 -0
- package/src/devcc/app/App.ts +1463 -0
- package/src/devcc/app/builtinCommands.ts +429 -0
- package/src/devcc/app/keymap.ts +167 -0
- package/src/devcc/app/theme.ts +83 -0
- package/src/devcc/cli.ts +122 -0
- package/src/devcc/components/CommandPalette.ts +136 -0
- package/src/devcc/components/ConfirmDialog.ts +174 -0
- package/src/devcc/components/Footer.ts +85 -0
- package/src/devcc/components/Header.ts +93 -0
- package/src/devcc/components/HelpOverlay.ts +62 -0
- package/src/devcc/components/Overlay.ts +91 -0
- package/src/devcc/components/ProjectPicker.ts +138 -0
- package/src/devcc/components/Sidebar.ts +163 -0
- package/src/devcc/components/StatusBadge.ts +36 -0
- package/src/devcc/components/primitives.ts +213 -0
- package/src/devcc/components/styled.ts +44 -0
- package/src/devcc/core/commands.ts +140 -0
- package/src/devcc/core/config.ts +405 -0
- package/src/devcc/core/events.ts +41 -0
- package/src/devcc/core/state.ts +236 -0
- package/src/devcc/deps/DependencyService.ts +152 -0
- package/src/devcc/deps/parse.ts +210 -0
- package/src/devcc/git/GitService.ts +205 -0
- package/src/devcc/git/parse.ts +203 -0
- package/src/devcc/index.ts +115 -0
- package/src/devcc/logs/LogBuffer.ts +237 -0
- package/src/devcc/logs/merge.ts +87 -0
- package/src/devcc/processes/ManagedProcess.ts +195 -0
- package/src/devcc/processes/ProcessManager.ts +625 -0
- package/src/devcc/processes/graph.ts +98 -0
- package/src/devcc/projects/ProjectRegistry.ts +219 -0
- package/src/devcc/services/ServiceManager.ts +180 -0
- package/src/devcc/services/docker.ts +220 -0
- package/src/devcc/services/node.ts +137 -0
- package/src/devcc/services/ollama.ts +80 -0
- package/src/devcc/services/postgres.ts +57 -0
- package/src/devcc/services/redis.ts +47 -0
- package/src/devcc/services/types.ts +59 -0
- package/src/devcc/system/SystemMonitor.ts +207 -0
- package/src/devcc/utils/errors.ts +64 -0
- package/src/devcc/utils/exec.ts +165 -0
- package/src/devcc/utils/format.ts +83 -0
- package/src/devcc/utils/fuzzy.ts +44 -0
- package/src/devcc/utils/logger.ts +140 -0
- package/src/devcc/utils/packageManager.ts +112 -0
- package/src/devcc/utils/paths.ts +39 -0
- package/src/devcc/views/DependenciesView.ts +206 -0
- package/src/devcc/views/GitView.ts +259 -0
- package/src/devcc/views/LogsView.ts +300 -0
- package/src/devcc/views/OverviewView.ts +187 -0
- package/src/devcc/views/ProcessesView.ts +177 -0
- package/src/devcc/views/ScriptsView.ts +187 -0
- package/src/devcc/views/ServicesView.ts +188 -0
- package/src/devcc/views/SettingsView.ts +146 -0
- package/src/devcc/views/SystemView.ts +110 -0
- package/src/devcc/views/View.ts +63 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API for Dev Command Center.
|
|
3
|
+
*
|
|
4
|
+
* Project config files import `defineConfig` from here; embedders can drive the
|
|
5
|
+
* `App` directly or reuse individual pieces (process manager, service adapters,
|
|
6
|
+
* git parsing) without the UI.
|
|
7
|
+
*/
|
|
8
|
+
export { App, type AppOptions } from "./app/App.js";
|
|
9
|
+
export { createBuiltinCommands, createConfigCommands, createScriptCommands } from "./app/builtinCommands.js";
|
|
10
|
+
export { HELP_SECTIONS, VIEW_SHORTCUTS } from "./app/keymap.js";
|
|
11
|
+
export { theme, glyphs, processStatusStyle, serviceStateStyle } from "./app/theme.js";
|
|
12
|
+
export { CommandRegistry, type CommandContext, type CommandDefinition } from "./core/commands.js";
|
|
13
|
+
export { defineConfig, loadConfig, validateConfig, findConfigFile, CONFIG_FILENAMES, DEFAULT_REFRESH, type CommandConfigEntry, type DevccConfig, type ResolvedConfig, type ServiceConfigEntry, } from "./core/config.js";
|
|
14
|
+
export { TypedEmitter, Subscriptions, type Unsubscribe } from "./core/events.js";
|
|
15
|
+
export { Store, VIEW_IDS, createInitialState, type AppState, type Notification, type ProjectState, type UiState, type ViewId, } from "./core/state.js";
|
|
16
|
+
export { DependencyService, updateArgs, type DependencySnapshot } from "./deps/DependencyService.js";
|
|
17
|
+
export { outdatedArgs, parseOutdated, severityBetween, sortOutdated, summariseOutdated, supportsOutdatedJson, type OutdatedPackage, type UpdateSeverity, } from "./deps/parse.js";
|
|
18
|
+
export { GitService, type GitSnapshot } from "./git/GitService.js";
|
|
19
|
+
export { parseCommits, parsePorcelainV2, summariseStatus, summariseTracking, type GitCommit, type GitFile, type GitStatus, } from "./git/parse.js";
|
|
20
|
+
export { LogBuffer, LogStore, MAX_LOG_LINES, type LogEntry, type LogSource, type LogStream, } from "./logs/LogBuffer.js";
|
|
21
|
+
export { canTransition, crashBackoffDelay, shouldAutoRestart, DEFAULT_CRASH_POLICY, createManagedProcess, describeCommand, isActive, type ManagedProcess, type ProcessDefinition, type ProcessStatus, type ReadinessCheck, } from "./processes/ManagedProcess.js";
|
|
22
|
+
export { dependentsOf, planStartOrder, type StartPlan } from "./processes/graph.js";
|
|
23
|
+
export { ProcessManager, type ProcessManagerOptions } from "./processes/ProcessManager.js";
|
|
24
|
+
export { buildProjectList, discoverProjects, isProjectDirectory, readRecents, recordRecent, type ProjectEntry, } from "./projects/ProjectRegistry.js";
|
|
25
|
+
export { ServiceManager } from "./services/ServiceManager.js";
|
|
26
|
+
export { DockerService, findComposeFile, parseComposePs } from "./services/docker.js";
|
|
27
|
+
export { PortService, detectNodeServices } from "./services/node.js";
|
|
28
|
+
export { OllamaService } from "./services/ollama.js";
|
|
29
|
+
export { PostgresService, parsePostgresUrl } from "./services/postgres.js";
|
|
30
|
+
export { RedisService, parseRedisUrl } from "./services/redis.js";
|
|
31
|
+
export type { ServiceAdapter, ServiceSnapshot, ServiceState, ServiceStatus } from "./services/types.js";
|
|
32
|
+
export { SystemMonitor, cpuUsageBetween, sampleCpu, type SystemMetrics } from "./system/SystemMonitor.js";
|
|
33
|
+
export { DevccError, errorMessage, toDevccError } from "./utils/errors.js";
|
|
34
|
+
export { Logger, createLogger, type LogLevel } from "./utils/logger.js";
|
|
35
|
+
export { detectPackageManager, readPackageJson, readScripts, runScriptArgs, type PackageManager, } from "./utils/packageManager.js";
|
|
36
|
+
export { findProjectRoot } from "./utils/paths.js";
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devcc/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API for Dev Command Center.
|
|
3
|
+
*
|
|
4
|
+
* Project config files import `defineConfig` from here; embedders can drive the
|
|
5
|
+
* `App` directly or reuse individual pieces (process manager, service adapters,
|
|
6
|
+
* git parsing) without the UI.
|
|
7
|
+
*/
|
|
8
|
+
export { App } from "./app/App.js";
|
|
9
|
+
export { createBuiltinCommands, createConfigCommands, createScriptCommands } from "./app/builtinCommands.js";
|
|
10
|
+
export { HELP_SECTIONS, VIEW_SHORTCUTS } from "./app/keymap.js";
|
|
11
|
+
export { theme, glyphs, processStatusStyle, serviceStateStyle } from "./app/theme.js";
|
|
12
|
+
export { CommandRegistry } from "./core/commands.js";
|
|
13
|
+
export { defineConfig, loadConfig, validateConfig, findConfigFile, CONFIG_FILENAMES, DEFAULT_REFRESH, } from "./core/config.js";
|
|
14
|
+
export { TypedEmitter, Subscriptions } from "./core/events.js";
|
|
15
|
+
export { Store, VIEW_IDS, createInitialState, } from "./core/state.js";
|
|
16
|
+
export { DependencyService, updateArgs } from "./deps/DependencyService.js";
|
|
17
|
+
export { outdatedArgs, parseOutdated, severityBetween, sortOutdated, summariseOutdated, supportsOutdatedJson, } from "./deps/parse.js";
|
|
18
|
+
export { GitService } from "./git/GitService.js";
|
|
19
|
+
export { parseCommits, parsePorcelainV2, summariseStatus, summariseTracking, } from "./git/parse.js";
|
|
20
|
+
export { LogBuffer, LogStore, MAX_LOG_LINES, } from "./logs/LogBuffer.js";
|
|
21
|
+
export { canTransition, crashBackoffDelay, shouldAutoRestart, DEFAULT_CRASH_POLICY, createManagedProcess, describeCommand, isActive, } from "./processes/ManagedProcess.js";
|
|
22
|
+
export { dependentsOf, planStartOrder } from "./processes/graph.js";
|
|
23
|
+
export { ProcessManager } from "./processes/ProcessManager.js";
|
|
24
|
+
export { buildProjectList, discoverProjects, isProjectDirectory, readRecents, recordRecent, } from "./projects/ProjectRegistry.js";
|
|
25
|
+
export { ServiceManager } from "./services/ServiceManager.js";
|
|
26
|
+
export { DockerService, findComposeFile, parseComposePs } from "./services/docker.js";
|
|
27
|
+
export { PortService, detectNodeServices } from "./services/node.js";
|
|
28
|
+
export { OllamaService } from "./services/ollama.js";
|
|
29
|
+
export { PostgresService, parsePostgresUrl } from "./services/postgres.js";
|
|
30
|
+
export { RedisService, parseRedisUrl } from "./services/redis.js";
|
|
31
|
+
export { SystemMonitor, cpuUsageBetween, sampleCpu } from "./system/SystemMonitor.js";
|
|
32
|
+
export { DevccError, errorMessage, toDevccError } from "./utils/errors.js";
|
|
33
|
+
export { Logger, createLogger } from "./utils/logger.js";
|
|
34
|
+
export { detectPackageManager, readPackageJson, readScripts, runScriptArgs, } from "./utils/packageManager.js";
|
|
35
|
+
export { findProjectRoot } from "./utils/paths.js";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/devcc/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,GAAG,EAAmB,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC5G,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAErF,OAAO,EAAE,eAAe,EAA+C,MAAM,oBAAoB,CAAA;AACjG,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,GAKhB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAA;AAChF,OAAO,EACL,KAAK,EACL,QAAQ,EACR,kBAAkB,GAMnB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAA2B,MAAM,6BAA6B,CAAA;AACpG,OAAO,EACL,YAAY,EACZ,aAAa,EACb,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,GAGrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,UAAU,EAAoB,MAAM,qBAAqB,CAAA;AAClE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,iBAAiB,GAIlB,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,aAAa,GAId,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,QAAQ,GAKT,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,cAAc,EAA8B,MAAM,+BAA+B,CAAA;AAE1F,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,YAAY,GAEb,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGjE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAsB,MAAM,2BAA2B,CAAA;AAEzG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC1E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAiB,MAAM,mBAAmB,CAAA;AACvE,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,aAAa,GAEd,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { TypedEmitter } from "../core/events.js";
|
|
2
|
+
/** Default cap for a single source's in-memory history. */
|
|
3
|
+
export declare const MAX_LOG_LINES = 5000;
|
|
4
|
+
export type LogStream = "stdout" | "stderr" | "system";
|
|
5
|
+
export interface LogEntry {
|
|
6
|
+
/** Monotonic per-buffer sequence number; used for cheap "has it changed?" checks. */
|
|
7
|
+
seq: number;
|
|
8
|
+
timestamp: Date;
|
|
9
|
+
stream: LogStream;
|
|
10
|
+
text: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fixed-capacity ring buffer.
|
|
14
|
+
*
|
|
15
|
+
* Memory is bounded by construction: once `capacity` lines are stored, each new
|
|
16
|
+
* line overwrites the oldest one. Nothing else in the app is allowed to retain
|
|
17
|
+
* log lines.
|
|
18
|
+
*/
|
|
19
|
+
export declare class LogBuffer {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly capacity: number;
|
|
22
|
+
private readonly entries;
|
|
23
|
+
private writeIndex;
|
|
24
|
+
private count;
|
|
25
|
+
private nextSeq;
|
|
26
|
+
private pendingPartial;
|
|
27
|
+
constructor(id: string, capacity?: number);
|
|
28
|
+
get size(): number;
|
|
29
|
+
/** Total lines ever written, including evicted ones. */
|
|
30
|
+
get totalWritten(): number;
|
|
31
|
+
/** True when the oldest lines have been dropped. */
|
|
32
|
+
get truncated(): boolean;
|
|
33
|
+
push(text: string, stream?: LogStream, timestamp?: Date): LogEntry;
|
|
34
|
+
/**
|
|
35
|
+
* Feed a raw chunk from a child process. Splits on newlines and holds back an
|
|
36
|
+
* unterminated trailing fragment until the rest arrives.
|
|
37
|
+
*/
|
|
38
|
+
pushChunk(chunk: string, stream?: LogStream): LogEntry[];
|
|
39
|
+
/** Flush a held-back partial line (call when the stream closes). */
|
|
40
|
+
flush(stream?: LogStream): LogEntry[];
|
|
41
|
+
/** Entries in chronological order. */
|
|
42
|
+
toArray(): LogEntry[];
|
|
43
|
+
/** The most recent `n` entries, chronologically ordered. */
|
|
44
|
+
tail(n: number): LogEntry[];
|
|
45
|
+
/** A window of the chronological history, used by the scrolling log viewer. */
|
|
46
|
+
slice(offset: number, length: number): LogEntry[];
|
|
47
|
+
clear(): void;
|
|
48
|
+
}
|
|
49
|
+
export interface LogSource {
|
|
50
|
+
id: string;
|
|
51
|
+
label: string;
|
|
52
|
+
}
|
|
53
|
+
export type LogStoreEvents = {
|
|
54
|
+
"log:append": [string, LogEntry[]];
|
|
55
|
+
"log:clear": [string];
|
|
56
|
+
"log:sources": [LogSource[]];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Owns one `LogBuffer` per source (managed process, script run, or devcc itself)
|
|
60
|
+
* and announces changes so the Logs view can update without polling.
|
|
61
|
+
*/
|
|
62
|
+
export declare class LogStore extends TypedEmitter<LogStoreEvents> {
|
|
63
|
+
private readonly capacity;
|
|
64
|
+
private readonly buffers;
|
|
65
|
+
private readonly labels;
|
|
66
|
+
constructor(capacity?: number);
|
|
67
|
+
register(id: string, label: string): LogBuffer;
|
|
68
|
+
unregister(id: string): void;
|
|
69
|
+
get(id: string): LogBuffer | undefined;
|
|
70
|
+
has(id: string): boolean;
|
|
71
|
+
sources(): LogSource[];
|
|
72
|
+
append(id: string, text: string, stream?: LogStream): void;
|
|
73
|
+
appendChunk(id: string, chunk: string, stream: LogStream): void;
|
|
74
|
+
flush(id: string): void;
|
|
75
|
+
clear(id: string): void;
|
|
76
|
+
clearAll(): void;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove terminal control sequences from a captured line.
|
|
80
|
+
*
|
|
81
|
+
* Children are told `FORCE_COLOR=0`, but watchers such as `tsc --watch` still
|
|
82
|
+
* clear the screen and move the cursor; rendered verbatim those bytes would
|
|
83
|
+
* corrupt the viewer (or, in the merged stream, someone else's line).
|
|
84
|
+
*/
|
|
85
|
+
export declare function stripControlSequences(text: string): string;
|
|
86
|
+
//# sourceMappingURL=LogBuffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogBuffer.d.ts","sourceRoot":"","sources":["../../../src/devcc/logs/LogBuffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { TypedEmitter } from "../core/events.js";
|
|
2
|
+
/** Default cap for a single source's in-memory history. */
|
|
3
|
+
export const MAX_LOG_LINES = 5_000;
|
|
4
|
+
/**
|
|
5
|
+
* Fixed-capacity ring buffer.
|
|
6
|
+
*
|
|
7
|
+
* Memory is bounded by construction: once `capacity` lines are stored, each new
|
|
8
|
+
* line overwrites the oldest one. Nothing else in the app is allowed to retain
|
|
9
|
+
* log lines.
|
|
10
|
+
*/
|
|
11
|
+
export class LogBuffer {
|
|
12
|
+
id;
|
|
13
|
+
capacity;
|
|
14
|
+
entries;
|
|
15
|
+
writeIndex = 0;
|
|
16
|
+
count = 0;
|
|
17
|
+
nextSeq = 0;
|
|
18
|
+
pendingPartial = { stdout: "", stderr: "", system: "" };
|
|
19
|
+
constructor(id, capacity = MAX_LOG_LINES) {
|
|
20
|
+
this.id = id;
|
|
21
|
+
this.capacity = capacity;
|
|
22
|
+
if (capacity <= 0)
|
|
23
|
+
throw new RangeError("LogBuffer capacity must be > 0");
|
|
24
|
+
this.entries = new Array(capacity);
|
|
25
|
+
}
|
|
26
|
+
get size() {
|
|
27
|
+
return this.count;
|
|
28
|
+
}
|
|
29
|
+
/** Total lines ever written, including evicted ones. */
|
|
30
|
+
get totalWritten() {
|
|
31
|
+
return this.nextSeq;
|
|
32
|
+
}
|
|
33
|
+
/** True when the oldest lines have been dropped. */
|
|
34
|
+
get truncated() {
|
|
35
|
+
return this.nextSeq > this.capacity;
|
|
36
|
+
}
|
|
37
|
+
push(text, stream = "stdout", timestamp = new Date()) {
|
|
38
|
+
const entry = { seq: this.nextSeq++, timestamp, stream, text: stripControlSequences(text) };
|
|
39
|
+
this.entries[this.writeIndex] = entry;
|
|
40
|
+
this.writeIndex = (this.writeIndex + 1) % this.capacity;
|
|
41
|
+
if (this.count < this.capacity)
|
|
42
|
+
this.count += 1;
|
|
43
|
+
return entry;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Feed a raw chunk from a child process. Splits on newlines and holds back an
|
|
47
|
+
* unterminated trailing fragment until the rest arrives.
|
|
48
|
+
*/
|
|
49
|
+
pushChunk(chunk, stream = "stdout") {
|
|
50
|
+
const combined = this.pendingPartial[stream] + chunk;
|
|
51
|
+
const parts = combined.split(/\r?\n/u);
|
|
52
|
+
this.pendingPartial[stream] = parts.pop() ?? "";
|
|
53
|
+
return parts.map((line) => this.push(stripTrailingCarriage(line), stream));
|
|
54
|
+
}
|
|
55
|
+
/** Flush a held-back partial line (call when the stream closes). */
|
|
56
|
+
flush(stream) {
|
|
57
|
+
const streams = stream ? [stream] : ["stdout", "stderr", "system"];
|
|
58
|
+
const flushed = [];
|
|
59
|
+
for (const name of streams) {
|
|
60
|
+
const partial = this.pendingPartial[name];
|
|
61
|
+
if (partial.length > 0) {
|
|
62
|
+
this.pendingPartial[name] = "";
|
|
63
|
+
flushed.push(this.push(stripTrailingCarriage(partial), name));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return flushed;
|
|
67
|
+
}
|
|
68
|
+
/** Entries in chronological order. */
|
|
69
|
+
toArray() {
|
|
70
|
+
const result = [];
|
|
71
|
+
const start = this.count < this.capacity ? 0 : this.writeIndex;
|
|
72
|
+
for (let i = 0; i < this.count; i += 1) {
|
|
73
|
+
const entry = this.entries[(start + i) % this.capacity];
|
|
74
|
+
if (entry)
|
|
75
|
+
result.push(entry);
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
/** The most recent `n` entries, chronologically ordered. */
|
|
80
|
+
tail(n) {
|
|
81
|
+
if (n <= 0)
|
|
82
|
+
return [];
|
|
83
|
+
const all = this.toArray();
|
|
84
|
+
return all.slice(Math.max(0, all.length - n));
|
|
85
|
+
}
|
|
86
|
+
/** A window of the chronological history, used by the scrolling log viewer. */
|
|
87
|
+
slice(offset, length) {
|
|
88
|
+
const all = this.toArray();
|
|
89
|
+
const start = Math.max(0, Math.min(offset, all.length));
|
|
90
|
+
return all.slice(start, start + Math.max(0, length));
|
|
91
|
+
}
|
|
92
|
+
clear() {
|
|
93
|
+
this.entries.fill(undefined);
|
|
94
|
+
this.writeIndex = 0;
|
|
95
|
+
this.count = 0;
|
|
96
|
+
this.pendingPartial = { stdout: "", stderr: "", system: "" };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Owns one `LogBuffer` per source (managed process, script run, or devcc itself)
|
|
101
|
+
* and announces changes so the Logs view can update without polling.
|
|
102
|
+
*/
|
|
103
|
+
export class LogStore extends TypedEmitter {
|
|
104
|
+
capacity;
|
|
105
|
+
buffers = new Map();
|
|
106
|
+
labels = new Map();
|
|
107
|
+
constructor(capacity = MAX_LOG_LINES) {
|
|
108
|
+
super();
|
|
109
|
+
this.capacity = capacity;
|
|
110
|
+
}
|
|
111
|
+
register(id, label) {
|
|
112
|
+
const existing = this.buffers.get(id);
|
|
113
|
+
if (existing) {
|
|
114
|
+
if (this.labels.get(id) !== label) {
|
|
115
|
+
this.labels.set(id, label);
|
|
116
|
+
this.emit("log:sources", this.sources());
|
|
117
|
+
}
|
|
118
|
+
return existing;
|
|
119
|
+
}
|
|
120
|
+
const buffer = new LogBuffer(id, this.capacity);
|
|
121
|
+
this.buffers.set(id, buffer);
|
|
122
|
+
this.labels.set(id, label);
|
|
123
|
+
this.emit("log:sources", this.sources());
|
|
124
|
+
return buffer;
|
|
125
|
+
}
|
|
126
|
+
unregister(id) {
|
|
127
|
+
if (this.buffers.delete(id)) {
|
|
128
|
+
this.labels.delete(id);
|
|
129
|
+
this.emit("log:sources", this.sources());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
get(id) {
|
|
133
|
+
return this.buffers.get(id);
|
|
134
|
+
}
|
|
135
|
+
has(id) {
|
|
136
|
+
return this.buffers.has(id);
|
|
137
|
+
}
|
|
138
|
+
sources() {
|
|
139
|
+
return [...this.buffers.keys()].map((id) => ({ id, label: this.labels.get(id) ?? id }));
|
|
140
|
+
}
|
|
141
|
+
append(id, text, stream = "system") {
|
|
142
|
+
const buffer = this.buffers.get(id) ?? this.register(id, id);
|
|
143
|
+
const entry = buffer.push(text, stream);
|
|
144
|
+
this.emit("log:append", id, [entry]);
|
|
145
|
+
}
|
|
146
|
+
appendChunk(id, chunk, stream) {
|
|
147
|
+
const buffer = this.buffers.get(id) ?? this.register(id, id);
|
|
148
|
+
const entries = buffer.pushChunk(chunk, stream);
|
|
149
|
+
if (entries.length > 0)
|
|
150
|
+
this.emit("log:append", id, entries);
|
|
151
|
+
}
|
|
152
|
+
flush(id) {
|
|
153
|
+
const buffer = this.buffers.get(id);
|
|
154
|
+
if (!buffer)
|
|
155
|
+
return;
|
|
156
|
+
const entries = buffer.flush();
|
|
157
|
+
if (entries.length > 0)
|
|
158
|
+
this.emit("log:append", id, entries);
|
|
159
|
+
}
|
|
160
|
+
clear(id) {
|
|
161
|
+
this.buffers.get(id)?.clear();
|
|
162
|
+
this.emit("log:clear", id);
|
|
163
|
+
}
|
|
164
|
+
clearAll() {
|
|
165
|
+
for (const id of this.buffers.keys())
|
|
166
|
+
this.clear(id);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function stripTrailingCarriage(line) {
|
|
170
|
+
return line.endsWith("\r") ? line.slice(0, -1) : line;
|
|
171
|
+
}
|
|
172
|
+
const ESC = String.fromCharCode(27);
|
|
173
|
+
const BEL = String.fromCharCode(7);
|
|
174
|
+
/** CSI sequences (`ESC [ ... final`), including screen clears and cursor moves. */
|
|
175
|
+
const CSI_SEQUENCE = new RegExp(`${ESC}\\[[0-?]*[ -/]*[@-~]`, "gu");
|
|
176
|
+
/** OSC sequences (`ESC ] ... BEL` or `ESC ] ... ESC \\`), e.g. window titles and hyperlinks. */
|
|
177
|
+
const OSC_SEQUENCE = new RegExp(`${ESC}\\][^${BEL}${ESC}]*(?:${BEL}|${ESC}\\\\)`, "gu");
|
|
178
|
+
/**
|
|
179
|
+
* Two-byte escapes such as `ESC c` (reset) and `ESC 7`/`ESC 8` (save/restore
|
|
180
|
+
* cursor). Any printable after a bare ESC is an escape by definition.
|
|
181
|
+
*/
|
|
182
|
+
const SIMPLE_ESCAPE = new RegExp(`${ESC}[0-~]`, "gu");
|
|
183
|
+
/** Remaining C0 controls apart from tab. Matching control characters is the point here. */
|
|
184
|
+
// eslint-disable-next-line no-control-regex
|
|
185
|
+
const C0_CONTROLS = /[\u0000-\u0008\u000b-\u001f\u007f]/gu;
|
|
186
|
+
/**
|
|
187
|
+
* Remove terminal control sequences from a captured line.
|
|
188
|
+
*
|
|
189
|
+
* Children are told `FORCE_COLOR=0`, but watchers such as `tsc --watch` still
|
|
190
|
+
* clear the screen and move the cursor; rendered verbatim those bytes would
|
|
191
|
+
* corrupt the viewer (or, in the merged stream, someone else's line).
|
|
192
|
+
*/
|
|
193
|
+
export function stripControlSequences(text) {
|
|
194
|
+
return text
|
|
195
|
+
.replace(CSI_SEQUENCE, "")
|
|
196
|
+
.replace(OSC_SEQUENCE, "")
|
|
197
|
+
.replace(SIMPLE_ESCAPE, "")
|
|
198
|
+
.replace(C0_CONTROLS, "");
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=LogBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogBuffer.js","sourceRoot":"","sources":["../../../src/devcc/logs/LogBuffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { LogBuffer, LogEntry } from "./LogBuffer.js";
|
|
2
|
+
/** A log line that knows which source it came from. */
|
|
3
|
+
export interface SourcedLogEntry {
|
|
4
|
+
sourceId: string;
|
|
5
|
+
entry: LogEntry;
|
|
6
|
+
}
|
|
7
|
+
/** The synthetic source id that shows every buffer merged into one stream. */
|
|
8
|
+
export declare const ALL_SOURCES = "*";
|
|
9
|
+
/** Upper bound on how many lines the merged stream materialises at once. */
|
|
10
|
+
export declare const MERGED_LIMIT = 2000;
|
|
11
|
+
/**
|
|
12
|
+
* Merge the tails of several chronological buffers into one chronological
|
|
13
|
+
* stream, bounded by `limit` lines in total.
|
|
14
|
+
*
|
|
15
|
+
* Each buffer is already ordered, so taking the last `limit` of each and
|
|
16
|
+
* sorting once is both simple and cheap enough for a few thousand lines.
|
|
17
|
+
* Ties on timestamp fall back to sequence number, which is per-buffer, so a
|
|
18
|
+
* stable sort keeps the input order between buffers.
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeTails(buffers: readonly LogBuffer[], limit?: number): SourcedLogEntry[];
|
|
21
|
+
export interface LogFilter {
|
|
22
|
+
/** Case-insensitive substring, or a regular expression if it parses as one. */
|
|
23
|
+
query: string;
|
|
24
|
+
/** Show only stderr lines. */
|
|
25
|
+
errorsOnly: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare const EMPTY_LOG_FILTER: LogFilter;
|
|
28
|
+
/**
|
|
29
|
+
* Compile a user query. Anything that fails to parse as a regex is treated as
|
|
30
|
+
* a literal, so typing `(` never breaks the view.
|
|
31
|
+
*/
|
|
32
|
+
export declare function compileQuery(query: string): ((text: string) => boolean) | null;
|
|
33
|
+
export declare function filterEntries(entries: readonly SourcedLogEntry[], filter: LogFilter): SourcedLogEntry[];
|
|
34
|
+
export declare function isFilterActive(filter: LogFilter): boolean;
|
|
35
|
+
export declare function describeFilter(filter: LogFilter): string;
|
|
36
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../src/devcc/logs/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzD,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,QAAQ,CAAA;CAChB;AAED,8EAA8E;AAC9E,eAAO,MAAM,WAAW,MAAM,CAAA;AAE9B,4EAA4E;AAC5E,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,GAAE,MAAqB,GAAG,eAAe,EAAE,CAgBzG;AAED,MAAM,WAAW,SAAS;IACxB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,8BAA8B;IAC9B,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAA4C,CAAA;AAE3E;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAW9E;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,EAAE,MAAM,EAAE,SAAS,GAAG,eAAe,EAAE,CAQvG;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAEzD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAKxD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** The synthetic source id that shows every buffer merged into one stream. */
|
|
2
|
+
export const ALL_SOURCES = "*";
|
|
3
|
+
/** Upper bound on how many lines the merged stream materialises at once. */
|
|
4
|
+
export const MERGED_LIMIT = 2_000;
|
|
5
|
+
/**
|
|
6
|
+
* Merge the tails of several chronological buffers into one chronological
|
|
7
|
+
* stream, bounded by `limit` lines in total.
|
|
8
|
+
*
|
|
9
|
+
* Each buffer is already ordered, so taking the last `limit` of each and
|
|
10
|
+
* sorting once is both simple and cheap enough for a few thousand lines.
|
|
11
|
+
* Ties on timestamp fall back to sequence number, which is per-buffer, so a
|
|
12
|
+
* stable sort keeps the input order between buffers.
|
|
13
|
+
*/
|
|
14
|
+
export function mergeTails(buffers, limit = MERGED_LIMIT) {
|
|
15
|
+
if (limit <= 0)
|
|
16
|
+
return [];
|
|
17
|
+
const combined = [];
|
|
18
|
+
for (const buffer of buffers) {
|
|
19
|
+
for (const entry of buffer.tail(limit))
|
|
20
|
+
combined.push({ sourceId: buffer.id, entry });
|
|
21
|
+
}
|
|
22
|
+
combined.sort((a, b) => {
|
|
23
|
+
const byTime = a.entry.timestamp.getTime() - b.entry.timestamp.getTime();
|
|
24
|
+
if (byTime !== 0)
|
|
25
|
+
return byTime;
|
|
26
|
+
if (a.sourceId === b.sourceId)
|
|
27
|
+
return a.entry.seq - b.entry.seq;
|
|
28
|
+
return 0;
|
|
29
|
+
});
|
|
30
|
+
return combined.length > limit ? combined.slice(combined.length - limit) : combined;
|
|
31
|
+
}
|
|
32
|
+
export const EMPTY_LOG_FILTER = { query: "", errorsOnly: false };
|
|
33
|
+
/**
|
|
34
|
+
* Compile a user query. Anything that fails to parse as a regex is treated as
|
|
35
|
+
* a literal, so typing `(` never breaks the view.
|
|
36
|
+
*/
|
|
37
|
+
export function compileQuery(query) {
|
|
38
|
+
const trimmed = query.trim();
|
|
39
|
+
if (trimmed === "")
|
|
40
|
+
return null;
|
|
41
|
+
try {
|
|
42
|
+
const pattern = new RegExp(trimmed, "iu");
|
|
43
|
+
return (text) => pattern.test(text);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
const needle = trimmed.toLowerCase();
|
|
47
|
+
return (text) => text.toLowerCase().includes(needle);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function filterEntries(entries, filter) {
|
|
51
|
+
const matches = compileQuery(filter.query);
|
|
52
|
+
if (!matches && !filter.errorsOnly)
|
|
53
|
+
return [...entries];
|
|
54
|
+
return entries.filter(({ entry }) => {
|
|
55
|
+
if (filter.errorsOnly && entry.stream !== "stderr")
|
|
56
|
+
return false;
|
|
57
|
+
return matches ? matches(entry.text) : true;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function isFilterActive(filter) {
|
|
61
|
+
return filter.query.trim() !== "" || filter.errorsOnly;
|
|
62
|
+
}
|
|
63
|
+
export function describeFilter(filter) {
|
|
64
|
+
const parts = [];
|
|
65
|
+
if (filter.query.trim() !== "")
|
|
66
|
+
parts.push(`/${filter.query.trim()}/`);
|
|
67
|
+
if (filter.errorsOnly)
|
|
68
|
+
parts.push("errors only");
|
|
69
|
+
return parts.join(" · ");
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../src/devcc/logs/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types and pure helpers describing a process Dev Command Center knows about.
|
|
3
|
+
*
|
|
4
|
+
* `ownership` is the safety boundary: `"managed"` processes were launched by us
|
|
5
|
+
* and may be signalled; `"detected"` processes were merely observed on the host
|
|
6
|
+
* and must never be killed by devcc.
|
|
7
|
+
*/
|
|
8
|
+
export type ProcessStatus = "stopped" | "starting" | "running" | "stopping" | "failed";
|
|
9
|
+
export type ProcessOwnership = "managed" | "detected";
|
|
10
|
+
/** `service` processes are long-running; `task` processes are expected to exit. */
|
|
11
|
+
export type ProcessKind = "service" | "task";
|
|
12
|
+
export interface ProcessDefinition {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
command: string;
|
|
16
|
+
args?: string[];
|
|
17
|
+
cwd?: string;
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
kind?: ProcessKind;
|
|
20
|
+
/** Start automatically when devcc launches. */
|
|
21
|
+
autoStart?: boolean;
|
|
22
|
+
/** Informational URL shown next to the process (e.g. `localhost:3000`). */
|
|
23
|
+
url?: string;
|
|
24
|
+
/** Port to probe for a readiness indicator. */
|
|
25
|
+
port?: number;
|
|
26
|
+
/** Milliseconds to wait after SIGTERM before escalating to SIGKILL. */
|
|
27
|
+
killGraceMs?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Bring the process back up automatically when it exits non-zero.
|
|
30
|
+
* Opt-in per process: devcc never resurrects something you stopped yourself.
|
|
31
|
+
*/
|
|
32
|
+
restartOnCrash?: boolean;
|
|
33
|
+
/** Give up after this many consecutive crashes (default 5). */
|
|
34
|
+
maxCrashRestarts?: number;
|
|
35
|
+
/** First backoff delay; doubles per consecutive crash (default 1000ms). */
|
|
36
|
+
crashBackoffMs?: number;
|
|
37
|
+
/** Upper bound on the backoff delay (default 30000ms). */
|
|
38
|
+
maxCrashBackoffMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* A run lasting at least this long is considered healthy, which resets the
|
|
41
|
+
* crash counter (default 30000ms).
|
|
42
|
+
*/
|
|
43
|
+
healthyAfterMs?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Ids of processes that must be *ready* before this one starts. Used by
|
|
46
|
+
* "start all" and autostart to bring a stack up in order.
|
|
47
|
+
*/
|
|
48
|
+
dependsOn?: string[];
|
|
49
|
+
/**
|
|
50
|
+
* How devcc decides the process is usable. Until it passes, the process is
|
|
51
|
+
* reported as `starting` rather than `running`. Without one, a process is
|
|
52
|
+
* considered ready the moment it has spawned.
|
|
53
|
+
*/
|
|
54
|
+
readiness?: ReadinessCheck;
|
|
55
|
+
}
|
|
56
|
+
export interface ReadinessCheck {
|
|
57
|
+
/** Ready once something accepts a TCP connection on this port. */
|
|
58
|
+
port?: number;
|
|
59
|
+
host?: string;
|
|
60
|
+
/** Ready once a line of output matches this regular expression. */
|
|
61
|
+
logPattern?: string;
|
|
62
|
+
/** Give up waiting after this long and report `running` anyway (default 30000). */
|
|
63
|
+
timeoutMs?: number;
|
|
64
|
+
/** How often to probe the port (default 250). */
|
|
65
|
+
intervalMs?: number;
|
|
66
|
+
}
|
|
67
|
+
export declare const DEFAULT_READINESS: {
|
|
68
|
+
readonly timeoutMs: 30000;
|
|
69
|
+
readonly intervalMs: 250;
|
|
70
|
+
};
|
|
71
|
+
export declare const DEFAULT_CRASH_POLICY: {
|
|
72
|
+
readonly maxCrashRestarts: 5;
|
|
73
|
+
readonly crashBackoffMs: 1000;
|
|
74
|
+
readonly maxCrashBackoffMs: 30000;
|
|
75
|
+
readonly healthyAfterMs: 30000;
|
|
76
|
+
};
|
|
77
|
+
export interface ManagedProcess {
|
|
78
|
+
id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
command: string;
|
|
81
|
+
args?: string[];
|
|
82
|
+
cwd?: string;
|
|
83
|
+
status: ProcessStatus;
|
|
84
|
+
pid?: number;
|
|
85
|
+
startedAt?: Date;
|
|
86
|
+
exitCode?: number;
|
|
87
|
+
/** Signal that terminated the process, when it was signalled. */
|
|
88
|
+
exitSignal?: string;
|
|
89
|
+
stoppedAt?: Date;
|
|
90
|
+
kind: ProcessKind;
|
|
91
|
+
ownership: ProcessOwnership;
|
|
92
|
+
url?: string;
|
|
93
|
+
port?: number;
|
|
94
|
+
/** How many times the user has restarted it this session. */
|
|
95
|
+
restarts: number;
|
|
96
|
+
/** Consecutive automatic restarts since the last healthy run. */
|
|
97
|
+
crashRestarts: number;
|
|
98
|
+
/** When an automatic restart is scheduled, the time it will happen. */
|
|
99
|
+
retryAt?: Date;
|
|
100
|
+
/** True once devcc has given up automatically restarting this process. */
|
|
101
|
+
crashRestartsExhausted?: boolean;
|
|
102
|
+
/** Last failure message, cleared on a successful start. */
|
|
103
|
+
lastError?: string;
|
|
104
|
+
/** Ids this process waits for before starting. */
|
|
105
|
+
dependsOn: string[];
|
|
106
|
+
/** True once the readiness check has passed (or there is none). */
|
|
107
|
+
ready: boolean;
|
|
108
|
+
/** Set when the readiness check timed out and the process was reported anyway. */
|
|
109
|
+
readinessTimedOut?: boolean;
|
|
110
|
+
}
|
|
111
|
+
export declare const ACTIVE_STATUSES: readonly ProcessStatus[];
|
|
112
|
+
export declare function isActive(status: ProcessStatus): boolean;
|
|
113
|
+
/** Whether a status change is legal. Keeps the manager's bookkeeping honest. */
|
|
114
|
+
export declare function canTransition(from: ProcessStatus, to: ProcessStatus): boolean;
|
|
115
|
+
/** Build the initial snapshot for a definition. */
|
|
116
|
+
export declare function createManagedProcess(definition: ProcessDefinition, ownership?: ProcessOwnership): ManagedProcess;
|
|
117
|
+
/**
|
|
118
|
+
* Exponential backoff for automatic restarts.
|
|
119
|
+
*
|
|
120
|
+
* `attempt` is 1-based: the first restart waits `base`, the second `2 * base`,
|
|
121
|
+
* and so on, capped at `max`. Keeping this a pure function makes the policy
|
|
122
|
+
* testable without spawning anything.
|
|
123
|
+
*/
|
|
124
|
+
export declare function crashBackoffDelay(attempt: number, base?: number, max?: number): number;
|
|
125
|
+
/** Whether a crashed process should be brought back up automatically. */
|
|
126
|
+
export declare function shouldAutoRestart(definition: Pick<ProcessDefinition, "restartOnCrash" | "maxCrashRestarts">, snapshot: Pick<ManagedProcess, "crashRestarts">): boolean;
|
|
127
|
+
/** Human-readable one-liner of what will actually be executed. */
|
|
128
|
+
export declare function describeCommand(process: Pick<ManagedProcess, "command" | "args">): string;
|
|
129
|
+
//# sourceMappingURL=ManagedProcess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ManagedProcess.d.ts","sourceRoot":"","sources":["../../../src/devcc/processes/ManagedProcess.ts"],"names":[],"mappings":"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"}
|