@studiometa/forge-core 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -28,11 +28,12 @@ console.log(result.data); // ForgeServer[]
28
28
  ```typescript
29
29
  import { RESOURCES, ACTIONS } from "@studiometa/forge-core";
30
30
 
31
- // RESOURCES: ['servers', 'sites', 'deployments', 'certificates', 'databases', 'daemons',
32
- // 'env', 'nginx', 'firewall-rules', 'ssh-keys', 'security-rules', 'redirect-rules',
33
- // 'nginx-templates', 'monitors', 'recipes']
31
+ // RESOURCES: ['servers', 'sites', 'deployments', 'certificates', 'databases',
32
+ // 'database-users', 'daemons', 'env', 'nginx', 'firewall-rules', 'ssh-keys',
33
+ // 'security-rules', 'redirect-rules', 'nginx-templates', 'monitors', 'recipes',
34
+ // 'backups', 'commands', 'scheduled-jobs', 'user', 'batch']
34
35
  // ACTIONS: ['list', 'get', 'create', 'update', 'delete', 'deploy', 'reboot', 'restart',
35
- // 'activate', 'run', 'help', 'schema']
36
+ // 'activate', 'run', 'resolve', 'help', 'schema', 'context']
36
37
  ```
37
38
 
38
39
  ## Executors
@@ -44,6 +45,7 @@ import { RESOURCES, ACTIONS } from "@studiometa/forge-core";
44
45
  - `createServer(data, ctx)` — Create a server
45
46
  - `deleteServer({ server_id }, ctx)` — Delete a server
46
47
  - `rebootServer({ server_id }, ctx)` — Reboot a server
48
+ - `resolveServers({ query }, ctx)` — Resolve servers by name (partial, case-insensitive); returns `ResolveResult` with `query`, `matches` (`id` + `name`), and `total`
47
49
 
48
50
  ### Sites
49
51
 
@@ -51,6 +53,7 @@ import { RESOURCES, ACTIONS } from "@studiometa/forge-core";
51
53
  - `getSite({ server_id, site_id }, ctx)` — Get a site
52
54
  - `createSite({ server_id, ...data }, ctx)` — Create a site
53
55
  - `deleteSite({ server_id, site_id }, ctx)` — Delete a site
56
+ - `resolveSites({ server_id, query }, ctx)` — Resolve sites by domain name (partial, case-insensitive); returns `ResolveSiteResult` with `query`, `matches` (`id` + `name`), and `total`
54
57
 
55
58
  ### Deployments
56
59
 
@@ -70,6 +73,10 @@ import { RESOURCES, ACTIONS } from "@studiometa/forge-core";
70
73
 
71
74
  - `listDatabases`, `getDatabase`, `createDatabase`, `deleteDatabase`
72
75
 
76
+ ### Database Users
77
+
78
+ - `listDatabaseUsers`, `getDatabaseUser`, `createDatabaseUser`, `deleteDatabaseUser`
79
+
73
80
  ### Daemons
74
81
 
75
82
  - `listDaemons`, `getDaemon`, `createDaemon`, `deleteDaemon`, `restartDaemon`
@@ -102,6 +109,47 @@ import { RESOURCES, ACTIONS } from "@studiometa/forge-core";
102
109
 
103
110
  - `listRecipes`, `getRecipe`, `createRecipe`, `deleteRecipe`, `runRecipe`
104
111
 
112
+ ### Backups
113
+
114
+ - `listBackupConfigs`, `getBackupConfig`, `createBackupConfig`, `deleteBackupConfig`
115
+
116
+ ### Commands
117
+
118
+ - `listCommands`, `getCommand`, `createCommand`
119
+
120
+ ### Scheduled Jobs
121
+
122
+ - `listScheduledJobs`, `getScheduledJob`, `createScheduledJob`, `deleteScheduledJob`
123
+
124
+ ### User
125
+
126
+ - `getUser(options, ctx)` — Get the authenticated user's profile
127
+
128
+ ## Utilities
129
+
130
+ ### `matchByName(items, query, getName)`
131
+
132
+ Case-insensitive exact and partial name matching — used internally by `resolveServers` and `resolveSites`, but exported for reuse:
133
+
134
+ ```typescript
135
+ import { matchByName } from "@studiometa/forge-core";
136
+
137
+ const result = matchByName(servers, "my-server", (s) => s.name);
138
+ // result.exact — items whose name matches exactly (case-insensitive)
139
+ // result.partial — items whose name contains the query (includes exact matches)
140
+ ```
141
+
142
+ **Signature:**
143
+
144
+ ```typescript
145
+ function matchByName<T>(items: T[], query: string, getName: (item: T) => string): NameMatch<T>;
146
+
147
+ interface NameMatch<T> {
148
+ exact: T[];
149
+ partial: T[];
150
+ }
151
+ ```
152
+
105
153
  ## Audit Logging
106
154
 
107
155
  A shared audit logger for tracking write operations across MCP and CLI:
@@ -2,12 +2,12 @@
2
2
  * All supported resources.
3
3
  * Single source of truth — MCP schema and handlers derive from this.
4
4
  */
5
- export declare const RESOURCES: readonly ["servers", "sites", "deployments", "certificates", "databases", "database-users", "daemons", "env", "nginx", "firewall-rules", "ssh-keys", "security-rules", "redirect-rules", "nginx-templates", "monitors", "recipes", "backups", "commands", "scheduled-jobs", "user"];
5
+ export declare const RESOURCES: readonly ["servers", "sites", "deployments", "certificates", "databases", "database-users", "daemons", "env", "nginx", "firewall-rules", "ssh-keys", "security-rules", "redirect-rules", "nginx-templates", "monitors", "recipes", "backups", "commands", "scheduled-jobs", "user", "batch"];
6
6
  export type Resource = (typeof RESOURCES)[number];
7
7
  /**
8
8
  * All supported actions.
9
9
  * Single source of truth — MCP schema and handlers derive from this.
10
10
  */
11
- export declare const ACTIONS: readonly ["list", "get", "create", "update", "delete", "deploy", "reboot", "restart", "activate", "run", "help", "schema"];
11
+ export declare const ACTIONS: readonly ["list", "get", "create", "update", "delete", "deploy", "reboot", "restart", "activate", "run", "resolve", "help", "schema", "context"];
12
12
  export type Action = (typeof ACTIONS)[number];
13
13
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,SAAS,qRAqBZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,OAAO,4HAaV,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,SAAS,8RAsBZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,OAAO,kJAeV,CAAC;AAEX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -3,5 +3,7 @@ export { deleteServer } from "./delete.ts";
3
3
  export { getServer } from "./get.ts";
4
4
  export { listServers } from "./list.ts";
5
5
  export { rebootServer } from "./reboot.ts";
6
+ export { resolveServers } from "./resolve.ts";
6
7
  export type { CreateServerOptions, DeleteServerOptions, GetServerOptions, ListServersOptions, RebootServerOptions, } from "./types.ts";
8
+ export type { ResolveServersOptions, ResolveMatch, ResolveResult } from "./resolve.ts";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/executors/servers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/executors/servers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ExecutorContext, ExecutorResult } from "../../context.ts";
2
+ export interface ResolveServersOptions {
3
+ query: string;
4
+ }
5
+ export interface ResolveMatch {
6
+ id: number;
7
+ name: string;
8
+ }
9
+ export interface ResolveResult {
10
+ query: string;
11
+ matches: ResolveMatch[];
12
+ total: number;
13
+ }
14
+ /**
15
+ * Resolve servers by name — partial, case-insensitive match.
16
+ *
17
+ * If exactly one server matches the query exactly, it is returned as a single result.
18
+ * Otherwise all partial matches are returned.
19
+ */
20
+ export declare function resolveServers(options: ResolveServersOptions, ctx: ExecutorContext): Promise<ExecutorResult<ResolveResult>>;
21
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/executors/servers/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxE,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,EAC9B,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAcxC"}
@@ -2,5 +2,7 @@ export { createSite } from "./create.ts";
2
2
  export { deleteSite } from "./delete.ts";
3
3
  export { getSite } from "./get.ts";
4
4
  export { listSites } from "./list.ts";
5
+ export { resolveSites } from "./resolve.ts";
5
6
  export type { CreateSiteOptions, DeleteSiteOptions, GetSiteOptions, ListSitesOptions, } from "./types.ts";
7
+ export type { ResolveSitesOptions, ResolveSiteMatch, ResolveSiteResult } from "./resolve.ts";
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/executors/sites/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/executors/sites/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ExecutorContext, ExecutorResult } from "../../context.ts";
2
+ export interface ResolveSitesOptions {
3
+ server_id: string;
4
+ query: string;
5
+ }
6
+ export interface ResolveSiteMatch {
7
+ id: number;
8
+ name: string;
9
+ }
10
+ export interface ResolveSiteResult {
11
+ query: string;
12
+ matches: ResolveSiteMatch[];
13
+ total: number;
14
+ }
15
+ /**
16
+ * Resolve sites by domain name — partial, case-insensitive match.
17
+ *
18
+ * If exactly one site matches the query exactly, it is returned as a single result.
19
+ * Otherwise all partial matches are returned.
20
+ */
21
+ export declare function resolveSites(options: ResolveSitesOptions, ctx: ExecutorContext): Promise<ExecutorResult<ResolveSiteResult>>;
22
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/executors/sites/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGxE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,EAC5B,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAc5C"}
package/dist/index.d.ts CHANGED
@@ -1,14 +1,16 @@
1
1
  export { ACTIONS, RESOURCES } from "./constants.ts";
2
2
  export type { Action, Resource } from "./constants.ts";
3
+ export { matchByName } from "./utils/name-matcher.ts";
4
+ export type { NameMatch } from "./utils/name-matcher.ts";
3
5
  export { createAuditLogger, sanitizeArgs, getAuditLogPath } from "./logger.ts";
4
6
  export type { AuditLogger, AuditLogEntry } from "./logger.ts";
5
7
  export { createTestExecutorContext } from "./context.ts";
6
8
  export type { ExecutorContext, ExecutorResult } from "./context.ts";
7
9
  export type { Executor } from "./executors/types.ts";
8
- export { createServer, deleteServer, getServer, listServers, rebootServer, } from "./executors/servers/index.ts";
9
- export type { CreateServerOptions, DeleteServerOptions, GetServerOptions, ListServersOptions, RebootServerOptions, } from "./executors/servers/index.ts";
10
- export { createSite, deleteSite, getSite, listSites } from "./executors/sites/index.ts";
11
- export type { CreateSiteOptions, DeleteSiteOptions, GetSiteOptions, ListSitesOptions, } from "./executors/sites/index.ts";
10
+ export { createServer, deleteServer, getServer, listServers, rebootServer, resolveServers, } from "./executors/servers/index.ts";
11
+ export type { CreateServerOptions, DeleteServerOptions, GetServerOptions, ListServersOptions, RebootServerOptions, ResolveServersOptions, ResolveMatch, ResolveResult, } from "./executors/servers/index.ts";
12
+ export { createSite, deleteSite, getSite, listSites, resolveSites, } from "./executors/sites/index.ts";
13
+ export type { CreateSiteOptions, DeleteSiteOptions, GetSiteOptions, ListSitesOptions, ResolveSitesOptions, ResolveSiteMatch, ResolveSiteResult, } from "./executors/sites/index.ts";
12
14
  export { deploySite, deploySiteAndWait, getDeploymentLog, getDeploymentOutput, getDeploymentScript, listDeployments, updateDeploymentScript, } from "./executors/deployments/index.ts";
13
15
  export type { DeployResult, DeploySiteAndWaitOptions, DeploySiteOptions, GetDeploymentLogOptions, GetDeploymentOutputOptions, GetDeploymentScriptOptions, ListDeploymentsOptions, UpdateDeploymentScriptOptions, } from "./executors/deployments/index.ts";
14
16
  export { activateCertificate, createCertificate, deleteCertificate, getCertificate, listCertificates, } from "./executors/certificates/index.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpD,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,aAAa,GACd,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,UAAU,EACV,UAAU,EACV,OAAO,EACP,SAAS,EACT,YAAY,GACb,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,cAAc,EACd,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACnG,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EACV,0BAA0B,EAC1B,0BAA0B,EAC1B,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGhF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGlG,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,WAAW,EACX,SAAS,GACV,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACxF,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -46,7 +46,8 @@ const RESOURCES = [
46
46
  "backups",
47
47
  "commands",
48
48
  "scheduled-jobs",
49
- "user"
49
+ "user",
50
+ "batch"
50
51
  ];
51
52
  /**
52
53
  * All supported actions.
@@ -63,9 +64,26 @@ const ACTIONS = [
63
64
  "restart",
64
65
  "activate",
65
66
  "run",
67
+ "resolve",
66
68
  "help",
67
- "schema"
69
+ "schema",
70
+ "context"
68
71
  ];
72
+ /**
73
+ * Match items by name using case-insensitive exact and partial matching.
74
+ *
75
+ * @param items - The items to search through.
76
+ * @param query - The search query.
77
+ * @param getName - Function to extract the name from an item.
78
+ * @returns Object with exact and partial match arrays.
79
+ */
80
+ function matchByName(items, query, getName) {
81
+ const lower = query.toLowerCase();
82
+ return {
83
+ exact: items.filter((item) => getName(item).toLowerCase() === lower),
84
+ partial: items.filter((item) => getName(item).toLowerCase().includes(lower))
85
+ };
86
+ }
69
87
  var require_quick_format_unescaped = /* @__PURE__ */ __commonJSMin(((exports, module) => {
70
88
  function tryStringify(o) {
71
89
  try {
@@ -677,6 +695,25 @@ async function rebootServer(options, ctx) {
677
695
  return { data: void 0 };
678
696
  }
679
697
  /**
698
+ * Resolve servers by name — partial, case-insensitive match.
699
+ *
700
+ * If exactly one server matches the query exactly, it is returned as a single result.
701
+ * Otherwise all partial matches are returned.
702
+ */
703
+ async function resolveServers(options, ctx) {
704
+ const servers = (await ctx.client.get("/servers")).servers;
705
+ const match = matchByName(servers, options.query, (s) => s.name);
706
+ const matches = match.exact.length === 1 ? match.exact : match.partial;
707
+ return { data: {
708
+ query: options.query,
709
+ matches: matches.map((s) => ({
710
+ id: s.id,
711
+ name: s.name
712
+ })),
713
+ total: matches.length
714
+ } };
715
+ }
716
+ /**
680
717
  * Create a new site on a server.
681
718
  */
682
719
  async function createSite(options, ctx) {
@@ -703,6 +740,25 @@ async function listSites(options, ctx) {
703
740
  return { data: (await ctx.client.get(`/servers/${options.server_id}/sites`)).sites };
704
741
  }
705
742
  /**
743
+ * Resolve sites by domain name — partial, case-insensitive match.
744
+ *
745
+ * If exactly one site matches the query exactly, it is returned as a single result.
746
+ * Otherwise all partial matches are returned.
747
+ */
748
+ async function resolveSites(options, ctx) {
749
+ const sites = (await ctx.client.get(`/servers/${options.server_id}/sites`)).sites;
750
+ const match = matchByName(sites, options.query, (s) => s.name);
751
+ const matches = match.exact.length === 1 ? match.exact : match.partial;
752
+ return { data: {
753
+ query: options.query,
754
+ matches: matches.map((s) => ({
755
+ id: s.id,
756
+ name: s.name
757
+ })),
758
+ total: matches.length
759
+ } };
760
+ }
761
+ /**
706
762
  * Trigger a deployment for a site.
707
763
  */
708
764
  async function deploySite(options, ctx) {
@@ -1120,6 +1176,6 @@ async function listScheduledJobs(options, ctx) {
1120
1176
  async function getUser(_options, ctx) {
1121
1177
  return { data: (await ctx.client.get("/user")).user };
1122
1178
  }
1123
- export { ACTIONS, RESOURCES, activateCertificate, createAuditLogger, createBackupConfig, createCertificate, createCommand, createDaemon, createDatabase, createDatabaseUser, createFirewallRule, createMonitor, createNginxTemplate, createRecipe, createRedirectRule, createScheduledJob, createSecurityRule, createServer, createSite, createSshKey, createTestExecutorContext, deleteBackupConfig, deleteCertificate, deleteDaemon, deleteDatabase, deleteDatabaseUser, deleteFirewallRule, deleteMonitor, deleteNginxTemplate, deleteRecipe, deleteRedirectRule, deleteScheduledJob, deleteSecurityRule, deleteServer, deleteSite, deleteSshKey, deploySite, deploySiteAndWait, getAuditLogPath, getBackupConfig, getCertificate, getCommand, getDaemon, getDatabase, getDatabaseUser, getDeploymentLog, getDeploymentOutput, getDeploymentScript, getEnv, getFirewallRule, getMonitor, getNginxConfig, getNginxTemplate, getRecipe, getRedirectRule, getScheduledJob, getSecurityRule, getServer, getSite, getSshKey, getUser, listBackupConfigs, listCertificates, listCommands, listDaemons, listDatabaseUsers, listDatabases, listDeployments, listFirewallRules, listMonitors, listNginxTemplates, listRecipes, listRedirectRules, listScheduledJobs, listSecurityRules, listServers, listSites, listSshKeys, rebootServer, restartDaemon, runRecipe, sanitizeArgs, updateDeploymentScript, updateEnv, updateNginxConfig, updateNginxTemplate };
1179
+ export { ACTIONS, RESOURCES, activateCertificate, createAuditLogger, createBackupConfig, createCertificate, createCommand, createDaemon, createDatabase, createDatabaseUser, createFirewallRule, createMonitor, createNginxTemplate, createRecipe, createRedirectRule, createScheduledJob, createSecurityRule, createServer, createSite, createSshKey, createTestExecutorContext, deleteBackupConfig, deleteCertificate, deleteDaemon, deleteDatabase, deleteDatabaseUser, deleteFirewallRule, deleteMonitor, deleteNginxTemplate, deleteRecipe, deleteRedirectRule, deleteScheduledJob, deleteSecurityRule, deleteServer, deleteSite, deleteSshKey, deploySite, deploySiteAndWait, getAuditLogPath, getBackupConfig, getCertificate, getCommand, getDaemon, getDatabase, getDatabaseUser, getDeploymentLog, getDeploymentOutput, getDeploymentScript, getEnv, getFirewallRule, getMonitor, getNginxConfig, getNginxTemplate, getRecipe, getRedirectRule, getScheduledJob, getSecurityRule, getServer, getSite, getSshKey, getUser, listBackupConfigs, listCertificates, listCommands, listDaemons, listDatabaseUsers, listDatabases, listDeployments, listFirewallRules, listMonitors, listNginxTemplates, listRecipes, listRedirectRules, listScheduledJobs, listSecurityRules, listServers, listSites, listSshKeys, matchByName, rebootServer, resolveServers, resolveSites, restartDaemon, runRecipe, sanitizeArgs, updateDeploymentScript, updateEnv, updateNginxConfig, updateNginxTemplate };
1124
1180
 
1125
1181
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../../../node_modules/quick-format-unescaped/index.js","../../../node_modules/pino/browser.js","../src/logger.ts","../src/context.ts","../src/executors/servers/create.ts","../src/executors/servers/delete.ts","../src/executors/servers/get.ts","../src/executors/servers/list.ts","../src/executors/servers/reboot.ts","../src/executors/sites/create.ts","../src/executors/sites/delete.ts","../src/executors/sites/get.ts","../src/executors/sites/list.ts","../src/executors/deployments/deploy.ts","../src/executors/deployments/deploy-and-wait.ts","../src/executors/deployments/get-log.ts","../src/executors/deployments/get-output.ts","../src/executors/deployments/get-script.ts","../src/executors/deployments/list.ts","../src/executors/deployments/update-script.ts","../src/executors/certificates/activate.ts","../src/executors/certificates/create.ts","../src/executors/certificates/delete.ts","../src/executors/certificates/get.ts","../src/executors/certificates/list.ts","../src/executors/databases/create.ts","../src/executors/databases/delete.ts","../src/executors/databases/get.ts","../src/executors/databases/list.ts","../src/executors/database-users/create.ts","../src/executors/database-users/delete.ts","../src/executors/database-users/get.ts","../src/executors/database-users/list.ts","../src/executors/daemons/create.ts","../src/executors/daemons/delete.ts","../src/executors/daemons/get.ts","../src/executors/daemons/list.ts","../src/executors/daemons/restart.ts","../src/executors/firewall-rules/create.ts","../src/executors/firewall-rules/delete.ts","../src/executors/firewall-rules/get.ts","../src/executors/firewall-rules/list.ts","../src/executors/ssh-keys/create.ts","../src/executors/ssh-keys/delete.ts","../src/executors/ssh-keys/get.ts","../src/executors/ssh-keys/list.ts","../src/executors/security-rules/create.ts","../src/executors/security-rules/delete.ts","../src/executors/security-rules/get.ts","../src/executors/security-rules/list.ts","../src/executors/redirect-rules/create.ts","../src/executors/redirect-rules/delete.ts","../src/executors/redirect-rules/get.ts","../src/executors/redirect-rules/list.ts","../src/executors/monitors/create.ts","../src/executors/monitors/delete.ts","../src/executors/monitors/get.ts","../src/executors/monitors/list.ts","../src/executors/nginx-templates/create.ts","../src/executors/nginx-templates/delete.ts","../src/executors/nginx-templates/get.ts","../src/executors/nginx-templates/list.ts","../src/executors/nginx-templates/update.ts","../src/executors/env/get.ts","../src/executors/env/update.ts","../src/executors/nginx/get.ts","../src/executors/nginx/update.ts","../src/executors/recipes/create.ts","../src/executors/recipes/delete.ts","../src/executors/recipes/get.ts","../src/executors/recipes/list.ts","../src/executors/recipes/run.ts","../src/executors/backups/create.ts","../src/executors/backups/delete.ts","../src/executors/backups/get.ts","../src/executors/backups/list.ts","../src/executors/commands/create.ts","../src/executors/commands/get.ts","../src/executors/commands/list.ts","../src/executors/scheduled-jobs/create.ts","../src/executors/scheduled-jobs/delete.ts","../src/executors/scheduled-jobs/get.ts","../src/executors/scheduled-jobs/list.ts","../src/executors/user/get.ts"],"sourcesContent":["/**\n * All supported resources.\n * Single source of truth — MCP schema and handlers derive from this.\n */\nexport const RESOURCES = [\n \"servers\",\n \"sites\",\n \"deployments\",\n \"certificates\",\n \"databases\",\n \"database-users\",\n \"daemons\",\n \"env\",\n \"nginx\",\n \"firewall-rules\",\n \"ssh-keys\",\n \"security-rules\",\n \"redirect-rules\",\n \"nginx-templates\",\n \"monitors\",\n \"recipes\",\n \"backups\",\n \"commands\",\n \"scheduled-jobs\",\n \"user\",\n] as const;\n\nexport type Resource = (typeof RESOURCES)[number];\n\n/**\n * All supported actions.\n * Single source of truth — MCP schema and handlers derive from this.\n */\nexport const ACTIONS = [\n \"list\",\n \"get\",\n \"create\",\n \"update\",\n \"delete\",\n \"deploy\",\n \"reboot\",\n \"restart\",\n \"activate\",\n \"run\",\n \"help\",\n \"schema\",\n] as const;\n\nexport type Action = (typeof ACTIONS)[number];\n","'use strict'\nfunction tryStringify (o) {\n try { return JSON.stringify(o) } catch(e) { return '\"[Circular]\"' }\n}\n\nmodule.exports = format\n\nfunction format(f, args, opts) {\n var ss = (opts && opts.stringify) || tryStringify\n var offset = 1\n if (typeof f === 'object' && f !== null) {\n var len = args.length + offset\n if (len === 1) return f\n var objects = new Array(len)\n objects[0] = ss(f)\n for (var index = 1; index < len; index++) {\n objects[index] = ss(args[index])\n }\n return objects.join(' ')\n }\n if (typeof f !== 'string') {\n return f\n }\n var argLen = args.length\n if (argLen === 0) return f\n var str = ''\n var a = 1 - offset\n var lastPos = -1\n var flen = (f && f.length) || 0\n for (var i = 0; i < flen;) {\n if (f.charCodeAt(i) === 37 && i + 1 < flen) {\n lastPos = lastPos > -1 ? lastPos : 0\n switch (f.charCodeAt(i + 1)) {\n case 100: // 'd'\n case 102: // 'f'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Number(args[a])\n lastPos = i + 2\n i++\n break\n case 105: // 'i'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Math.floor(Number(args[a]))\n lastPos = i + 2\n i++\n break\n case 79: // 'O'\n case 111: // 'o'\n case 106: // 'j'\n if (a >= argLen)\n break\n if (args[a] === undefined) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n var type = typeof args[a]\n if (type === 'string') {\n str += '\\'' + args[a] + '\\''\n lastPos = i + 2\n i++\n break\n }\n if (type === 'function') {\n str += args[a].name || '<anonymous>'\n lastPos = i + 2\n i++\n break\n }\n str += ss(args[a])\n lastPos = i + 2\n i++\n break\n case 115: // 's'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += String(args[a])\n lastPos = i + 2\n i++\n break\n case 37: // '%'\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += '%'\n lastPos = i + 2\n i++\n a--\n break\n }\n ++a\n }\n ++i\n }\n if (lastPos === -1)\n return f\n else if (lastPos < flen) {\n str += f.slice(lastPos)\n }\n\n return str\n}\n","'use strict'\n\nconst format = require('quick-format-unescaped')\n\nmodule.exports = pino\n\nconst _console = pfGlobalThisOrFallback().console || {}\nconst stdSerializers = {\n mapHttpRequest: mock,\n mapHttpResponse: mock,\n wrapRequestSerializer: passthrough,\n wrapResponseSerializer: passthrough,\n wrapErrorSerializer: passthrough,\n req: mock,\n res: mock,\n err: asErrValue,\n errWithCause: asErrValue\n}\nfunction levelToValue (level, logger) {\n return level === 'silent'\n ? Infinity\n : logger.levels.values[level]\n}\nconst baseLogFunctionSymbol = Symbol('pino.logFuncs')\nconst hierarchySymbol = Symbol('pino.hierarchy')\n\nconst logFallbackMap = {\n error: 'log',\n fatal: 'error',\n warn: 'error',\n info: 'log',\n debug: 'log',\n trace: 'log'\n}\n\nfunction appendChildLogger (parentLogger, childLogger) {\n const newEntry = {\n logger: childLogger,\n parent: parentLogger[hierarchySymbol]\n }\n childLogger[hierarchySymbol] = newEntry\n}\n\nfunction setupBaseLogFunctions (logger, levels, proto) {\n const logFunctions = {}\n levels.forEach(level => {\n logFunctions[level] = proto[level] ? proto[level] : (_console[level] || _console[logFallbackMap[level] || 'log'] || noop)\n })\n logger[baseLogFunctionSymbol] = logFunctions\n}\n\nfunction shouldSerialize (serialize, serializers) {\n if (Array.isArray(serialize)) {\n const hasToFilter = serialize.filter(function (k) {\n return k !== '!stdSerializers.err'\n })\n return hasToFilter\n } else if (serialize === true) {\n return Object.keys(serializers)\n }\n\n return false\n}\n\nfunction pino (opts) {\n opts = opts || {}\n opts.browser = opts.browser || {}\n\n const transmit = opts.browser.transmit\n if (transmit && typeof transmit.send !== 'function') { throw Error('pino: transmit option must have a send function') }\n\n const proto = opts.browser.write || _console\n if (opts.browser.write) opts.browser.asObject = true\n const serializers = opts.serializers || {}\n const serialize = shouldSerialize(opts.browser.serialize, serializers)\n let stdErrSerialize = opts.browser.serialize\n\n if (\n Array.isArray(opts.browser.serialize) &&\n opts.browser.serialize.indexOf('!stdSerializers.err') > -1\n ) stdErrSerialize = false\n\n const customLevels = Object.keys(opts.customLevels || {})\n const levels = ['error', 'fatal', 'warn', 'info', 'debug', 'trace'].concat(customLevels)\n\n if (typeof proto === 'function') {\n levels.forEach(function (level) {\n proto[level] = proto\n })\n }\n if (opts.enabled === false || opts.browser.disabled) opts.level = 'silent'\n const level = opts.level || 'info'\n const logger = Object.create(proto)\n if (!logger.log) logger.log = noop\n\n setupBaseLogFunctions(logger, levels, proto)\n // setup root hierarchy entry\n appendChildLogger({}, logger)\n\n Object.defineProperty(logger, 'levelVal', {\n get: getLevelVal\n })\n Object.defineProperty(logger, 'level', {\n get: getLevel,\n set: setLevel\n })\n\n const setOpts = {\n transmit,\n serialize,\n asObject: opts.browser.asObject,\n asObjectBindingsOnly: opts.browser.asObjectBindingsOnly,\n formatters: opts.browser.formatters,\n reportCaller: opts.browser.reportCaller,\n levels,\n timestamp: getTimeFunction(opts),\n messageKey: opts.messageKey || 'msg',\n onChild: opts.onChild || noop\n }\n logger.levels = getLevels(opts)\n logger.level = level\n\n logger.isLevelEnabled = function (level) {\n if (!this.levels.values[level]) {\n return false\n }\n\n return this.levels.values[level] >= this.levels.values[this.level]\n }\n logger.setMaxListeners = logger.getMaxListeners =\n logger.emit = logger.addListener = logger.on =\n logger.prependListener = logger.once =\n logger.prependOnceListener = logger.removeListener =\n logger.removeAllListeners = logger.listeners =\n logger.listenerCount = logger.eventNames =\n logger.write = logger.flush = noop\n logger.serializers = serializers\n logger._serialize = serialize\n logger._stdErrSerialize = stdErrSerialize\n logger.child = function (...args) { return child.call(this, setOpts, ...args) }\n\n if (transmit) logger._logEvent = createLogEventShape()\n\n function getLevelVal () {\n return levelToValue(this.level, this)\n }\n\n function getLevel () {\n return this._level\n }\n function setLevel (level) {\n if (level !== 'silent' && !this.levels.values[level]) {\n throw Error('unknown level ' + level)\n }\n this._level = level\n\n set(this, setOpts, logger, 'error') // <-- must stay first\n set(this, setOpts, logger, 'fatal')\n set(this, setOpts, logger, 'warn')\n set(this, setOpts, logger, 'info')\n set(this, setOpts, logger, 'debug')\n set(this, setOpts, logger, 'trace')\n\n customLevels.forEach((level) => {\n set(this, setOpts, logger, level)\n })\n }\n\n function child (setOpts, bindings, childOptions) {\n if (!bindings) {\n throw new Error('missing bindings for child Pino')\n }\n childOptions = childOptions || {}\n if (serialize && bindings.serializers) {\n childOptions.serializers = bindings.serializers\n }\n const childOptionsSerializers = childOptions.serializers\n if (serialize && childOptionsSerializers) {\n var childSerializers = Object.assign({}, serializers, childOptionsSerializers)\n var childSerialize = opts.browser.serialize === true\n ? Object.keys(childSerializers)\n : serialize\n delete bindings.serializers\n applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)\n }\n function Child (parent) {\n this._childLevel = (parent._childLevel | 0) + 1\n\n // make sure bindings are available in the `set` function\n this.bindings = bindings\n\n if (childSerializers) {\n this.serializers = childSerializers\n this._serialize = childSerialize\n }\n if (transmit) {\n this._logEvent = createLogEventShape(\n [].concat(parent._logEvent.bindings, bindings)\n )\n }\n }\n Child.prototype = this\n const newLogger = new Child(this)\n\n // must happen before the level is assigned\n appendChildLogger(this, newLogger)\n newLogger.child = function (...args) { return child.call(this, setOpts, ...args) }\n // required to actually initialize the logger functions for any given child\n newLogger.level = childOptions.level || this.level // allow level to be set by childOptions\n setOpts.onChild(newLogger)\n\n return newLogger\n }\n return logger\n}\n\nfunction getLevels (opts) {\n const customLevels = opts.customLevels || {}\n\n const values = Object.assign({}, pino.levels.values, customLevels)\n const labels = Object.assign({}, pino.levels.labels, invertObject(customLevels))\n\n return {\n values,\n labels\n }\n}\n\nfunction invertObject (obj) {\n const inverted = {}\n Object.keys(obj).forEach(function (key) {\n inverted[obj[key]] = key\n })\n return inverted\n}\n\npino.levels = {\n values: {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10\n },\n labels: {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal'\n }\n}\n\npino.stdSerializers = stdSerializers\npino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })\n\nfunction getBindingChain (logger) {\n const bindings = []\n if (logger.bindings) {\n bindings.push(logger.bindings)\n }\n\n // traverse up the tree to get all bindings\n let hierarchy = logger[hierarchySymbol]\n while (hierarchy.parent) {\n hierarchy = hierarchy.parent\n if (hierarchy.logger.bindings) {\n bindings.push(hierarchy.logger.bindings)\n }\n }\n\n return bindings.reverse()\n}\n\nfunction set (self, opts, rootLogger, level) {\n // override the current log functions with either `noop` or the base log function\n Object.defineProperty(self, level, {\n value: (levelToValue(self.level, rootLogger) > levelToValue(level, rootLogger)\n ? noop\n : rootLogger[baseLogFunctionSymbol][level]),\n writable: true,\n enumerable: true,\n configurable: true\n })\n\n if (self[level] === noop) {\n if (!opts.transmit) return\n\n const transmitLevel = opts.transmit.level || self.level\n const transmitValue = levelToValue(transmitLevel, rootLogger)\n const methodValue = levelToValue(level, rootLogger)\n if (methodValue < transmitValue) return\n }\n\n // make sure the log format is correct\n self[level] = createWrap(self, opts, rootLogger, level)\n\n // prepend bindings if it is not the root logger\n const bindings = getBindingChain(self)\n if (bindings.length === 0) {\n // early exit in case for rootLogger\n return\n }\n self[level] = prependBindingsInArguments(bindings, self[level])\n}\n\nfunction prependBindingsInArguments (bindings, logFunc) {\n return function () {\n return logFunc.apply(this, [...bindings, ...arguments])\n }\n}\n\nfunction createWrap (self, opts, rootLogger, level) {\n return (function (write) {\n return function LOG () {\n const ts = opts.timestamp()\n const args = new Array(arguments.length)\n const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this\n for (var i = 0; i < args.length; i++) args[i] = arguments[i]\n\n var argsIsSerialized = false\n if (opts.serialize) {\n applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)\n argsIsSerialized = true\n }\n if (opts.asObject || opts.formatters) {\n const out = asObject(this, level, args, ts, opts)\n if (opts.reportCaller && out && out.length > 0 && out[0] && typeof out[0] === 'object') {\n try {\n const caller = getCallerLocation()\n if (caller) out[0].caller = caller\n } catch (e) {}\n }\n write.call(proto, ...out)\n } else {\n if (opts.reportCaller) {\n try {\n const caller = getCallerLocation()\n if (caller) args.push(caller)\n } catch (e) {}\n }\n write.apply(proto, args)\n }\n\n if (opts.transmit) {\n const transmitLevel = opts.transmit.level || self._level\n const transmitValue = levelToValue(transmitLevel, rootLogger)\n const methodValue = levelToValue(level, rootLogger)\n if (methodValue < transmitValue) return\n transmit(this, {\n ts,\n methodLevel: level,\n methodValue,\n transmitLevel,\n transmitValue: rootLogger.levels.values[opts.transmit.level || self._level],\n send: opts.transmit.send,\n val: levelToValue(self._level, rootLogger)\n }, args, argsIsSerialized)\n }\n }\n })(self[baseLogFunctionSymbol][level])\n}\n\nfunction asObject (logger, level, args, ts, opts) {\n const {\n level: levelFormatter,\n log: logObjectFormatter = (obj) => obj\n } = opts.formatters || {}\n const argsCloned = args.slice()\n let msg = argsCloned[0]\n const logObject = {}\n\n let lvl = (logger._childLevel | 0) + 1\n if (lvl < 1) lvl = 1\n\n if (ts) {\n logObject.time = ts\n }\n\n if (levelFormatter) {\n const formattedLevel = levelFormatter(level, logger.levels.values[level])\n Object.assign(logObject, formattedLevel)\n } else {\n logObject.level = logger.levels.values[level]\n }\n\n if (opts.asObjectBindingsOnly) {\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n }\n\n const formattedLogObject = logObjectFormatter(logObject)\n return [formattedLogObject, ...argsCloned]\n } else {\n // deliberate, catching objects, arrays\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined\n } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)\n if (msg !== undefined) logObject[opts.messageKey] = msg\n\n const formattedLogObject = logObjectFormatter(logObject)\n return [formattedLogObject]\n }\n}\n\nfunction applySerializers (args, serialize, serializers, stdErrSerialize) {\n for (const i in args) {\n if (stdErrSerialize && args[i] instanceof Error) {\n args[i] = pino.stdSerializers.err(args[i])\n } else if (typeof args[i] === 'object' && !Array.isArray(args[i]) && serialize) {\n for (const k in args[i]) {\n if (serialize.indexOf(k) > -1 && k in serializers) {\n args[i][k] = serializers[k](args[i][k])\n }\n }\n }\n }\n}\n\nfunction transmit (logger, opts, args, argsIsSerialized = false) {\n const send = opts.send\n const ts = opts.ts\n const methodLevel = opts.methodLevel\n const methodValue = opts.methodValue\n const val = opts.val\n const bindings = logger._logEvent.bindings\n\n if (!argsIsSerialized) {\n applySerializers(\n args,\n logger._serialize || Object.keys(logger.serializers),\n logger.serializers,\n logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize\n )\n }\n\n logger._logEvent.ts = ts\n logger._logEvent.messages = args.filter(function (arg) {\n // bindings can only be objects, so reference equality check via indexOf is fine\n return bindings.indexOf(arg) === -1\n })\n\n logger._logEvent.level.label = methodLevel\n logger._logEvent.level.value = methodValue\n\n send(methodLevel, logger._logEvent, val)\n\n logger._logEvent = createLogEventShape(bindings)\n}\n\nfunction createLogEventShape (bindings) {\n return {\n ts: 0,\n messages: [],\n bindings: bindings || [],\n level: { label: '', value: 0 }\n }\n}\n\nfunction asErrValue (err) {\n const obj = {\n type: err.constructor.name,\n msg: err.message,\n stack: err.stack\n }\n for (const key in err) {\n if (obj[key] === undefined) {\n obj[key] = err[key]\n }\n }\n return obj\n}\n\nfunction getTimeFunction (opts) {\n if (typeof opts.timestamp === 'function') {\n return opts.timestamp\n }\n if (opts.timestamp === false) {\n return nullTime\n }\n return epochTime\n}\n\nfunction mock () { return {} }\nfunction passthrough (a) { return a }\nfunction noop () {}\n\nfunction nullTime () { return false }\nfunction epochTime () { return Date.now() }\nfunction unixTime () { return Math.round(Date.now() / 1000.0) }\nfunction isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability\n\n/* eslint-disable */\n/* istanbul ignore next */\nfunction pfGlobalThisOrFallback () {\n function defd (o) { return typeof o !== 'undefined' && o }\n try {\n if (typeof globalThis !== 'undefined') return globalThis\n Object.defineProperty(Object.prototype, 'globalThis', {\n get: function () {\n delete Object.prototype.globalThis\n return (this.globalThis = this)\n },\n configurable: true\n })\n return globalThis\n } catch (e) {\n return defd(self) || defd(window) || defd(this) || {}\n }\n}\n/* eslint-enable */\n\nmodule.exports.default = pino\nmodule.exports.pino = pino\n\n// Attempt to extract the user callsite (file:line:column)\n/* istanbul ignore next */\nfunction getCallerLocation () {\n const stack = (new Error()).stack\n if (!stack) return null\n const lines = stack.split('\\n')\n for (let i = 1; i < lines.length; i++) {\n const l = lines[i].trim()\n // skip frames from this file and internals\n if (/(^at\\s+)?(createWrap|LOG|set\\s*\\(|asObject|Object\\.apply|Function\\.apply)/.test(l)) continue\n if (l.indexOf('browser.js') !== -1) continue\n if (l.indexOf('node:internal') !== -1) continue\n if (l.indexOf('node_modules') !== -1) continue\n // try formats like: at func (file:line:col) or at file:line:col\n let m = l.match(/\\((.*?):(\\d+):(\\d+)\\)/)\n if (!m) m = l.match(/at\\s+(.*?):(\\d+):(\\d+)/)\n if (m) {\n const file = m[1]\n const line = m[2]\n const col = m[3]\n return file + ':' + line + ':' + col\n }\n }\n return null\n}\n","import { createWriteStream, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport pino from \"pino\";\n\nexport interface AuditLogEntry {\n source: \"mcp\" | \"cli\";\n resource: string;\n action: string;\n args: Record<string, unknown>;\n status: \"success\" | \"error\";\n error?: string;\n}\n\nexport interface AuditLogger {\n log(entry: AuditLogEntry): void;\n}\n\n/**\n * Sensitive fields to strip from logged args.\n * These are replaced with '[REDACTED]' to prevent token leakage.\n */\nconst SENSITIVE_KEYS = [\"apiToken\", \"token\", \"password\", \"secret\", \"key\", \"credentials\"];\n\n/**\n * Return a shallow copy of `args` with sensitive keys replaced by '[REDACTED]'.\n */\nexport function sanitizeArgs(args: Record<string, unknown>): Record<string, unknown> {\n const sanitized = { ...args };\n for (const k of SENSITIVE_KEYS) {\n if (k in sanitized) {\n sanitized[k] = \"[REDACTED]\";\n }\n }\n return sanitized;\n}\n\n/**\n * Resolve the audit log file path.\n *\n * Priority:\n * 1. `FORGE_AUDIT_LOG` environment variable\n * 2. `~/.config/forge-tools/audit.log` (default)\n */\nexport function getAuditLogPath(): string {\n if (process.env.FORGE_AUDIT_LOG) {\n return process.env.FORGE_AUDIT_LOG;\n }\n return join(homedir(), \".config\", \"forge-tools\", \"audit.log\");\n}\n\n/**\n * Create an audit logger that appends structured JSON lines to the audit log.\n *\n * Failures are always silent — logging must never interrupt the actual operation.\n *\n * @param source - Identifies who is logging ('mcp' or 'cli').\n */\nexport function createAuditLogger(source: \"mcp\" | \"cli\"): AuditLogger {\n let logger: pino.Logger | null = null;\n\n try {\n const logPath = getAuditLogPath();\n mkdirSync(dirname(logPath), { recursive: true });\n const stream = createWriteStream(logPath, { flags: \"a\" });\n logger = pino({ level: \"info\" }, stream);\n } catch {\n // Silent failure — logging should never interrupt operations\n }\n\n return {\n log(entry: AuditLogEntry): void {\n try {\n if (!logger) return;\n logger.info({\n source,\n resource: entry.resource,\n action: entry.action,\n args: sanitizeArgs(entry.args),\n status: entry.status,\n ...(entry.error !== undefined ? { error: entry.error } : {}),\n });\n } catch {\n // Silent failure\n }\n },\n };\n}\n","import type { HttpClient } from \"@studiometa/forge-api\";\n\n/**\n * Execution context injected into all executors.\n *\n * Provides access to the HTTP client and other dependencies.\n * Uses DI for testability — tests inject mocks via `createTestExecutorContext()`.\n */\nexport interface ExecutorContext {\n /** HTTP client for Forge API calls. */\n client: HttpClient;\n}\n\n/**\n * Result of an executor function.\n */\nexport interface ExecutorResult<T> {\n /** The response data. */\n data: T;\n /** Pagination metadata (for list operations). */\n meta?: { total_count?: number; current_page?: number };\n}\n\n/**\n * Create a test executor context with a mock HTTP client.\n *\n * @param overrides Partial overrides for the context.\n */\nexport function createTestExecutorContext(\n overrides: Partial<ExecutorContext> = {},\n): ExecutorContext {\n const defaultClient = new Proxy({} as HttpClient, {\n get: (_target, prop) => {\n return (..._args: unknown[]) => {\n throw new Error(\n `HttpClient.${String(prop)}() called without mock — inject a mock client in createTestExecutorContext()`,\n );\n };\n },\n });\n\n return {\n client: defaultClient,\n ...overrides,\n };\n}\n","import type { ForgeServer, ServerResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateServerOptions } from \"./types.ts\";\n\n/**\n * Create a new server.\n */\nexport async function createServer(\n options: CreateServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer>> {\n const response = await ctx.client.post<ServerResponse>(\"/servers\", options);\n const server = response.server;\n\n return {\n data: server,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteServerOptions } from \"./types.ts\";\n\n/**\n * Delete a server.\n */\nexport async function deleteServer(\n options: DeleteServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeServer, ServerResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetServerOptions } from \"./types.ts\";\n\n/**\n * Get a specific server by ID.\n */\nexport async function getServer(\n options: GetServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer>> {\n const response = await ctx.client.get<ServerResponse>(`/servers/${options.server_id}`);\n const server = response.server;\n\n return {\n data: server,\n };\n}\n","import type { ForgeServer, ServersResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListServersOptions } from \"./types.ts\";\n\n/**\n * List all servers.\n */\nexport async function listServers(\n _options: ListServersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer[]>> {\n const response = await ctx.client.get<ServersResponse>(\"/servers\");\n const servers = response.servers;\n\n return {\n data: servers,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RebootServerOptions } from \"./types.ts\";\n\n/**\n * Reboot a server.\n */\nexport async function rebootServer(\n options: RebootServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/reboot`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSiteOptions } from \"./types.ts\";\n\n/**\n * Create a new site on a server.\n */\nexport async function createSite(\n options: CreateSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<SiteResponse>(`/servers/${server_id}/sites`, data);\n const site = response.site;\n\n return {\n data: site,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSiteOptions } from \"./types.ts\";\n\n/**\n * Delete a site.\n */\nexport async function deleteSite(\n options: DeleteSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/sites/${options.site_id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSiteOptions } from \"./types.ts\";\n\n/**\n * Get a specific site by ID.\n */\nexport async function getSite(\n options: GetSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite>> {\n const response = await ctx.client.get<SiteResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}`,\n );\n const site = response.site;\n\n return {\n data: site,\n };\n}\n","import type { ForgeSite, SitesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSitesOptions } from \"./types.ts\";\n\n/**\n * List all sites on a server.\n */\nexport async function listSites(\n options: ListSitesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite[]>> {\n const response = await ctx.client.get<SitesResponse>(`/servers/${options.server_id}/sites`);\n const sites = response.sites;\n\n return {\n data: sites,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeploySiteOptions } from \"./types.ts\";\n\n/**\n * Trigger a deployment for a site.\n */\nexport async function deploySite(\n options: DeploySiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/sites/${options.site_id}/deployment/deploy`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse, DeploymentsResponse } from \"@studiometa/forge-api\";\n\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeploySiteAndWaitOptions, DeployResult } from \"./types.ts\";\n\n/**\n * Trigger a deployment and wait for it to complete.\n *\n * 1. POSTs to the deploy endpoint.\n * 2. Polls GET /servers/{id}/sites/{site_id} every `poll_interval_ms` ms.\n * 3. When `deployment_status` becomes null the deploy is done.\n * 4. Fetches the deployment log.\n * 5. Checks the most recent deployment status to determine success/failure.\n */\nexport async function deploySiteAndWait(\n options: DeploySiteAndWaitOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<DeployResult>> {\n const { server_id, site_id, poll_interval_ms = 3000, timeout_ms = 600_000, onProgress } = options;\n\n const baseUrl = `/servers/${server_id}/sites/${site_id}`;\n\n // 1. Trigger deploy\n await ctx.client.post(`${baseUrl}/deployment/deploy`);\n\n const startTime = Date.now();\n\n // 2. Poll until deployment_status is null (done)\n await new Promise<void>((resolve) => {\n const tick = async (): Promise<void> => {\n const elapsed_ms = Date.now() - startTime;\n\n if (elapsed_ms >= timeout_ms) {\n resolve();\n return;\n }\n\n const response = await ctx.client.get<SiteResponse>(`/servers/${server_id}/sites/${site_id}`);\n const site = response.site as ForgeSite;\n const currentStatus = site.deployment_status;\n\n if (onProgress) {\n onProgress({ status: currentStatus ?? \"done\", elapsed_ms });\n }\n\n if (currentStatus === null) {\n resolve();\n return;\n }\n\n await new Promise<void>((r) => setTimeout(r, poll_interval_ms));\n await tick();\n };\n\n tick().catch(() => resolve());\n });\n\n const elapsed_ms = Date.now() - startTime;\n\n // 3. Fetch deployment log\n let log = \"\";\n try {\n log = await ctx.client.get<string>(`${baseUrl}/deployment/log`);\n } catch {\n // log may not be available; continue\n }\n\n // 4. Determine success/failure from the most recent deployment\n let deployStatus: \"success\" | \"failed\" = \"failed\";\n try {\n const deploymentsResponse = await ctx.client.get<DeploymentsResponse>(`${baseUrl}/deployments`);\n const deployments = deploymentsResponse.deployments;\n if (deployments.length > 0) {\n const latest = deployments[0]!;\n deployStatus = latest.status === \"finished\" ? \"success\" : \"failed\";\n }\n } catch {\n // If we can't fetch deployments, keep 'failed'\n }\n\n // 5. If we timed out, force 'failed'\n if (elapsed_ms >= timeout_ms) {\n deployStatus = \"failed\";\n }\n\n return {\n data: {\n status: deployStatus,\n log,\n elapsed_ms,\n },\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentLogOptions } from \"./types.ts\";\n\n/**\n * Get the deployment log for a site.\n */\nexport async function getDeploymentLog(\n options: GetDeploymentLogOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const log = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployment/log`,\n );\n return { data: log };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentOutputOptions } from \"./types.ts\";\n\n/**\n * Get the output of a deployment.\n */\nexport async function getDeploymentOutput(\n options: GetDeploymentOutputOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const output = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployments/${options.deployment_id}/output`,\n );\n\n return {\n data: output,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentScriptOptions } from \"./types.ts\";\n\n/**\n * Get the deployment script for a site.\n */\nexport async function getDeploymentScript(\n options: GetDeploymentScriptOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const script = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployment/script`,\n );\n\n return {\n data: script,\n };\n}\n","import type { ForgeDeployment, DeploymentsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDeploymentsOptions } from \"./types.ts\";\n\n/**\n * List all deployments for a site.\n */\nexport async function listDeployments(\n options: ListDeploymentsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDeployment[]>> {\n const response = await ctx.client.get<DeploymentsResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployments`,\n );\n const deployments = response.deployments;\n\n return {\n data: deployments,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateDeploymentScriptOptions } from \"./types.ts\";\n\n/**\n * Update the deployment script for a site.\n */\nexport async function updateDeploymentScript(\n options: UpdateDeploymentScriptOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/deployment/script`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ActivateCertificateOptions } from \"./types.ts\";\n\n/**\n * Activate an SSL certificate.\n */\nexport async function activateCertificate(\n options: ActivateCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}/activate`,\n {},\n );\n\n return {\n data: undefined,\n };\n}\n","import type { CertificateResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateCertificateOptions } from \"./types.ts\";\n\n/**\n * Create a new SSL certificate.\n */\nexport async function createCertificate(\n options: CreateCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<CertificateResponse>(\n `/servers/${server_id}/sites/${site_id}/certificates`,\n data,\n );\n const cert = response.certificate;\n\n return {\n data: cert,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteCertificateOptions } from \"./types.ts\";\n\n/**\n * Delete an SSL certificate.\n */\nexport async function deleteCertificate(\n options: DeleteCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { CertificateResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetCertificateOptions } from \"./types.ts\";\n\n/**\n * Get a single SSL certificate.\n */\nexport async function getCertificate(\n options: GetCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate>> {\n const response = await ctx.client.get<CertificateResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}`,\n );\n const cert = response.certificate;\n\n return {\n data: cert,\n };\n}\n","import type { CertificatesResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListCertificatesOptions } from \"./types.ts\";\n\n/**\n * List SSL certificates for a site.\n */\nexport async function listCertificates(\n options: ListCertificatesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate[]>> {\n const response = await ctx.client.get<CertificatesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates`,\n );\n const certificates = response.certificates;\n\n return {\n data: certificates,\n };\n}\n","import type { DatabaseResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDatabaseOptions } from \"./types.ts\";\n\n/**\n * Create a new database.\n */\nexport async function createDatabase(\n options: CreateDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DatabaseResponse>(`/servers/${server_id}/databases`, data);\n const db = response.database;\n\n return {\n data: db,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDatabaseOptions } from \"./types.ts\";\n\n/**\n * Delete a database.\n */\nexport async function deleteDatabase(\n options: DeleteDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/databases/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DatabaseResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDatabaseOptions } from \"./types.ts\";\n\n/**\n * Get a single database.\n */\nexport async function getDatabase(\n options: GetDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase>> {\n const response = await ctx.client.get<DatabaseResponse>(\n `/servers/${options.server_id}/databases/${options.id}`,\n );\n const db = response.database;\n\n return {\n data: db,\n };\n}\n","import type { DatabasesResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDatabasesOptions } from \"./types.ts\";\n\n/**\n * List databases on a server.\n */\nexport async function listDatabases(\n options: ListDatabasesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase[]>> {\n const response = await ctx.client.get<DatabasesResponse>(\n `/servers/${options.server_id}/databases`,\n );\n const databases = response.databases;\n\n return {\n data: databases,\n };\n}\n","import type { DatabaseUserResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Create a new database user.\n */\nexport async function createDatabaseUser(\n options: CreateDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DatabaseUserResponse>(\n `/servers/${server_id}/database-users`,\n data,\n );\n const user = response.user;\n\n return {\n data: user,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Delete a database user.\n */\nexport async function deleteDatabaseUser(\n options: DeleteDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/database-users/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DatabaseUserResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Get a single database user.\n */\nexport async function getDatabaseUser(\n options: GetDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser>> {\n const response = await ctx.client.get<DatabaseUserResponse>(\n `/servers/${options.server_id}/database-users/${options.id}`,\n );\n const user = response.user;\n\n return {\n data: user,\n };\n}\n","import type { DatabaseUsersResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDatabaseUsersOptions } from \"./types.ts\";\n\n/**\n * List database users on a server.\n */\nexport async function listDatabaseUsers(\n options: ListDatabaseUsersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser[]>> {\n const response = await ctx.client.get<DatabaseUsersResponse>(\n `/servers/${options.server_id}/database-users`,\n );\n const users = response.users;\n\n return {\n data: users,\n };\n}\n","import type { DaemonResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDaemonOptions } from \"./types.ts\";\n\n/**\n * Create a new daemon (background process).\n */\nexport async function createDaemon(\n options: CreateDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DaemonResponse>(`/servers/${server_id}/daemons`, data);\n const daemon = response.daemon;\n\n return {\n data: daemon,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDaemonOptions } from \"./types.ts\";\n\n/**\n * Delete a daemon.\n */\nexport async function deleteDaemon(\n options: DeleteDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/daemons/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DaemonResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDaemonOptions } from \"./types.ts\";\n\n/**\n * Get a single daemon.\n */\nexport async function getDaemon(\n options: GetDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon>> {\n const response = await ctx.client.get<DaemonResponse>(\n `/servers/${options.server_id}/daemons/${options.id}`,\n );\n const daemon = response.daemon;\n\n return {\n data: daemon,\n };\n}\n","import type { DaemonsResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDaemonsOptions } from \"./types.ts\";\n\n/**\n * List daemons (background processes) on a server.\n */\nexport async function listDaemons(\n options: ListDaemonsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon[]>> {\n const response = await ctx.client.get<DaemonsResponse>(`/servers/${options.server_id}/daemons`);\n const daemons = response.daemons;\n\n return {\n data: daemons,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RestartDaemonOptions } from \"./types.ts\";\n\n/**\n * Restart a daemon.\n */\nexport async function restartDaemon(\n options: RestartDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/daemons/${options.id}/restart`, {});\n\n return {\n data: undefined,\n };\n}\n","import type { FirewallRuleResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateFirewallRuleOptions } from \"./types.ts\";\n\nexport async function createFirewallRule(\n options: CreateFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<FirewallRuleResponse>(\n `/servers/${server_id}/firewall-rules`,\n data,\n );\n const rule = response.rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteFirewallRuleOptions } from \"./types.ts\";\n\nexport async function deleteFirewallRule(\n options: DeleteFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/firewall-rules/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { FirewallRuleResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetFirewallRuleOptions } from \"./types.ts\";\n\nexport async function getFirewallRule(\n options: GetFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule>> {\n const response = await ctx.client.get<FirewallRuleResponse>(\n `/servers/${options.server_id}/firewall-rules/${options.id}`,\n );\n const rule = response.rule;\n\n return {\n data: rule,\n };\n}\n","import type { FirewallRulesResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListFirewallRulesOptions } from \"./types.ts\";\n\nexport async function listFirewallRules(\n options: ListFirewallRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule[]>> {\n const response = await ctx.client.get<FirewallRulesResponse>(\n `/servers/${options.server_id}/firewall-rules`,\n );\n const rules = response.rules;\n return {\n data: rules,\n };\n}\n","import type { ForgeSshKey, SshKeyResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSshKeyOptions } from \"./types.ts\";\n\nexport async function createSshKey(\n options: CreateSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<SshKeyResponse>(`/servers/${server_id}/keys`, data);\n const key = response.key;\n\n return {\n data: key,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSshKeyOptions } from \"./types.ts\";\n\nexport async function deleteSshKey(\n options: DeleteSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/keys/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSshKey, SshKeyResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSshKeyOptions } from \"./types.ts\";\n\nexport async function getSshKey(\n options: GetSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey>> {\n const response = await ctx.client.get<SshKeyResponse>(\n `/servers/${options.server_id}/keys/${options.id}`,\n );\n const key = response.key;\n\n return {\n data: key,\n };\n}\n","import type { ForgeSshKey, SshKeysResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSshKeysOptions } from \"./types.ts\";\n\nexport async function listSshKeys(\n options: ListSshKeysOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey[]>> {\n const response = await ctx.client.get<SshKeysResponse>(`/servers/${options.server_id}/keys`);\n const keys = response.keys;\n return {\n data: keys,\n };\n}\n","import type { ForgeSecurityRule, SecurityRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSecurityRuleOptions } from \"./types.ts\";\n\nexport async function createSecurityRule(\n options: CreateSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<SecurityRuleResponse>(\n `/servers/${server_id}/sites/${site_id}/security-rules`,\n data,\n );\n const rule = response.security_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSecurityRuleOptions } from \"./types.ts\";\n\nexport async function deleteSecurityRule(\n options: DeleteSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSecurityRule, SecurityRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSecurityRuleOptions } from \"./types.ts\";\n\nexport async function getSecurityRule(\n options: GetSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule>> {\n const response = await ctx.client.get<SecurityRuleResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules/${options.id}`,\n );\n const rule = response.security_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ForgeSecurityRule, SecurityRulesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSecurityRulesOptions } from \"./types.ts\";\n\nexport async function listSecurityRules(\n options: ListSecurityRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule[]>> {\n const response = await ctx.client.get<SecurityRulesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules`,\n );\n const rules = response.security_rules;\n\n return {\n data: rules,\n };\n}\n","import type { ForgeRedirectRule, RedirectRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateRedirectRuleOptions } from \"./types.ts\";\n\nexport async function createRedirectRule(\n options: CreateRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<RedirectRuleResponse>(\n `/servers/${server_id}/sites/${site_id}/redirect-rules`,\n data,\n );\n const rule = response.redirect_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteRedirectRuleOptions } from \"./types.ts\";\n\nexport async function deleteRedirectRule(\n options: DeleteRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRedirectRule, RedirectRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetRedirectRuleOptions } from \"./types.ts\";\n\nexport async function getRedirectRule(\n options: GetRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule>> {\n const response = await ctx.client.get<RedirectRuleResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules/${options.id}`,\n );\n const rule = response.redirect_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ForgeRedirectRule, RedirectRulesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListRedirectRulesOptions } from \"./types.ts\";\n\nexport async function listRedirectRules(\n options: ListRedirectRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule[]>> {\n const response = await ctx.client.get<RedirectRulesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules`,\n );\n const rules = response.redirect_rules;\n return {\n data: rules,\n };\n}\n","import type { ForgeMonitor, MonitorResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateMonitorOptions } from \"./types.ts\";\n\nexport async function createMonitor(\n options: CreateMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<MonitorResponse>(`/servers/${server_id}/monitors`, data);\n const monitor = response.monitor;\n\n return {\n data: monitor,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteMonitorOptions } from \"./types.ts\";\n\nexport async function deleteMonitor(\n options: DeleteMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/monitors/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeMonitor, MonitorResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetMonitorOptions } from \"./types.ts\";\n\nexport async function getMonitor(\n options: GetMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor>> {\n const response = await ctx.client.get<MonitorResponse>(\n `/servers/${options.server_id}/monitors/${options.id}`,\n );\n const monitor = response.monitor;\n\n return {\n data: monitor,\n };\n}\n","import type { ForgeMonitor, MonitorsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListMonitorsOptions } from \"./types.ts\";\n\nexport async function listMonitors(\n options: ListMonitorsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor[]>> {\n const response = await ctx.client.get<MonitorsResponse>(`/servers/${options.server_id}/monitors`);\n const monitors = response.monitors;\n return {\n data: monitors,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateNginxTemplateOptions } from \"./types.ts\";\n\nexport async function createNginxTemplate(\n options: CreateNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<NginxTemplateResponse>(\n `/servers/${server_id}/nginx/templates`,\n data,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteNginxTemplateOptions } from \"./types.ts\";\n\nexport async function deleteNginxTemplate(\n options: DeleteNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/nginx/templates/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetNginxTemplateOptions } from \"./types.ts\";\n\nexport async function getNginxTemplate(\n options: GetNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const response = await ctx.client.get<NginxTemplateResponse>(\n `/servers/${options.server_id}/nginx/templates/${options.id}`,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplatesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListNginxTemplatesOptions } from \"./types.ts\";\n\nexport async function listNginxTemplates(\n options: ListNginxTemplatesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate[]>> {\n const response = await ctx.client.get<NginxTemplatesResponse>(\n `/servers/${options.server_id}/nginx/templates`,\n );\n const templates = response.templates;\n return {\n data: templates,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateNginxTemplateOptions } from \"./types.ts\";\n\nexport async function updateNginxTemplate(\n options: UpdateNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const { server_id, id, ...data } = options;\n const response = await ctx.client.put<NginxTemplateResponse>(\n `/servers/${server_id}/nginx/templates/${id}`,\n data,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetEnvOptions } from \"./types.ts\";\n\n/**\n * Get environment variables for a site.\n */\nexport async function getEnv(\n options: GetEnvOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const content = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/env`,\n );\n\n return {\n data: content,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateEnvOptions } from \"./types.ts\";\n\n/**\n * Update environment variables for a site.\n */\nexport async function updateEnv(\n options: UpdateEnvOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/env`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetNginxConfigOptions } from \"./types.ts\";\n\n/**\n * Get Nginx configuration for a site.\n */\nexport async function getNginxConfig(\n options: GetNginxConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const content = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/nginx`,\n );\n\n return {\n data: content,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateNginxConfigOptions } from \"./types.ts\";\n\n/**\n * Update Nginx configuration for a site.\n */\nexport async function updateNginxConfig(\n options: UpdateNginxConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/nginx`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRecipe, RecipeResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateRecipeOptions } from \"./types.ts\";\n\nexport async function createRecipe(\n options: CreateRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe>> {\n const response = await ctx.client.post<RecipeResponse>(\"/recipes\", options);\n const recipe = response.recipe;\n\n return {\n data: recipe,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteRecipeOptions } from \"./types.ts\";\n\nexport async function deleteRecipe(\n options: DeleteRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/recipes/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRecipe, RecipeResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetRecipeOptions } from \"./types.ts\";\n\nexport async function getRecipe(\n options: GetRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe>> {\n const response = await ctx.client.get<RecipeResponse>(`/recipes/${options.id}`);\n const recipe = response.recipe;\n\n return {\n data: recipe,\n };\n}\n","import type { ForgeRecipe, RecipesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListRecipesOptions } from \"./types.ts\";\n\nexport async function listRecipes(\n _options: ListRecipesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe[]>> {\n const response = await ctx.client.get<RecipesResponse>(\"/recipes\");\n const recipes = response.recipes;\n return {\n data: recipes,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RunRecipeOptions } from \"./types.ts\";\n\n/**\n * Run a recipe on specified servers.\n */\nexport async function runRecipe(\n options: RunRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/recipes/${options.id}/run`, {\n servers: options.servers,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { BackupConfigResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Create a new backup configuration.\n */\nexport async function createBackupConfig(\n options: CreateBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<BackupConfigResponse>(\n `/servers/${server_id}/backup-configs`,\n data,\n );\n const backup = response.backup;\n\n return {\n data: backup,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Delete a backup configuration.\n */\nexport async function deleteBackupConfig(\n options: DeleteBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/backup-configs/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { BackupConfigResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Get a specific backup configuration.\n */\nexport async function getBackupConfig(\n options: GetBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig>> {\n const response = await ctx.client.get<BackupConfigResponse>(\n `/servers/${options.server_id}/backup-configs/${options.id}`,\n );\n const backup = response.backup;\n\n return {\n data: backup,\n };\n}\n","import type { BackupConfigsResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListBackupConfigsOptions } from \"./types.ts\";\n\n/**\n * List backup configurations for a server.\n */\nexport async function listBackupConfigs(\n options: ListBackupConfigsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig[]>> {\n const response = await ctx.client.get<BackupConfigsResponse>(\n `/servers/${options.server_id}/backup-configs`,\n );\n const backups = response.backups;\n\n return {\n data: backups,\n };\n}\n","import type { CommandResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateCommandOptions } from \"./types.ts\";\n\n/**\n * Execute a command on a site.\n */\nexport async function createCommand(\n options: CreateCommandOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand>> {\n const response = await ctx.client.post<CommandResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands`,\n { command: options.command },\n );\n const command = response.command;\n\n return {\n data: command,\n };\n}\n","import type { CommandResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetCommandOptions } from \"./types.ts\";\n\n/**\n * Get a specific command.\n */\nexport async function getCommand(\n options: GetCommandOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand>> {\n const response = await ctx.client.get<CommandResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands/${options.id}`,\n );\n const command = response.command;\n\n return {\n data: command,\n };\n}\n","import type { CommandsResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListCommandsOptions } from \"./types.ts\";\n\n/**\n * List commands executed on a site.\n */\nexport async function listCommands(\n options: ListCommandsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand[]>> {\n const response = await ctx.client.get<CommandsResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands`,\n );\n const commands = response.commands;\n\n return {\n data: commands,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Create a new scheduled job (cron).\n */\nexport async function createScheduledJob(\n options: CreateScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<ScheduledJobResponse>(`/servers/${server_id}/jobs`, data);\n const job = response.job;\n\n return {\n data: job,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Delete a scheduled job.\n */\nexport async function deleteScheduledJob(\n options: DeleteScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/jobs/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Get a specific scheduled job.\n */\nexport async function getScheduledJob(\n options: GetScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob>> {\n const response = await ctx.client.get<ScheduledJobResponse>(\n `/servers/${options.server_id}/jobs/${options.id}`,\n );\n const job = response.job;\n\n return {\n data: job,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListScheduledJobsOptions } from \"./types.ts\";\n\n/**\n * List scheduled jobs (cron) on a server.\n */\nexport async function listScheduledJobs(\n options: ListScheduledJobsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob[]>> {\n const response = await ctx.client.get<ScheduledJobsResponse>(\n `/servers/${options.server_id}/jobs`,\n );\n const jobs = response.jobs;\n\n return {\n data: jobs,\n };\n}\n","import type { ForgeUser, UserResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetUserOptions } from \"./types.ts\";\n\n/**\n * Get the currently authenticated user.\n */\nexport async function getUser(\n _options: GetUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeUser>> {\n const response = await ctx.client.get<UserResponse>(\"/user\");\n const user = response.user;\n\n return {\n data: user,\n };\n}\n"],"x_google_ignoreList":[1,2],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/constants.ts","../src/utils/name-matcher.ts","../../../node_modules/quick-format-unescaped/index.js","../../../node_modules/pino/browser.js","../src/logger.ts","../src/context.ts","../src/executors/servers/create.ts","../src/executors/servers/delete.ts","../src/executors/servers/get.ts","../src/executors/servers/list.ts","../src/executors/servers/reboot.ts","../src/executors/servers/resolve.ts","../src/executors/sites/create.ts","../src/executors/sites/delete.ts","../src/executors/sites/get.ts","../src/executors/sites/list.ts","../src/executors/sites/resolve.ts","../src/executors/deployments/deploy.ts","../src/executors/deployments/deploy-and-wait.ts","../src/executors/deployments/get-log.ts","../src/executors/deployments/get-output.ts","../src/executors/deployments/get-script.ts","../src/executors/deployments/list.ts","../src/executors/deployments/update-script.ts","../src/executors/certificates/activate.ts","../src/executors/certificates/create.ts","../src/executors/certificates/delete.ts","../src/executors/certificates/get.ts","../src/executors/certificates/list.ts","../src/executors/databases/create.ts","../src/executors/databases/delete.ts","../src/executors/databases/get.ts","../src/executors/databases/list.ts","../src/executors/database-users/create.ts","../src/executors/database-users/delete.ts","../src/executors/database-users/get.ts","../src/executors/database-users/list.ts","../src/executors/daemons/create.ts","../src/executors/daemons/delete.ts","../src/executors/daemons/get.ts","../src/executors/daemons/list.ts","../src/executors/daemons/restart.ts","../src/executors/firewall-rules/create.ts","../src/executors/firewall-rules/delete.ts","../src/executors/firewall-rules/get.ts","../src/executors/firewall-rules/list.ts","../src/executors/ssh-keys/create.ts","../src/executors/ssh-keys/delete.ts","../src/executors/ssh-keys/get.ts","../src/executors/ssh-keys/list.ts","../src/executors/security-rules/create.ts","../src/executors/security-rules/delete.ts","../src/executors/security-rules/get.ts","../src/executors/security-rules/list.ts","../src/executors/redirect-rules/create.ts","../src/executors/redirect-rules/delete.ts","../src/executors/redirect-rules/get.ts","../src/executors/redirect-rules/list.ts","../src/executors/monitors/create.ts","../src/executors/monitors/delete.ts","../src/executors/monitors/get.ts","../src/executors/monitors/list.ts","../src/executors/nginx-templates/create.ts","../src/executors/nginx-templates/delete.ts","../src/executors/nginx-templates/get.ts","../src/executors/nginx-templates/list.ts","../src/executors/nginx-templates/update.ts","../src/executors/env/get.ts","../src/executors/env/update.ts","../src/executors/nginx/get.ts","../src/executors/nginx/update.ts","../src/executors/recipes/create.ts","../src/executors/recipes/delete.ts","../src/executors/recipes/get.ts","../src/executors/recipes/list.ts","../src/executors/recipes/run.ts","../src/executors/backups/create.ts","../src/executors/backups/delete.ts","../src/executors/backups/get.ts","../src/executors/backups/list.ts","../src/executors/commands/create.ts","../src/executors/commands/get.ts","../src/executors/commands/list.ts","../src/executors/scheduled-jobs/create.ts","../src/executors/scheduled-jobs/delete.ts","../src/executors/scheduled-jobs/get.ts","../src/executors/scheduled-jobs/list.ts","../src/executors/user/get.ts"],"sourcesContent":["/**\n * All supported resources.\n * Single source of truth — MCP schema and handlers derive from this.\n */\nexport const RESOURCES = [\n \"servers\",\n \"sites\",\n \"deployments\",\n \"certificates\",\n \"databases\",\n \"database-users\",\n \"daemons\",\n \"env\",\n \"nginx\",\n \"firewall-rules\",\n \"ssh-keys\",\n \"security-rules\",\n \"redirect-rules\",\n \"nginx-templates\",\n \"monitors\",\n \"recipes\",\n \"backups\",\n \"commands\",\n \"scheduled-jobs\",\n \"user\",\n \"batch\",\n] as const;\n\nexport type Resource = (typeof RESOURCES)[number];\n\n/**\n * All supported actions.\n * Single source of truth — MCP schema and handlers derive from this.\n */\nexport const ACTIONS = [\n \"list\",\n \"get\",\n \"create\",\n \"update\",\n \"delete\",\n \"deploy\",\n \"reboot\",\n \"restart\",\n \"activate\",\n \"run\",\n \"resolve\",\n \"help\",\n \"schema\",\n \"context\",\n] as const;\n\nexport type Action = (typeof ACTIONS)[number];\n","/**\n * Result of a name matching operation.\n * Provides both exact and partial matches for flexible consumption.\n */\nexport interface NameMatch<T> {\n /** Items whose name matches the query exactly (case-insensitive). */\n exact: T[];\n /** Items whose name contains the query (case-insensitive). Includes exact matches. */\n partial: T[];\n}\n\n/**\n * Match items by name using case-insensitive exact and partial matching.\n *\n * @param items - The items to search through.\n * @param query - The search query.\n * @param getName - Function to extract the name from an item.\n * @returns Object with exact and partial match arrays.\n */\nexport function matchByName<T>(\n items: T[],\n query: string,\n getName: (item: T) => string,\n): NameMatch<T> {\n const lower = query.toLowerCase();\n const exact = items.filter((item) => getName(item).toLowerCase() === lower);\n const partial = items.filter((item) => getName(item).toLowerCase().includes(lower));\n return { exact, partial };\n}\n","'use strict'\nfunction tryStringify (o) {\n try { return JSON.stringify(o) } catch(e) { return '\"[Circular]\"' }\n}\n\nmodule.exports = format\n\nfunction format(f, args, opts) {\n var ss = (opts && opts.stringify) || tryStringify\n var offset = 1\n if (typeof f === 'object' && f !== null) {\n var len = args.length + offset\n if (len === 1) return f\n var objects = new Array(len)\n objects[0] = ss(f)\n for (var index = 1; index < len; index++) {\n objects[index] = ss(args[index])\n }\n return objects.join(' ')\n }\n if (typeof f !== 'string') {\n return f\n }\n var argLen = args.length\n if (argLen === 0) return f\n var str = ''\n var a = 1 - offset\n var lastPos = -1\n var flen = (f && f.length) || 0\n for (var i = 0; i < flen;) {\n if (f.charCodeAt(i) === 37 && i + 1 < flen) {\n lastPos = lastPos > -1 ? lastPos : 0\n switch (f.charCodeAt(i + 1)) {\n case 100: // 'd'\n case 102: // 'f'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Number(args[a])\n lastPos = i + 2\n i++\n break\n case 105: // 'i'\n if (a >= argLen)\n break\n if (args[a] == null) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += Math.floor(Number(args[a]))\n lastPos = i + 2\n i++\n break\n case 79: // 'O'\n case 111: // 'o'\n case 106: // 'j'\n if (a >= argLen)\n break\n if (args[a] === undefined) break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n var type = typeof args[a]\n if (type === 'string') {\n str += '\\'' + args[a] + '\\''\n lastPos = i + 2\n i++\n break\n }\n if (type === 'function') {\n str += args[a].name || '<anonymous>'\n lastPos = i + 2\n i++\n break\n }\n str += ss(args[a])\n lastPos = i + 2\n i++\n break\n case 115: // 's'\n if (a >= argLen)\n break\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += String(args[a])\n lastPos = i + 2\n i++\n break\n case 37: // '%'\n if (lastPos < i)\n str += f.slice(lastPos, i)\n str += '%'\n lastPos = i + 2\n i++\n a--\n break\n }\n ++a\n }\n ++i\n }\n if (lastPos === -1)\n return f\n else if (lastPos < flen) {\n str += f.slice(lastPos)\n }\n\n return str\n}\n","'use strict'\n\nconst format = require('quick-format-unescaped')\n\nmodule.exports = pino\n\nconst _console = pfGlobalThisOrFallback().console || {}\nconst stdSerializers = {\n mapHttpRequest: mock,\n mapHttpResponse: mock,\n wrapRequestSerializer: passthrough,\n wrapResponseSerializer: passthrough,\n wrapErrorSerializer: passthrough,\n req: mock,\n res: mock,\n err: asErrValue,\n errWithCause: asErrValue\n}\nfunction levelToValue (level, logger) {\n return level === 'silent'\n ? Infinity\n : logger.levels.values[level]\n}\nconst baseLogFunctionSymbol = Symbol('pino.logFuncs')\nconst hierarchySymbol = Symbol('pino.hierarchy')\n\nconst logFallbackMap = {\n error: 'log',\n fatal: 'error',\n warn: 'error',\n info: 'log',\n debug: 'log',\n trace: 'log'\n}\n\nfunction appendChildLogger (parentLogger, childLogger) {\n const newEntry = {\n logger: childLogger,\n parent: parentLogger[hierarchySymbol]\n }\n childLogger[hierarchySymbol] = newEntry\n}\n\nfunction setupBaseLogFunctions (logger, levels, proto) {\n const logFunctions = {}\n levels.forEach(level => {\n logFunctions[level] = proto[level] ? proto[level] : (_console[level] || _console[logFallbackMap[level] || 'log'] || noop)\n })\n logger[baseLogFunctionSymbol] = logFunctions\n}\n\nfunction shouldSerialize (serialize, serializers) {\n if (Array.isArray(serialize)) {\n const hasToFilter = serialize.filter(function (k) {\n return k !== '!stdSerializers.err'\n })\n return hasToFilter\n } else if (serialize === true) {\n return Object.keys(serializers)\n }\n\n return false\n}\n\nfunction pino (opts) {\n opts = opts || {}\n opts.browser = opts.browser || {}\n\n const transmit = opts.browser.transmit\n if (transmit && typeof transmit.send !== 'function') { throw Error('pino: transmit option must have a send function') }\n\n const proto = opts.browser.write || _console\n if (opts.browser.write) opts.browser.asObject = true\n const serializers = opts.serializers || {}\n const serialize = shouldSerialize(opts.browser.serialize, serializers)\n let stdErrSerialize = opts.browser.serialize\n\n if (\n Array.isArray(opts.browser.serialize) &&\n opts.browser.serialize.indexOf('!stdSerializers.err') > -1\n ) stdErrSerialize = false\n\n const customLevels = Object.keys(opts.customLevels || {})\n const levels = ['error', 'fatal', 'warn', 'info', 'debug', 'trace'].concat(customLevels)\n\n if (typeof proto === 'function') {\n levels.forEach(function (level) {\n proto[level] = proto\n })\n }\n if (opts.enabled === false || opts.browser.disabled) opts.level = 'silent'\n const level = opts.level || 'info'\n const logger = Object.create(proto)\n if (!logger.log) logger.log = noop\n\n setupBaseLogFunctions(logger, levels, proto)\n // setup root hierarchy entry\n appendChildLogger({}, logger)\n\n Object.defineProperty(logger, 'levelVal', {\n get: getLevelVal\n })\n Object.defineProperty(logger, 'level', {\n get: getLevel,\n set: setLevel\n })\n\n const setOpts = {\n transmit,\n serialize,\n asObject: opts.browser.asObject,\n asObjectBindingsOnly: opts.browser.asObjectBindingsOnly,\n formatters: opts.browser.formatters,\n reportCaller: opts.browser.reportCaller,\n levels,\n timestamp: getTimeFunction(opts),\n messageKey: opts.messageKey || 'msg',\n onChild: opts.onChild || noop\n }\n logger.levels = getLevels(opts)\n logger.level = level\n\n logger.isLevelEnabled = function (level) {\n if (!this.levels.values[level]) {\n return false\n }\n\n return this.levels.values[level] >= this.levels.values[this.level]\n }\n logger.setMaxListeners = logger.getMaxListeners =\n logger.emit = logger.addListener = logger.on =\n logger.prependListener = logger.once =\n logger.prependOnceListener = logger.removeListener =\n logger.removeAllListeners = logger.listeners =\n logger.listenerCount = logger.eventNames =\n logger.write = logger.flush = noop\n logger.serializers = serializers\n logger._serialize = serialize\n logger._stdErrSerialize = stdErrSerialize\n logger.child = function (...args) { return child.call(this, setOpts, ...args) }\n\n if (transmit) logger._logEvent = createLogEventShape()\n\n function getLevelVal () {\n return levelToValue(this.level, this)\n }\n\n function getLevel () {\n return this._level\n }\n function setLevel (level) {\n if (level !== 'silent' && !this.levels.values[level]) {\n throw Error('unknown level ' + level)\n }\n this._level = level\n\n set(this, setOpts, logger, 'error') // <-- must stay first\n set(this, setOpts, logger, 'fatal')\n set(this, setOpts, logger, 'warn')\n set(this, setOpts, logger, 'info')\n set(this, setOpts, logger, 'debug')\n set(this, setOpts, logger, 'trace')\n\n customLevels.forEach((level) => {\n set(this, setOpts, logger, level)\n })\n }\n\n function child (setOpts, bindings, childOptions) {\n if (!bindings) {\n throw new Error('missing bindings for child Pino')\n }\n childOptions = childOptions || {}\n if (serialize && bindings.serializers) {\n childOptions.serializers = bindings.serializers\n }\n const childOptionsSerializers = childOptions.serializers\n if (serialize && childOptionsSerializers) {\n var childSerializers = Object.assign({}, serializers, childOptionsSerializers)\n var childSerialize = opts.browser.serialize === true\n ? Object.keys(childSerializers)\n : serialize\n delete bindings.serializers\n applySerializers([bindings], childSerialize, childSerializers, this._stdErrSerialize)\n }\n function Child (parent) {\n this._childLevel = (parent._childLevel | 0) + 1\n\n // make sure bindings are available in the `set` function\n this.bindings = bindings\n\n if (childSerializers) {\n this.serializers = childSerializers\n this._serialize = childSerialize\n }\n if (transmit) {\n this._logEvent = createLogEventShape(\n [].concat(parent._logEvent.bindings, bindings)\n )\n }\n }\n Child.prototype = this\n const newLogger = new Child(this)\n\n // must happen before the level is assigned\n appendChildLogger(this, newLogger)\n newLogger.child = function (...args) { return child.call(this, setOpts, ...args) }\n // required to actually initialize the logger functions for any given child\n newLogger.level = childOptions.level || this.level // allow level to be set by childOptions\n setOpts.onChild(newLogger)\n\n return newLogger\n }\n return logger\n}\n\nfunction getLevels (opts) {\n const customLevels = opts.customLevels || {}\n\n const values = Object.assign({}, pino.levels.values, customLevels)\n const labels = Object.assign({}, pino.levels.labels, invertObject(customLevels))\n\n return {\n values,\n labels\n }\n}\n\nfunction invertObject (obj) {\n const inverted = {}\n Object.keys(obj).forEach(function (key) {\n inverted[obj[key]] = key\n })\n return inverted\n}\n\npino.levels = {\n values: {\n fatal: 60,\n error: 50,\n warn: 40,\n info: 30,\n debug: 20,\n trace: 10\n },\n labels: {\n 10: 'trace',\n 20: 'debug',\n 30: 'info',\n 40: 'warn',\n 50: 'error',\n 60: 'fatal'\n }\n}\n\npino.stdSerializers = stdSerializers\npino.stdTimeFunctions = Object.assign({}, { nullTime, epochTime, unixTime, isoTime })\n\nfunction getBindingChain (logger) {\n const bindings = []\n if (logger.bindings) {\n bindings.push(logger.bindings)\n }\n\n // traverse up the tree to get all bindings\n let hierarchy = logger[hierarchySymbol]\n while (hierarchy.parent) {\n hierarchy = hierarchy.parent\n if (hierarchy.logger.bindings) {\n bindings.push(hierarchy.logger.bindings)\n }\n }\n\n return bindings.reverse()\n}\n\nfunction set (self, opts, rootLogger, level) {\n // override the current log functions with either `noop` or the base log function\n Object.defineProperty(self, level, {\n value: (levelToValue(self.level, rootLogger) > levelToValue(level, rootLogger)\n ? noop\n : rootLogger[baseLogFunctionSymbol][level]),\n writable: true,\n enumerable: true,\n configurable: true\n })\n\n if (self[level] === noop) {\n if (!opts.transmit) return\n\n const transmitLevel = opts.transmit.level || self.level\n const transmitValue = levelToValue(transmitLevel, rootLogger)\n const methodValue = levelToValue(level, rootLogger)\n if (methodValue < transmitValue) return\n }\n\n // make sure the log format is correct\n self[level] = createWrap(self, opts, rootLogger, level)\n\n // prepend bindings if it is not the root logger\n const bindings = getBindingChain(self)\n if (bindings.length === 0) {\n // early exit in case for rootLogger\n return\n }\n self[level] = prependBindingsInArguments(bindings, self[level])\n}\n\nfunction prependBindingsInArguments (bindings, logFunc) {\n return function () {\n return logFunc.apply(this, [...bindings, ...arguments])\n }\n}\n\nfunction createWrap (self, opts, rootLogger, level) {\n return (function (write) {\n return function LOG () {\n const ts = opts.timestamp()\n const args = new Array(arguments.length)\n const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this\n for (var i = 0; i < args.length; i++) args[i] = arguments[i]\n\n var argsIsSerialized = false\n if (opts.serialize) {\n applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)\n argsIsSerialized = true\n }\n if (opts.asObject || opts.formatters) {\n const out = asObject(this, level, args, ts, opts)\n if (opts.reportCaller && out && out.length > 0 && out[0] && typeof out[0] === 'object') {\n try {\n const caller = getCallerLocation()\n if (caller) out[0].caller = caller\n } catch (e) {}\n }\n write.call(proto, ...out)\n } else {\n if (opts.reportCaller) {\n try {\n const caller = getCallerLocation()\n if (caller) args.push(caller)\n } catch (e) {}\n }\n write.apply(proto, args)\n }\n\n if (opts.transmit) {\n const transmitLevel = opts.transmit.level || self._level\n const transmitValue = levelToValue(transmitLevel, rootLogger)\n const methodValue = levelToValue(level, rootLogger)\n if (methodValue < transmitValue) return\n transmit(this, {\n ts,\n methodLevel: level,\n methodValue,\n transmitLevel,\n transmitValue: rootLogger.levels.values[opts.transmit.level || self._level],\n send: opts.transmit.send,\n val: levelToValue(self._level, rootLogger)\n }, args, argsIsSerialized)\n }\n }\n })(self[baseLogFunctionSymbol][level])\n}\n\nfunction asObject (logger, level, args, ts, opts) {\n const {\n level: levelFormatter,\n log: logObjectFormatter = (obj) => obj\n } = opts.formatters || {}\n const argsCloned = args.slice()\n let msg = argsCloned[0]\n const logObject = {}\n\n let lvl = (logger._childLevel | 0) + 1\n if (lvl < 1) lvl = 1\n\n if (ts) {\n logObject.time = ts\n }\n\n if (levelFormatter) {\n const formattedLevel = levelFormatter(level, logger.levels.values[level])\n Object.assign(logObject, formattedLevel)\n } else {\n logObject.level = logger.levels.values[level]\n }\n\n if (opts.asObjectBindingsOnly) {\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n }\n\n const formattedLogObject = logObjectFormatter(logObject)\n return [formattedLogObject, ...argsCloned]\n } else {\n // deliberate, catching objects, arrays\n if (msg !== null && typeof msg === 'object') {\n while (lvl-- && typeof argsCloned[0] === 'object') {\n Object.assign(logObject, argsCloned.shift())\n }\n msg = argsCloned.length ? format(argsCloned.shift(), argsCloned) : undefined\n } else if (typeof msg === 'string') msg = format(argsCloned.shift(), argsCloned)\n if (msg !== undefined) logObject[opts.messageKey] = msg\n\n const formattedLogObject = logObjectFormatter(logObject)\n return [formattedLogObject]\n }\n}\n\nfunction applySerializers (args, serialize, serializers, stdErrSerialize) {\n for (const i in args) {\n if (stdErrSerialize && args[i] instanceof Error) {\n args[i] = pino.stdSerializers.err(args[i])\n } else if (typeof args[i] === 'object' && !Array.isArray(args[i]) && serialize) {\n for (const k in args[i]) {\n if (serialize.indexOf(k) > -1 && k in serializers) {\n args[i][k] = serializers[k](args[i][k])\n }\n }\n }\n }\n}\n\nfunction transmit (logger, opts, args, argsIsSerialized = false) {\n const send = opts.send\n const ts = opts.ts\n const methodLevel = opts.methodLevel\n const methodValue = opts.methodValue\n const val = opts.val\n const bindings = logger._logEvent.bindings\n\n if (!argsIsSerialized) {\n applySerializers(\n args,\n logger._serialize || Object.keys(logger.serializers),\n logger.serializers,\n logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize\n )\n }\n\n logger._logEvent.ts = ts\n logger._logEvent.messages = args.filter(function (arg) {\n // bindings can only be objects, so reference equality check via indexOf is fine\n return bindings.indexOf(arg) === -1\n })\n\n logger._logEvent.level.label = methodLevel\n logger._logEvent.level.value = methodValue\n\n send(methodLevel, logger._logEvent, val)\n\n logger._logEvent = createLogEventShape(bindings)\n}\n\nfunction createLogEventShape (bindings) {\n return {\n ts: 0,\n messages: [],\n bindings: bindings || [],\n level: { label: '', value: 0 }\n }\n}\n\nfunction asErrValue (err) {\n const obj = {\n type: err.constructor.name,\n msg: err.message,\n stack: err.stack\n }\n for (const key in err) {\n if (obj[key] === undefined) {\n obj[key] = err[key]\n }\n }\n return obj\n}\n\nfunction getTimeFunction (opts) {\n if (typeof opts.timestamp === 'function') {\n return opts.timestamp\n }\n if (opts.timestamp === false) {\n return nullTime\n }\n return epochTime\n}\n\nfunction mock () { return {} }\nfunction passthrough (a) { return a }\nfunction noop () {}\n\nfunction nullTime () { return false }\nfunction epochTime () { return Date.now() }\nfunction unixTime () { return Math.round(Date.now() / 1000.0) }\nfunction isoTime () { return new Date(Date.now()).toISOString() } // using Date.now() for testability\n\n/* eslint-disable */\n/* istanbul ignore next */\nfunction pfGlobalThisOrFallback () {\n function defd (o) { return typeof o !== 'undefined' && o }\n try {\n if (typeof globalThis !== 'undefined') return globalThis\n Object.defineProperty(Object.prototype, 'globalThis', {\n get: function () {\n delete Object.prototype.globalThis\n return (this.globalThis = this)\n },\n configurable: true\n })\n return globalThis\n } catch (e) {\n return defd(self) || defd(window) || defd(this) || {}\n }\n}\n/* eslint-enable */\n\nmodule.exports.default = pino\nmodule.exports.pino = pino\n\n// Attempt to extract the user callsite (file:line:column)\n/* istanbul ignore next */\nfunction getCallerLocation () {\n const stack = (new Error()).stack\n if (!stack) return null\n const lines = stack.split('\\n')\n for (let i = 1; i < lines.length; i++) {\n const l = lines[i].trim()\n // skip frames from this file and internals\n if (/(^at\\s+)?(createWrap|LOG|set\\s*\\(|asObject|Object\\.apply|Function\\.apply)/.test(l)) continue\n if (l.indexOf('browser.js') !== -1) continue\n if (l.indexOf('node:internal') !== -1) continue\n if (l.indexOf('node_modules') !== -1) continue\n // try formats like: at func (file:line:col) or at file:line:col\n let m = l.match(/\\((.*?):(\\d+):(\\d+)\\)/)\n if (!m) m = l.match(/at\\s+(.*?):(\\d+):(\\d+)/)\n if (m) {\n const file = m[1]\n const line = m[2]\n const col = m[3]\n return file + ':' + line + ':' + col\n }\n }\n return null\n}\n","import { createWriteStream, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport pino from \"pino\";\n\nexport interface AuditLogEntry {\n source: \"mcp\" | \"cli\";\n resource: string;\n action: string;\n args: Record<string, unknown>;\n status: \"success\" | \"error\";\n error?: string;\n}\n\nexport interface AuditLogger {\n log(entry: AuditLogEntry): void;\n}\n\n/**\n * Sensitive fields to strip from logged args.\n * These are replaced with '[REDACTED]' to prevent token leakage.\n */\nconst SENSITIVE_KEYS = [\"apiToken\", \"token\", \"password\", \"secret\", \"key\", \"credentials\"];\n\n/**\n * Return a shallow copy of `args` with sensitive keys replaced by '[REDACTED]'.\n */\nexport function sanitizeArgs(args: Record<string, unknown>): Record<string, unknown> {\n const sanitized = { ...args };\n for (const k of SENSITIVE_KEYS) {\n if (k in sanitized) {\n sanitized[k] = \"[REDACTED]\";\n }\n }\n return sanitized;\n}\n\n/**\n * Resolve the audit log file path.\n *\n * Priority:\n * 1. `FORGE_AUDIT_LOG` environment variable\n * 2. `~/.config/forge-tools/audit.log` (default)\n */\nexport function getAuditLogPath(): string {\n if (process.env.FORGE_AUDIT_LOG) {\n return process.env.FORGE_AUDIT_LOG;\n }\n return join(homedir(), \".config\", \"forge-tools\", \"audit.log\");\n}\n\n/**\n * Create an audit logger that appends structured JSON lines to the audit log.\n *\n * Failures are always silent — logging must never interrupt the actual operation.\n *\n * @param source - Identifies who is logging ('mcp' or 'cli').\n */\nexport function createAuditLogger(source: \"mcp\" | \"cli\"): AuditLogger {\n let logger: pino.Logger | null = null;\n\n try {\n const logPath = getAuditLogPath();\n mkdirSync(dirname(logPath), { recursive: true });\n const stream = createWriteStream(logPath, { flags: \"a\" });\n logger = pino({ level: \"info\" }, stream);\n } catch {\n // Silent failure — logging should never interrupt operations\n }\n\n return {\n log(entry: AuditLogEntry): void {\n try {\n if (!logger) return;\n logger.info({\n source,\n resource: entry.resource,\n action: entry.action,\n args: sanitizeArgs(entry.args),\n status: entry.status,\n ...(entry.error !== undefined ? { error: entry.error } : {}),\n });\n } catch {\n // Silent failure\n }\n },\n };\n}\n","import type { HttpClient } from \"@studiometa/forge-api\";\n\n/**\n * Execution context injected into all executors.\n *\n * Provides access to the HTTP client and other dependencies.\n * Uses DI for testability — tests inject mocks via `createTestExecutorContext()`.\n */\nexport interface ExecutorContext {\n /** HTTP client for Forge API calls. */\n client: HttpClient;\n}\n\n/**\n * Result of an executor function.\n */\nexport interface ExecutorResult<T> {\n /** The response data. */\n data: T;\n /** Pagination metadata (for list operations). */\n meta?: { total_count?: number; current_page?: number };\n}\n\n/**\n * Create a test executor context with a mock HTTP client.\n *\n * @param overrides Partial overrides for the context.\n */\nexport function createTestExecutorContext(\n overrides: Partial<ExecutorContext> = {},\n): ExecutorContext {\n const defaultClient = new Proxy({} as HttpClient, {\n get: (_target, prop) => {\n return (..._args: unknown[]) => {\n throw new Error(\n `HttpClient.${String(prop)}() called without mock — inject a mock client in createTestExecutorContext()`,\n );\n };\n },\n });\n\n return {\n client: defaultClient,\n ...overrides,\n };\n}\n","import type { ForgeServer, ServerResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateServerOptions } from \"./types.ts\";\n\n/**\n * Create a new server.\n */\nexport async function createServer(\n options: CreateServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer>> {\n const response = await ctx.client.post<ServerResponse>(\"/servers\", options);\n const server = response.server;\n\n return {\n data: server,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteServerOptions } from \"./types.ts\";\n\n/**\n * Delete a server.\n */\nexport async function deleteServer(\n options: DeleteServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeServer, ServerResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetServerOptions } from \"./types.ts\";\n\n/**\n * Get a specific server by ID.\n */\nexport async function getServer(\n options: GetServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer>> {\n const response = await ctx.client.get<ServerResponse>(`/servers/${options.server_id}`);\n const server = response.server;\n\n return {\n data: server,\n };\n}\n","import type { ForgeServer, ServersResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListServersOptions } from \"./types.ts\";\n\n/**\n * List all servers.\n */\nexport async function listServers(\n _options: ListServersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeServer[]>> {\n const response = await ctx.client.get<ServersResponse>(\"/servers\");\n const servers = response.servers;\n\n return {\n data: servers,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RebootServerOptions } from \"./types.ts\";\n\n/**\n * Reboot a server.\n */\nexport async function rebootServer(\n options: RebootServerOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/reboot`);\n\n return {\n data: undefined,\n };\n}\n","import type { ServersResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\nimport { matchByName } from \"../../utils/name-matcher.ts\";\n\nexport interface ResolveServersOptions {\n query: string;\n}\n\nexport interface ResolveMatch {\n id: number;\n name: string;\n}\n\nexport interface ResolveResult {\n query: string;\n matches: ResolveMatch[];\n total: number;\n}\n\n/**\n * Resolve servers by name — partial, case-insensitive match.\n *\n * If exactly one server matches the query exactly, it is returned as a single result.\n * Otherwise all partial matches are returned.\n */\nexport async function resolveServers(\n options: ResolveServersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ResolveResult>> {\n const response = await ctx.client.get<ServersResponse>(\"/servers\");\n const servers = response.servers;\n\n const match = matchByName(servers, options.query, (s) => s.name);\n const matches = match.exact.length === 1 ? match.exact : match.partial;\n\n return {\n data: {\n query: options.query,\n matches: matches.map((s) => ({ id: s.id, name: s.name })),\n total: matches.length,\n },\n };\n}\n","import type { ForgeSite, SiteResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSiteOptions } from \"./types.ts\";\n\n/**\n * Create a new site on a server.\n */\nexport async function createSite(\n options: CreateSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<SiteResponse>(`/servers/${server_id}/sites`, data);\n const site = response.site;\n\n return {\n data: site,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSiteOptions } from \"./types.ts\";\n\n/**\n * Delete a site.\n */\nexport async function deleteSite(\n options: DeleteSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/sites/${options.site_id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSiteOptions } from \"./types.ts\";\n\n/**\n * Get a specific site by ID.\n */\nexport async function getSite(\n options: GetSiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite>> {\n const response = await ctx.client.get<SiteResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}`,\n );\n const site = response.site;\n\n return {\n data: site,\n };\n}\n","import type { ForgeSite, SitesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSitesOptions } from \"./types.ts\";\n\n/**\n * List all sites on a server.\n */\nexport async function listSites(\n options: ListSitesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSite[]>> {\n const response = await ctx.client.get<SitesResponse>(`/servers/${options.server_id}/sites`);\n const sites = response.sites;\n\n return {\n data: sites,\n };\n}\n","import type { SitesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\nimport { matchByName } from \"../../utils/name-matcher.ts\";\n\nexport interface ResolveSitesOptions {\n server_id: string;\n query: string;\n}\n\nexport interface ResolveSiteMatch {\n id: number;\n name: string;\n}\n\nexport interface ResolveSiteResult {\n query: string;\n matches: ResolveSiteMatch[];\n total: number;\n}\n\n/**\n * Resolve sites by domain name — partial, case-insensitive match.\n *\n * If exactly one site matches the query exactly, it is returned as a single result.\n * Otherwise all partial matches are returned.\n */\nexport async function resolveSites(\n options: ResolveSitesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ResolveSiteResult>> {\n const response = await ctx.client.get<SitesResponse>(`/servers/${options.server_id}/sites`);\n const sites = response.sites;\n\n const match = matchByName(sites, options.query, (s) => s.name);\n const matches = match.exact.length === 1 ? match.exact : match.partial;\n\n return {\n data: {\n query: options.query,\n matches: matches.map((s) => ({ id: s.id, name: s.name })),\n total: matches.length,\n },\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeploySiteOptions } from \"./types.ts\";\n\n/**\n * Trigger a deployment for a site.\n */\nexport async function deploySite(\n options: DeploySiteOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/sites/${options.site_id}/deployment/deploy`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSite, SiteResponse, DeploymentsResponse } from \"@studiometa/forge-api\";\n\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeploySiteAndWaitOptions, DeployResult } from \"./types.ts\";\n\n/**\n * Trigger a deployment and wait for it to complete.\n *\n * 1. POSTs to the deploy endpoint.\n * 2. Polls GET /servers/{id}/sites/{site_id} every `poll_interval_ms` ms.\n * 3. When `deployment_status` becomes null the deploy is done.\n * 4. Fetches the deployment log.\n * 5. Checks the most recent deployment status to determine success/failure.\n */\nexport async function deploySiteAndWait(\n options: DeploySiteAndWaitOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<DeployResult>> {\n const { server_id, site_id, poll_interval_ms = 3000, timeout_ms = 600_000, onProgress } = options;\n\n const baseUrl = `/servers/${server_id}/sites/${site_id}`;\n\n // 1. Trigger deploy\n await ctx.client.post(`${baseUrl}/deployment/deploy`);\n\n const startTime = Date.now();\n\n // 2. Poll until deployment_status is null (done)\n await new Promise<void>((resolve) => {\n const tick = async (): Promise<void> => {\n const elapsed_ms = Date.now() - startTime;\n\n if (elapsed_ms >= timeout_ms) {\n resolve();\n return;\n }\n\n const response = await ctx.client.get<SiteResponse>(`/servers/${server_id}/sites/${site_id}`);\n const site = response.site as ForgeSite;\n const currentStatus = site.deployment_status;\n\n if (onProgress) {\n onProgress({ status: currentStatus ?? \"done\", elapsed_ms });\n }\n\n if (currentStatus === null) {\n resolve();\n return;\n }\n\n await new Promise<void>((r) => setTimeout(r, poll_interval_ms));\n await tick();\n };\n\n tick().catch(() => resolve());\n });\n\n const elapsed_ms = Date.now() - startTime;\n\n // 3. Fetch deployment log\n let log = \"\";\n try {\n log = await ctx.client.get<string>(`${baseUrl}/deployment/log`);\n } catch {\n // log may not be available; continue\n }\n\n // 4. Determine success/failure from the most recent deployment\n let deployStatus: \"success\" | \"failed\" = \"failed\";\n try {\n const deploymentsResponse = await ctx.client.get<DeploymentsResponse>(`${baseUrl}/deployments`);\n const deployments = deploymentsResponse.deployments;\n if (deployments.length > 0) {\n const latest = deployments[0]!;\n deployStatus = latest.status === \"finished\" ? \"success\" : \"failed\";\n }\n } catch {\n // If we can't fetch deployments, keep 'failed'\n }\n\n // 5. If we timed out, force 'failed'\n if (elapsed_ms >= timeout_ms) {\n deployStatus = \"failed\";\n }\n\n return {\n data: {\n status: deployStatus,\n log,\n elapsed_ms,\n },\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentLogOptions } from \"./types.ts\";\n\n/**\n * Get the deployment log for a site.\n */\nexport async function getDeploymentLog(\n options: GetDeploymentLogOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const log = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployment/log`,\n );\n return { data: log };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentOutputOptions } from \"./types.ts\";\n\n/**\n * Get the output of a deployment.\n */\nexport async function getDeploymentOutput(\n options: GetDeploymentOutputOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const output = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployments/${options.deployment_id}/output`,\n );\n\n return {\n data: output,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDeploymentScriptOptions } from \"./types.ts\";\n\n/**\n * Get the deployment script for a site.\n */\nexport async function getDeploymentScript(\n options: GetDeploymentScriptOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const script = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployment/script`,\n );\n\n return {\n data: script,\n };\n}\n","import type { ForgeDeployment, DeploymentsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDeploymentsOptions } from \"./types.ts\";\n\n/**\n * List all deployments for a site.\n */\nexport async function listDeployments(\n options: ListDeploymentsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDeployment[]>> {\n const response = await ctx.client.get<DeploymentsResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/deployments`,\n );\n const deployments = response.deployments;\n\n return {\n data: deployments,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateDeploymentScriptOptions } from \"./types.ts\";\n\n/**\n * Update the deployment script for a site.\n */\nexport async function updateDeploymentScript(\n options: UpdateDeploymentScriptOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/deployment/script`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ActivateCertificateOptions } from \"./types.ts\";\n\n/**\n * Activate an SSL certificate.\n */\nexport async function activateCertificate(\n options: ActivateCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}/activate`,\n {},\n );\n\n return {\n data: undefined,\n };\n}\n","import type { CertificateResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateCertificateOptions } from \"./types.ts\";\n\n/**\n * Create a new SSL certificate.\n */\nexport async function createCertificate(\n options: CreateCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<CertificateResponse>(\n `/servers/${server_id}/sites/${site_id}/certificates`,\n data,\n );\n const cert = response.certificate;\n\n return {\n data: cert,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteCertificateOptions } from \"./types.ts\";\n\n/**\n * Delete an SSL certificate.\n */\nexport async function deleteCertificate(\n options: DeleteCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { CertificateResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetCertificateOptions } from \"./types.ts\";\n\n/**\n * Get a single SSL certificate.\n */\nexport async function getCertificate(\n options: GetCertificateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate>> {\n const response = await ctx.client.get<CertificateResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates/${options.id}`,\n );\n const cert = response.certificate;\n\n return {\n data: cert,\n };\n}\n","import type { CertificatesResponse, ForgeCertificate } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListCertificatesOptions } from \"./types.ts\";\n\n/**\n * List SSL certificates for a site.\n */\nexport async function listCertificates(\n options: ListCertificatesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCertificate[]>> {\n const response = await ctx.client.get<CertificatesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/certificates`,\n );\n const certificates = response.certificates;\n\n return {\n data: certificates,\n };\n}\n","import type { DatabaseResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDatabaseOptions } from \"./types.ts\";\n\n/**\n * Create a new database.\n */\nexport async function createDatabase(\n options: CreateDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DatabaseResponse>(`/servers/${server_id}/databases`, data);\n const db = response.database;\n\n return {\n data: db,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDatabaseOptions } from \"./types.ts\";\n\n/**\n * Delete a database.\n */\nexport async function deleteDatabase(\n options: DeleteDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/databases/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DatabaseResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDatabaseOptions } from \"./types.ts\";\n\n/**\n * Get a single database.\n */\nexport async function getDatabase(\n options: GetDatabaseOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase>> {\n const response = await ctx.client.get<DatabaseResponse>(\n `/servers/${options.server_id}/databases/${options.id}`,\n );\n const db = response.database;\n\n return {\n data: db,\n };\n}\n","import type { DatabasesResponse, ForgeDatabase } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDatabasesOptions } from \"./types.ts\";\n\n/**\n * List databases on a server.\n */\nexport async function listDatabases(\n options: ListDatabasesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabase[]>> {\n const response = await ctx.client.get<DatabasesResponse>(\n `/servers/${options.server_id}/databases`,\n );\n const databases = response.databases;\n\n return {\n data: databases,\n };\n}\n","import type { DatabaseUserResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Create a new database user.\n */\nexport async function createDatabaseUser(\n options: CreateDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DatabaseUserResponse>(\n `/servers/${server_id}/database-users`,\n data,\n );\n const user = response.user;\n\n return {\n data: user,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Delete a database user.\n */\nexport async function deleteDatabaseUser(\n options: DeleteDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/database-users/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DatabaseUserResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDatabaseUserOptions } from \"./types.ts\";\n\n/**\n * Get a single database user.\n */\nexport async function getDatabaseUser(\n options: GetDatabaseUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser>> {\n const response = await ctx.client.get<DatabaseUserResponse>(\n `/servers/${options.server_id}/database-users/${options.id}`,\n );\n const user = response.user;\n\n return {\n data: user,\n };\n}\n","import type { DatabaseUsersResponse, ForgeDatabaseUser } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDatabaseUsersOptions } from \"./types.ts\";\n\n/**\n * List database users on a server.\n */\nexport async function listDatabaseUsers(\n options: ListDatabaseUsersOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDatabaseUser[]>> {\n const response = await ctx.client.get<DatabaseUsersResponse>(\n `/servers/${options.server_id}/database-users`,\n );\n const users = response.users;\n\n return {\n data: users,\n };\n}\n","import type { DaemonResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateDaemonOptions } from \"./types.ts\";\n\n/**\n * Create a new daemon (background process).\n */\nexport async function createDaemon(\n options: CreateDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<DaemonResponse>(`/servers/${server_id}/daemons`, data);\n const daemon = response.daemon;\n\n return {\n data: daemon,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteDaemonOptions } from \"./types.ts\";\n\n/**\n * Delete a daemon.\n */\nexport async function deleteDaemon(\n options: DeleteDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/daemons/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { DaemonResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetDaemonOptions } from \"./types.ts\";\n\n/**\n * Get a single daemon.\n */\nexport async function getDaemon(\n options: GetDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon>> {\n const response = await ctx.client.get<DaemonResponse>(\n `/servers/${options.server_id}/daemons/${options.id}`,\n );\n const daemon = response.daemon;\n\n return {\n data: daemon,\n };\n}\n","import type { DaemonsResponse, ForgeDaemon } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListDaemonsOptions } from \"./types.ts\";\n\n/**\n * List daemons (background processes) on a server.\n */\nexport async function listDaemons(\n options: ListDaemonsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeDaemon[]>> {\n const response = await ctx.client.get<DaemonsResponse>(`/servers/${options.server_id}/daemons`);\n const daemons = response.daemons;\n\n return {\n data: daemons,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RestartDaemonOptions } from \"./types.ts\";\n\n/**\n * Restart a daemon.\n */\nexport async function restartDaemon(\n options: RestartDaemonOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/servers/${options.server_id}/daemons/${options.id}/restart`, {});\n\n return {\n data: undefined,\n };\n}\n","import type { FirewallRuleResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateFirewallRuleOptions } from \"./types.ts\";\n\nexport async function createFirewallRule(\n options: CreateFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<FirewallRuleResponse>(\n `/servers/${server_id}/firewall-rules`,\n data,\n );\n const rule = response.rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteFirewallRuleOptions } from \"./types.ts\";\n\nexport async function deleteFirewallRule(\n options: DeleteFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/firewall-rules/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { FirewallRuleResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetFirewallRuleOptions } from \"./types.ts\";\n\nexport async function getFirewallRule(\n options: GetFirewallRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule>> {\n const response = await ctx.client.get<FirewallRuleResponse>(\n `/servers/${options.server_id}/firewall-rules/${options.id}`,\n );\n const rule = response.rule;\n\n return {\n data: rule,\n };\n}\n","import type { FirewallRulesResponse, ForgeFirewallRule } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListFirewallRulesOptions } from \"./types.ts\";\n\nexport async function listFirewallRules(\n options: ListFirewallRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeFirewallRule[]>> {\n const response = await ctx.client.get<FirewallRulesResponse>(\n `/servers/${options.server_id}/firewall-rules`,\n );\n const rules = response.rules;\n return {\n data: rules,\n };\n}\n","import type { ForgeSshKey, SshKeyResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSshKeyOptions } from \"./types.ts\";\n\nexport async function createSshKey(\n options: CreateSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<SshKeyResponse>(`/servers/${server_id}/keys`, data);\n const key = response.key;\n\n return {\n data: key,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSshKeyOptions } from \"./types.ts\";\n\nexport async function deleteSshKey(\n options: DeleteSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/keys/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSshKey, SshKeyResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSshKeyOptions } from \"./types.ts\";\n\nexport async function getSshKey(\n options: GetSshKeyOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey>> {\n const response = await ctx.client.get<SshKeyResponse>(\n `/servers/${options.server_id}/keys/${options.id}`,\n );\n const key = response.key;\n\n return {\n data: key,\n };\n}\n","import type { ForgeSshKey, SshKeysResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSshKeysOptions } from \"./types.ts\";\n\nexport async function listSshKeys(\n options: ListSshKeysOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSshKey[]>> {\n const response = await ctx.client.get<SshKeysResponse>(`/servers/${options.server_id}/keys`);\n const keys = response.keys;\n return {\n data: keys,\n };\n}\n","import type { ForgeSecurityRule, SecurityRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateSecurityRuleOptions } from \"./types.ts\";\n\nexport async function createSecurityRule(\n options: CreateSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<SecurityRuleResponse>(\n `/servers/${server_id}/sites/${site_id}/security-rules`,\n data,\n );\n const rule = response.security_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteSecurityRuleOptions } from \"./types.ts\";\n\nexport async function deleteSecurityRule(\n options: DeleteSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeSecurityRule, SecurityRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetSecurityRuleOptions } from \"./types.ts\";\n\nexport async function getSecurityRule(\n options: GetSecurityRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule>> {\n const response = await ctx.client.get<SecurityRuleResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules/${options.id}`,\n );\n const rule = response.security_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ForgeSecurityRule, SecurityRulesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListSecurityRulesOptions } from \"./types.ts\";\n\nexport async function listSecurityRules(\n options: ListSecurityRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeSecurityRule[]>> {\n const response = await ctx.client.get<SecurityRulesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/security-rules`,\n );\n const rules = response.security_rules;\n\n return {\n data: rules,\n };\n}\n","import type { ForgeRedirectRule, RedirectRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateRedirectRuleOptions } from \"./types.ts\";\n\nexport async function createRedirectRule(\n options: CreateRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule>> {\n const { server_id, site_id, ...data } = options;\n const response = await ctx.client.post<RedirectRuleResponse>(\n `/servers/${server_id}/sites/${site_id}/redirect-rules`,\n data,\n );\n const rule = response.redirect_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteRedirectRuleOptions } from \"./types.ts\";\n\nexport async function deleteRedirectRule(\n options: DeleteRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules/${options.id}`,\n );\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRedirectRule, RedirectRuleResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetRedirectRuleOptions } from \"./types.ts\";\n\nexport async function getRedirectRule(\n options: GetRedirectRuleOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule>> {\n const response = await ctx.client.get<RedirectRuleResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules/${options.id}`,\n );\n const rule = response.redirect_rule;\n\n return {\n data: rule,\n };\n}\n","import type { ForgeRedirectRule, RedirectRulesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListRedirectRulesOptions } from \"./types.ts\";\n\nexport async function listRedirectRules(\n options: ListRedirectRulesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRedirectRule[]>> {\n const response = await ctx.client.get<RedirectRulesResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/redirect-rules`,\n );\n const rules = response.redirect_rules;\n return {\n data: rules,\n };\n}\n","import type { ForgeMonitor, MonitorResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateMonitorOptions } from \"./types.ts\";\n\nexport async function createMonitor(\n options: CreateMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<MonitorResponse>(`/servers/${server_id}/monitors`, data);\n const monitor = response.monitor;\n\n return {\n data: monitor,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteMonitorOptions } from \"./types.ts\";\n\nexport async function deleteMonitor(\n options: DeleteMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/monitors/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeMonitor, MonitorResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetMonitorOptions } from \"./types.ts\";\n\nexport async function getMonitor(\n options: GetMonitorOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor>> {\n const response = await ctx.client.get<MonitorResponse>(\n `/servers/${options.server_id}/monitors/${options.id}`,\n );\n const monitor = response.monitor;\n\n return {\n data: monitor,\n };\n}\n","import type { ForgeMonitor, MonitorsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListMonitorsOptions } from \"./types.ts\";\n\nexport async function listMonitors(\n options: ListMonitorsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeMonitor[]>> {\n const response = await ctx.client.get<MonitorsResponse>(`/servers/${options.server_id}/monitors`);\n const monitors = response.monitors;\n return {\n data: monitors,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateNginxTemplateOptions } from \"./types.ts\";\n\nexport async function createNginxTemplate(\n options: CreateNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<NginxTemplateResponse>(\n `/servers/${server_id}/nginx/templates`,\n data,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteNginxTemplateOptions } from \"./types.ts\";\n\nexport async function deleteNginxTemplate(\n options: DeleteNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/nginx/templates/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetNginxTemplateOptions } from \"./types.ts\";\n\nexport async function getNginxTemplate(\n options: GetNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const response = await ctx.client.get<NginxTemplateResponse>(\n `/servers/${options.server_id}/nginx/templates/${options.id}`,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplatesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListNginxTemplatesOptions } from \"./types.ts\";\n\nexport async function listNginxTemplates(\n options: ListNginxTemplatesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate[]>> {\n const response = await ctx.client.get<NginxTemplatesResponse>(\n `/servers/${options.server_id}/nginx/templates`,\n );\n const templates = response.templates;\n return {\n data: templates,\n };\n}\n","import type { ForgeNginxTemplate, NginxTemplateResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateNginxTemplateOptions } from \"./types.ts\";\n\nexport async function updateNginxTemplate(\n options: UpdateNginxTemplateOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeNginxTemplate>> {\n const { server_id, id, ...data } = options;\n const response = await ctx.client.put<NginxTemplateResponse>(\n `/servers/${server_id}/nginx/templates/${id}`,\n data,\n );\n const template = response.template;\n\n return {\n data: template,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetEnvOptions } from \"./types.ts\";\n\n/**\n * Get environment variables for a site.\n */\nexport async function getEnv(\n options: GetEnvOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const content = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/env`,\n );\n\n return {\n data: content,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateEnvOptions } from \"./types.ts\";\n\n/**\n * Update environment variables for a site.\n */\nexport async function updateEnv(\n options: UpdateEnvOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/env`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetNginxConfigOptions } from \"./types.ts\";\n\n/**\n * Get Nginx configuration for a site.\n */\nexport async function getNginxConfig(\n options: GetNginxConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<string>> {\n const content = await ctx.client.get<string>(\n `/servers/${options.server_id}/sites/${options.site_id}/nginx`,\n );\n\n return {\n data: content,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { UpdateNginxConfigOptions } from \"./types.ts\";\n\n/**\n * Update Nginx configuration for a site.\n */\nexport async function updateNginxConfig(\n options: UpdateNginxConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.put(`/servers/${options.server_id}/sites/${options.site_id}/nginx`, {\n content: options.content,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRecipe, RecipeResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateRecipeOptions } from \"./types.ts\";\n\nexport async function createRecipe(\n options: CreateRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe>> {\n const response = await ctx.client.post<RecipeResponse>(\"/recipes\", options);\n const recipe = response.recipe;\n\n return {\n data: recipe,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteRecipeOptions } from \"./types.ts\";\n\nexport async function deleteRecipe(\n options: DeleteRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/recipes/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeRecipe, RecipeResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetRecipeOptions } from \"./types.ts\";\n\nexport async function getRecipe(\n options: GetRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe>> {\n const response = await ctx.client.get<RecipeResponse>(`/recipes/${options.id}`);\n const recipe = response.recipe;\n\n return {\n data: recipe,\n };\n}\n","import type { ForgeRecipe, RecipesResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListRecipesOptions } from \"./types.ts\";\n\nexport async function listRecipes(\n _options: ListRecipesOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeRecipe[]>> {\n const response = await ctx.client.get<RecipesResponse>(\"/recipes\");\n const recipes = response.recipes;\n return {\n data: recipes,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { RunRecipeOptions } from \"./types.ts\";\n\n/**\n * Run a recipe on specified servers.\n */\nexport async function runRecipe(\n options: RunRecipeOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.post(`/recipes/${options.id}/run`, {\n servers: options.servers,\n });\n\n return {\n data: undefined,\n };\n}\n","import type { BackupConfigResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Create a new backup configuration.\n */\nexport async function createBackupConfig(\n options: CreateBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<BackupConfigResponse>(\n `/servers/${server_id}/backup-configs`,\n data,\n );\n const backup = response.backup;\n\n return {\n data: backup,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Delete a backup configuration.\n */\nexport async function deleteBackupConfig(\n options: DeleteBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/backup-configs/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { BackupConfigResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetBackupConfigOptions } from \"./types.ts\";\n\n/**\n * Get a specific backup configuration.\n */\nexport async function getBackupConfig(\n options: GetBackupConfigOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig>> {\n const response = await ctx.client.get<BackupConfigResponse>(\n `/servers/${options.server_id}/backup-configs/${options.id}`,\n );\n const backup = response.backup;\n\n return {\n data: backup,\n };\n}\n","import type { BackupConfigsResponse, ForgeBackupConfig } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListBackupConfigsOptions } from \"./types.ts\";\n\n/**\n * List backup configurations for a server.\n */\nexport async function listBackupConfigs(\n options: ListBackupConfigsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeBackupConfig[]>> {\n const response = await ctx.client.get<BackupConfigsResponse>(\n `/servers/${options.server_id}/backup-configs`,\n );\n const backups = response.backups;\n\n return {\n data: backups,\n };\n}\n","import type { CommandResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateCommandOptions } from \"./types.ts\";\n\n/**\n * Execute a command on a site.\n */\nexport async function createCommand(\n options: CreateCommandOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand>> {\n const response = await ctx.client.post<CommandResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands`,\n { command: options.command },\n );\n const command = response.command;\n\n return {\n data: command,\n };\n}\n","import type { CommandResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetCommandOptions } from \"./types.ts\";\n\n/**\n * Get a specific command.\n */\nexport async function getCommand(\n options: GetCommandOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand>> {\n const response = await ctx.client.get<CommandResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands/${options.id}`,\n );\n const command = response.command;\n\n return {\n data: command,\n };\n}\n","import type { CommandsResponse, ForgeCommand } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListCommandsOptions } from \"./types.ts\";\n\n/**\n * List commands executed on a site.\n */\nexport async function listCommands(\n options: ListCommandsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeCommand[]>> {\n const response = await ctx.client.get<CommandsResponse>(\n `/servers/${options.server_id}/sites/${options.site_id}/commands`,\n );\n const commands = response.commands;\n\n return {\n data: commands,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { CreateScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Create a new scheduled job (cron).\n */\nexport async function createScheduledJob(\n options: CreateScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob>> {\n const { server_id, ...data } = options;\n const response = await ctx.client.post<ScheduledJobResponse>(`/servers/${server_id}/jobs`, data);\n const job = response.job;\n\n return {\n data: job,\n };\n}\n","import type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { DeleteScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Delete a scheduled job.\n */\nexport async function deleteScheduledJob(\n options: DeleteScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<void>> {\n await ctx.client.delete(`/servers/${options.server_id}/jobs/${options.id}`);\n\n return {\n data: undefined,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetScheduledJobOptions } from \"./types.ts\";\n\n/**\n * Get a specific scheduled job.\n */\nexport async function getScheduledJob(\n options: GetScheduledJobOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob>> {\n const response = await ctx.client.get<ScheduledJobResponse>(\n `/servers/${options.server_id}/jobs/${options.id}`,\n );\n const job = response.job;\n\n return {\n data: job,\n };\n}\n","import type { ForgeScheduledJob, ScheduledJobsResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { ListScheduledJobsOptions } from \"./types.ts\";\n\n/**\n * List scheduled jobs (cron) on a server.\n */\nexport async function listScheduledJobs(\n options: ListScheduledJobsOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeScheduledJob[]>> {\n const response = await ctx.client.get<ScheduledJobsResponse>(\n `/servers/${options.server_id}/jobs`,\n );\n const jobs = response.jobs;\n\n return {\n data: jobs,\n };\n}\n","import type { ForgeUser, UserResponse } from \"@studiometa/forge-api\";\nimport type { ExecutorContext, ExecutorResult } from \"../../context.ts\";\n\nimport type { GetUserOptions } from \"./types.ts\";\n\n/**\n * Get the currently authenticated user.\n */\nexport async function getUser(\n _options: GetUserOptions,\n ctx: ExecutorContext,\n): Promise<ExecutorResult<ForgeUser>> {\n const response = await ctx.client.get<UserResponse>(\"/user\");\n const user = response.user;\n\n return {\n data: user,\n };\n}\n"],"x_google_ignoreList":[2,3],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Result of a name matching operation.
3
+ * Provides both exact and partial matches for flexible consumption.
4
+ */
5
+ export interface NameMatch<T> {
6
+ /** Items whose name matches the query exactly (case-insensitive). */
7
+ exact: T[];
8
+ /** Items whose name contains the query (case-insensitive). Includes exact matches. */
9
+ partial: T[];
10
+ }
11
+ /**
12
+ * Match items by name using case-insensitive exact and partial matching.
13
+ *
14
+ * @param items - The items to search through.
15
+ * @param query - The search query.
16
+ * @param getName - Function to extract the name from an item.
17
+ * @returns Object with exact and partial match arrays.
18
+ */
19
+ export declare function matchByName<T>(items: T[], query: string, getName: (item: T) => string): NameMatch<T>;
20
+ //# sourceMappingURL=name-matcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-matcher.d.ts","sourceRoot":"","sources":["../../src/utils/name-matcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,qEAAqE;IACrE,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,sFAAsF;IACtF,OAAO,EAAE,CAAC,EAAE,CAAC;CACd;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAC3B,SAAS,CAAC,CAAC,CAAC,CAKd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiometa/forge-core",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Shared business logic for Laravel Forge tools — executors and dependency injection",
5
5
  "keywords": [
6
6
  "automation",