procler 0.2.0__py3-none-any.whl

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.
Files changed (83) hide show
  1. procler/__init__.py +3 -0
  2. procler/__main__.py +6 -0
  3. procler/api/__init__.py +5 -0
  4. procler/api/app.py +261 -0
  5. procler/api/deps.py +21 -0
  6. procler/api/routes/__init__.py +5 -0
  7. procler/api/routes/config.py +290 -0
  8. procler/api/routes/groups.py +62 -0
  9. procler/api/routes/logs.py +43 -0
  10. procler/api/routes/processes.py +185 -0
  11. procler/api/routes/recipes.py +69 -0
  12. procler/api/routes/snippets.py +134 -0
  13. procler/api/routes/ws.py +459 -0
  14. procler/cli.py +1478 -0
  15. procler/config/__init__.py +65 -0
  16. procler/config/changelog.py +148 -0
  17. procler/config/loader.py +256 -0
  18. procler/config/schema.py +315 -0
  19. procler/core/__init__.py +54 -0
  20. procler/core/context_base.py +117 -0
  21. procler/core/context_docker.py +384 -0
  22. procler/core/context_local.py +287 -0
  23. procler/core/daemon_detector.py +325 -0
  24. procler/core/events.py +74 -0
  25. procler/core/groups.py +419 -0
  26. procler/core/health.py +280 -0
  27. procler/core/log_tailer.py +262 -0
  28. procler/core/process_manager.py +1277 -0
  29. procler/core/recipes.py +330 -0
  30. procler/core/snippets.py +231 -0
  31. procler/core/variable_substitution.py +65 -0
  32. procler/db.py +96 -0
  33. procler/logging.py +41 -0
  34. procler/models.py +130 -0
  35. procler/py.typed +0 -0
  36. procler/settings.py +29 -0
  37. procler/static/assets/AboutView-BwZnsfpW.js +4 -0
  38. procler/static/assets/AboutView-UHbxWXcS.css +1 -0
  39. procler/static/assets/Code-HTS-H1S6.js +74 -0
  40. procler/static/assets/ConfigView-CGJcmp9G.css +1 -0
  41. procler/static/assets/ConfigView-aVtbRDf8.js +1 -0
  42. procler/static/assets/DashboardView-C5jw9Nsd.css +1 -0
  43. procler/static/assets/DashboardView-Dab7Cu9v.js +1 -0
  44. procler/static/assets/DataTable-z39TOAa4.js +746 -0
  45. procler/static/assets/DescriptionsItem-B2E8YbqJ.js +74 -0
  46. procler/static/assets/Divider-Dk-6aD2Y.js +42 -0
  47. procler/static/assets/Empty-MuygEHZM.js +24 -0
  48. procler/static/assets/Grid-CZ9QVKAT.js +1 -0
  49. procler/static/assets/GroupsView-BALG7i1X.js +1 -0
  50. procler/static/assets/GroupsView-gXAI1CVC.css +1 -0
  51. procler/static/assets/Input-e0xaxoWE.js +259 -0
  52. procler/static/assets/PhArrowsClockwise.vue-DqDg31az.js +1 -0
  53. procler/static/assets/PhCheckCircle.vue-Fwj9sh9m.js +1 -0
  54. procler/static/assets/PhEye.vue-JcPHciC2.js +1 -0
  55. procler/static/assets/PhPlay.vue-CZm7Gy3u.js +1 -0
  56. procler/static/assets/PhPlus.vue-yTWqKlSh.js +1 -0
  57. procler/static/assets/PhStop.vue-DxsqwIki.js +1 -0
  58. procler/static/assets/PhTrash.vue-DcqQbN1_.js +125 -0
  59. procler/static/assets/PhXCircle.vue-BXWmrabV.js +1 -0
  60. procler/static/assets/ProcessDetailView-DDbtIWq9.css +1 -0
  61. procler/static/assets/ProcessDetailView-DPtdNV-q.js +1 -0
  62. procler/static/assets/ProcessesView-B3a6Umur.js +1 -0
  63. procler/static/assets/ProcessesView-goLmghbJ.css +1 -0
  64. procler/static/assets/RecipesView-D2VxdneD.js +166 -0
  65. procler/static/assets/RecipesView-DXnFDCK4.css +1 -0
  66. procler/static/assets/Select-BBR17AHq.js +317 -0
  67. procler/static/assets/SnippetsView-B3a9q3AI.css +1 -0
  68. procler/static/assets/SnippetsView-DBCB2yGq.js +1 -0
  69. procler/static/assets/Spin-BXTjvFUk.js +90 -0
  70. procler/static/assets/Tag-Bh_qV63A.js +71 -0
  71. procler/static/assets/changelog-KkTT4H9-.js +1 -0
  72. procler/static/assets/groups-Zu-_v8ey.js +1 -0
  73. procler/static/assets/index-BsN-YMXq.css +1 -0
  74. procler/static/assets/index-BzW1XhyH.js +1282 -0
  75. procler/static/assets/procler-DOrSB1Vj.js +1 -0
  76. procler/static/assets/recipes-1w5SseGb.js +1 -0
  77. procler/static/index.html +17 -0
  78. procler/static/procler.png +0 -0
  79. procler-0.2.0.dist-info/METADATA +545 -0
  80. procler-0.2.0.dist-info/RECORD +83 -0
  81. procler-0.2.0.dist-info/WHEEL +4 -0
  82. procler-0.2.0.dist-info/entry_points.txt +2 -0
  83. procler-0.2.0.dist-info/licenses/LICENSE +21 -0
procler/db.py ADDED
@@ -0,0 +1,96 @@
1
+ """Database initialization for Procler using sqler."""
2
+
3
+ import logging
4
+ from pathlib import Path
5
+
6
+ from sqler import SQLerDB
7
+
8
+ from .models import LogEntry, Process, Snippet
9
+ from .settings import get_db_path
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ # Global database instance
14
+ _db: SQLerDB | None = None
15
+
16
+ # Current schema version - increment when making breaking changes
17
+ SCHEMA_VERSION = 1
18
+
19
+
20
+ def _get_schema_version(db: SQLerDB) -> int:
21
+ """Get the current schema version from database metadata."""
22
+ try:
23
+ result = db.execute_sql(
24
+ "SELECT value FROM procler_meta WHERE key = 'schema_version'"
25
+ )
26
+ if result and len(result) > 0:
27
+ return int(result[0].get("value", 0))
28
+ return 0
29
+ except Exception:
30
+ # Table doesn't exist yet
31
+ return 0
32
+
33
+
34
+ def _set_schema_version(db: SQLerDB, version: int) -> None:
35
+ """Set the schema version in database metadata."""
36
+ db.execute_sql("""
37
+ CREATE TABLE IF NOT EXISTS procler_meta (
38
+ key TEXT PRIMARY KEY,
39
+ value TEXT
40
+ )
41
+ """)
42
+ db.execute_sql(
43
+ f"INSERT OR REPLACE INTO procler_meta (key, value) VALUES ('schema_version', '{version}')"
44
+ )
45
+
46
+
47
+ def _run_migrations(db: SQLerDB, from_version: int, to_version: int) -> None:
48
+ """Run any necessary migrations between versions."""
49
+ # Future migrations would go here
50
+ # Example:
51
+ # if from_version < 2 and to_version >= 2:
52
+ # db._conn.execute("ALTER TABLE processes ADD COLUMN new_field TEXT")
53
+ pass
54
+
55
+
56
+ def init_database(db_path: Path | None = None) -> SQLerDB:
57
+ """Initialize the database and register models."""
58
+ global _db
59
+
60
+ if _db is not None:
61
+ return _db
62
+
63
+ path = db_path or get_db_path()
64
+ _db = SQLerDB.on_disk(str(path))
65
+
66
+ # Check and update schema version
67
+ current_version = _get_schema_version(_db)
68
+ if current_version < SCHEMA_VERSION:
69
+ logger.info(f"Upgrading database schema from v{current_version} to v{SCHEMA_VERSION}")
70
+ _run_migrations(_db, current_version, SCHEMA_VERSION)
71
+ _set_schema_version(_db, SCHEMA_VERSION)
72
+ elif current_version > SCHEMA_VERSION:
73
+ logger.warning(
74
+ f"Database schema v{current_version} is newer than app v{SCHEMA_VERSION}. "
75
+ "Some features may not work correctly."
76
+ )
77
+
78
+ # Register models with the database
79
+ Process.set_db(_db)
80
+ LogEntry.set_db(_db)
81
+ Snippet.set_db(_db)
82
+
83
+ return _db
84
+
85
+
86
+ def get_database() -> SQLerDB:
87
+ """Get the global database instance, initializing if needed."""
88
+ if _db is None:
89
+ return init_database()
90
+ return _db
91
+
92
+
93
+ def reset_database() -> None:
94
+ """Reset the global database instance (useful for testing)."""
95
+ global _db
96
+ _db = None
procler/logging.py ADDED
@@ -0,0 +1,41 @@
1
+ """Logging configuration using loguru."""
2
+
3
+ import os
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ from loguru import logger
8
+
9
+ # Remove default handler
10
+ logger.remove()
11
+
12
+ # Determine log level from environment
13
+ LOG_LEVEL = os.environ.get("PROCLER_LOG_LEVEL", "INFO").upper()
14
+ LOG_FILE = os.environ.get("PROCLER_LOG_FILE", "")
15
+
16
+ # Console handler with color
17
+ logger.add(
18
+ sys.stderr,
19
+ level=LOG_LEVEL,
20
+ format=(
21
+ "<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | "
22
+ "<cyan>{name}</cyan>:<cyan>{function}</cyan> - <level>{message}</level>"
23
+ ),
24
+ colorize=True,
25
+ )
26
+
27
+ # File handler if specified
28
+ if LOG_FILE:
29
+ log_path = Path(LOG_FILE)
30
+ log_path.parent.mkdir(parents=True, exist_ok=True)
31
+ logger.add(
32
+ LOG_FILE,
33
+ level=LOG_LEVEL,
34
+ format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
35
+ rotation="10 MB",
36
+ retention="7 days",
37
+ compression="gz",
38
+ )
39
+
40
+ # Export configured logger
41
+ __all__ = ["logger"]
procler/models.py ADDED
@@ -0,0 +1,130 @@
1
+ """Data models for Procler using sqler."""
2
+
3
+ from dataclasses import dataclass
4
+ from datetime import datetime
5
+ from enum import Enum
6
+
7
+ from sqler import SQLerModel
8
+
9
+
10
+ class ProcessStatus(str, Enum):
11
+ """Status of a managed process."""
12
+
13
+ STOPPED = "stopped"
14
+ STARTING = "starting"
15
+ RUNNING = "running"
16
+ STOPPING = "stopping"
17
+ ERROR = "error"
18
+
19
+
20
+ class ContextType(str, Enum):
21
+ """Execution context type."""
22
+
23
+ LOCAL = "local"
24
+ DOCKER = "docker"
25
+
26
+
27
+ class LogStream(str, Enum):
28
+ """Log stream type."""
29
+
30
+ STDOUT = "stdout"
31
+ STDERR = "stderr"
32
+
33
+
34
+ # SQLer Models for database persistence
35
+
36
+
37
+ class Process(SQLerModel):
38
+ """Process definition stored in database."""
39
+
40
+ name: str
41
+ command: str
42
+ context_type: str = "local"
43
+ display_name: str | None = None
44
+ container_name: str | None = None
45
+ cwd: str | None = None
46
+ env: dict[str, str] | None = None
47
+ auto_restart: bool = False
48
+ restart_delay_seconds: int = 5
49
+ tags: list[str] | None = None
50
+ created_at: str | None = None
51
+ updated_at: str | None = None
52
+
53
+ # Daemon mode configuration
54
+ daemon_mode: bool = False
55
+ daemon_match_pattern: str | None = None
56
+ daemon_pidfile: str | None = None
57
+ daemon_container: str | None = None # Container for daemon detection
58
+ adopt_existing: bool = False
59
+
60
+ # Log file for capturing output (used when process started via CLI or adopted)
61
+ log_file: str | None = None # Default: /tmp/procler/{name}.log
62
+
63
+ # Runtime state (stored with the process)
64
+ status: str = "stopped"
65
+ pid: int | None = None
66
+ started_at: str | None = None
67
+ exit_code: int | None = None
68
+ error_message: str | None = None
69
+ adopted: bool = False # Was this process adopted from an existing daemon?
70
+
71
+ def get_context_type(self) -> ContextType:
72
+ return ContextType(self.context_type)
73
+
74
+ def get_status(self) -> ProcessStatus:
75
+ return ProcessStatus(self.status)
76
+
77
+ @property
78
+ def uptime_seconds(self) -> int | None:
79
+ if self.started_at and self.status == ProcessStatus.RUNNING.value:
80
+ started = datetime.fromisoformat(self.started_at)
81
+ return int((datetime.now() - started).total_seconds())
82
+ return None
83
+
84
+
85
+ class LogEntry(SQLerModel):
86
+ """Log entry stored in database."""
87
+
88
+ process_id: int
89
+ stream: str = "stdout"
90
+ line: str = ""
91
+ timestamp: str | None = None
92
+
93
+ def get_stream(self) -> LogStream:
94
+ return LogStream(self.stream)
95
+
96
+
97
+ class Snippet(SQLerModel):
98
+ """Command snippet stored in database."""
99
+
100
+ name: str
101
+ command: str
102
+ description: str | None = None
103
+ context_type: str = "local"
104
+ container_name: str | None = None
105
+ tags: list[str] | None = None
106
+ created_at: str | None = None
107
+
108
+ def get_context_type(self) -> ContextType:
109
+ return ContextType(self.context_type)
110
+
111
+
112
+ # JSON response envelope types (not stored in DB)
113
+
114
+
115
+ @dataclass
116
+ class SuccessResponse:
117
+ """Successful JSON response."""
118
+
119
+ success: bool = True
120
+ data: dict | None = None
121
+
122
+
123
+ @dataclass
124
+ class ErrorResponse:
125
+ """Error JSON response."""
126
+
127
+ success: bool = False
128
+ error: str = ""
129
+ error_code: str | None = None
130
+ suggestion: str | None = None
procler/py.typed ADDED
File without changes
procler/settings.py ADDED
@@ -0,0 +1,29 @@
1
+ """Default settings for Procler."""
2
+
3
+ import os
4
+ from pathlib import Path
5
+
6
+ # Default paths
7
+ DEFAULT_DATA_DIR = Path(os.environ.get("PROCLER_DATA_DIR", Path.home() / ".procler"))
8
+ DEFAULT_DB_PATH = DEFAULT_DATA_DIR / "procler.db"
9
+
10
+ # Server defaults
11
+ DEFAULT_HOST = "127.0.0.1"
12
+ DEFAULT_PORT = 8000
13
+
14
+ # Process defaults
15
+ DEFAULT_RESTART_DELAY_SECONDS = 5
16
+ DEFAULT_LOG_TAIL_LINES = 100
17
+ DEFAULT_LOG_RETENTION_LINES = 10000
18
+
19
+
20
+ def get_data_dir() -> Path:
21
+ """Get the data directory, creating it if necessary."""
22
+ data_dir = Path(os.environ.get("PROCLER_DATA_DIR", DEFAULT_DATA_DIR))
23
+ data_dir.mkdir(parents=True, exist_ok=True)
24
+ return data_dir
25
+
26
+
27
+ def get_db_path() -> Path:
28
+ """Get the database file path."""
29
+ return Path(os.environ.get("PROCLER_DB_PATH", get_data_dir() / "procler.db"))
@@ -0,0 +1,4 @@
1
+ import{_ as N}from"./procler-DOrSB1Vj.js";import{d as H,m as c,p as v,c as i,f as r,q as y,j as _,a,s as w,r as z,o as C,b as s,t as o,w as n,e as l,y as B,B as L,h as g,N as $,_ as P}from"./index-BzW1XhyH.js";import{N as V}from"./Tag-Bh_qV63A.js";import{N as q,a as b}from"./Grid-CZ9QVKAT.js";import{N as j}from"./Code-HTS-H1S6.js";const I=["width","height","fill","transform"],D={key:0},E=a("path",{d:"M228,104a12,12,0,0,1-24,0V69l-59.51,59.51a12,12,0,0,1-17-17L187,52H152a12,12,0,0,1,0-24h64a12,12,0,0,1,12,12Zm-44,24a12,12,0,0,0-12,12v64H52V84h64a12,12,0,0,0,0-24H48A20,20,0,0,0,28,80V208a20,20,0,0,0,20,20H176a20,20,0,0,0,20-20V140A12,12,0,0,0,184,128Z"},null,-1),F=[E],G={key:1},W=a("path",{d:"M184,80V208a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V80a8,8,0,0,1,8-8H176A8,8,0,0,1,184,80Z",opacity:"0.2"},null,-1),T=a("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"},null,-1),O=[W,T],Q={key:2},R=a("path",{d:"M192,136v72a16,16,0,0,1-16,16H48a16,16,0,0,1-16-16V80A16,16,0,0,1,48,64h72a8,8,0,0,1,0,16H48V208H176V136a8,8,0,0,1,16,0Zm32-96a8,8,0,0,0-8-8H152a8,8,0,0,0-5.66,13.66L172.69,72l-42.35,42.34a8,8,0,0,0,11.32,11.32L184,83.31l26.34,26.35A8,8,0,0,0,224,104Z"},null,-1),J=[R],K={key:3},U=a("path",{d:"M222,104a6,6,0,0,1-12,0V54.49l-69.75,69.75a6,6,0,0,1-8.48-8.48L201.51,46H152a6,6,0,0,1,0-12h64a6,6,0,0,1,6,6Zm-38,26a6,6,0,0,0-6,6v72a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V80a2,2,0,0,1,2-2h72a6,6,0,0,0,0-12H48A14,14,0,0,0,34,80V208a14,14,0,0,0,14,14H176a14,14,0,0,0,14-14V136A6,6,0,0,0,184,130Z"},null,-1),X=[U],Y={key:4},x=a("path",{d:"M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"},null,-1),a0=[x],e0={key:5},t0=a("path",{d:"M220,104a4,4,0,0,1-8,0V49.66l-73.16,73.17a4,4,0,0,1-5.66-5.66L206.34,44H152a4,4,0,0,1,0-8h64a4,4,0,0,1,4,4Zm-36,28a4,4,0,0,0-4,4v72a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V80a4,4,0,0,1,4-4h72a4,4,0,0,0,0-8H48A12,12,0,0,0,36,80V208a12,12,0,0,0,12,12H176a12,12,0,0,0,12-12V136A4,4,0,0,0,184,132Z"},null,-1),l0=[t0],s0={name:"PhArrowSquareOut"},S=H({...s0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(f){const u=f,h=c("weight","regular"),e=c("size","1em"),t=c("color","currentColor"),A=c("mirrored",!1),d=v(()=>u.weight??h),p=v(()=>u.size??e),Z=v(()=>u.color??t),k=v(()=>u.mirrored!==void 0?u.mirrored?"scale(-1, 1)":void 0:A?"scale(-1, 1)":void 0);return(m,M)=>(r(),i("svg",w({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:p.value,height:p.value,fill:Z.value,transform:k.value},m.$attrs),[y(m.$slots,"default"),d.value==="bold"?(r(),i("g",D,F)):d.value==="duotone"?(r(),i("g",G,O)):d.value==="fill"?(r(),i("g",Q,J)):d.value==="light"?(r(),i("g",K,X)):d.value==="regular"?(r(),i("g",Y,a0)):d.value==="thin"?(r(),i("g",e0,l0)):_("",!0)],16,I))}}),o0=["width","height","fill","transform"],i0={key:0},r0=a("path",{d:"M212.62,75.17A63.7,63.7,0,0,0,206.39,26,12,12,0,0,0,196,20a63.71,63.71,0,0,0-50,24H126A63.71,63.71,0,0,0,76,20a12,12,0,0,0-10.39,6,63.7,63.7,0,0,0-6.23,49.17A61.5,61.5,0,0,0,52,104v8a60.1,60.1,0,0,0,45.76,58.28A43.66,43.66,0,0,0,92,192v4H76a20,20,0,0,1-20-20,44.05,44.05,0,0,0-44-44,12,12,0,0,0,0,24,20,20,0,0,1,20,20,44.05,44.05,0,0,0,44,44H92v12a12,12,0,0,0,24,0V192a20,20,0,0,1,40,0v40a12,12,0,0,0,24,0V192a43.66,43.66,0,0,0-5.76-21.72A60.1,60.1,0,0,0,220,112v-8A61.5,61.5,0,0,0,212.62,75.17ZM196,112a36,36,0,0,1-36,36H112a36,36,0,0,1-36-36v-8a37.87,37.87,0,0,1,6.13-20.12,11.65,11.65,0,0,0,1.58-11.49,39.9,39.9,0,0,1-.4-27.72,39.87,39.87,0,0,1,26.41,17.8A12,12,0,0,0,119.82,68h32.35a12,12,0,0,0,10.11-5.53,39.84,39.84,0,0,1,26.41-17.8,39.9,39.9,0,0,1-.4,27.72,12,12,0,0,0,1.61,11.53A37.85,37.85,0,0,1,196,104Z"},null,-1),n0=[r0],u0={key:1},d0=a("path",{d:"M208,104v8a48,48,0,0,1-48,48H136a32,32,0,0,1,32,32v40H104V192a32,32,0,0,1,32-32H112a48,48,0,0,1-48-48v-8a49.28,49.28,0,0,1,8.51-27.3A51.92,51.92,0,0,1,76,32a52,52,0,0,1,43.83,24h32.34A52,52,0,0,1,196,32a51.92,51.92,0,0,1,3.49,44.7A49.28,49.28,0,0,1,208,104Z",opacity:"0.2"},null,-1),c0=a("path",{d:"M208.3,75.68A59.74,59.74,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58,58,0,0,0,208.3,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.76,41.76,0,0,1,200,104Z"},null,-1),v0=[d0,c0],h0={key:2},p0=a("path",{d:"M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z"},null,-1),m0=[p0],g0={key:3},A0=a("path",{d:"M206.13,75.92A57.79,57.79,0,0,0,201.2,29a6,6,0,0,0-5.2-3,57.77,57.77,0,0,0-47,24H123A57.77,57.77,0,0,0,76,26a6,6,0,0,0-5.2,3,57.79,57.79,0,0,0-4.93,46.92A55.88,55.88,0,0,0,58,104v8a54.06,54.06,0,0,0,50.45,53.87A37.85,37.85,0,0,0,98,192v10H72a26,26,0,0,1-26-26A38,38,0,0,0,8,138a6,6,0,0,0,0,12,26,26,0,0,1,26,26,38,38,0,0,0,38,38H98v18a6,6,0,0,0,12,0V192a26,26,0,0,1,52,0v40a6,6,0,0,0,12,0V192a37.85,37.85,0,0,0-10.45-26.13A54.06,54.06,0,0,0,214,112v-8A55.88,55.88,0,0,0,206.13,75.92ZM202,112a42,42,0,0,1-42,42H112a42,42,0,0,1-42-42v-8a43.86,43.86,0,0,1,7.3-23.69,6,6,0,0,0,.81-5.76,45.85,45.85,0,0,1,1.43-36.42,45.85,45.85,0,0,1,35.23,21.1A6,6,0,0,0,119.83,62h32.34a6,6,0,0,0,5.06-2.76,45.83,45.83,0,0,1,35.23-21.11,45.85,45.85,0,0,1,1.43,36.42,6,6,0,0,0,.79,5.74A43.78,43.78,0,0,1,202,104Z"},null,-1),f0=[A0],$0={key:4},V0=a("path",{d:"M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z"},null,-1),b0=[V0],Z0={key:5},k0=a("path",{d:"M203.94,76.16A55.73,55.73,0,0,0,199.46,30,4,4,0,0,0,196,28a55.78,55.78,0,0,0-46,24H122A55.78,55.78,0,0,0,76,28a4,4,0,0,0-3.46,2,55.73,55.73,0,0,0-4.48,46.16A53.78,53.78,0,0,0,60,104v8a52.06,52.06,0,0,0,52,52h1.41A36,36,0,0,0,100,192v12H72a28,28,0,0,1-28-28A36,36,0,0,0,8,140a4,4,0,0,0,0,8,28,28,0,0,1,28,28,36,36,0,0,0,36,36h28v20a4,4,0,0,0,8,0V192a28,28,0,0,1,56,0v40a4,4,0,0,0,8,0V192a36,36,0,0,0-13.41-28H160a52.06,52.06,0,0,0,52-52v-8A53.78,53.78,0,0,0,203.94,76.16ZM204,112a44.05,44.05,0,0,1-44,44H112a44.05,44.05,0,0,1-44-44v-8a45.76,45.76,0,0,1,7.71-24.89,4,4,0,0,0,.53-3.84,47.82,47.82,0,0,1,2.1-39.21,47.8,47.8,0,0,1,38.12,22.1A4,4,0,0,0,119.83,60h32.34a4,4,0,0,0,3.37-1.84,47.8,47.8,0,0,1,38.12-22.1,47.82,47.82,0,0,1,2.1,39.21,4,4,0,0,0,.53,3.83A45.85,45.85,0,0,1,204,104Z"},null,-1),H0=[k0],y0={name:"PhGithubLogo"},_0=H({...y0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(f){const u=f,h=c("weight","regular"),e=c("size","1em"),t=c("color","currentColor"),A=c("mirrored",!1),d=v(()=>u.weight??h),p=v(()=>u.size??e),Z=v(()=>u.color??t),k=v(()=>u.mirrored!==void 0?u.mirrored?"scale(-1, 1)":void 0:A?"scale(-1, 1)":void 0);return(m,M)=>(r(),i("svg",w({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:p.value,height:p.value,fill:Z.value,transform:k.value},m.$attrs),[y(m.$slots,"default"),d.value==="bold"?(r(),i("g",i0,n0)):d.value==="duotone"?(r(),i("g",u0,v0)):d.value==="fill"?(r(),i("g",h0,m0)):d.value==="light"?(r(),i("g",g0,f0)):d.value==="regular"?(r(),i("g",$0,b0)):d.value==="thin"?(r(),i("g",Z0,H0)):_("",!0)],16,o0))}}),w0=["width","height","fill","transform"],M0={key:0},L0=a("path",{d:"M225.6,62.64l-88-48.17a19.91,19.91,0,0,0-19.2,0l-88,48.17A20,20,0,0,0,20,80.19v95.62a20,20,0,0,0,10.4,17.55l88,48.17a19.89,19.89,0,0,0,19.2,0l88-48.17A20,20,0,0,0,236,175.81V80.19A20,20,0,0,0,225.6,62.64ZM128,36.57,200,76,178.57,87.73l-72-39.42Zm0,78.83L56,76,81.56,62l72,39.41ZM44,96.79l72,39.4v76.67L44,173.44Zm96,116.07V136.19l24-13.13V152a12,12,0,0,0,24,0V109.92l24-13.13v76.65Z"},null,-1),S0=[L0],N0={key:1},z0=a("path",{d:"M128,129.09V232a8,8,0,0,1-3.84-1l-88-48.18a8,8,0,0,1-4.16-7V80.18a8,8,0,0,1,.7-3.25Z",opacity:"0.2"},null,-1),C0=a("path",{d:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32l80.34,44-29.77,16.3-80.35-44ZM128,120,47.66,76l33.9-18.56,80.34,44ZM40,90l80,43.78v85.79L40,175.82Zm176,85.78h0l-80,43.79V133.82l32-17.51V152a8,8,0,0,0,16,0V107.55L216,90v85.77Z"},null,-1),B0=[z0,C0],P0={key:2},q0=a("path",{d:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32l80.35,44L178.57,92.29l-80.35-44Zm0,88L47.65,76,81.56,57.43l80.35,44Zm88,55.85h0l-80,43.79V133.83l32-17.51V152a8,8,0,0,0,16,0V107.56l32-17.51v85.76Z"},null,-1),j0=[q0],I0={key:3},D0=a("path",{d:"M222.72,67.91l-88-48.18a13.9,13.9,0,0,0-13.44,0l-88,48.18A14,14,0,0,0,26,80.18v95.64a14,14,0,0,0,7.28,12.27l88,48.18a13.92,13.92,0,0,0,13.44,0l88-48.18A14,14,0,0,0,230,175.82V80.18A14,14,0,0,0,222.72,67.91ZM127,30.25a2,2,0,0,1,1.92,0L212.51,76,178.57,94.57,94.05,48.31ZM122,223,39,177.57a2,2,0,0,1-1-1.75V86.66l84,46ZM43.49,76,81.56,55.15l84.51,46.26L128,122.24ZM218,175.82a2,2,0,0,1-1,1.75h0L134,223V132.64l36-19.71V152a6,6,0,0,0,12,0V106.37l36-19.71Z"},null,-1),E0=[D0],F0={key:4},G0=a("path",{d:"M223.68,66.15,135.68,18a15.88,15.88,0,0,0-15.36,0l-88,48.17a16,16,0,0,0-8.32,14v95.64a16,16,0,0,0,8.32,14l88,48.17a15.88,15.88,0,0,0,15.36,0l88-48.17a16,16,0,0,0,8.32-14V80.18A16,16,0,0,0,223.68,66.15ZM128,32l80.34,44-29.77,16.3-80.35-44ZM128,120,47.66,76l33.9-18.56,80.34,44ZM40,90l80,43.78v85.79L40,175.82Zm176,85.78h0l-80,43.79V133.82l32-17.51V152a8,8,0,0,0,16,0V107.55L216,90v85.77Z"},null,-1),W0=[G0],T0={key:5},O0=a("path",{d:"M221.76,69.66l-88-48.18a12,12,0,0,0-11.52,0l-88,48.18A12,12,0,0,0,28,80.18v95.64a12,12,0,0,0,6.24,10.52l88,48.18a11.95,11.95,0,0,0,11.52,0l88-48.18A12,12,0,0,0,228,175.82V80.18A12,12,0,0,0,221.76,69.66ZM126.08,28.5a3.94,3.94,0,0,1,3.84,0L216.67,76,178.5,96.89a4,4,0,0,0-.58-.4l-88-48.18Zm1.92,96L39.33,76,81.56,52.87l88.67,48.54Zm-89.92,54.8a4,4,0,0,1-2.08-3.5V83.29l88,48.16v94.91Zm179.84,0h0l-85.92,47V131.45l40-21.89V152a4,4,0,0,0,8,0V105.18l40-21.89v92.53A4,4,0,0,1,217.92,179.32Z"},null,-1),Q0=[O0],R0={name:"PhPackage"},J0=H({...R0,props:{weight:{type:String},size:{type:[String,Number]},color:{type:String},mirrored:{type:Boolean}},setup(f){const u=f,h=c("weight","regular"),e=c("size","1em"),t=c("color","currentColor"),A=c("mirrored",!1),d=v(()=>u.weight??h),p=v(()=>u.size??e),Z=v(()=>u.color??t),k=v(()=>u.mirrored!==void 0?u.mirrored?"scale(-1, 1)":void 0:A?"scale(-1, 1)":void 0);return(m,M)=>(r(),i("svg",w({xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 256 256",width:p.value,height:p.value,fill:Z.value,transform:k.value},m.$attrs),[y(m.$slots,"default"),d.value==="bold"?(r(),i("g",M0,S0)):d.value==="duotone"?(r(),i("g",N0,B0)):d.value==="fill"?(r(),i("g",P0,j0)):d.value==="light"?(r(),i("g",I0,E0)):d.value==="regular"?(r(),i("g",F0,W0)):d.value==="thin"?(r(),i("g",T0,Q0)):_("",!0)],16,w0))}}),K0={class:"about-view"},U0={class:"hero"},X0={class:"hero-content"},Y0={class:"hero-copy"},x0={class:"hero-kicker"},a1={class:"hero-tagline"},e1={class:"hero-actions"},t1={class:"hero-tags"},l1={class:"bullet-list"},s1={class:"tech-grid"},o1={class:"tech-item"},i1={class:"tech-label"},r1={class:"tech-item"},n1={class:"tech-label"},u1={class:"tech-item"},d1={class:"tech-label"},c1={class:"tech-item"},v1={class:"tech-label"},h1={class:"tech-item"},p1={class:"tech-label"},m1={class:"links-list"},g1={href:"https://github.com/gabu-quest/procler",target:"_blank",rel:"noopener noreferrer",class:"link-item"},A1={href:"https://pypi.org/project/procler/",target:"_blank",rel:"noopener noreferrer",class:"link-item"},f1={class:"version-grid"},$1={class:"version-item"},V1={class:"version-label"},b1={class:"version-item"},Z1={class:"version-label"},k1=`procler define --name api --command "uvicorn main:app"
2
+ procler start api
3
+ procler status api
4
+ procler logs api --tail 50`,H1=H({__name:"AboutView",setup(f){const u=B(),h=z("0.1.0");return C(async()=>{try{const e=await fetch("/api/health");if(e.ok){const t=await e.json();t.version&&(h.value=t.version)}}catch{}}),(e,t)=>(r(),i("div",K0,[a("section",U0,[t[4]||(t[4]=a("div",{class:"hero-glow"},null,-1)),a("div",X0,[t[3]||(t[3]=a("div",{class:"logo-frame"},[a("img",{src:N,alt:"Procler logo",class:"hero-logo"})],-1)),a("div",Y0,[a("div",x0,o(e.$t("about.tagline")),1),t[2]||(t[2]=a("h1",null,"Procler",-1)),a("p",a1,o(e.$t("about.description")),1),a("div",e1,[s(l(L),{type:"primary",onClick:t[0]||(t[0]=A=>l(u).push("/processes"))},{default:n(()=>[g(o(e.$t("about.openProcesses")),1)]),_:1}),s(l(L),{secondary:"",onClick:t[1]||(t[1]=A=>l(u).push("/config"))},{default:n(()=>[g(o(e.$t("about.viewConfig")),1)]),_:1})]),a("div",t1,[s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.local")),1)]),_:1}),s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.docker")),1)]),_:1}),s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.recipes")),1)]),_:1}),s(l(V),{size:"small",bordered:!1},{default:n(()=>[g(o(e.$t("about.tags.vars")),1)]),_:1})])])])]),s(l(q),{cols:3,"x-gap":20,"y-gap":20,responsive:"screen","item-responsive":!0},{default:n(()=>[s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.whatItDoes.title"),class:"info-card"},{default:n(()=>[a("p",null,o(e.$t("about.whatItDoes.description")),1)]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.concepts.title"),class:"info-card"},{default:n(()=>[a("ul",l1,[a("li",null,o(e.$t("about.concepts.items.processes")),1),a("li",null,o(e.$t("about.concepts.items.contexts")),1),a("li",null,o(e.$t("about.concepts.items.recipes")),1),a("li",null,o(e.$t("about.concepts.items.vars")),1)])]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.quickStart.title"),class:"info-card"},{default:n(()=>[s(l(j),{code:k1,class:"quick-code"})]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.techStack.title"),class:"info-card tech-stack-card"},{default:n(()=>[a("div",s1,[a("div",o1,[a("span",i1,o(e.$t("about.techStack.backend")),1),t[5]||(t[5]=a("span",{class:"tech-value"},"Python 3.12+, FastAPI",-1))]),a("div",r1,[a("span",n1,o(e.$t("about.techStack.database")),1),t[6]||(t[6]=a("span",{class:"tech-value"},"SQLite + sqler",-1))]),a("div",u1,[a("span",d1,o(e.$t("about.techStack.frontend")),1),t[7]||(t[7]=a("span",{class:"tech-value"},"Vue 3, Vite, Pinia",-1))]),a("div",c1,[a("span",v1,o(e.$t("about.techStack.cli")),1),t[8]||(t[8]=a("span",{class:"tech-value"},"Click",-1))]),a("div",h1,[a("span",p1,o(e.$t("about.techStack.realtime")),1),t[9]||(t[9]=a("span",{class:"tech-value"},"WebSockets",-1))])])]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{title:e.$t("about.links.title"),class:"info-card links-card"},{default:n(()=>[a("div",m1,[a("a",g1,[s(l(_0),{class:"link-icon"}),a("span",null,o(e.$t("about.links.github")),1),s(l(S),{class:"link-external"})]),a("a",A1,[s(l(J0),{class:"link-icon"}),a("span",null,o(e.$t("about.links.pypi")),1),s(l(S),{class:"link-external"})])])]),_:1},8,["title"])]),_:1}),s(l(b),{span:"3 m:1"},{default:n(()=>[s(l($),{class:"info-card version-card"},{default:n(()=>[a("div",f1,[a("div",$1,[a("span",V1,o(e.$t("about.version")),1),s(l(V),{type:"primary",size:"small"},{default:n(()=>[g("v"+o(h.value),1)]),_:1})]),a("div",b1,[a("span",Z1,o(e.$t("about.license")),1),s(l(V),{size:"small"},{default:n(()=>[...t[10]||(t[10]=[g("MIT",-1)])]),_:1})])])]),_:1})]),_:1})]),_:1})]))}}),S1=P(H1,[["__scopeId","data-v-233d7d05"]]);export{S1 as default};
@@ -0,0 +1 @@
1
+ .about-view[data-v-233d7d05]{max-width:1200px;margin:0 auto}.hero[data-v-233d7d05]{position:relative;padding:2.5rem 2rem;border-radius:18px;background:radial-gradient(circle at top left,rgba(0,229,255,.16),transparent 45%),radial-gradient(circle at 20% 120%,rgba(255,43,214,.12),transparent 55%),var(--n-card-color);border:1px solid var(--n-border-color);margin-bottom:2rem;overflow:hidden}.hero-glow[data-v-233d7d05]{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(120deg,rgba(0,229,255,.1),transparent 60%);pointer-events:none}.hero-content[data-v-233d7d05]{position:relative;display:grid;grid-template-columns:auto 1fr;gap:2rem;align-items:center}.logo-frame[data-v-233d7d05]{width:160px;height:160px;border-radius:24px;padding:10px;background:#07080d99;border:1px solid rgba(0,229,255,.25);box-shadow:0 24px 48px #0006;display:flex;align-items:center;justify-content:center}.hero-logo[data-v-233d7d05]{width:100%;height:100%;border-radius:18px;object-fit:cover}.hero-copy h1[data-v-233d7d05]{margin:0 0 .5rem;font-size:2.5rem}.hero-kicker[data-v-233d7d05]{font-size:.75rem;letter-spacing:.3em;text-transform:uppercase;color:var(--n-text-color-3);margin-bottom:.5rem}.hero-tagline[data-v-233d7d05]{color:var(--n-text-color-2);font-size:1rem;max-width:560px;margin:0 0 1.25rem}.hero-actions[data-v-233d7d05]{display:flex;gap:.75rem;flex-wrap:wrap;margin-bottom:1rem}.hero-tags[data-v-233d7d05]{display:flex;gap:.5rem;flex-wrap:wrap}.info-card p[data-v-233d7d05]{margin:0;color:var(--n-text-color-2);line-height:1.6}.bullet-list[data-v-233d7d05]{margin:0;padding-left:1.25rem;color:var(--n-text-color-2);display:grid;gap:.5rem}.quick-code[data-v-233d7d05]{display:block;font-size:.85rem;line-height:1.6;white-space:pre}.tech-grid[data-v-233d7d05]{display:grid;gap:.75rem}.tech-item[data-v-233d7d05]{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--n-border-color)}.tech-item[data-v-233d7d05]:last-child{border-bottom:none}.tech-label[data-v-233d7d05]{font-size:.8125rem;color:var(--n-text-color-3)}.tech-value[data-v-233d7d05]{font-size:.875rem;color:var(--n-text-color-1);font-family:var(--n-font-family-mono)}.links-list[data-v-233d7d05]{display:flex;flex-direction:column;gap:.5rem}.link-item[data-v-233d7d05]{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;border-radius:var(--n-border-radius);background:var(--n-code-color);color:var(--n-text-color-1);text-decoration:none;transition:all .15s ease}.link-item[data-v-233d7d05]:hover{background:var(--n-primary-color);color:var(--n-base-color)}.link-icon[data-v-233d7d05]{font-size:1.25rem}.link-external[data-v-233d7d05]{margin-left:auto;font-size:.875rem;opacity:.6}.version-grid[data-v-233d7d05]{display:flex;justify-content:space-around;gap:2rem}.version-item[data-v-233d7d05]{display:flex;flex-direction:column;align-items:center;gap:.5rem}.version-label[data-v-233d7d05]{font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--n-text-color-3)}@media(max-width:900px){.hero-content[data-v-233d7d05]{grid-template-columns:1fr}.logo-frame[data-v-233d7d05]{width:120px;height:120px}}
@@ -0,0 +1,74 @@
1
+ import{p as f,m as k,a$ as M,bx as W,U as g,V as F,X as x,ac as I,d as O,x as w,Y as V,r as q,o as U,E as j,ag as _,Z as y,a1 as D}from"./index-BzW1XhyH.js";function K(n,e){const o=k(M,null);return f(()=>n.hljs||(o==null?void 0:o.mergedHljsRef.value))}function X(n){const{textColor2:e,fontSize:o,fontWeightStrong:c,textColor3:a}=n;return{textColor:e,fontSize:o,fontWeightStrong:c,"mono-3":"#a0a1a7","hue-1":"#0184bb","hue-2":"#4078f2","hue-3":"#a626a4","hue-4":"#50a14f","hue-5":"#e45649","hue-5-2":"#c91243","hue-6":"#986801","hue-6-2":"#c18401",lineNumberTextColor:a}}const Y={common:W,self:X},Z=g([F("code",`
2
+ font-size: var(--n-font-size);
3
+ font-family: var(--n-font-family);
4
+ `,[x("show-line-numbers",`
5
+ display: flex;
6
+ `),I("line-numbers",`
7
+ user-select: none;
8
+ padding-right: 12px;
9
+ text-align: right;
10
+ transition: color .3s var(--n-bezier);
11
+ color: var(--n-line-number-text-color);
12
+ `),x("word-wrap",[g("pre",`
13
+ white-space: pre-wrap;
14
+ word-break: break-all;
15
+ `)]),g("pre",`
16
+ margin: 0;
17
+ line-height: inherit;
18
+ font-size: inherit;
19
+ font-family: inherit;
20
+ `),g("[class^=hljs]",`
21
+ color: var(--n-text-color);
22
+ transition:
23
+ color .3s var(--n-bezier),
24
+ background-color .3s var(--n-bezier);
25
+ `)]),({props:n})=>{const e=`${n.bPrefix}code`;return[`${e} .hljs-comment,
26
+ ${e} .hljs-quote {
27
+ color: var(--n-mono-3);
28
+ font-style: italic;
29
+ }`,`${e} .hljs-doctag,
30
+ ${e} .hljs-keyword,
31
+ ${e} .hljs-formula {
32
+ color: var(--n-hue-3);
33
+ }`,`${e} .hljs-section,
34
+ ${e} .hljs-name,
35
+ ${e} .hljs-selector-tag,
36
+ ${e} .hljs-deletion,
37
+ ${e} .hljs-subst {
38
+ color: var(--n-hue-5);
39
+ }`,`${e} .hljs-literal {
40
+ color: var(--n-hue-1);
41
+ }`,`${e} .hljs-string,
42
+ ${e} .hljs-regexp,
43
+ ${e} .hljs-addition,
44
+ ${e} .hljs-attribute,
45
+ ${e} .hljs-meta-string {
46
+ color: var(--n-hue-4);
47
+ }`,`${e} .hljs-built_in,
48
+ ${e} .hljs-class .hljs-title {
49
+ color: var(--n-hue-6-2);
50
+ }`,`${e} .hljs-attr,
51
+ ${e} .hljs-variable,
52
+ ${e} .hljs-template-variable,
53
+ ${e} .hljs-type,
54
+ ${e} .hljs-selector-class,
55
+ ${e} .hljs-selector-attr,
56
+ ${e} .hljs-selector-pseudo,
57
+ ${e} .hljs-number {
58
+ color: var(--n-hue-6);
59
+ }`,`${e} .hljs-symbol,
60
+ ${e} .hljs-bullet,
61
+ ${e} .hljs-link,
62
+ ${e} .hljs-meta,
63
+ ${e} .hljs-selector-id,
64
+ ${e} .hljs-title {
65
+ color: var(--n-hue-2);
66
+ }`,`${e} .hljs-emphasis {
67
+ font-style: italic;
68
+ }`,`${e} .hljs-strong {
69
+ font-weight: var(--n-font-weight-strong);
70
+ }`,`${e} .hljs-link {
71
+ text-decoration: underline;
72
+ }`]}]),A=Object.assign(Object.assign({},y.props),{language:String,code:{type:String,default:""},trim:{type:Boolean,default:!0},hljs:Object,uri:Boolean,inline:Boolean,wordWrap:Boolean,showLineNumbers:Boolean,internalFontSize:Number,internalNoHighlight:Boolean}),J=O({name:"Code",props:A,setup(n,{slots:e}){const{internalNoHighlight:o}=n,{mergedClsPrefixRef:c,inlineThemeDisabled:a}=V(),h=q(null),b=o?{value:void 0}:K(n),N=(t,r,l)=>{const{value:s}=b;return!s||!(t&&s.getLanguage(t))?null:s.highlight(l?r.trim():r,{language:t}).value},z=f(()=>n.inline||n.wordWrap?!1:n.showLineNumbers),m=()=>{if(e.default)return;const{value:t}=h;if(!t)return;const{language:r}=n,l=n.uri?window.decodeURIComponent(n.code):n.code;if(r){const i=N(r,l,n.trim);if(i!==null){if(n.inline)t.innerHTML=i;else{const $=t.querySelector(".__code__");$&&t.removeChild($);const d=document.createElement("pre");d.className="__code__",d.innerHTML=i,t.appendChild(d)}return}}if(n.inline){t.textContent=l;return}const s=t.querySelector(".__code__");if(s)s.textContent=l;else{const i=document.createElement("pre");i.className="__code__",i.textContent=l,t.innerHTML="",t.appendChild(i)}};U(m),j(_(n,"language"),m),j(_(n,"code"),m),o||j(b,m);const R=y("Code","-code",Z,Y,n,c),v=f(()=>{const{common:{cubicBezierEaseInOut:t,fontFamilyMono:r},self:{textColor:l,fontSize:s,fontWeightStrong:i,lineNumberTextColor:$,"mono-3":d,"hue-1":S,"hue-2":L,"hue-3":p,"hue-4":H,"hue-5":E,"hue-5-2":P,"hue-6":B,"hue-6-2":T}}=R.value,{internalFontSize:C}=n;return{"--n-font-size":C?`${C}px`:s,"--n-font-family":r,"--n-font-weight-strong":i,"--n-bezier":t,"--n-text-color":l,"--n-mono-3":d,"--n-hue-1":S,"--n-hue-2":L,"--n-hue-3":p,"--n-hue-4":H,"--n-hue-5":E,"--n-hue-5-2":P,"--n-hue-6":B,"--n-hue-6-2":T,"--n-line-number-text-color":$}}),u=a?D("code",f(()=>`${n.internalFontSize||"a"}`),v,n):void 0;return{mergedClsPrefix:c,codeRef:h,mergedShowLineNumbers:z,lineNumbers:f(()=>{let t=1;const r=[];let l=!1;for(const s of n.code)s===`
73
+ `?(l=!0,r.push(t++)):l=!1;return l||r.push(t++),r.join(`
74
+ `)}),cssVars:a?void 0:v,themeClass:u==null?void 0:u.themeClass,onRender:u==null?void 0:u.onRender}},render(){var n,e;const{mergedClsPrefix:o,wordWrap:c,mergedShowLineNumbers:a,onRender:h}=this;return h==null||h(),w("code",{class:[`${o}-code`,this.themeClass,c&&`${o}-code--word-wrap`,a&&`${o}-code--show-line-numbers`],style:this.cssVars,ref:"codeRef"},a?w("pre",{class:`${o}-code__line-numbers`},this.lineNumbers):null,(e=(n=this.$slots).default)===null||e===void 0?void 0:e.call(n))}});export{J as N};
@@ -0,0 +1 @@
1
+ .config-view[data-v-6f76d041]{max-width:1400px;margin:0 auto}.page-header[data-v-6f76d041]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}.header-title[data-v-6f76d041]{display:flex;align-items:center;gap:.5rem}.config-logo[data-v-6f76d041]{width:22px;height:22px;border-radius:6px;opacity:.75;box-shadow:0 0 0 1px #00e5ff40}.page-header h1[data-v-6f76d041]{margin:0}.error-state[data-v-6f76d041]{padding:2rem 0}.stats-grid[data-v-6f76d041]{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem}.stat-item[data-v-6f76d041]{display:flex;flex-direction:column;align-items:center;padding:1rem;background:var(--n-code-color);border-radius:var(--n-border-radius)}.stat-icon[data-v-6f76d041]{font-size:1.5rem;color:var(--n-primary-color);margin-bottom:.5rem}.stat-value[data-v-6f76d041]{font-size:1.75rem;font-weight:600;color:var(--n-text-color-1)}.stat-label[data-v-6f76d041]{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--n-text-color-3)}.changelog-empty[data-v-6f76d041],.vars-empty[data-v-6f76d041]{padding:1rem 0}.vars-hint[data-v-6f76d041]{color:var(--n-text-color-3);font-size:.8125rem;margin:0 0 .75rem}.empty-hint[data-v-6f76d041]{color:var(--n-text-color-3);font-size:.8125rem;margin:.5rem 0 0}.empty-hint code[data-v-6f76d041]{background:var(--n-code-color);padding:.125rem .375rem;border-radius:3px}.changelog-viewer[data-v-6f76d041]{max-height:400px;overflow-y:auto;font-family:var(--n-font-family-mono);font-size:.75rem;line-height:1.6;background:var(--n-code-color);border-radius:var(--n-border-radius);padding:.75rem}.changelog-entry[data-v-6f76d041]{padding:.25rem .5rem;border-left:3px solid transparent;white-space:pre-wrap;word-break:break-all}.changelog-entry[data-v-6f76d041]:hover{background:var(--n-hover-color)}.changelog-entry.action-execute[data-v-6f76d041]{border-left-color:var(--n-primary-color)}.changelog-entry.action-start[data-v-6f76d041]{border-left-color:var(--n-success-color)}.changelog-entry.action-stop[data-v-6f76d041]{border-left-color:var(--n-warning-color)}.changelog-entry.action-create[data-v-6f76d041]{border-left-color:var(--n-info-color)}@media(max-width:640px){.stats-grid[data-v-6f76d041]{grid-template-columns:repeat(2,1fr)}}
@@ -0,0 +1 @@
1
+ import{_ as G}from"./procler-DOrSB1Vj.js";import{d as I,v as P,p as y,x as $,o as R,c as d,a as n,b as t,t as i,w as a,e,B as w,f as c,h as r,l as z,j as E,N as u,at as H,J as j,i as M,z as O,F as U,k as J,n as L,_ as X}from"./index-BzW1XhyH.js";import{G as V}from"./PhArrowsClockwise.vue-DqDg31az.js";import{u as q,g as K,a as Q}from"./changelog-KkTT4H9-.js";import{u as W,N as Y,a as Z,b as x}from"./Spin-BXTjvFUk.js";import{N as g}from"./Tag-Bh_qV63A.js";import{N as C}from"./Code-HTS-H1S6.js";import{a as m,N as ee}from"./Grid-CZ9QVKAT.js";import{N as se,a as b}from"./DescriptionsItem-B2E8YbqJ.js";import{N}from"./Empty-MuygEHZM.js";import{N as T}from"./DataTable-z39TOAa4.js";import"./Input-e0xaxoWE.js";import"./Select-BBR17AHq.js";const te={class:"config-view"},ae={class:"page-header"},oe={class:"header-title"},ne={key:0,class:"error-state"},ie={class:"stats-grid"},le={class:"stat-item"},re={class:"stat-value"},ce={class:"stat-label"},de={class:"stat-item"},fe={class:"stat-value"},ge={class:"stat-label"},ue={class:"stat-item"},me={class:"stat-value"},pe={class:"stat-label"},he={class:"stat-item"},ve={class:"stat-value"},_e={class:"stat-label"},ye={key:0,class:"vars-empty"},$e={class:"empty-hint"},Ce={key:1},be={class:"vars-hint"},Ne={key:0,class:"changelog-empty"},ke={class:"empty-hint"},we={key:1,class:"changelog-empty"},ze={key:2,class:"changelog-viewer"},Ee=I({__name:"ConfigView",setup(Ve){const{t:f}=P(),o=q(),k=W(),p=y(()=>{var l;const s=((l=o.info)==null?void 0:l.vars)??{};return Object.entries(s).map(([h,_])=>({name:h,value:_}))}),D=y(()=>[{title:f("config.columns.name"),key:"name",width:160,render:s=>$(g,{size:"small",bordered:!1},{default:()=>s.name})},{title:f("config.columns.value"),key:"value",ellipsis:{tooltip:!0},render:s=>$(C,null,{default:()=>s.value})}]),B=y(()=>[{title:f("config.columns.name"),key:"name",width:150},{title:f("config.columns.context"),key:"context",width:100,render:s=>$(g,{size:"small",bordered:!1},{default:()=>s.context})},{title:f("config.columns.command"),key:"command",ellipsis:{tooltip:!0}},{title:f("config.columns.container"),key:"container",width:120,render:s=>s.container??"-"}]);function F(s){const l=K(s);return l==="EXECUTE"?"action-execute":l==="START"?"action-start":l==="STOP"?"action-stop":l==="CREATE"?"action-create":""}function S(s){return Q(s)}async function v(){await o.fetchChangelog(100)}async function A(){const s=await o.reloadConfig();s.success?(k.success(f("config.messages.reloaded")),await v(),await o.fetchProcesses()):k.error(s.error||f("config.messages.reloadFailed"))}return R(async()=>{await o.fetchInfo(),await o.fetchProcesses(),await v()}),(s,l)=>(c(),d("div",te,[n("div",ae,[n("div",oe,[l[0]||(l[0]=n("img",{src:G,alt:"Procler logo",class:"config-logo"},null,-1)),n("h1",null,i(s.$t("config.title")),1)]),t(e(w),{type:"primary",onClick:A,loading:e(o).loading},{icon:a(()=>[t(e(V))]),default:a(()=>[r(" "+i(s.$t("config.reloadConfig")),1)]),_:1},8,["loading"])]),t(e(Y),{show:e(o).loading&&!e(o).info},{default:a(()=>[e(o).error?(c(),d("div",ne,[t(e(Z),{type:"error",title:e(o).error},null,8,["title"])])):e(o).info?(c(),z(e(ee),{key:1,cols:2,"x-gap":20,"y-gap":20,responsive:"screen","item-responsive":!0},{default:a(()=>[t(e(m),{span:"2 m:1"},{default:a(()=>[t(e(u),{title:s.$t("config.configuration"),class:"status-card"},{"header-extra":a(()=>[t(e(g),{type:e(o).info.config_exists?"success":"warning",size:"small"},{default:a(()=>[r(i(e(o).info.config_exists?s.$t("common.active"):s.$t("common.notFound")),1)]),_:1},8,["type"])]),default:a(()=>[t(e(se),{column:1,"label-placement":"left"},{default:a(()=>[t(e(b),{label:s.$t("config.labels.configDirectory")},{default:a(()=>[t(e(C),null,{default:a(()=>[r(i(e(o).info.config_dir),1)]),_:1})]),_:1},8,["label"]),t(e(b),{label:s.$t("config.labels.configFile")},{default:a(()=>[t(e(C),null,{default:a(()=>[r(i(e(o).info.config_file),1)]),_:1}),t(e(g),{type:e(o).info.config_exists?"success":"default",size:"small",style:{"margin-left":"0.5rem"}},{default:a(()=>[r(i(e(o).info.config_exists?s.$t("common.exists"):s.$t("common.missing")),1)]),_:1},8,["type"])]),_:1},8,["label"]),t(e(b),{label:s.$t("config.labels.version")},{default:a(()=>[r(" v"+i(e(o).info.version),1)]),_:1},8,["label"])]),_:1})]),_:1},8,["title"])]),_:1}),t(e(m),{span:"2 m:1"},{default:a(()=>[t(e(u),{title:s.$t("config.definedInConfig"),class:"stats-card"},{default:a(()=>[n("div",ie,[n("div",le,[t(e(H),{class:"stat-icon"}),n("div",re,i(e(o).info.stats.processes),1),n("div",ce,i(s.$t("nav.processes")),1)]),n("div",de,[t(e(j),{class:"stat-icon"}),n("div",fe,i(e(o).info.stats.groups),1),n("div",ge,i(s.$t("nav.groups")),1)]),n("div",ue,[t(e(M),{class:"stat-icon"}),n("div",me,i(e(o).info.stats.recipes),1),n("div",pe,i(s.$t("nav.recipes")),1)]),n("div",he,[t(e(O),{class:"stat-icon"}),n("div",ve,i(e(o).info.stats.snippets),1),n("div",_e,i(s.$t("nav.snippets")),1)])])]),_:1},8,["title"])]),_:1}),t(e(m),{span:"2 m:1"},{default:a(()=>[t(e(u),{title:s.$t("config.variables"),class:"vars-card"},{"header-extra":a(()=>[t(e(g),{type:p.value.length>0?"info":"default",size:"small"},{default:a(()=>[r(i(s.$t("config.variablesCount",{count:p.value.length})),1)]),_:1},8,["type"])]),default:a(()=>[p.value.length===0?(c(),d("div",ye,[t(e(N),{description:s.$t("config.noVariables"),size:"small"},{extra:a(()=>[n("p",$e,[r(i(s.$t("config.addVarsHint",{vars:"",config:""})),1),l[1]||(l[1]=n("code",null,"vars:",-1)),l[2]||(l[2]=r()),l[3]||(l[3]=n("code",null,".procler/config.yaml",-1))])]),_:1},8,["description"])])):(c(),d("div",Ce,[n("p",be,[r(i(s.$t("config.varsUsageHint",{syntax:""})),1),l[4]||(l[4]=n("code",null,"${VAR}",-1))]),t(e(T),{columns:D.value,data:p.value,bordered:!1,size:"small"},null,8,["columns","data"])]))]),_:1},8,["title"])]),_:1}),t(e(m),{span:"2"},{default:a(()=>[t(e(u),{title:s.$t("config.changelog"),class:"changelog-card"},{"header-extra":a(()=>[t(e(x),{size:"small"},{default:a(()=>[t(e(w),{size:"small",onClick:v},{icon:a(()=>[t(e(V))]),default:a(()=>[r(" "+i(s.$t("common.refresh")),1)]),_:1}),t(e(g),{type:e(o).info.changelog_exists?"success":"default",size:"small"},{default:a(()=>[r(i(e(o).info.changelog_exists?s.$t("common.tracking"):s.$t("common.noChangelog")),1)]),_:1},8,["type"])]),_:1})]),default:a(()=>[e(o).info.changelog_exists?e(o).changelog.length===0?(c(),d("div",we,[t(e(N),{description:s.$t("config.changelogEmpty"),size:"small"},null,8,["description"])])):(c(),d("div",ze,[(c(!0),d(U,null,J(e(o).changelog,(h,_)=>(c(),d("div",{key:_,class:L(["changelog-entry",F(h)])},i(S(h)),3))),128))])):(c(),d("div",Ne,[t(e(N),{description:s.$t("config.noChangelog"),size:"small"},{extra:a(()=>[n("p",ke,[r(i(s.$t("config.changelogHint",{file:""})),1),l[5]||(l[5]=n("code",null,"changelog.log",-1))])]),_:1},8,["description"])]))]),_:1},8,["title"])]),_:1}),e(o).processes.length>0?(c(),z(e(m),{key:0,span:"2"},{default:a(()=>[t(e(u),{title:s.$t("config.processDefinitions")},{default:a(()=>[t(e(T),{columns:B.value,data:e(o).processes,bordered:!1,size:"small"},null,8,["columns","data"])]),_:1},8,["title"])]),_:1})):E("",!0)]),_:1})):E("",!0)]),_:1},8,["show"])]))}}),Oe=X(Ee,[["__scopeId","data-v-6f76d041"]]);export{Oe as default};
@@ -0,0 +1 @@
1
+ .dashboard-view[data-v-b23c65b5]{max-width:1400px;margin:0 auto}.page-header[data-v-b23c65b5]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem}.header-title[data-v-b23c65b5]{display:flex;align-items:center;gap:.75rem}.dashboard-logo[data-v-b23c65b5]{width:72px;height:72px;border-radius:14px;box-shadow:0 0 0 1px #00e5ff38,0 18px 32px #0006}.page-header h1[data-v-b23c65b5]{margin:0}.stats-row[data-v-b23c65b5]{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;margin-bottom:1.5rem}@media(max-width:768px){.stats-row[data-v-b23c65b5]{grid-template-columns:repeat(2,1fr)}}.stat-card[data-v-b23c65b5]{transition:transform .15s ease,box-shadow .15s ease}.stat-card[data-v-b23c65b5]:hover{transform:translateY(-2px)}.stat-card.has-running[data-v-b23c65b5]{border-color:var(--n-success-color);box-shadow:0 0 20px #a8ff6026}.stat-content[data-v-b23c65b5]{display:flex;align-items:center;gap:1rem}.stat-icon-wrapper[data-v-b23c65b5]{width:48px;height:48px;display:flex;align-items:center;justify-content:center;border-radius:12px;background:var(--n-code-color)}.stat-icon-wrapper.running[data-v-b23c65b5]{background:#a8ff6026;color:var(--n-success-color)}.stat-icon-wrapper.processes[data-v-b23c65b5]{background:#00e5ff26;color:var(--n-primary-color)}.stat-icon-wrapper.groups[data-v-b23c65b5]{background:#ff2bd626;color:var(--n-info-color)}.stat-icon-wrapper.recipes[data-v-b23c65b5]{background:#ffcc0026;color:var(--n-warning-color)}.stat-icon[data-v-b23c65b5]{font-size:1.5rem}.stat-info[data-v-b23c65b5]{display:flex;flex-direction:column}.stat-value[data-v-b23c65b5]{font-size:1.75rem;font-weight:600;line-height:1}.stat-label[data-v-b23c65b5]{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--n-text-color-3);margin-top:.25rem}.view-all-link[data-v-b23c65b5]{font-size:.8125rem;color:var(--n-primary-color);text-decoration:none}.view-all-link[data-v-b23c65b5]:hover{text-decoration:underline}.empty-placeholder[data-v-b23c65b5]{padding:1.5rem 0}.empty-hint[data-v-b23c65b5]{color:var(--n-text-color-3);font-size:.8125rem;margin:.5rem 0 0}.empty-hint code[data-v-b23c65b5]{background:var(--n-code-color);padding:.125rem .375rem;border-radius:3px}.process-list[data-v-b23c65b5]{display:flex;flex-direction:column;gap:.5rem}.process-item[data-v-b23c65b5]{display:flex;align-items:center;gap:.75rem;padding:.5rem;border-radius:var(--n-border-radius);cursor:pointer;transition:background .15s ease}.process-item[data-v-b23c65b5]:hover{background:var(--n-hover-color)}.status-dot[data-v-b23c65b5]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.status-dot.running[data-v-b23c65b5]{background:var(--n-success-color);box-shadow:0 0 8px var(--n-success-color)}.status-dot.stopped[data-v-b23c65b5]{background:var(--n-text-color-3)}.status-dot.failed[data-v-b23c65b5]{background:var(--n-error-color)}.process-name[data-v-b23c65b5]{flex:1;font-family:var(--n-font-family-mono);font-size:.875rem}.status-tags[data-v-b23c65b5]{display:flex;align-items:center;gap:.35rem;flex-wrap:wrap}.more-indicator[data-v-b23c65b5]{text-align:center;font-size:.8125rem;color:var(--n-text-color-3);padding:.5rem}.quick-actions[data-v-b23c65b5]{display:flex;flex-direction:column;gap:1rem}.action-section[data-v-b23c65b5]{display:flex;flex-direction:column;gap:.5rem}.section-label[data-v-b23c65b5]{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--n-text-color-3)}.action-buttons[data-v-b23c65b5]{display:flex;flex-wrap:wrap;gap:.5rem}.activity-list[data-v-b23c65b5]{display:flex;flex-direction:column;gap:.25rem}.activity-item[data-v-b23c65b5]{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;font-size:.8125rem;font-family:var(--n-font-family-mono);border-left:3px solid transparent;border-radius:0 var(--n-border-radius-small) var(--n-border-radius-small) 0}.activity-item[data-v-b23c65b5]:hover{background:var(--n-hover-color)}.activity-item.execute[data-v-b23c65b5]{border-left-color:var(--n-primary-color)}.activity-item.start[data-v-b23c65b5]{border-left-color:var(--n-success-color)}.activity-item.stop[data-v-b23c65b5]{border-left-color:var(--n-warning-color)}.activity-item.create[data-v-b23c65b5]{border-left-color:var(--n-info-color)}.activity-icon[data-v-b23c65b5]{font-size:1rem;flex-shrink:0}.activity-item.execute .activity-icon[data-v-b23c65b5]{color:var(--n-primary-color)}.activity-item.start .activity-icon[data-v-b23c65b5]{color:var(--n-success-color)}.activity-item.stop .activity-icon[data-v-b23c65b5]{color:var(--n-warning-color)}.activity-item.create .activity-icon[data-v-b23c65b5]{color:var(--n-info-color)}.activity-text[data-v-b23c65b5]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
@@ -0,0 +1 @@
1
+ import{_ as L}from"./procler-DOrSB1Vj.js";import{G as U}from"./PhArrowsClockwise.vue-DqDg31az.js";import{H as X}from"./PhCheckCircle.vue-Fwj9sh9m.js";import{d as j,u as J,r as M,o as Z,c,a as e,b as a,t as l,w as o,e as s,B as C,n as S,N as _,f as n,g as K,h as u,G as Q,J as I,i as W,j as v,F as g,k as y,l as p,_ as Y}from"./index-BzW1XhyH.js";import{H as N}from"./PhPlay.vue-CZm7Gy3u.js";import{I as x}from"./PhPlus.vue-yTWqKlSh.js";import{I as ss}from"./PhStop.vue-DxsqwIki.js";import{u as ts}from"./groups-Zu-_v8ey.js";import{u as es}from"./recipes-1w5SseGb.js";import{u as as,g as V,f as os}from"./changelog-KkTT4H9-.js";import{N as is,a as T}from"./Grid-CZ9QVKAT.js";import{N as A}from"./Empty-MuygEHZM.js";import{N as D}from"./Tag-Bh_qV63A.js";const ns={class:"dashboard-view"},ls={class:"page-header"},rs={class:"header-title"},cs={class:"stats-row"},ds={class:"stat-content"},us={class:"stat-icon-wrapper running"},_s={class:"stat-info"},ps={class:"stat-value"},hs={class:"stat-label"},fs={class:"stat-content"},ms={class:"stat-icon-wrapper processes"},vs={class:"stat-info"},gs={class:"stat-value"},ys={class:"stat-label"},ks={class:"stat-content"},$s={class:"stat-icon-wrapper groups"},bs={class:"stat-info"},ws={class:"stat-value"},Cs={class:"stat-label"},Ss={class:"stat-content"},Ns={class:"stat-icon-wrapper recipes"},Ts={class:"stat-info"},As={class:"stat-value"},Gs={class:"stat-label"},zs={key:0,class:"empty-placeholder"},Es={key:1,class:"process-list"},Ps=["onClick"],Rs={class:"process-name"},Bs={class:"status-tags"},Is={key:0,class:"more-indicator"},Vs={key:0,class:"empty-placeholder"},Ds={class:"empty-hint"},Hs={key:1,class:"quick-actions"},Os={key:0,class:"action-section"},qs={class:"section-label"},Fs={class:"action-buttons"},Ls={key:1,class:"action-section"},Us={class:"section-label"},Xs={class:"action-buttons"},js={key:0,class:"empty-placeholder"},Js={key:1,class:"activity-list"},Ms={class:"activity-text"},Zs=j({__name:"DashboardView",setup(Ks){const d=J(),f=ts(),m=es(),k=as(),$=M(!1);function H(t){switch(t){case"running":return"success";case"stopped":return"default";case"failed":return"error";default:return"default"}}function O(t){switch(t){case"D":case"Z":return"error";case"T":case"t":return"warning";case"S":case"I":return"info";default:return"default"}}function G(t,r){return!t||!r||t==="R"?"":`${t} ${r}`}function q(t){const r=V(t);return r==="EXECUTE"?"execute":r==="START"?"start":r==="STOP"?"stop":"create"}function b(t,r){return V(t)===r}function F(t){return os(t)}async function z(){$.value=!0;try{await Promise.all([d.fetchProcesses(),f.fetchGroups(),m.fetchRecipes(),k.fetchChangelog(20)])}finally{$.value=!1}}return Z(z),(t,r)=>{const E=K("router-link");return n(),c("div",ns,[e("div",ls,[e("div",rs,[r[2]||(r[2]=e("img",{src:L,alt:"Procler logo",class:"dashboard-logo"},null,-1)),e("h1",null,l(t.$t("dashboard.title")),1)]),a(s(C),{onClick:z,loading:$.value},{icon:o(()=>[a(s(U))]),default:o(()=>[u(" "+l(t.$t("common.refresh")),1)]),_:1},8,["loading"])]),e("div",cs,[a(s(_),{class:S(["stat-card",{"has-running":s(d).runningCount>0}])},{default:o(()=>[e("div",ds,[e("div",us,[a(s(N),{weight:"fill",class:"stat-icon"})]),e("div",_s,[e("div",ps,l(s(d).runningCount),1),e("div",hs,l(t.$t("dashboard.stats.running")),1)])])]),_:1},8,["class"]),a(s(_),{class:"stat-card"},{default:o(()=>[e("div",fs,[e("div",ms,[a(s(Q),{class:"stat-icon"})]),e("div",vs,[e("div",gs,l(s(d).processes.length),1),e("div",ys,l(t.$t("dashboard.stats.processes")),1)])])]),_:1}),a(s(_),{class:"stat-card"},{default:o(()=>[e("div",ks,[e("div",$s,[a(s(I),{class:"stat-icon"})]),e("div",bs,[e("div",ws,l(s(f).groups.length),1),e("div",Cs,l(t.$t("dashboard.stats.groups")),1)])])]),_:1}),a(s(_),{class:"stat-card"},{default:o(()=>[e("div",Ss,[e("div",Ns,[a(s(W),{class:"stat-icon"})]),e("div",Ts,[e("div",As,l(s(m).recipes.length),1),e("div",Gs,l(t.$t("dashboard.stats.recipes")),1)])])]),_:1})]),a(s(is),{cols:2,"x-gap":20,"y-gap":20,responsive:"screen","item-responsive":!0},{default:o(()=>[a(s(T),{span:"2 m:1"},{default:o(()=>[a(s(_),{title:t.$t("dashboard.processStatus")},{"header-extra":o(()=>[a(E,{to:"/processes",class:"view-all-link"},{default:o(()=>[u(l(t.$t("common.viewAll")),1)]),_:1})]),default:o(()=>[s(d).processes.length===0?(n(),c("div",zs,[a(s(A),{description:t.$t("dashboard.noProcesses"),size:"small"},null,8,["description"])])):(n(),c("div",Es,[(n(!0),c(g,null,y(s(d).processes.slice(0,8),i=>{var h,P,R;return n(),c("div",{key:i.id,class:"process-item",onClick:w=>t.$router.push(`/process/${i.name}`)},[e("div",{class:S(["status-dot",i.status])},null,2),e("span",Rs,l(i.name),1),e("div",Bs,[a(s(D),{type:H(i.status),size:"small"},{default:o(()=>[u(l(i.status),1)]),_:2},1032,["type"]),G((h=i.linux_state)==null?void 0:h.state_code,(P=i.linux_state)==null?void 0:P.state_name)?(n(),p(s(D),{key:0,type:O((R=i.linux_state)==null?void 0:R.state_code),size:"small"},{default:o(()=>{var w,B;return[u(l(G((w=i.linux_state)==null?void 0:w.state_code,(B=i.linux_state)==null?void 0:B.state_name)),1)]}),_:2},1032,["type"])):v("",!0)])],8,Ps)}),128)),s(d).processes.length>8?(n(),c("div",Is,l(t.$t("common.more",{count:s(d).processes.length-8})),1)):v("",!0)]))]),_:1},8,["title"])]),_:1}),a(s(T),{span:"2 m:1"},{default:o(()=>[a(s(_),{title:t.$t("dashboard.quickActions")},{default:o(()=>[s(f).groups.length===0&&s(m).recipes.length===0?(n(),c("div",Vs,[a(s(A),{description:t.$t("dashboard.noGroupsOrRecipes"),size:"small"},{extra:o(()=>[e("p",Ds,[u(l(t.$t("dashboard.defineInConfig",{config:""})),1),r[3]||(r[3]=e("code",null,".procler/config.yaml",-1))])]),_:1},8,["description"])])):(n(),c("div",Hs,[s(f).groups.length>0?(n(),c("div",Os,[e("div",qs,l(t.$t("nav.groups")),1),e("div",Fs,[(n(!0),c(g,null,y(s(f).groups.slice(0,4),i=>(n(),p(s(C),{key:i.name,size:"small",onClick:r[0]||(r[0]=h=>t.$router.push("/groups"))},{icon:o(()=>[a(s(I))]),default:o(()=>[u(" "+l(i.name),1)]),_:2},1024))),128))])])):v("",!0),s(m).recipes.length>0?(n(),c("div",Ls,[e("div",Us,l(t.$t("nav.recipes")),1),e("div",Xs,[(n(!0),c(g,null,y(s(m).recipes.slice(0,4),i=>(n(),p(s(C),{key:i.name,size:"small",type:"primary",secondary:"",onClick:r[1]||(r[1]=h=>t.$router.push("/recipes"))},{icon:o(()=>[a(s(N),{weight:"fill"})]),default:o(()=>[u(" "+l(i.name),1)]),_:2},1024))),128))])])):v("",!0)]))]),_:1},8,["title"])]),_:1}),a(s(T),{span:"2"},{default:o(()=>[a(s(_),{title:t.$t("dashboard.recentActivity")},{"header-extra":o(()=>[a(E,{to:"/config",class:"view-all-link"},{default:o(()=>[u(l(t.$t("dashboard.viewChangelog")),1)]),_:1})]),default:o(()=>[s(k).changelog.length===0?(n(),c("div",js,[a(s(A),{description:t.$t("dashboard.noRecentActivity"),size:"small"},null,8,["description"])])):(n(),c("div",Js,[(n(!0),c(g,null,y(s(k).changelog.slice(-10).reverse(),(i,h)=>(n(),c("div",{key:h,class:S(["activity-item",q(i)])},[b(i,"EXECUTE")?(n(),p(s(X),{key:0,weight:"fill",class:"activity-icon"})):b(i,"START")?(n(),p(s(N),{key:1,weight:"fill",class:"activity-icon"})):b(i,"STOP")?(n(),p(s(ss),{key:2,weight:"fill",class:"activity-icon"})):(n(),p(s(x),{key:3,weight:"fill",class:"activity-icon"})),e("span",Ms,l(F(i)),1)],2))),128))]))]),_:1},8,["title"])]),_:1})]),_:1})])}}}),ct=Y(Zs,[["__scopeId","data-v-b23c65b5"]]);export{ct as default};