proxmox-mcps 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +60 -0
- package/.mcp.json.example +19 -0
- package/LICENSE +21 -0
- package/README.md +72 -0
- package/dist/cli/check-config.d.ts +3 -0
- package/dist/cli/check-config.d.ts.map +1 -0
- package/dist/cli/check-config.js +29 -0
- package/dist/cli/check-config.js.map +1 -0
- package/dist/cli/print-tools.d.ts +4 -0
- package/dist/cli/print-tools.d.ts.map +1 -0
- package/dist/cli/print-tools.js +45 -0
- package/dist/cli/print-tools.js.map +1 -0
- package/dist/config/env.d.ts +183 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +149 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +26 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +42 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +60 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +50 -0
- package/dist/config/types.js.map +1 -0
- package/dist/format/response.d.ts +40 -0
- package/dist/format/response.d.ts.map +1 -0
- package/dist/format/response.js +109 -0
- package/dist/format/response.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +200 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/sqlite-store.d.ts +34 -0
- package/dist/jobs/sqlite-store.d.ts.map +1 -0
- package/dist/jobs/sqlite-store.js +282 -0
- package/dist/jobs/sqlite-store.js.map +1 -0
- package/dist/jobs/store.d.ts +66 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +101 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/log.d.ts +24 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +64 -0
- package/dist/log.js.map +1 -0
- package/dist/proxmox/auth.d.ts +30 -0
- package/dist/proxmox/auth.d.ts.map +1 -0
- package/dist/proxmox/auth.js +39 -0
- package/dist/proxmox/auth.js.map +1 -0
- package/dist/proxmox/client.d.ts +28 -0
- package/dist/proxmox/client.d.ts.map +1 -0
- package/dist/proxmox/client.js +192 -0
- package/dist/proxmox/client.js.map +1 -0
- package/dist/proxmox/errors.d.ts +51 -0
- package/dist/proxmox/errors.d.ts.map +1 -0
- package/dist/proxmox/errors.js +80 -0
- package/dist/proxmox/errors.js.map +1 -0
- package/dist/proxmox/paths.d.ts +126 -0
- package/dist/proxmox/paths.d.ts.map +1 -0
- package/dist/proxmox/paths.js +157 -0
- package/dist/proxmox/paths.js.map +1 -0
- package/dist/proxmox/types.d.ts +255 -0
- package/dist/proxmox/types.d.ts.map +1 -0
- package/dist/proxmox/types.js +9 -0
- package/dist/proxmox/types.js.map +1 -0
- package/dist/retry.d.ts +18 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +50 -0
- package/dist/retry.js.map +1 -0
- package/dist/safety/policy.d.ts +23 -0
- package/dist/safety/policy.d.ts.map +1 -0
- package/dist/safety/policy.js +81 -0
- package/dist/safety/policy.js.map +1 -0
- package/dist/safety/risk.d.ts +3 -0
- package/dist/safety/risk.d.ts.map +1 -0
- package/dist/safety/risk.js +234 -0
- package/dist/safety/risk.js.map +1 -0
- package/dist/security/url-guard.d.ts +22 -0
- package/dist/security/url-guard.d.ts.map +1 -0
- package/dist/security/url-guard.js +166 -0
- package/dist/security/url-guard.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +74 -0
- package/dist/server.js.map +1 -0
- package/dist/ssh/client.d.ts +32 -0
- package/dist/ssh/client.d.ts.map +1 -0
- package/dist/ssh/client.js +128 -0
- package/dist/ssh/client.js.map +1 -0
- package/dist/tools/backup-schedule.d.ts +10 -0
- package/dist/tools/backup-schedule.d.ts.map +1 -0
- package/dist/tools/backup-schedule.js +194 -0
- package/dist/tools/backup-schedule.js.map +1 -0
- package/dist/tools/backup.d.ts +7 -0
- package/dist/tools/backup.d.ts.map +1 -0
- package/dist/tools/backup.js +163 -0
- package/dist/tools/backup.js.map +1 -0
- package/dist/tools/cluster.d.ts +7 -0
- package/dist/tools/cluster.d.ts.map +1 -0
- package/dist/tools/cluster.js +20 -0
- package/dist/tools/cluster.js.map +1 -0
- package/dist/tools/container/config.d.ts +7 -0
- package/dist/tools/container/config.d.ts.map +1 -0
- package/dist/tools/container/config.js +97 -0
- package/dist/tools/container/config.js.map +1 -0
- package/dist/tools/container/console.d.ts +7 -0
- package/dist/tools/container/console.d.ts.map +1 -0
- package/dist/tools/container/console.js +65 -0
- package/dist/tools/container/console.js.map +1 -0
- package/dist/tools/container/crud.d.ts +7 -0
- package/dist/tools/container/crud.d.ts.map +1 -0
- package/dist/tools/container/crud.js +362 -0
- package/dist/tools/container/crud.js.map +1 -0
- package/dist/tools/container/diagnostics.d.ts +7 -0
- package/dist/tools/container/diagnostics.d.ts.map +1 -0
- package/dist/tools/container/diagnostics.js +115 -0
- package/dist/tools/container/diagnostics.js.map +1 -0
- package/dist/tools/container/migration.d.ts +7 -0
- package/dist/tools/container/migration.d.ts.map +1 -0
- package/dist/tools/container/migration.js +134 -0
- package/dist/tools/container/migration.js.map +1 -0
- package/dist/tools/context.d.ts +21 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +2 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/ha.d.ts +7 -0
- package/dist/tools/ha.d.ts.map +1 -0
- package/dist/tools/ha.js +241 -0
- package/dist/tools/ha.js.map +1 -0
- package/dist/tools/helpers.d.ts +15 -0
- package/dist/tools/helpers.d.ts.map +1 -0
- package/dist/tools/helpers.js +7 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +66 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/iso.d.ts +7 -0
- package/dist/tools/iso.d.ts.map +1 -0
- package/dist/tools/iso.js +131 -0
- package/dist/tools/iso.js.map +1 -0
- package/dist/tools/jobs.d.ts +11 -0
- package/dist/tools/jobs.d.ts.map +1 -0
- package/dist/tools/jobs.js +173 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/node-admin.d.ts +10 -0
- package/dist/tools/node-admin.d.ts.map +1 -0
- package/dist/tools/node-admin.js +361 -0
- package/dist/tools/node-admin.js.map +1 -0
- package/dist/tools/node-certs.d.ts +7 -0
- package/dist/tools/node-certs.d.ts.map +1 -0
- package/dist/tools/node-certs.js +36 -0
- package/dist/tools/node-certs.js.map +1 -0
- package/dist/tools/node-disks.d.ts +7 -0
- package/dist/tools/node-disks.d.ts.map +1 -0
- package/dist/tools/node-disks.js +100 -0
- package/dist/tools/node-disks.js.map +1 -0
- package/dist/tools/node-network.d.ts +7 -0
- package/dist/tools/node-network.d.ts.map +1 -0
- package/dist/tools/node-network.js +102 -0
- package/dist/tools/node-network.js.map +1 -0
- package/dist/tools/node-services.d.ts +7 -0
- package/dist/tools/node-services.d.ts.map +1 -0
- package/dist/tools/node-services.js +39 -0
- package/dist/tools/node-services.js.map +1 -0
- package/dist/tools/node.d.ts +7 -0
- package/dist/tools/node.d.ts.map +1 -0
- package/dist/tools/node.js +85 -0
- package/dist/tools/node.js.map +1 -0
- package/dist/tools/pools.d.ts +10 -0
- package/dist/tools/pools.d.ts.map +1 -0
- package/dist/tools/pools.js +111 -0
- package/dist/tools/pools.js.map +1 -0
- package/dist/tools/replication.d.ts +7 -0
- package/dist/tools/replication.d.ts.map +1 -0
- package/dist/tools/replication.js +116 -0
- package/dist/tools/replication.js.map +1 -0
- package/dist/tools/sdn.d.ts +7 -0
- package/dist/tools/sdn.d.ts.map +1 -0
- package/dist/tools/sdn.js +358 -0
- package/dist/tools/sdn.js.map +1 -0
- package/dist/tools/snapshot.d.ts +10 -0
- package/dist/tools/snapshot.d.ts.map +1 -0
- package/dist/tools/snapshot.js +115 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/storage-admin.d.ts +9 -0
- package/dist/tools/storage-admin.d.ts.map +1 -0
- package/dist/tools/storage-admin.js +126 -0
- package/dist/tools/storage-admin.js.map +1 -0
- package/dist/tools/storage.d.ts +7 -0
- package/dist/tools/storage.d.ts.map +1 -0
- package/dist/tools/storage.js +20 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/tasks.d.ts +11 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +85 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/vm/config.d.ts +28 -0
- package/dist/tools/vm/config.d.ts.map +1 -0
- package/dist/tools/vm/config.js +221 -0
- package/dist/tools/vm/config.js.map +1 -0
- package/dist/tools/vm/console.d.ts +9 -0
- package/dist/tools/vm/console.d.ts.map +1 -0
- package/dist/tools/vm/console.js +141 -0
- package/dist/tools/vm/console.js.map +1 -0
- package/dist/tools/vm/crud.d.ts +10 -0
- package/dist/tools/vm/crud.d.ts.map +1 -0
- package/dist/tools/vm/crud.js +333 -0
- package/dist/tools/vm/crud.js.map +1 -0
- package/dist/tools/vm/diagnostics.d.ts +10 -0
- package/dist/tools/vm/diagnostics.d.ts.map +1 -0
- package/dist/tools/vm/diagnostics.js +256 -0
- package/dist/tools/vm/diagnostics.js.map +1 -0
- package/dist/tools/vm/migration.d.ts +7 -0
- package/dist/tools/vm/migration.d.ts.map +1 -0
- package/dist/tools/vm/migration.js +131 -0
- package/dist/tools/vm/migration.js.map +1 -0
- package/package.json +74 -0
package/.env.example
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# Proxmox MCP Server — environment configuration
|
|
3
|
+
# Copy to `.env` and fill in. All vars can also be passed inline.
|
|
4
|
+
# =============================================================================
|
|
5
|
+
|
|
6
|
+
# ---- Proxmox API connection (REQUIRED) ---------------------------------------
|
|
7
|
+
PROXMOX_HOST=proxmox.example.com
|
|
8
|
+
PROXMOX_PORT=8006
|
|
9
|
+
PROXMOX_USER=root@pam
|
|
10
|
+
PROXMOX_TOKEN_NAME=mcp
|
|
11
|
+
PROXMOX_TOKEN_VALUE=00000000-0000-0000-0000-000000000000
|
|
12
|
+
PROXMOX_VERIFY_SSL=true
|
|
13
|
+
PROXMOX_TIMEOUT_MS=30000
|
|
14
|
+
PROXMOX_SERVICE=PVE
|
|
15
|
+
|
|
16
|
+
# ---- Safety -----------------------------------------------------------------
|
|
17
|
+
# Set to `true` only in dev environments where Proxmox uses a self-signed cert.
|
|
18
|
+
PROXMOX_DEV_MODE=false
|
|
19
|
+
|
|
20
|
+
# When `true`, high-risk and destructive tools run without approval_token.
|
|
21
|
+
# Use only for dev/automation. Production path: PROXMOX_MCP_APPROVAL_TOKEN.
|
|
22
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=false
|
|
23
|
+
|
|
24
|
+
# Token required per-call for high-risk/destructive tools. Compared with
|
|
25
|
+
# crypto.timingSafeEqual against the `approval_token` tool argument.
|
|
26
|
+
# Generate with: openssl rand -hex 32
|
|
27
|
+
PROXMOX_MCP_APPROVAL_TOKEN=
|
|
28
|
+
|
|
29
|
+
# When `true`, high-risk tools log an audit line but still require a token.
|
|
30
|
+
PROXMOX_MCP_AUDIT_ONLY=false
|
|
31
|
+
|
|
32
|
+
# ---- Logging ----------------------------------------------------------------
|
|
33
|
+
LOG_LEVEL=info
|
|
34
|
+
LOG_PRETTY=false
|
|
35
|
+
|
|
36
|
+
# ---- Retry & jobs -----------------------------------------------------------
|
|
37
|
+
PROXMOX_MCP_RETRY_MAX=3
|
|
38
|
+
PROXMOX_MCP_RETRY_BASE_MS=200
|
|
39
|
+
PROXMOX_MCP_JOB_TTL_HOURS=24
|
|
40
|
+
# 'memory' (default; lost on restart) or 'sqlite' (persisted)
|
|
41
|
+
PROXMOX_MCP_JOB_STORE=memory
|
|
42
|
+
PROXMOX_MCP_JOB_SQLITE_PATH=./proxmox-jobs.sqlite3
|
|
43
|
+
|
|
44
|
+
# ---- Transport --------------------------------------------------------------
|
|
45
|
+
# STDIO = current default (Claude Code)
|
|
46
|
+
# SSE = legacy HTTP+SSE
|
|
47
|
+
# STREAMABLE = streamable HTTP (recommended for non-stdio clients)
|
|
48
|
+
MCP_TRANSPORT=STDIO
|
|
49
|
+
MCP_HOST=127.0.0.1
|
|
50
|
+
MCP_PORT=8000
|
|
51
|
+
|
|
52
|
+
# ---- SSH (for `execute_container_command` — pct exec on the host) -----------
|
|
53
|
+
PROXMOX_SSH_USER=root
|
|
54
|
+
PROXMOX_SSH_PORT=22
|
|
55
|
+
PROXMOX_SSH_KEY_FILE=
|
|
56
|
+
PROXMOX_SSH_PASSWORD=
|
|
57
|
+
# JSON string: {"pve1":"10.0.0.1","pve2":"10.0.0.2"}
|
|
58
|
+
PROXMOX_SSH_HOST_OVERRIDES=
|
|
59
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE=
|
|
60
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING=true
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mcpServers": {
|
|
3
|
+
"proxmox": {
|
|
4
|
+
"command": "node",
|
|
5
|
+
"args": ["/Users/ngocdd/Documents/source_code/proxmox-mcp/dist/index.js"],
|
|
6
|
+
"env": {
|
|
7
|
+
"PROXMOX_HOST": "proxmox.example.com",
|
|
8
|
+
"PROXMOX_PORT": "8006",
|
|
9
|
+
"PROXMOX_USER": "root@pam",
|
|
10
|
+
"PROXMOX_TOKEN_NAME": "mcp",
|
|
11
|
+
"PROXMOX_TOKEN_VALUE": "your-token-uuid-here",
|
|
12
|
+
"PROXMOX_VERIFY_SSL": "false",
|
|
13
|
+
"PROXMOX_DEV_MODE": "true",
|
|
14
|
+
"PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE": "false",
|
|
15
|
+
"LOG_LEVEL": "info"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Proxmox MCP Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Proxmox MCP (TypeScript)
|
|
2
|
+
|
|
3
|
+
MCP server for [Proxmox VE](https://www.proxmox.com/en/proxmox-ve) — lets AI assistants (Claude Code, etc.) manage QEMU VMs, LXC containers, storage, network, HA, replication, SDN, and node admin.
|
|
4
|
+
|
|
5
|
+
**195 tools** · 3 transports (stdio / HTTP-SSE / streamable) · approval-gated destructive ops
|
|
6
|
+
|
|
7
|
+
## Supported tools (195)
|
|
8
|
+
|
|
9
|
+
**Foundation (24)** — `get_cluster_status`, `get_nodes`, `get_node_status`, `get_storage`, `list_tasks`, `get_task`, `get_task_log`, `list_jobs`, `get_job`, `poll_job`, `cancel_job`, `retry_job` · snapshot / backup / ISO + template CRUD
|
|
10
|
+
|
|
11
|
+
**VM (45)** — CRUD + lifecycle (`get_vms`, `get_vm_config`, `create_vm`, `clone_vm`, `start/stop/shutdown/reset/reboot/delete_vm`) · config (`update_vm_config`, `resize_vm_disk`, `set_vm_cloudinit`) · diagnostics (RRD, 10× QEMU guest agent, `vm_monitor`, `vm_firewall_rules`) · migration + console (VNC / SPICE / termproxy)
|
|
12
|
+
|
|
13
|
+
**Container (35)** — CRUD + lifecycle + config (`update_container_resources`, `resize_container_disk`) · diagnostics (RRD, firewall, **`execute_container_command`** via SSH + `pct exec`) · migration + console
|
|
14
|
+
|
|
15
|
+
**Cluster (23)** — Resource pools (5) · HA resources + groups (11) · Scheduled vzdump jobs (7)
|
|
16
|
+
|
|
17
|
+
**Node admin (40)** — apt / DNS / hosts / time (15) · bulk ops (4) · subscription (4) · systemd services (7) · network bonds/bridges/VLANs/OVS (5) · disks + ZFS (5) · certificates (2)
|
|
18
|
+
|
|
19
|
+
**Storage (5)** — `list_storages`, `get_storage`, `create/update/delete_storage` (lvm, zfs, nfs, cifs, pbs, dir, …)
|
|
20
|
+
|
|
21
|
+
**Replication (7)** + **SDN (22)** — ZFS replication jobs · SDN controllers / zones / vnets / subnets + `apply_sdn`
|
|
22
|
+
|
|
23
|
+
> 25 destructive tools require an approval token (or `PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE=true`). List them: `proxmox-mcp-print-tools destructive`.
|
|
24
|
+
|
|
25
|
+
## Install
|
|
26
|
+
|
|
27
|
+
### From npm (recommended)
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npx proxmox-mcps
|
|
31
|
+
# or install globally
|
|
32
|
+
npm install -g proxmox-mcps
|
|
33
|
+
proxmox-mcp # CLI binary (installed by the package above)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### From source
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
git clone https://github.com/your-username/proxmox-mcp.git
|
|
40
|
+
cd proxmox-mcp
|
|
41
|
+
npm install
|
|
42
|
+
cp .env.example .env # fill in Proxmox host + API token
|
|
43
|
+
npm run check-config # validate env
|
|
44
|
+
npm run build # tsc → dist/
|
|
45
|
+
npm start # node dist/index.js
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Configure for Claude Code
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
claude mcp add proxmox \
|
|
52
|
+
--command "npx" --args "-y,proxmox-mcps" \
|
|
53
|
+
--env "PROXMOX_HOST=proxmox.example.com" \
|
|
54
|
+
--env "PROXMOX_PORT=8006" \
|
|
55
|
+
--env "PROXMOX_USER=root@pam" \
|
|
56
|
+
--env "PROXMOX_TOKEN_NAME=mcp" \
|
|
57
|
+
--env "PROXMOX_TOKEN_VALUE=<uuid>" \
|
|
58
|
+
--env "PROXMOX_VERIFY_SSL=false" \
|
|
59
|
+
--env "PROXMOX_DEV_MODE=true"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Restart Claude Code, verify with `/mcp` (should show `proxmox` with 195 tools).
|
|
63
|
+
|
|
64
|
+
### Get an API token
|
|
65
|
+
|
|
66
|
+
Proxmox UI → **Datacenter → Permissions → API Tokens → Add** → user `root@pam`, token ID `mcp`, uncheck **Privilege Separation** → copy the secret UUID into `PROXMOX_TOKEN_VALUE`.
|
|
67
|
+
|
|
68
|
+
Full env-var reference: [`.env.example`](.env.example).
|
|
69
|
+
|
|
70
|
+
## License
|
|
71
|
+
|
|
72
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-config.d.ts","sourceRoot":"","sources":["../../src/cli/check-config.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `proxmox-mcp --check-config` — validate environment variables without
|
|
4
|
+
* starting the MCP server.
|
|
5
|
+
*/
|
|
6
|
+
import { loadConfig } from "../config/index.js";
|
|
7
|
+
try {
|
|
8
|
+
const cfg = loadConfig();
|
|
9
|
+
process.stdout.write(`[OK] Configuration is valid.\n\n` +
|
|
10
|
+
` Proxmox: ${cfg.proxmox.user}@${cfg.proxmox.host}:${cfg.proxmox.port}\n` +
|
|
11
|
+
` Service: ${cfg.proxmox.service}\n` +
|
|
12
|
+
` Verify SSL: ${cfg.proxmox.verifySsl}\n` +
|
|
13
|
+
` Dev mode: ${cfg.safety.devMode}\n` +
|
|
14
|
+
` Dangerously allow destructive: ${cfg.safety.dangerouslyAllowDestructive}\n` +
|
|
15
|
+
` Approval token configured: ${cfg.safety.approvalToken ? "yes" : "no"}\n` +
|
|
16
|
+
` Audit only: ${cfg.safety.auditOnly}\n` +
|
|
17
|
+
` Log level: ${cfg.logLevel}\n` +
|
|
18
|
+
` SSH user: ${cfg.ssh.user}@*:${cfg.ssh.port}\n` +
|
|
19
|
+
` SSH key file: ${cfg.ssh.keyFile ?? "(none)"}\n` +
|
|
20
|
+
` Retry max: ${cfg.retryJob.retryMax} (base ${cfg.retryJob.retryBaseMs}ms)\n` +
|
|
21
|
+
` Job TTL: ${cfg.retryJob.jobTtlHours}h\n`);
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
process.stderr.write(`[FAIL] ${err instanceof Error ? err.message : String(err)}\n\n` +
|
|
26
|
+
`Run 'cp .env.example .env' and fill in your Proxmox host + API token.\n`);
|
|
27
|
+
process.exit(2);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=check-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-config.js","sourceRoot":"","sources":["../../src/cli/check-config.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,IAAI,CAAC;IACH,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kCAAkC;QAChC,cAAc,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI;QAC1E,cAAc,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI;QACrC,iBAAiB,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI;QAC1C,eAAe,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI;QACrC,oCAAoC,GAAG,CAAC,MAAM,CAAC,2BAA2B,IAAI;QAC9E,gCAAgC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QAC3E,iBAAiB,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI;QACzC,gBAAgB,GAAG,CAAC,QAAQ,IAAI;QAChC,eAAe,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI;QACjD,mBAAmB,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,IAAI;QAClD,gBAAgB,GAAG,CAAC,QAAQ,CAAC,QAAQ,UAAU,GAAG,CAAC,QAAQ,CAAC,WAAW,OAAO;QAC9E,cAAc,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,CAC9C,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM;QAC9D,yEAAyE,CAC5E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-tools.d.ts","sourceRoot":"","sources":["../../src/cli/print-tools.ts"],"names":[],"mappings":";AAaA,OAAO,mBAAmB,CAAC;AAG3B,OAAO,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `proxmox-mcp --print-tools` — list every tool that would be registered.
|
|
4
|
+
*
|
|
5
|
+
* Pass `destructive` as the first arg to list only tools that require
|
|
6
|
+
* approval (risk=destructive).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* node dist/cli/print-tools.js # all tools
|
|
10
|
+
* node dist/cli/print-tools.js destructive # only approval-gated tools
|
|
11
|
+
*/
|
|
12
|
+
import { listRiskRegistry } from "../safety/policy.js";
|
|
13
|
+
// Side-effect import: triggers risk registration (Phase 1B+).
|
|
14
|
+
import "../safety/risk.js";
|
|
15
|
+
// Side-effect import: also pulls in tool files so any future per-file
|
|
16
|
+
// registration logic runs.
|
|
17
|
+
import "../tools/index.js";
|
|
18
|
+
const filter = (process.argv[2] ?? "").trim().toLowerCase();
|
|
19
|
+
const reg = listRiskRegistry();
|
|
20
|
+
let tools = Object.entries(reg);
|
|
21
|
+
if (filter === "destructive") {
|
|
22
|
+
tools = tools.filter(([, risk]) => risk === "destructive");
|
|
23
|
+
if (tools.length === 0) {
|
|
24
|
+
process.stdout.write("[INFO] No destructive tools registered.\n");
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
process.stdout.write(`[OK] ${tools.length} destructive (approval-required) tool(s):\n\n`);
|
|
28
|
+
}
|
|
29
|
+
else if (filter === "high" || filter === "medium" || filter === "low") {
|
|
30
|
+
tools = tools.filter(([, risk]) => risk === filter);
|
|
31
|
+
process.stdout.write(`[OK] ${tools.length} ${filter}-risk tool(s):\n\n`);
|
|
32
|
+
}
|
|
33
|
+
else if (tools.length === 0) {
|
|
34
|
+
process.stdout.write("[INFO] No tools registered yet. (Phase 1A skeleton)\n");
|
|
35
|
+
process.exit(0);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
process.stdout.write(`[OK] ${tools.length} tool(s) registered:\n\n`);
|
|
39
|
+
}
|
|
40
|
+
tools.sort(([a], [b]) => a.localeCompare(b));
|
|
41
|
+
const maxLen = Math.max(...tools.map(([n]) => n.length));
|
|
42
|
+
for (const [name, risk] of tools) {
|
|
43
|
+
process.stdout.write(` ${name.padEnd(maxLen)} risk=${risk}\n`);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=print-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-tools.js","sourceRoot":"","sources":["../../src/cli/print-tools.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,8DAA8D;AAC9D,OAAO,mBAAmB,CAAC;AAC3B,sEAAsE;AACtE,2BAA2B;AAC3B,OAAO,mBAAmB,CAAC;AAE3B,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAE5D,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;AAC/B,IAAI,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEhC,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;IAC7B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,+CAA+C,CAAC,CAAC;AAC5F,CAAC;KAAM,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;IACxE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,IAAI,MAAM,oBAAoB,CAAC,CAAC;AAC3E,CAAC;KAAM,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,MAAM,0BAA0B,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;IACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable schema. Single source of truth for runtime config.
|
|
3
|
+
*
|
|
4
|
+
* Validates process.env at startup. Exits with code 2 on validation failure.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import type { LoggerConfig } from "../log.js";
|
|
8
|
+
declare const EnvSchema: z.ZodEffects<z.ZodObject<{
|
|
9
|
+
PROXMOX_HOST: z.ZodString;
|
|
10
|
+
PROXMOX_PORT: z.ZodDefault<z.ZodNumber>;
|
|
11
|
+
PROXMOX_USER: z.ZodString;
|
|
12
|
+
PROXMOX_TOKEN_NAME: z.ZodString;
|
|
13
|
+
PROXMOX_TOKEN_VALUE: z.ZodString;
|
|
14
|
+
PROXMOX_VERIFY_SSL: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
|
|
15
|
+
PROXMOX_TIMEOUT_MS: z.ZodDefault<z.ZodNumber>;
|
|
16
|
+
PROXMOX_SERVICE: z.ZodDefault<z.ZodEnum<["PVE", "PMG", "PBS"]>>;
|
|
17
|
+
PROXMOX_DEV_MODE: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
|
|
18
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
|
|
19
|
+
PROXMOX_MCP_APPROVAL_TOKEN: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
20
|
+
PROXMOX_MCP_AUDIT_ONLY: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
|
|
21
|
+
LOG_LEVEL: z.ZodDefault<z.ZodEnum<["debug", "info", "warn", "error"]>>;
|
|
22
|
+
LOG_PRETTY: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
|
|
23
|
+
PROXMOX_MCP_RETRY_MAX: z.ZodDefault<z.ZodNumber>;
|
|
24
|
+
PROXMOX_MCP_RETRY_BASE_MS: z.ZodDefault<z.ZodNumber>;
|
|
25
|
+
PROXMOX_MCP_JOB_TTL_HOURS: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
PROXMOX_MCP_JOB_STORE: z.ZodDefault<z.ZodEnum<["memory", "sqlite"]>>;
|
|
27
|
+
PROXMOX_MCP_JOB_SQLITE_PATH: z.ZodDefault<z.ZodString>;
|
|
28
|
+
MCP_TRANSPORT: z.ZodDefault<z.ZodEnum<["STDIO", "SSE", "STREAMABLE"]>>;
|
|
29
|
+
MCP_HOST: z.ZodDefault<z.ZodString>;
|
|
30
|
+
MCP_PORT: z.ZodDefault<z.ZodNumber>;
|
|
31
|
+
PROXMOX_SSH_USER: z.ZodDefault<z.ZodString>;
|
|
32
|
+
PROXMOX_SSH_PORT: z.ZodDefault<z.ZodNumber>;
|
|
33
|
+
PROXMOX_SSH_KEY_FILE: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
34
|
+
PROXMOX_SSH_PASSWORD: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
35
|
+
PROXMOX_SSH_HOST_OVERRIDES: z.ZodEffects<z.ZodOptional<z.ZodString>, Record<string, string>, string | undefined>;
|
|
36
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
37
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: z.ZodDefault<z.ZodEffects<z.ZodUnion<[z.ZodBoolean, z.ZodString]>, boolean, string | boolean>>;
|
|
38
|
+
PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: z.ZodEffects<z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>, string[] | readonly ["http", "https"], string | undefined>;
|
|
39
|
+
PROXMOX_DOWNLOAD_ALLOWED_HOSTS: z.ZodEffects<z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>, string[], string | undefined>;
|
|
40
|
+
}, "strip", z.ZodTypeAny, {
|
|
41
|
+
PROXMOX_HOST: string;
|
|
42
|
+
PROXMOX_PORT: number;
|
|
43
|
+
PROXMOX_USER: string;
|
|
44
|
+
PROXMOX_TOKEN_NAME: string;
|
|
45
|
+
PROXMOX_TOKEN_VALUE: string;
|
|
46
|
+
PROXMOX_VERIFY_SSL: boolean;
|
|
47
|
+
PROXMOX_TIMEOUT_MS: number;
|
|
48
|
+
PROXMOX_SERVICE: "PVE" | "PMG" | "PBS";
|
|
49
|
+
PROXMOX_DEV_MODE: boolean;
|
|
50
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: boolean;
|
|
51
|
+
PROXMOX_MCP_AUDIT_ONLY: boolean;
|
|
52
|
+
LOG_LEVEL: "debug" | "info" | "warn" | "error";
|
|
53
|
+
LOG_PRETTY: boolean;
|
|
54
|
+
PROXMOX_MCP_RETRY_MAX: number;
|
|
55
|
+
PROXMOX_MCP_RETRY_BASE_MS: number;
|
|
56
|
+
PROXMOX_MCP_JOB_TTL_HOURS: number;
|
|
57
|
+
PROXMOX_MCP_JOB_STORE: "memory" | "sqlite";
|
|
58
|
+
PROXMOX_MCP_JOB_SQLITE_PATH: string;
|
|
59
|
+
MCP_TRANSPORT: "STDIO" | "SSE" | "STREAMABLE";
|
|
60
|
+
MCP_HOST: string;
|
|
61
|
+
MCP_PORT: number;
|
|
62
|
+
PROXMOX_SSH_USER: string;
|
|
63
|
+
PROXMOX_SSH_PORT: number;
|
|
64
|
+
PROXMOX_SSH_HOST_OVERRIDES: Record<string, string>;
|
|
65
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: boolean;
|
|
66
|
+
PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: string[] | readonly ["http", "https"];
|
|
67
|
+
PROXMOX_DOWNLOAD_ALLOWED_HOSTS: string[];
|
|
68
|
+
PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
|
|
69
|
+
PROXMOX_SSH_KEY_FILE?: string | undefined;
|
|
70
|
+
PROXMOX_SSH_PASSWORD?: string | undefined;
|
|
71
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
|
|
72
|
+
}, {
|
|
73
|
+
PROXMOX_HOST: string;
|
|
74
|
+
PROXMOX_USER: string;
|
|
75
|
+
PROXMOX_TOKEN_NAME: string;
|
|
76
|
+
PROXMOX_TOKEN_VALUE: string;
|
|
77
|
+
PROXMOX_PORT?: number | undefined;
|
|
78
|
+
PROXMOX_VERIFY_SSL?: string | boolean | undefined;
|
|
79
|
+
PROXMOX_TIMEOUT_MS?: number | undefined;
|
|
80
|
+
PROXMOX_SERVICE?: "PVE" | "PMG" | "PBS" | undefined;
|
|
81
|
+
PROXMOX_DEV_MODE?: string | boolean | undefined;
|
|
82
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE?: string | boolean | undefined;
|
|
83
|
+
PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
|
|
84
|
+
PROXMOX_MCP_AUDIT_ONLY?: string | boolean | undefined;
|
|
85
|
+
LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
|
|
86
|
+
LOG_PRETTY?: string | boolean | undefined;
|
|
87
|
+
PROXMOX_MCP_RETRY_MAX?: number | undefined;
|
|
88
|
+
PROXMOX_MCP_RETRY_BASE_MS?: number | undefined;
|
|
89
|
+
PROXMOX_MCP_JOB_TTL_HOURS?: number | undefined;
|
|
90
|
+
PROXMOX_MCP_JOB_STORE?: "memory" | "sqlite" | undefined;
|
|
91
|
+
PROXMOX_MCP_JOB_SQLITE_PATH?: string | undefined;
|
|
92
|
+
MCP_TRANSPORT?: "STDIO" | "SSE" | "STREAMABLE" | undefined;
|
|
93
|
+
MCP_HOST?: string | undefined;
|
|
94
|
+
MCP_PORT?: number | undefined;
|
|
95
|
+
PROXMOX_SSH_USER?: string | undefined;
|
|
96
|
+
PROXMOX_SSH_PORT?: number | undefined;
|
|
97
|
+
PROXMOX_SSH_KEY_FILE?: string | undefined;
|
|
98
|
+
PROXMOX_SSH_PASSWORD?: string | undefined;
|
|
99
|
+
PROXMOX_SSH_HOST_OVERRIDES?: string | undefined;
|
|
100
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
|
|
101
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING?: string | boolean | undefined;
|
|
102
|
+
PROXMOX_DOWNLOAD_ALLOWED_SCHEMES?: string | undefined;
|
|
103
|
+
PROXMOX_DOWNLOAD_ALLOWED_HOSTS?: string | undefined;
|
|
104
|
+
}>, {
|
|
105
|
+
PROXMOX_HOST: string;
|
|
106
|
+
PROXMOX_PORT: number;
|
|
107
|
+
PROXMOX_USER: string;
|
|
108
|
+
PROXMOX_TOKEN_NAME: string;
|
|
109
|
+
PROXMOX_TOKEN_VALUE: string;
|
|
110
|
+
PROXMOX_VERIFY_SSL: boolean;
|
|
111
|
+
PROXMOX_TIMEOUT_MS: number;
|
|
112
|
+
PROXMOX_SERVICE: "PVE" | "PMG" | "PBS";
|
|
113
|
+
PROXMOX_DEV_MODE: boolean;
|
|
114
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: boolean;
|
|
115
|
+
PROXMOX_MCP_AUDIT_ONLY: boolean;
|
|
116
|
+
LOG_LEVEL: "debug" | "info" | "warn" | "error";
|
|
117
|
+
LOG_PRETTY: boolean;
|
|
118
|
+
PROXMOX_MCP_RETRY_MAX: number;
|
|
119
|
+
PROXMOX_MCP_RETRY_BASE_MS: number;
|
|
120
|
+
PROXMOX_MCP_JOB_TTL_HOURS: number;
|
|
121
|
+
PROXMOX_MCP_JOB_STORE: "memory" | "sqlite";
|
|
122
|
+
PROXMOX_MCP_JOB_SQLITE_PATH: string;
|
|
123
|
+
MCP_TRANSPORT: "STDIO" | "SSE" | "STREAMABLE";
|
|
124
|
+
MCP_HOST: string;
|
|
125
|
+
MCP_PORT: number;
|
|
126
|
+
PROXMOX_SSH_USER: string;
|
|
127
|
+
PROXMOX_SSH_PORT: number;
|
|
128
|
+
PROXMOX_SSH_HOST_OVERRIDES: Record<string, string>;
|
|
129
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: boolean;
|
|
130
|
+
PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: string[] | readonly ["http", "https"];
|
|
131
|
+
PROXMOX_DOWNLOAD_ALLOWED_HOSTS: string[];
|
|
132
|
+
PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
|
|
133
|
+
PROXMOX_SSH_KEY_FILE?: string | undefined;
|
|
134
|
+
PROXMOX_SSH_PASSWORD?: string | undefined;
|
|
135
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
|
|
136
|
+
}, {
|
|
137
|
+
PROXMOX_HOST: string;
|
|
138
|
+
PROXMOX_USER: string;
|
|
139
|
+
PROXMOX_TOKEN_NAME: string;
|
|
140
|
+
PROXMOX_TOKEN_VALUE: string;
|
|
141
|
+
PROXMOX_PORT?: number | undefined;
|
|
142
|
+
PROXMOX_VERIFY_SSL?: string | boolean | undefined;
|
|
143
|
+
PROXMOX_TIMEOUT_MS?: number | undefined;
|
|
144
|
+
PROXMOX_SERVICE?: "PVE" | "PMG" | "PBS" | undefined;
|
|
145
|
+
PROXMOX_DEV_MODE?: string | boolean | undefined;
|
|
146
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE?: string | boolean | undefined;
|
|
147
|
+
PROXMOX_MCP_APPROVAL_TOKEN?: string | undefined;
|
|
148
|
+
PROXMOX_MCP_AUDIT_ONLY?: string | boolean | undefined;
|
|
149
|
+
LOG_LEVEL?: "debug" | "info" | "warn" | "error" | undefined;
|
|
150
|
+
LOG_PRETTY?: string | boolean | undefined;
|
|
151
|
+
PROXMOX_MCP_RETRY_MAX?: number | undefined;
|
|
152
|
+
PROXMOX_MCP_RETRY_BASE_MS?: number | undefined;
|
|
153
|
+
PROXMOX_MCP_JOB_TTL_HOURS?: number | undefined;
|
|
154
|
+
PROXMOX_MCP_JOB_STORE?: "memory" | "sqlite" | undefined;
|
|
155
|
+
PROXMOX_MCP_JOB_SQLITE_PATH?: string | undefined;
|
|
156
|
+
MCP_TRANSPORT?: "STDIO" | "SSE" | "STREAMABLE" | undefined;
|
|
157
|
+
MCP_HOST?: string | undefined;
|
|
158
|
+
MCP_PORT?: number | undefined;
|
|
159
|
+
PROXMOX_SSH_USER?: string | undefined;
|
|
160
|
+
PROXMOX_SSH_PORT?: number | undefined;
|
|
161
|
+
PROXMOX_SSH_KEY_FILE?: string | undefined;
|
|
162
|
+
PROXMOX_SSH_PASSWORD?: string | undefined;
|
|
163
|
+
PROXMOX_SSH_HOST_OVERRIDES?: string | undefined;
|
|
164
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE?: string | undefined;
|
|
165
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING?: string | boolean | undefined;
|
|
166
|
+
PROXMOX_DOWNLOAD_ALLOWED_SCHEMES?: string | undefined;
|
|
167
|
+
PROXMOX_DOWNLOAD_ALLOWED_HOSTS?: string | undefined;
|
|
168
|
+
}>;
|
|
169
|
+
export type EnvInput = z.infer<typeof EnvSchema>;
|
|
170
|
+
/**
|
|
171
|
+
* Parse and validate process.env. Throws ZodError on failure.
|
|
172
|
+
*/
|
|
173
|
+
export declare function parseEnv(env?: NodeJS.ProcessEnv): EnvInput;
|
|
174
|
+
/**
|
|
175
|
+
* Parse and exit with code 2 on failure. Use in entry points.
|
|
176
|
+
*/
|
|
177
|
+
export declare function parseEnvOrExit(env?: NodeJS.ProcessEnv): EnvInput;
|
|
178
|
+
/**
|
|
179
|
+
* Build a LoggerConfig from env.
|
|
180
|
+
*/
|
|
181
|
+
export declare function loggerConfigFromEnv(env: EnvInput): LoggerConfig;
|
|
182
|
+
export {};
|
|
183
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AA6C9C,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiFX,CAAC;AAEL,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAEjD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,QAAQ,CASvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,QAAQ,CAU7E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY,CAE/D"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable schema. Single source of truth for runtime config.
|
|
3
|
+
*
|
|
4
|
+
* Validates process.env at startup. Exits with code 2 on validation failure.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
const USER_REGEX = /^[\w.\-]+(@[a-z][a-z0-9\-]+)?$/i;
|
|
8
|
+
const HOST_REGEX = /^[a-zA-Z0-9]([a-zA-Z0-9\-_.]*[a-zA-Z0-9])?$/;
|
|
9
|
+
const LogLevelSchema = z.enum(["debug", "info", "warn", "error"]);
|
|
10
|
+
const ServiceSchema = z.enum(["PVE", "PMG", "PBS"]);
|
|
11
|
+
/**
|
|
12
|
+
* Coerce env-style boolean strings to actual booleans. z.coerce.boolean() is
|
|
13
|
+
* broken (any non-empty string is truthy), so we explicitly map "true"/"1" to
|
|
14
|
+
* true and everything else to false.
|
|
15
|
+
*/
|
|
16
|
+
const BoolFromString = z
|
|
17
|
+
.union([z.boolean(), z.string()])
|
|
18
|
+
.transform((v) => {
|
|
19
|
+
if (typeof v === "boolean")
|
|
20
|
+
return v;
|
|
21
|
+
return /^(true|1|yes|on)$/i.test(v.trim());
|
|
22
|
+
});
|
|
23
|
+
const SshHostOverridesSchema = z
|
|
24
|
+
.string()
|
|
25
|
+
.optional()
|
|
26
|
+
.transform((raw) => {
|
|
27
|
+
if (!raw || raw.trim() === "")
|
|
28
|
+
return {};
|
|
29
|
+
try {
|
|
30
|
+
const parsed = JSON.parse(raw);
|
|
31
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
32
|
+
throw new Error("PROXMOX_SSH_HOST_OVERRIDES must be a JSON object");
|
|
33
|
+
}
|
|
34
|
+
const out = {};
|
|
35
|
+
for (const [k, v] of Object.entries(parsed)) {
|
|
36
|
+
if (typeof v !== "string") {
|
|
37
|
+
throw new Error(`PROXMOX_SSH_HOST_OVERRIDES[${k}] must be a string`);
|
|
38
|
+
}
|
|
39
|
+
out[k] = v;
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
throw new Error(`PROXMOX_SSH_HOST_OVERRIDES: ${err instanceof Error ? err.message : String(err)}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
const EnvSchema = z
|
|
48
|
+
.object({
|
|
49
|
+
// Proxmox API connection
|
|
50
|
+
PROXMOX_HOST: z.string().min(1).regex(HOST_REGEX, "invalid hostname"),
|
|
51
|
+
PROXMOX_PORT: z.coerce.number().int().min(1).max(65535).default(8006),
|
|
52
|
+
PROXMOX_USER: z.string().regex(USER_REGEX, "must be like 'user@realm'"),
|
|
53
|
+
PROXMOX_TOKEN_NAME: z.string().min(1),
|
|
54
|
+
PROXMOX_TOKEN_VALUE: z.string().min(8),
|
|
55
|
+
PROXMOX_VERIFY_SSL: BoolFromString.default(true),
|
|
56
|
+
PROXMOX_TIMEOUT_MS: z.coerce.number().int().min(1000).max(600_000).default(30_000),
|
|
57
|
+
PROXMOX_SERVICE: ServiceSchema.default("PVE"),
|
|
58
|
+
// Safety
|
|
59
|
+
PROXMOX_DEV_MODE: BoolFromString.default(false),
|
|
60
|
+
PROXMOX_DANGEROUSLY_ALLOW_DESTRUCTIVE: BoolFromString.default(false),
|
|
61
|
+
PROXMOX_MCP_APPROVAL_TOKEN: z.string().min(8).optional().or(z.literal("")),
|
|
62
|
+
PROXMOX_MCP_AUDIT_ONLY: BoolFromString.default(false),
|
|
63
|
+
// Logging
|
|
64
|
+
LOG_LEVEL: LogLevelSchema.default("info"),
|
|
65
|
+
LOG_PRETTY: BoolFromString.default(false),
|
|
66
|
+
// Retry & jobs
|
|
67
|
+
PROXMOX_MCP_RETRY_MAX: z.coerce.number().int().min(0).max(10).default(3),
|
|
68
|
+
PROXMOX_MCP_RETRY_BASE_MS: z.coerce.number().int().min(50).max(10_000).default(200),
|
|
69
|
+
PROXMOX_MCP_JOB_TTL_HOURS: z.coerce.number().int().min(1).max(168).default(24),
|
|
70
|
+
PROXMOX_MCP_JOB_STORE: z.enum(["memory", "sqlite"]).default("memory"),
|
|
71
|
+
PROXMOX_MCP_JOB_SQLITE_PATH: z.string().min(1).default("./proxmox-jobs.sqlite3"),
|
|
72
|
+
// Transport (Phase 2A)
|
|
73
|
+
MCP_TRANSPORT: z.enum(["STDIO", "SSE", "STREAMABLE"]).default("STDIO"),
|
|
74
|
+
MCP_HOST: z.string().default("127.0.0.1"),
|
|
75
|
+
MCP_PORT: z.coerce.number().int().min(1).max(65535).default(8000),
|
|
76
|
+
// SSH (for `pct exec` on containers)
|
|
77
|
+
PROXMOX_SSH_USER: z.string().default("root"),
|
|
78
|
+
PROXMOX_SSH_PORT: z.coerce.number().int().min(1).max(65535).default(22),
|
|
79
|
+
PROXMOX_SSH_KEY_FILE: z.string().optional().or(z.literal("")),
|
|
80
|
+
PROXMOX_SSH_PASSWORD: z.string().optional().or(z.literal("")),
|
|
81
|
+
PROXMOX_SSH_HOST_OVERRIDES: SshHostOverridesSchema,
|
|
82
|
+
PROXMOX_SSH_KNOWN_HOSTS_FILE: z.string().optional().or(z.literal("")),
|
|
83
|
+
PROXMOX_SSH_STRICT_HOST_KEY_CHECKING: BoolFromString.default(true),
|
|
84
|
+
// Download guard (SSRF mitigation for download_iso etc.)
|
|
85
|
+
PROXMOX_DOWNLOAD_ALLOWED_SCHEMES: z
|
|
86
|
+
.string()
|
|
87
|
+
.optional()
|
|
88
|
+
.or(z.literal(""))
|
|
89
|
+
.transform((raw) => !raw || raw.trim() === ""
|
|
90
|
+
? ["http", "https"]
|
|
91
|
+
: raw
|
|
92
|
+
.split(",")
|
|
93
|
+
.map((s) => s.trim().toLowerCase())
|
|
94
|
+
.filter(Boolean)),
|
|
95
|
+
PROXMOX_DOWNLOAD_ALLOWED_HOSTS: z
|
|
96
|
+
.string()
|
|
97
|
+
.optional()
|
|
98
|
+
.or(z.literal(""))
|
|
99
|
+
.transform((raw) => !raw || raw.trim() === ""
|
|
100
|
+
? []
|
|
101
|
+
: raw.split(",").map((s) => s.trim()).filter(Boolean)),
|
|
102
|
+
})
|
|
103
|
+
.superRefine((data, ctx) => {
|
|
104
|
+
// Guard: verify_ssl=false requires dev_mode=true
|
|
105
|
+
if (!data.PROXMOX_VERIFY_SSL && !data.PROXMOX_DEV_MODE) {
|
|
106
|
+
ctx.addIssue({
|
|
107
|
+
code: z.ZodIssueCode.custom,
|
|
108
|
+
path: ["PROXMOX_VERIFY_SSL"],
|
|
109
|
+
message: "PROXMOX_VERIFY_SSL=false requires PROXMOX_DEV_MODE=true",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Guard: at least one of key_file or password for SSH (warning only)
|
|
113
|
+
// We don't enforce — user might want password prompt via agent.
|
|
114
|
+
// Guard: approval_token or dangerously_allow_destructive should be set
|
|
115
|
+
// for any use of destructive tools. We log a warning at startup.
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* Parse and validate process.env. Throws ZodError on failure.
|
|
119
|
+
*/
|
|
120
|
+
export function parseEnv(env = process.env) {
|
|
121
|
+
const result = EnvSchema.safeParse(env);
|
|
122
|
+
if (!result.success) {
|
|
123
|
+
const issues = result.error.issues
|
|
124
|
+
.map((i) => ` - ${i.path.join(".") || "(root)"}: ${i.message}`)
|
|
125
|
+
.join("\n");
|
|
126
|
+
throw new Error(`Invalid environment configuration:\n${issues}`);
|
|
127
|
+
}
|
|
128
|
+
return result.data;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse and exit with code 2 on failure. Use in entry points.
|
|
132
|
+
*/
|
|
133
|
+
export function parseEnvOrExit(env = process.env) {
|
|
134
|
+
try {
|
|
135
|
+
return parseEnv(env);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
process.stderr.write(`\n[FATAL] ${err instanceof Error ? err.message : String(err)}\n\n` +
|
|
139
|
+
`Run 'npm run check-config' to diagnose, or 'cp .env.example .env' to start.\n`);
|
|
140
|
+
process.exit(2);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Build a LoggerConfig from env.
|
|
145
|
+
*/
|
|
146
|
+
export function loggerConfigFromEnv(env) {
|
|
147
|
+
return { level: env.LOG_LEVEL, pretty: env.LOG_PRETTY };
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,GAAG,iCAAiC,CAAC;AACrD,MAAM,UAAU,GAAG,6CAA6C,CAAC;AAEjE,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAClE,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC;KACrB,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;KAChC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;IACf,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IACrC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEL,MAAM,sBAAsB,GAAG,CAAC;KAC7B,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAA4B,CAAC;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,oBAAoB,CAAC,CAAC;YACvE,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,yBAAyB;IACzB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACrE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,2BAA2B,CAAC;IACvE,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,kBAAkB,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAClF,eAAe,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC;IAE7C,SAAS;IACT,gBAAgB,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/C,qCAAqC,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;IACpE,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,sBAAsB,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;IAErD,UAAU;IACV,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;IACzC,UAAU,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;IAEzC,eAAe;IACf,qBAAqB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACnF,yBAAyB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9E,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACrE,2BAA2B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC;IAEhF,uBAAuB;IACvB,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACtE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAEjE,qCAAqC;IACrC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAC5C,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACvE,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,0BAA0B,EAAE,sBAAsB;IAClD,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrE,oCAAoC,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;IAElE,yDAAyD;IACzD,gCAAgC,EAAE,CAAC;SAChC,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACjB,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CACjB,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QACvB,CAAC,CAAE,CAAC,MAAM,EAAE,OAAO,CAAW;QAC9B,CAAC,CAAE,GAAG;aACD,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aAClC,MAAM,CAAC,OAAO,CAAc,CACpC;IACH,8BAA8B,EAAE,CAAC;SAC9B,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SACjB,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CACjB,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QACvB,CAAC,CAAE,EAAe;QAClB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CACxD;CACJ,CAAC;KACD,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACzB,iDAAiD;IACjD,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvD,GAAG,CAAC,QAAQ,CAAC;YACX,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM;YAC3B,IAAI,EAAE,CAAC,oBAAoB,CAAC;YAC5B,OAAO,EAAE,yDAAyD;SACnE,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,gEAAgE;IAEhE,uEAAuE;IACvE,iEAAiE;AACnE,CAAC,CAAC,CAAC;AAIL;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/D,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,aAAa,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM;YACjE,+EAA+E,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAa;IAC/C,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config entrypoint. Loads .env, parses env, returns AppConfig.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { loadConfig } from "./config/index.js";
|
|
6
|
+
* const cfg = loadConfig();
|
|
7
|
+
*/
|
|
8
|
+
import "dotenv/config";
|
|
9
|
+
import { type AppConfig } from "./types.js";
|
|
10
|
+
import type { LoggerConfig } from "../log.js";
|
|
11
|
+
export { parseEnv, loggerConfigFromEnv } from "./env.js";
|
|
12
|
+
export type { EnvInput } from "./env.js";
|
|
13
|
+
export * from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Load (and cache) the AppConfig. Subsequent calls return the cached value.
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadConfig(): AppConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Load (and cache) the LoggerConfig.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadLoggerConfig(): LoggerConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Reset cached config (tests).
|
|
24
|
+
*/
|
|
25
|
+
export declare function resetConfig(): void;
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|