@procedures/server 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +18 -1
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/index.d.ts +6 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +7 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/module.d.ts +24 -0
  9. package/dist/module.d.ts.map +1 -0
  10. package/dist/module.js +29 -0
  11. package/dist/module.js.map +1 -0
  12. package/dist/procedures/server.start.d.ts +17 -0
  13. package/dist/procedures/server.start.d.ts.map +1 -0
  14. package/dist/procedures/server.start.js +183 -0
  15. package/dist/procedures/server.start.js.map +1 -0
  16. package/dist/procedures/server.status.d.ts +15 -0
  17. package/dist/procedures/server.status.d.ts.map +1 -0
  18. package/dist/procedures/server.status.js +118 -0
  19. package/dist/procedures/server.status.js.map +1 -0
  20. package/dist/procedures/server.stop.d.ts +14 -0
  21. package/dist/procedures/server.stop.d.ts.map +1 -0
  22. package/dist/procedures/server.stop.js +98 -0
  23. package/dist/procedures/server.stop.js.map +1 -0
  24. package/dist/register.d.ts +7 -0
  25. package/dist/register.d.ts.map +1 -0
  26. package/dist/register.js +9 -0
  27. package/dist/register.js.map +1 -0
  28. package/dist/run.d.ts.map +1 -1
  29. package/dist/run.js +5 -2
  30. package/dist/run.js.map +1 -1
  31. package/dist/schemas.d.ts +19 -0
  32. package/dist/schemas.d.ts.map +1 -0
  33. package/dist/schemas.js +48 -0
  34. package/dist/schemas.js.map +1 -0
  35. package/dist/types.d.ts +58 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/package.json +19 -5
  38. package/src/index.ts +26 -1
  39. package/src/module.ts +33 -0
  40. package/src/procedures/server.start.ts +213 -0
  41. package/src/procedures/server.status.ts +141 -0
  42. package/src/procedures/server.stop.ts +123 -0
  43. package/src/register.ts +11 -0
  44. package/src/run.ts +5 -2
  45. package/src/schemas.ts +69 -0
  46. package/src/types.ts +76 -0
package/dist/index.d.ts CHANGED
@@ -7,5 +7,10 @@
7
7
  */
8
8
  export { parseConfig } from "./config.js";
9
9
  export { runServer, startServer, loadProcedureModule, type RunningServer, type ServerRunOptions } from "./run.js";
10
- export type { ServerConfig, TransportConfig, ServerCreateResult } from "./types.js";
10
+ export type { ServerConfig, TransportConfig, ServerCreateResult, ServerStartInput, ServerStartOutput, ServerStopInput, ServerStopOutput, ServerStatusInput, ServerStatusOutput, } from "./types.js";
11
+ export * from "./module.js";
12
+ export { serverStartProcedure } from "./procedures/server.start.js";
13
+ export { serverStopProcedure } from "./procedures/server.stop.js";
14
+ export { serverStatusProcedure } from "./procedures/server.status.js";
15
+ export { serverStartInputSchema, serverStopInputSchema, serverStatusInputSchema, ServerStartOutputSchema, ServerStopOutputSchema, ServerStatusOutputSchema, } from "./schemas.js";
11
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAClH,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAClH,YAAY,EACV,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAIpB,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -7,4 +7,11 @@
7
7
  */
8
8
  export { parseConfig } from "./config.js";
9
9
  export { runServer, startServer, loadProcedureModule } from "./run.js";
10
+ // server.start, server.stop and server.status (from @procedures/peer). The root registers
11
+ // nothing: import "@procedures/server/register", or give the module to createRegistry().
12
+ export * from "./module.js";
13
+ export { serverStartProcedure } from "./procedures/server.start.js";
14
+ export { serverStopProcedure } from "./procedures/server.stop.js";
15
+ export { serverStatusProcedure } from "./procedures/server.status.js";
16
+ export { serverStartInputSchema, serverStopInputSchema, serverStatusInputSchema, ServerStartOutputSchema, ServerStopOutputSchema, ServerStatusOutputSchema, } from "./schemas.js";
10
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAA6C,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAA6C,MAAM,UAAU,CAAC;AAalH,0FAA0F;AAC1F,yFAAyF;AACzF,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Module (no side effects): the procedures of this package as data, for `createRegistry()`.
3
+ *
4
+ * The package holds the host: the `server` CLI, `mark serve`, and the procedures that manage the
5
+ * background server of the `mark` CLI. `server.start`, `server.stop` and `server.status` came
6
+ * from `@procedures/peer`. Their names stay the same. The other `server.*` procedures
7
+ * (`server.create`, `server.connect` and the others) stay in the peer package.
8
+ */
9
+ import { type AnyProcedure, type ProcedureModule, type ProcedureRegistry } from "@procedures/client";
10
+ /** The procedures of the host: `server.start`, `server.stop` and `server.status`. */
11
+ export declare const hostProcedures: readonly AnyProcedure[];
12
+ /**
13
+ * The module of this package, for `createRegistry()`: its procedures as data. Importing this
14
+ * file registers nothing. (`register.ts` registers the same procedures in the global registry.)
15
+ */
16
+ export declare const serverModule: ProcedureModule;
17
+ export default serverModule;
18
+ /**
19
+ * This function registers the procedures of @procedures/server in a registry. The default is the
20
+ * global registry. Importing this file registers nothing: the `./register` entry starts this
21
+ * function (ARCHITECTURE-PROPOSALS-2026-10, P9).
22
+ */
23
+ export declare function registerServerProcedures(registry?: ProcedureRegistry): void;
24
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAqD,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAKxJ,qFAAqF;AACrF,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAAuE,CAAC;AAE1H;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,eAAyE,CAAC;eAEtF,YAAY;AAE3B;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,GAAE,iBAAsC,GAAG,IAAI,CAE/F"}
package/dist/module.js ADDED
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Module (no side effects): the procedures of this package as data, for `createRegistry()`.
3
+ *
4
+ * The package holds the host: the `server` CLI, `mark serve`, and the procedures that manage the
5
+ * background server of the `mark` CLI. `server.start`, `server.stop` and `server.status` came
6
+ * from `@procedures/peer`. Their names stay the same. The other `server.*` procedures
7
+ * (`server.create`, `server.connect` and the others) stay in the peer package.
8
+ */
9
+ import { defineModule, registerModules, PROCEDURE_REGISTRY } from "@procedures/client";
10
+ import { serverStartProcedure } from "./procedures/server.start.js";
11
+ import { serverStopProcedure } from "./procedures/server.stop.js";
12
+ import { serverStatusProcedure } from "./procedures/server.status.js";
13
+ /** The procedures of the host: `server.start`, `server.stop` and `server.status`. */
14
+ export const hostProcedures = [serverStartProcedure, serverStopProcedure, serverStatusProcedure];
15
+ /**
16
+ * The module of this package, for `createRegistry()`: its procedures as data. Importing this
17
+ * file registers nothing. (`register.ts` registers the same procedures in the global registry.)
18
+ */
19
+ export const serverModule = defineModule("@procedures/server", [...hostProcedures]);
20
+ export default serverModule;
21
+ /**
22
+ * This function registers the procedures of @procedures/server in a registry. The default is the
23
+ * global registry. Importing this file registers nothing: the `./register` entry starts this
24
+ * function (ARCHITECTURE-PROPOSALS-2026-10, P9).
25
+ */
26
+ export function registerServerProcedures(registry = PROCEDURE_REGISTRY) {
27
+ registerModules(registry, [serverModule]);
28
+ }
29
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAmE,MAAM,oBAAoB,CAAC;AACxJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,qBAAqB,CAAC,CAAC;AAE1H;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB,YAAY,CAAC,oBAAoB,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;AAErG,eAAe,YAAY,CAAC;AAE5B;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,QAAQ,GAAsB,kBAAkB;IACvF,eAAe,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Procedure: server.start
3
+ * Starts the CLI server as a background daemon
4
+ *
5
+ * The procedure came from `@procedures/peer`: it belongs to the host. The lockfiles stay in the
6
+ * peer package, because the peer of `mark --server` writes them.
7
+ */
8
+ import { type Effects, type Procedure } from "@procedures/client";
9
+ import type { ServerStartInput, ServerStartOutput } from "../types.js";
10
+ export declare const serverStartProcedure: Procedure<ServerStartInput, ServerStartOutput, {
11
+ description: string;
12
+ effects: Effects;
13
+ args: string[];
14
+ shorts: Record<string, string>;
15
+ }>;
16
+ export type { ServerStartInput, ServerStartOutput };
17
+ //# sourceMappingURL=server.start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.start.d.ts","sourceRoot":"","sources":["../../src/procedures/server.start.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAyEvE,eAAO,MAAM,oBAAoB,EAAE,SAAS,CAC1C,gBAAgB,EAChB,iBAAiB,EACjB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAuHjF,CAAC;AAEX,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Procedure: server.start
3
+ * Starts the CLI server as a background daemon
4
+ *
5
+ * The procedure came from `@procedures/peer`: it belongs to the host. The lockfiles stay in the
6
+ * peer package, because the peer of `mark --server` writes them.
7
+ */
8
+ import { spawn } from "node:child_process";
9
+ import * as fs from "node:fs";
10
+ import * as path from "node:path";
11
+ import * as os from "node:os";
12
+ import { createProcedure, zodAdapter } from "@procedures/client";
13
+ import { checkServer, readLockfileForPort } from "@procedures/peer/lockfile";
14
+ import { ServerStartOutputSchema, serverStartInputSchema } from "../schemas.js";
15
+ const MARK_DIR = path.join(os.homedir(), ".mark");
16
+ const SERVERS_DIR = path.join(MARK_DIR, "servers");
17
+ const LOG_PATH = path.join(MARK_DIR, "server.log");
18
+ const LOG_PREV_PATH = path.join(MARK_DIR, "server.log.1");
19
+ const serverStartOutputSchema = zodAdapter(ServerStartOutputSchema);
20
+ /**
21
+ * Check if process is alive
22
+ */
23
+ function isProcessAlive(pid) {
24
+ try {
25
+ process.kill(pid, 0);
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ /**
33
+ * Rotate log file
34
+ */
35
+ function rotateLog() {
36
+ try {
37
+ fs.mkdirSync(MARK_DIR, { recursive: true });
38
+ if (fs.existsSync(LOG_PATH)) {
39
+ fs.renameSync(LOG_PATH, LOG_PREV_PATH);
40
+ }
41
+ }
42
+ catch {
43
+ // Ignore rotation errors
44
+ }
45
+ }
46
+ /**
47
+ * Find the CLI entry point
48
+ */
49
+ function findCliPath() {
50
+ // First, try to use the currently running script if it's the CLI
51
+ const currentScript = process.argv[1];
52
+ if (currentScript) {
53
+ // Normalize path for cross-platform check
54
+ const normalized = currentScript.replace(/\\/g, "/");
55
+ // mark runs as dist/bin.js (its bin) or dist/cli.js
56
+ if (normalized.endsWith("/dist/bin.js") || normalized.endsWith("cli.js") || normalized.includes("cli/dist")) {
57
+ // Return absolute path
58
+ return path.resolve(currentScript);
59
+ }
60
+ }
61
+ // Try to find the mark CLI in node_modules or as a direct path
62
+ const candidates = [
63
+ path.join(process.cwd(), "node_modules", "@procedures", "mark", "dist", "cli.js"),
64
+ path.join(process.cwd(), "node_modules", ".bin", "mark"),
65
+ // Check parent directories for monorepo setups
66
+ path.join(process.cwd(), "..", "cli", "dist", "cli.js"),
67
+ // Direct check in current directory
68
+ path.join(process.cwd(), "dist", "cli.js"),
69
+ ];
70
+ // Check which candidate exists
71
+ for (const candidate of candidates) {
72
+ if (fs.existsSync(candidate)) {
73
+ return candidate;
74
+ }
75
+ }
76
+ // Fallback: try mark in PATH (will fail if not installed globally)
77
+ return "mark";
78
+ }
79
+ export const serverStartProcedure = createProcedure()
80
+ .path(["server", "start"])
81
+ .input(serverStartInputSchema)
82
+ .output(serverStartOutputSchema)
83
+ .meta({
84
+ description: "Start CLI server as background daemon",
85
+ // The daemon loads the procedure packages of the workspace. The procedure moves server.log
86
+ // over server.log.1.
87
+ effects: { reads: ["fs", "server"], writes: ["fs", "network", "process", "server"] },
88
+ args: [],
89
+ shorts: { port: "p", host: "h" },
90
+ })
91
+ .handler(async (input) => {
92
+ const port = input.port ?? 3000;
93
+ // Loopback by default; pass host: "0.0.0.0" to expose on the LAN deliberately.
94
+ // See documentation/BUGS-2026-07.md (H19).
95
+ const host = input.host ?? "127.0.0.1";
96
+ const transport = input.transport ?? "http";
97
+ // Check if server is already running on this port
98
+ const existing = readLockfileForPort(port);
99
+ if (existing && (await checkServer(existing)) === "alive") {
100
+ return {
101
+ success: false,
102
+ message: `Server already running on port ${port} (PID ${existing.pid})`,
103
+ };
104
+ }
105
+ // Rotate log file
106
+ rotateLog();
107
+ // Ensure directories exist
108
+ fs.mkdirSync(SERVERS_DIR, { recursive: true });
109
+ // Open log file for writing
110
+ const logFd = fs.openSync(LOG_PATH, "a");
111
+ // Find CLI path
112
+ const cliPath = findCliPath();
113
+ // Build arguments
114
+ const args = ["--server", "--port", String(port), "--host", host];
115
+ if (transport !== "http") {
116
+ args.push("--transport", transport);
117
+ }
118
+ // Determine how to spawn
119
+ let spawnCmd;
120
+ let spawnArgs;
121
+ if (cliPath === "mark" || cliPath.endsWith(".bin/mark") || cliPath.endsWith(".bin\\mark")) {
122
+ // Use mark command directly
123
+ spawnCmd = cliPath;
124
+ spawnArgs = args;
125
+ }
126
+ else {
127
+ // Use node to run the JS file
128
+ spawnCmd = process.execPath;
129
+ spawnArgs = [cliPath, ...args];
130
+ }
131
+ // Spawn daemon process
132
+ const child = spawn(spawnCmd, spawnArgs, {
133
+ detached: true,
134
+ stdio: ["ignore", logFd, logFd],
135
+ env: { ...process.env },
136
+ cwd: process.cwd(),
137
+ // No console window on Windows (deep dive CLI-16)
138
+ windowsHide: true,
139
+ });
140
+ // Unref so parent can exit
141
+ child.unref();
142
+ fs.closeSync(logFd);
143
+ // Poll for lockfile (server takes ~4-8s to load ecosystem)
144
+ const maxWait = 15000;
145
+ const pollInterval = 500;
146
+ const startTime = Date.now();
147
+ while (Date.now() - startTime < maxWait) {
148
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
149
+ // Check if child died
150
+ if (child.pid && !isProcessAlive(child.pid)) {
151
+ break;
152
+ }
153
+ // Check for lockfile
154
+ const lockfile = readLockfileForPort(port);
155
+ if (lockfile && (await checkServer(lockfile)) === "alive") {
156
+ return {
157
+ success: true,
158
+ pid: lockfile.pid,
159
+ port: lockfile.port,
160
+ endpoint: lockfile.endpoint,
161
+ logFile: LOG_PATH,
162
+ message: `Server started (PID ${lockfile.pid})`,
163
+ };
164
+ }
165
+ }
166
+ // Timed out waiting for lockfile, but child may still be alive
167
+ if (child.pid && isProcessAlive(child.pid)) {
168
+ return {
169
+ success: true,
170
+ pid: child.pid,
171
+ port,
172
+ endpoint: `http://${host === "0.0.0.0" ? "localhost" : host}:${port}/api`,
173
+ logFile: LOG_PATH,
174
+ message: `Server starting (PID ${child.pid}, still loading...)`,
175
+ };
176
+ }
177
+ return {
178
+ success: false,
179
+ message: `Failed to start server. Check ${LOG_PATH} for details.`,
180
+ };
181
+ })
182
+ .build();
183
+ //# sourceMappingURL=server.start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.start.js","sourceRoot":"","sources":["../../src/procedures/server.start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Procedure: server.status
3
+ * Gets the current CLI server status
4
+ *
5
+ * The procedure came from `@procedures/peer`: it belongs to the host.
6
+ */
7
+ import { type Effects, type Procedure } from "@procedures/client";
8
+ import type { ServerStatusInput, ServerStatusOutput } from "../types.js";
9
+ export declare const serverStatusProcedure: Procedure<ServerStatusInput, ServerStatusOutput, {
10
+ description: string;
11
+ effects: Effects;
12
+ output: string;
13
+ }>;
14
+ export type { ServerStatusInput, ServerStatusOutput };
15
+ //# sourceMappingURL=server.status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.status.d.ts","sourceRoot":"","sources":["../../src/procedures/server.status.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAqCzE,eAAO,MAAM,qBAAqB,EAAE,SAAS,CAC3C,iBAAiB,EACjB,kBAAkB,EAClB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsFjD,CAAC;AAEX,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Procedure: server.status
3
+ * Gets the current CLI server status
4
+ *
5
+ * The procedure came from `@procedures/peer`: it belongs to the host.
6
+ */
7
+ import * as path from "node:path";
8
+ import * as os from "node:os";
9
+ import { createProcedure, zodAdapter } from "@procedures/client";
10
+ import { checkServer, readAllLockfiles, readLockfileForPort, removeLockfileForPort } from "@procedures/peer/lockfile";
11
+ import { ServerStatusOutputSchema, serverStatusInputSchema } from "../schemas.js";
12
+ const MARK_DIR = path.join(os.homedir(), ".mark");
13
+ const LOG_PATH = path.join(MARK_DIR, "server.log");
14
+ const serverStatusOutputSchema = zodAdapter(ServerStatusOutputSchema);
15
+ /**
16
+ * Format uptime as human-readable string
17
+ */
18
+ function formatUptime(startedAt) {
19
+ const start = new Date(startedAt).getTime();
20
+ const now = Date.now();
21
+ const diff = Math.floor((now - start) / 1000);
22
+ if (diff < 60) {
23
+ return `${diff}s`;
24
+ }
25
+ if (diff < 3600) {
26
+ const mins = Math.floor(diff / 60);
27
+ const secs = diff % 60;
28
+ return `${mins}m ${secs}s`;
29
+ }
30
+ if (diff < 86400) {
31
+ const hours = Math.floor(diff / 3600);
32
+ const mins = Math.floor((diff % 3600) / 60);
33
+ return `${hours}h ${mins}m`;
34
+ }
35
+ const days = Math.floor(diff / 86400);
36
+ const hours = Math.floor((diff % 86400) / 3600);
37
+ return `${days}d ${hours}h`;
38
+ }
39
+ export const serverStatusProcedure = createProcedure()
40
+ .path(["server", "status"])
41
+ .input(serverStatusInputSchema)
42
+ .output(serverStatusOutputSchema)
43
+ .meta({
44
+ description: "Get CLI server status",
45
+ // It deletes the lockfile of a server that does not answer
46
+ effects: { reads: ["fs", "server"], writes: ["fs"], idempotent: true },
47
+ args: [],
48
+ shorts: { port: "p" },
49
+ output: "text",
50
+ })
51
+ .handler(async (input) => {
52
+ // Get target servers
53
+ let targets;
54
+ if (input.port !== undefined) {
55
+ const lockfile = readLockfileForPort(input.port);
56
+ targets = lockfile ? [lockfile] : [];
57
+ }
58
+ else {
59
+ targets = readAllLockfiles();
60
+ }
61
+ if (targets.length === 0) {
62
+ return {
63
+ running: false,
64
+ message: input.port
65
+ ? `No server found on port ${input.port}`
66
+ : "No servers running",
67
+ };
68
+ }
69
+ // For single server, return detailed info
70
+ if (targets.length === 1) {
71
+ const lockfile = targets[0];
72
+ const { pid, port, endpoint, startedAt, transport } = lockfile;
73
+ if ((await checkServer(lockfile)) !== "alive") {
74
+ removeLockfileForPort(port);
75
+ return {
76
+ running: false,
77
+ message: "Server is not running (cleaned up stale lockfile)",
78
+ };
79
+ }
80
+ const uptime = formatUptime(startedAt);
81
+ return {
82
+ running: true,
83
+ pid,
84
+ port,
85
+ endpoint,
86
+ transport,
87
+ startedAt,
88
+ uptime,
89
+ logFile: LOG_PATH,
90
+ message: `Server running (PID ${pid}, port ${port}, uptime ${uptime})`,
91
+ };
92
+ }
93
+ // Multiple servers - summarize
94
+ const lines = [];
95
+ let anyRunning = false;
96
+ for (const lockfile of targets) {
97
+ const { pid, port, endpoint, startedAt } = lockfile;
98
+ if ((await checkServer(lockfile)) !== "alive") {
99
+ removeLockfileForPort(port);
100
+ continue;
101
+ }
102
+ anyRunning = true;
103
+ const uptime = formatUptime(startedAt);
104
+ lines.push(` Port ${port}: PID ${pid}, uptime ${uptime}, ${endpoint}`);
105
+ }
106
+ if (!anyRunning) {
107
+ return {
108
+ running: false,
109
+ message: "No servers running (cleaned up stale lockfiles)",
110
+ };
111
+ }
112
+ return {
113
+ running: true,
114
+ message: `${lines.length} server(s) running:\n${lines.join("\n")}`,
115
+ };
116
+ })
117
+ .build();
118
+ //# sourceMappingURL=server.status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.status.js","sourceRoot":"","sources":["../../src/procedures/server.status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Procedure: server.stop
3
+ * Stops the running CLI server daemon
4
+ *
5
+ * The procedure came from `@procedures/peer`: it belongs to the host.
6
+ */
7
+ import { type Effects, type Procedure } from "@procedures/client";
8
+ import type { ServerStopInput, ServerStopOutput } from "../types.js";
9
+ export declare const serverStopProcedure: Procedure<ServerStopInput, ServerStopOutput, {
10
+ description: string;
11
+ effects: Effects;
12
+ }>;
13
+ export type { ServerStopInput, ServerStopOutput };
14
+ //# sourceMappingURL=server.stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.stop.d.ts","sourceRoot":"","sources":["../../src/procedures/server.stop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAA+B,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAqBrE,eAAO,MAAM,mBAAmB,EAAE,SAAS,CACzC,eAAe,EACf,gBAAgB,EAChB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAsFjC,CAAC;AAEX,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Procedure: server.stop
3
+ * Stops the running CLI server daemon
4
+ *
5
+ * The procedure came from `@procedures/peer`: it belongs to the host.
6
+ */
7
+ import { createProcedure, zodAdapter } from "@procedures/client";
8
+ import { checkServer, readAllLockfiles, readLockfileForPort, removeLockfileForPort } from "@procedures/peer/lockfile";
9
+ import { ServerStopOutputSchema, serverStopInputSchema } from "../schemas.js";
10
+ const serverStopOutputSchema = zodAdapter(ServerStopOutputSchema);
11
+ /**
12
+ * Kill process by PID
13
+ */
14
+ function killProcess(pid, signal = "SIGTERM") {
15
+ try {
16
+ process.kill(pid, signal);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ }
23
+ export const serverStopProcedure = createProcedure()
24
+ .path(["server", "stop"])
25
+ .input(serverStopInputSchema)
26
+ .output(serverStopOutputSchema)
27
+ .meta({
28
+ description: "Stop running CLI server",
29
+ // It stops the servers of the lockfiles and deletes their lockfiles
30
+ effects: { reads: ["fs", "server"], writes: ["fs", "server"], idempotent: true },
31
+ args: [],
32
+ shorts: { port: "p" },
33
+ })
34
+ .handler(async (input) => {
35
+ const force = input.force ?? false;
36
+ const signal = force ? "SIGKILL" : "SIGTERM";
37
+ // Get target servers
38
+ let targets;
39
+ if (input.port !== undefined) {
40
+ const lockfile = readLockfileForPort(input.port);
41
+ targets = lockfile ? [lockfile] : [];
42
+ }
43
+ else {
44
+ targets = readAllLockfiles();
45
+ }
46
+ if (targets.length === 0) {
47
+ return {
48
+ success: false,
49
+ message: input.port
50
+ ? `No server found on port ${input.port}`
51
+ : "No servers running",
52
+ };
53
+ }
54
+ const results = [];
55
+ let allSuccess = true;
56
+ for (const lockfile of targets) {
57
+ const { pid, port } = lockfile;
58
+ // Signal the PID only when the server answers as the peer of this lockfile: Windows reuses
59
+ // PIDs, and before, a stale lockfile made this kill an unrelated process (deep dive CLI-4)
60
+ const state = await checkServer(lockfile);
61
+ if (state !== "alive") {
62
+ removeLockfileForPort(port);
63
+ results.push(state === "dead"
64
+ ? `Port ${port}: cleaned up stale lockfile`
65
+ : `Port ${port}: another process answers on this port; nothing stopped (stale lockfile removed)`);
66
+ continue;
67
+ }
68
+ const sent = killProcess(pid, signal);
69
+ if (!sent) {
70
+ allSuccess = false;
71
+ results.push(`Port ${port}: failed to send ${signal} to PID ${pid}`);
72
+ continue;
73
+ }
74
+ // Wait for process to die
75
+ const maxWait = force ? 500 : 5000;
76
+ const startTime = Date.now();
77
+ let stopped = false;
78
+ while (Date.now() - startTime < maxWait) {
79
+ if ((await checkServer(lockfile, 300)) === "dead") {
80
+ removeLockfileForPort(port);
81
+ results.push(`Port ${port}: stopped (PID ${pid})`);
82
+ stopped = true;
83
+ break;
84
+ }
85
+ await new Promise((resolve) => setTimeout(resolve, 100));
86
+ }
87
+ if (!stopped) {
88
+ allSuccess = false;
89
+ results.push(`Port ${port}: PID ${pid} did not stop${force ? "" : " (try --force)"}`);
90
+ }
91
+ }
92
+ return {
93
+ success: allSuccess,
94
+ message: results.join("\n"),
95
+ };
96
+ })
97
+ .build();
98
+ //# sourceMappingURL=server.stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.stop.js","sourceRoot":"","sources":["../../src/procedures/server.stop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAgC,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,qBAAqB,EAAqB,MAAM,2BAA2B,CAAC;AACzI,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAI9E,MAAM,sBAAsB,GAAG,UAAU,CAAmB,sBAAsB,CAAC,CAAC;AAMpF;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW,EAAE,MAAM,GAAmB,SAAS;IAClE,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAI5B,eAAe,EAAE;KAClB,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;KACxB,KAAK,CAAC,qBAAqB,CAAC;KAC5B,MAAM,CAAC,sBAAsB,CAAC;KAC9B,IAAI,CAAC;IACJ,WAAW,EAAE,yBAAyB;IACtC,oEAAoE;IACpE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;IAChF,IAAI,EAAE,EAAE;IACR,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE;CACtB,CAAC;KACD,OAAO,CAAC,KAAK,EAAE,KAAsB,EAA6B,EAAE;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACnC,MAAM,MAAM,GAAmB,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE7D,qBAAqB;IACrB,IAAI,OAAuB,CAAC;IAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,KAAK,CAAC,IAAI;gBACjB,CAAC,CAAC,2BAA2B,KAAK,CAAC,IAAI,EAAE;gBACzC,CAAC,CAAC,oBAAoB;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAG,IAAI,CAAC;IAEtB,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QAE/B,2FAA2F;QAC3F,2FAA2F;QAC3F,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,CAAC,IAAI,CACV,KAAK,KAAK,MAAM;gBACd,CAAC,CAAC,QAAQ,IAAI,6BAA6B;gBAC3C,CAAC,CAAC,QAAQ,IAAI,kFAAkF,CACnG,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,UAAU,GAAG,KAAK,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,oBAAoB,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC;YACrE,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBAClD,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,kBAAkB,GAAG,GAAG,CAAC,CAAC;gBACnD,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,UAAU,GAAG,KAAK,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,SAAS,GAAG,gBAAgB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5B,CAAC;AACJ,CAAC,CAAC;KACD,KAAK,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Importing this file registers the procedures of @procedures/server in the global registry:
3
+ * `import "@procedures/server/register"`. The package root and the `./module` entry register
4
+ * nothing (ARCHITECTURE-PROPOSALS-2026-10, P9).
5
+ */
6
+ export * from "./module.js";
7
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Importing this file registers the procedures of @procedures/server in the global registry:
3
+ * `import "@procedures/server/register"`. The package root and the `./module` entry register
4
+ * nothing (ARCHITECTURE-PROPOSALS-2026-10, P9).
5
+ */
6
+ import { registerServerProcedures } from "./module.js";
7
+ export * from "./module.js";
8
+ registerServerProcedures();
9
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,cAAc,aAAa,CAAC;AAE5B,wBAAwB,EAAE,CAAC"}
package/dist/run.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+C/C;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAAS,MAAM,EAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAclI;AAUD,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,kDAAkD;IAClD,cAAc,EAAE,OAAO,CAAC;CACzB;AAWD,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,4GAA4G;IAC5G,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C;AAED,iGAAiG;AACjG,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,EACzC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD7F"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA+C/C;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAAS,MAAM,EAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAclI;AAUD,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,kDAAkD;IAClD,cAAc,EAAE,OAAO,CAAC;CACzB;AAWD,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,4GAA4G;IAC5G,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C;AAED,iGAAiG;AACjG,wBAAsB,WAAW,CAC/B,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAkB,EACzC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoD7F"}