@procedures/peer 0.0.0-stage → 0.2.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 (135) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +21 -0
  3. package/README.md +725 -2
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/connection/index.d.ts +45 -0
  6. package/dist/connection/index.d.ts.map +1 -0
  7. package/dist/connection/index.js +148 -0
  8. package/dist/connection/index.js.map +1 -0
  9. package/dist/discovery/index.d.ts +31 -0
  10. package/dist/discovery/index.d.ts.map +1 -0
  11. package/dist/discovery/index.js +102 -0
  12. package/dist/discovery/index.js.map +1 -0
  13. package/dist/expose.d.ts +14 -0
  14. package/dist/expose.d.ts.map +1 -0
  15. package/dist/expose.js +16 -0
  16. package/dist/expose.js.map +1 -0
  17. package/dist/index.d.ts +15 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +20 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/input-schemas.d.ts +21 -0
  22. package/dist/input-schemas.d.ts.map +1 -0
  23. package/dist/input-schemas.js +80 -0
  24. package/dist/input-schemas.js.map +1 -0
  25. package/dist/lockfile.d.ts +48 -0
  26. package/dist/lockfile.d.ts.map +1 -0
  27. package/dist/lockfile.js +115 -0
  28. package/dist/lockfile.js.map +1 -0
  29. package/dist/manifest/index.d.ts +8 -0
  30. package/dist/manifest/index.d.ts.map +1 -0
  31. package/dist/manifest/index.js +8 -0
  32. package/dist/manifest/index.js.map +1 -0
  33. package/dist/manifest/json.d.ts +27 -0
  34. package/dist/manifest/json.d.ts.map +1 -0
  35. package/dist/manifest/json.js +24 -0
  36. package/dist/manifest/json.js.map +1 -0
  37. package/dist/manifest/typescript.d.ts +17 -0
  38. package/dist/manifest/typescript.d.ts.map +1 -0
  39. package/dist/manifest/typescript.js +123 -0
  40. package/dist/manifest/typescript.js.map +1 -0
  41. package/dist/module.d.ts +26 -0
  42. package/dist/module.d.ts.map +1 -0
  43. package/dist/module.js +50 -0
  44. package/dist/module.js.map +1 -0
  45. package/dist/output-schemas.d.ts +21 -0
  46. package/dist/output-schemas.d.ts.map +1 -0
  47. package/dist/output-schemas.js +85 -0
  48. package/dist/output-schemas.js.map +1 -0
  49. package/dist/peer/index.d.ts +47 -0
  50. package/dist/peer/index.d.ts.map +1 -0
  51. package/dist/peer/index.js +234 -0
  52. package/dist/peer/index.js.map +1 -0
  53. package/dist/peer/security.d.ts +25 -0
  54. package/dist/peer/security.d.ts.map +1 -0
  55. package/dist/peer/security.js +58 -0
  56. package/dist/peer/security.js.map +1 -0
  57. package/dist/procedures/index.d.ts +24 -0
  58. package/dist/procedures/index.d.ts.map +1 -0
  59. package/dist/procedures/index.js +15 -0
  60. package/dist/procedures/index.js.map +1 -0
  61. package/dist/procedures/manifest.generate.d.ts +12 -0
  62. package/dist/procedures/manifest.generate.d.ts.map +1 -0
  63. package/dist/procedures/manifest.generate.js +101 -0
  64. package/dist/procedures/manifest.generate.js.map +1 -0
  65. package/dist/procedures/server.call.d.ts +31 -0
  66. package/dist/procedures/server.call.d.ts.map +1 -0
  67. package/dist/procedures/server.call.js +62 -0
  68. package/dist/procedures/server.call.js.map +1 -0
  69. package/dist/procedures/server.connect.d.ts +12 -0
  70. package/dist/procedures/server.connect.d.ts.map +1 -0
  71. package/dist/procedures/server.connect.js +40 -0
  72. package/dist/procedures/server.connect.js.map +1 -0
  73. package/dist/procedures/server.connections.d.ts +23 -0
  74. package/dist/procedures/server.connections.d.ts.map +1 -0
  75. package/dist/procedures/server.connections.js +40 -0
  76. package/dist/procedures/server.connections.js.map +1 -0
  77. package/dist/procedures/server.create.d.ts +21 -0
  78. package/dist/procedures/server.create.d.ts.map +1 -0
  79. package/dist/procedures/server.create.js +68 -0
  80. package/dist/procedures/server.create.js.map +1 -0
  81. package/dist/procedures/server.disconnect.d.ts +12 -0
  82. package/dist/procedures/server.disconnect.d.ts.map +1 -0
  83. package/dist/procedures/server.disconnect.js +26 -0
  84. package/dist/procedures/server.disconnect.js.map +1 -0
  85. package/dist/procedures/server.start.d.ts +14 -0
  86. package/dist/procedures/server.start.d.ts.map +1 -0
  87. package/dist/procedures/server.start.js +182 -0
  88. package/dist/procedures/server.start.js.map +1 -0
  89. package/dist/procedures/server.status.d.ts +13 -0
  90. package/dist/procedures/server.status.d.ts.map +1 -0
  91. package/dist/procedures/server.status.js +118 -0
  92. package/dist/procedures/server.status.js.map +1 -0
  93. package/dist/procedures/server.stop.d.ts +12 -0
  94. package/dist/procedures/server.stop.d.ts.map +1 -0
  95. package/dist/procedures/server.stop.js +98 -0
  96. package/dist/procedures/server.stop.js.map +1 -0
  97. package/dist/register.d.ts +7 -0
  98. package/dist/register.d.ts.map +1 -0
  99. package/dist/register.js +9 -0
  100. package/dist/register.js.map +1 -0
  101. package/dist/schema.d.ts +14 -0
  102. package/dist/schema.d.ts.map +1 -0
  103. package/dist/schema.js +14 -0
  104. package/dist/schema.js.map +1 -0
  105. package/dist/types.d.ts +192 -0
  106. package/dist/types.d.ts.map +1 -0
  107. package/dist/types.js +5 -0
  108. package/dist/types.js.map +1 -0
  109. package/package.json +90 -3
  110. package/src/connection/index.ts +219 -0
  111. package/src/discovery/index.ts +140 -0
  112. package/src/expose.ts +17 -0
  113. package/src/index.ts +69 -0
  114. package/src/input-schemas.ts +121 -0
  115. package/src/lockfile.ts +129 -0
  116. package/src/manifest/index.ts +8 -0
  117. package/src/manifest/json.ts +39 -0
  118. package/src/manifest/typescript.ts +148 -0
  119. package/src/module.ts +55 -0
  120. package/src/output-schemas.ts +110 -0
  121. package/src/peer/index.ts +325 -0
  122. package/src/peer/security.ts +58 -0
  123. package/src/procedures/index.ts +32 -0
  124. package/src/procedures/manifest.generate.ts +117 -0
  125. package/src/procedures/server.call.ts +98 -0
  126. package/src/procedures/server.connect.ts +50 -0
  127. package/src/procedures/server.connections.ts +66 -0
  128. package/src/procedures/server.create.ts +88 -0
  129. package/src/procedures/server.disconnect.ts +35 -0
  130. package/src/procedures/server.start.ts +212 -0
  131. package/src/procedures/server.status.ts +141 -0
  132. package/src/procedures/server.stop.ts +123 -0
  133. package/src/register.ts +11 -0
  134. package/src/schema.ts +15 -0
  135. package/src/types.ts +257 -0
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Discovery Module
3
+ *
4
+ * Implements procedure discovery protocol for peers.
5
+ * Peers exchange procedure manifests on connection.
6
+ */
7
+ import { type Effects, type Procedure } from "@procedures/client";
8
+ import type { ProcedureInfo, ProcedureAnnounceMessage } from "../types.js";
9
+ interface DiscoveryAnnounceInput {
10
+ /** Optional peer ID of the connecting peer */
11
+ peerId?: string;
12
+ }
13
+ /**
14
+ * Internal procedure for procedure discovery
15
+ * Exposed at _discovery.announce
16
+ */
17
+ export declare const discoveryAnnounceProcedure: Procedure<DiscoveryAnnounceInput, ProcedureAnnounceMessage, {
18
+ description: string;
19
+ internal: boolean;
20
+ effects: Effects;
21
+ }>;
22
+ /**
23
+ * Get procedure info for all registered procedures
24
+ */
25
+ export declare function getProcedureInfos(): ProcedureInfo[];
26
+ /**
27
+ * Watch for procedure changes
28
+ */
29
+ export declare function watchProcedures(callback: (event: "register" | "unregister", info: ProcedureInfo) => void): () => void;
30
+ export {};
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,SAAS,EAGf,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EACV,aAAa,EACb,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAMrB,UAAU,sBAAsB;IAC9B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,SAAS,CAChD,sBAAsB,EACtB,wBAAwB,EACxB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA0CpD,CAAC;AAMX;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CAenD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,GACxE,MAAM,IAAI,CAuBZ"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Discovery Module
3
+ *
4
+ * Implements procedure discovery protocol for peers.
5
+ * Peers exchange procedure manifests on connection.
6
+ */
7
+ import { createProcedure, PROCEDURE_REGISTRY, REGISTRY_READ_EFFECTS, } from "@procedures/client";
8
+ import { schema } from "../schema.js";
9
+ // =============================================================================
10
+ // Discovery Procedure
11
+ // =============================================================================
12
+ const discoveryAnnounceInputSchema = schema();
13
+ const discoveryAnnounceOutputSchema = schema();
14
+ /**
15
+ * Internal procedure for procedure discovery
16
+ * Exposed at _discovery.announce
17
+ */
18
+ export const discoveryAnnounceProcedure = createProcedure()
19
+ .path(["_discovery", "announce"])
20
+ .input(discoveryAnnounceInputSchema)
21
+ .output(discoveryAnnounceOutputSchema)
22
+ .meta({
23
+ description: "Exchange procedure manifests for discovery",
24
+ internal: true,
25
+ effects: REGISTRY_READ_EFFECTS,
26
+ })
27
+ .handler(async (_input) => {
28
+ // Get all registered procedures
29
+ const procedures = PROCEDURE_REGISTRY.getAll();
30
+ // Convert to ProcedureInfo format
31
+ const procedureInfos = procedures
32
+ .filter((proc) => {
33
+ // Skip internal procedures in discovery
34
+ const meta = proc.metadata;
35
+ return !meta?.internal;
36
+ })
37
+ .map((proc) => {
38
+ const meta = proc.metadata;
39
+ const info = {
40
+ path: proc.path,
41
+ };
42
+ if (meta?.description !== undefined) {
43
+ info.description = meta.description;
44
+ }
45
+ // TODO: Generate JSON schema from input/output schemas
46
+ return info;
47
+ });
48
+ // Generate a peer ID based on process (could be configured)
49
+ const peerId = `peer-${process.pid}-${Date.now().toString(36)}`;
50
+ return {
51
+ type: "procedure-announce",
52
+ peerId,
53
+ procedures: procedureInfos,
54
+ };
55
+ })
56
+ .build();
57
+ // =============================================================================
58
+ // Utility Functions
59
+ // =============================================================================
60
+ /**
61
+ * Get procedure info for all registered procedures
62
+ */
63
+ export function getProcedureInfos() {
64
+ const procedures = PROCEDURE_REGISTRY.getAll();
65
+ return procedures
66
+ .filter((proc) => proc.handler !== undefined)
67
+ .map((proc) => {
68
+ const meta = proc.metadata;
69
+ const info = {
70
+ path: proc.path,
71
+ };
72
+ if (meta?.description !== undefined) {
73
+ info.description = meta.description;
74
+ }
75
+ return info;
76
+ });
77
+ }
78
+ /**
79
+ * Watch for procedure changes
80
+ */
81
+ export function watchProcedures(callback) {
82
+ const createHandler = (eventType) => {
83
+ return (proc) => {
84
+ const info = {
85
+ path: proc.path,
86
+ };
87
+ if (proc.metadata?.description !== undefined) {
88
+ info.description = proc.metadata.description;
89
+ }
90
+ callback(eventType, info);
91
+ };
92
+ };
93
+ const registerHandler = createHandler("register");
94
+ const unregisterHandler = createHandler("unregister");
95
+ PROCEDURE_REGISTRY.on("register", registerHandler);
96
+ PROCEDURE_REGISTRY.on("unregister", unregisterHandler);
97
+ return () => {
98
+ PROCEDURE_REGISTRY.off("register", registerHandler);
99
+ PROCEDURE_REGISTRY.off("unregister", unregisterHandler);
100
+ };
101
+ }
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The expose rule of a server, from a list of patterns.
3
+ *
4
+ * A pattern is an exact procedure key (`git.status`), a prefix with `.*` (`git.*`: every
5
+ * procedure under `git`, at any depth), or `*` (every procedure). A server without a list
6
+ * serves every procedure of its registry.
7
+ *
8
+ * The rule is `exposePatterns()` of the core host policy (roadmap 2.3); this name stays for the
9
+ * callers of `client-server`.
10
+ */
11
+ import { type ProcedurePath } from "@procedures/client";
12
+ /** This function gives the rule of `ProcedureServer` for a list of patterns. */
13
+ export declare function exposeRule(patterns: readonly string[]): (path: ProcedurePath) => boolean;
14
+ //# sourceMappingURL=expose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expose.d.ts","sourceRoot":"","sources":["../src/expose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAExF"}
package/dist/expose.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The expose rule of a server, from a list of patterns.
3
+ *
4
+ * A pattern is an exact procedure key (`git.status`), a prefix with `.*` (`git.*`: every
5
+ * procedure under `git`, at any depth), or `*` (every procedure). A server without a list
6
+ * serves every procedure of its registry.
7
+ *
8
+ * The rule is `exposePatterns()` of the core host policy (roadmap 2.3); this name stays for the
9
+ * callers of `client-server`.
10
+ */
11
+ import { exposePatterns } from "@procedures/client";
12
+ /** This function gives the rule of `ProcedureServer` for a list of patterns. */
13
+ export function exposeRule(patterns) {
14
+ return exposePatterns(patterns);
15
+ }
16
+ //# sourceMappingURL=expose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expose.js","sourceRoot":"","sources":["../src/expose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAsB,MAAM,oBAAoB,CAAC;AAExE,gFAAgF;AAChF,MAAM,UAAU,UAAU,CAAC,QAA2B;IACpD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Client Server
3
+ *
4
+ * Transport-agnostic peer for bidirectional RPC.
5
+ * Exposes procedures and generates manifests.
6
+ */
7
+ export type { TransportType, TransportConfig, HttpTransportConfig, WebSocketTransportConfig, LocalTransportConfig, ServerCreateInput, ServerCreateOutput, ServerConnectInput, ServerConnectOutput, ServerDisconnectInput, ServerDisconnectOutput, ManifestGenerateInput, ManifestGenerateOutput, ProcedureInfo, PeerConnection, ProcedureAnnounceMessage, ProcedureUpdateMessage, } from "./types.js";
8
+ export { createPeer, type Peer, type PeerOptions, type PeerEndpoint } from "./peer/index.js";
9
+ export { exposeRule } from "./expose.js";
10
+ export { serverCreateProcedure, getPeer, getActivePeerIds, serverConnectProcedure, serverDisconnectProcedure, manifestGenerateProcedure, } from "./procedures/index.js";
11
+ export { generateTypeScript, generateJson, generateJsonString, type ProcedureManifest, } from "./manifest/index.js";
12
+ export { connect, disconnect, getConnection, getConnectionIds, type Connection, type ConnectOptions, } from "./connection/index.js";
13
+ export { discoveryAnnounceProcedure, getProcedureInfos, watchProcedures, } from "./discovery/index.js";
14
+ export { procedures, registerServerProcedures } from "./module.js";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,OAAO,EACP,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Client Server
3
+ *
4
+ * Transport-agnostic peer for bidirectional RPC.
5
+ * Exposes procedures and generates manifests.
6
+ */
7
+ // Peer
8
+ export { createPeer } from "./peer/index.js";
9
+ export { exposeRule } from "./expose.js";
10
+ // Procedures
11
+ export { serverCreateProcedure, getPeer, getActivePeerIds, serverConnectProcedure, serverDisconnectProcedure, manifestGenerateProcedure, } from "./procedures/index.js";
12
+ // Manifest generation
13
+ export { generateTypeScript, generateJson, generateJsonString, } from "./manifest/index.js";
14
+ // Connection
15
+ export { connect, disconnect, getConnection, getConnectionIds, } from "./connection/index.js";
16
+ // Discovery
17
+ export { discoveryAnnounceProcedure, getProcedureInfos, watchProcedures, } from "./discovery/index.js";
18
+ // Registration
19
+ export { procedures, registerServerProcedures } from "./module.js";
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,OAAO;AACP,OAAO,EAAE,UAAU,EAAkD,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,aAAa;AACb,OAAO,EACL,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EAChB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,sBAAsB;AACtB,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAE7B,aAAa;AACb,OAAO,EACL,OAAO,EACP,UAAU,EACV,aAAa,EACb,gBAAgB,GAGjB,MAAM,uBAAuB,CAAC;AAE/B,YAAY;AACZ,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,eAAe;AACf,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Input schemas of the `server.*` and `manifest.*` procedures.
3
+ *
4
+ * Before, these procedures used pass-through schemas: `mark server start --help` listed no
5
+ * options, and a port such as "abc" reached the handler. Each schema now validates its input,
6
+ * and the CLI help shows the fields.
7
+ */
8
+ import { type ZodLikeSchema } from "@procedures/client";
9
+ import type { ManifestGenerateInput, ServerConnectInput, ServerCreateInput, ServerDisconnectInput, ServerStartInput, ServerStatusInput, ServerStopInput } from "./types.js";
10
+ import type { ServerCallInput } from "./procedures/server.call.js";
11
+ import type { ServerConnectionsInput } from "./procedures/server.connections.js";
12
+ export declare const serverCreateInputSchema: ZodLikeSchema<ServerCreateInput>;
13
+ export declare const serverStartInputSchema: ZodLikeSchema<ServerStartInput>;
14
+ export declare const serverStopInputSchema: ZodLikeSchema<ServerStopInput>;
15
+ export declare const serverStatusInputSchema: ZodLikeSchema<ServerStatusInput>;
16
+ export declare const serverConnectInputSchema: ZodLikeSchema<ServerConnectInput>;
17
+ export declare const serverDisconnectInputSchema: ZodLikeSchema<ServerDisconnectInput>;
18
+ export declare const serverCallInputSchema: ZodLikeSchema<ServerCallInput>;
19
+ export declare const serverConnectionsInputSchema: ZodLikeSchema<ServerConnectionsInput>;
20
+ export declare const manifestGenerateInputSchema: ZodLikeSchema<ManifestGenerateInput>;
21
+ //# sourceMappingURL=input-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-schemas.d.ts","sourceRoot":"","sources":["../src/input-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AA0BjF,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,iBAAiB,CAapE,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,gBAAgB,CAMlE,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,eAAe,CAKhE,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,aAAa,CAAC,iBAAiB,CAIpE,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,aAAa,CAAC,kBAAkB,CAMtE,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC,qBAAqB,CAI5E,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,eAAe,CAahE,CAAC;AAEF,eAAO,MAAM,4BAA4B,EAAE,aAAa,CAAC,sBAAsB,CAC7B,CAAC;AAEnD,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC,qBAAqB,CAM5E,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Input schemas of the `server.*` and `manifest.*` procedures.
3
+ *
4
+ * Before, these procedures used pass-through schemas: `mark server start --help` listed no
5
+ * options, and a port such as "abc" reached the handler. Each schema now validates its input,
6
+ * and the CLI help shows the fields.
7
+ */
8
+ import { z } from "zod";
9
+ import { zodAdapter } from "@procedures/client";
10
+ const port = z.number().int().min(1).max(65535);
11
+ const httpTransport = z.object({
12
+ type: z.literal("http"),
13
+ port: port.optional(),
14
+ host: z.string().min(1).optional(),
15
+ basePath: z.string().optional(),
16
+ cors: z.boolean().optional(),
17
+ corsOrigins: z.array(z.string()).optional(),
18
+ urlStrategy: z.enum(["rest", "rpc"]).optional(),
19
+ token: z.string().min(1).optional(),
20
+ });
21
+ const webSocketTransport = z.object({
22
+ type: z.literal("websocket"),
23
+ port: port.optional(),
24
+ host: z.string().min(1).optional(),
25
+ path: z.string().optional(),
26
+ origins: z.array(z.string()).optional(),
27
+ token: z.string().min(1).optional(),
28
+ });
29
+ const localTransport = z.object({ type: z.literal("local") });
30
+ export const serverCreateInputSchema = zodAdapter(z.object({
31
+ transports: z
32
+ .array(z.discriminatedUnion("type", [httpTransport, webSocketTransport, localTransport]))
33
+ .optional()
34
+ .describe("The transports to start (default: HTTP on port 3000)"),
35
+ autoRegister: z.boolean().optional().describe("Serve every procedure of the registry (default: true)"),
36
+ token: z.string().min(1).optional().describe("A secret that every request must send"),
37
+ expose: z
38
+ .array(z.string().min(1))
39
+ .optional()
40
+ .describe("The procedures to serve: exact keys (git.status) or prefixes (git.*). Default: every procedure"),
41
+ }));
42
+ export const serverStartInputSchema = zodAdapter(z.object({
43
+ port: port.optional().describe("The port to listen on (default: 3000)"),
44
+ host: z.string().min(1).optional().describe("The host to bind to (default: 127.0.0.1)"),
45
+ transport: z.enum(["http", "websocket", "both"]).optional().describe("The transport (default: http)"),
46
+ }));
47
+ export const serverStopInputSchema = zodAdapter(z.object({
48
+ port: port.optional().describe("The port of the server to stop (default: all servers)"),
49
+ force: z.boolean().optional().describe("Stop with SIGKILL instead of SIGTERM"),
50
+ }));
51
+ export const serverStatusInputSchema = zodAdapter(z.object({
52
+ port: port.optional().describe("The port of the server (default: all servers)"),
53
+ }));
54
+ export const serverConnectInputSchema = zodAdapter(z.object({
55
+ address: z.string().min(1).describe("The address of the remote peer"),
56
+ transport: z.enum(["http", "websocket", "local"]).optional().describe("The transport to use"),
57
+ timeout: z.number().int().positive().optional().describe("The connection timeout in milliseconds"),
58
+ }));
59
+ export const serverDisconnectInputSchema = zodAdapter(z.object({
60
+ connectionId: z.string().min(1).describe("The connection id from server connect"),
61
+ }));
62
+ export const serverCallInputSchema = zodAdapter(z
63
+ .object({
64
+ connectionId: z.string().min(1).optional().describe("The connection id from server connect"),
65
+ address: z.string().min(1).optional().describe("The address of a peer, for a one-time connection"),
66
+ path: z
67
+ .union([z.string().min(1), z.array(z.string().min(1)).min(1)])
68
+ .describe("The procedure path on the peer: dot-separated text or a list"),
69
+ input: z.unknown().optional().describe("The input of the remote procedure"),
70
+ })
71
+ .refine((input) => input.connectionId !== undefined || input.address !== undefined, {
72
+ message: "Give connectionId or address",
73
+ }));
74
+ export const serverConnectionsInputSchema = zodAdapter(z.object({}));
75
+ export const manifestGenerateInputSchema = zodAdapter(z.object({
76
+ formats: z.array(z.enum(["json", "typescript"])).optional().describe("The manifest formats (default: json)"),
77
+ namespace: z.array(z.string()).optional().describe("Only the procedures under this path"),
78
+ outputDir: z.string().optional().describe("The folder for the manifest files"),
79
+ }));
80
+ //# sourceMappingURL=input-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-schemas.js","sourceRoot":"","sources":["../src/input-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAsB,MAAM,oBAAoB,CAAC;AAapE,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEhD,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,uBAAuB,GAAqC,UAAU,CACjF,CAAC,CAAC,MAAM,CAAC;IACP,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;SACxF,QAAQ,EAAE;SACV,QAAQ,CAAC,sDAAsD,CAAC;IACnE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACtG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACrF,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CAAC,gGAAgG,CAAC;CAC9G,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAoC,UAAU,CAC/E,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACvE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;IACvF,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CACtG,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAmC,UAAU,CAC7E,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACvF,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CAC/E,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAqC,UAAU,CACjF,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CAChF,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAsC,UAAU,CACnF,CAAC,CAAC,MAAM,CAAC;IACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IACrE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;CACnG,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAyC,UAAU,CACzF,CAAC,CAAC,MAAM,CAAC;IACP,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CAClF,CAAC,CACH,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAmC,UAAU,CAC7E,CAAC;KACE,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IAC5F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAClG,IAAI,EAAE,CAAC;SACJ,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7D,QAAQ,CAAC,8DAA8D,CAAC;IAC3E,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC5E,CAAC;KACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE;IAClF,OAAO,EAAE,8BAA8B;CACxC,CAAC,CACL,CAAC;AAEF,MAAM,CAAC,MAAM,4BAA4B,GACvC,UAAU,CAAyB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnD,MAAM,CAAC,MAAM,2BAA2B,GAAyC,UAAU,CACzF,CAAC,CAAC,MAAM,CAAC;IACP,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC5G,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IACzF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC/E,CAAC,CACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * The lockfiles of the CLI servers: one module for `mark` and the `server.*` procedures.
3
+ *
4
+ * `mark --server` writes `~/.mark/servers/<port>.lock` with its token, the folder it runs in,
5
+ * the build of `mark` and its peer id. Before, five copies of this logic had drifted, and a
6
+ * server counted as alive when its PID existed: Windows reuses PIDs, so a stale lockfile broke
7
+ * every `mark` command and `server stop` killed an unrelated process (deep dive CLI-4). Now a
8
+ * server is alive only when its health endpoint answers with the peer id of its lockfile.
9
+ */
10
+ export interface LockfileData {
11
+ pid: number;
12
+ port: number;
13
+ transport: string;
14
+ endpoint: string;
15
+ startedAt: string;
16
+ /** The secret that every request must send (`Authorization: Bearer <token>`). An older lockfile has none. */
17
+ token?: string;
18
+ /** The folder the server runs in: relative paths and default `cwd` values resolve there */
19
+ cwd?: string;
20
+ /** The build of `mark` that runs the server */
21
+ build?: string;
22
+ /** The peer id that the server's health endpoint answers */
23
+ peerId?: string;
24
+ }
25
+ export declare function getMarkDir(): string;
26
+ export declare function getServersDir(): string;
27
+ /** This function writes a lockfile that only its user can read (it holds the token). */
28
+ export declare function writeLockfile(data: LockfileData): void;
29
+ export declare function readLockfileForPort(port: number): LockfileData | null;
30
+ export declare function readAllLockfiles(): LockfileData[];
31
+ export declare function removeLockfileForPort(port: number): void;
32
+ /**
33
+ * The state of a lockfile's server:
34
+ * - "alive": the health endpoint answers with the lockfile's peer id;
35
+ * - "dead": nothing answers (the lockfile is stale);
36
+ * - "other": something else answers on the port (another server, or a lockfile without a peer id).
37
+ */
38
+ export declare function checkServer(lockfile: LockfileData, timeoutMs?: number): Promise<"alive" | "dead" | "other">;
39
+ /**
40
+ * The lockfile of a running server that this caller can use: it has a token, it runs in `cwd`
41
+ * with the build `build`, and it answers as the peer of its lockfile. A dead server's lockfile
42
+ * is removed.
43
+ */
44
+ export declare function findServer(match: {
45
+ cwd: string;
46
+ build: string;
47
+ }): Promise<LockfileData | null>;
48
+ //# sourceMappingURL=lockfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../src/lockfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,6GAA6G;IAC7G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAMD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAGtD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMrE;AAED,wBAAgB,gBAAgB,IAAI,YAAY,EAAE,CAiBjD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAYxD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,CAa/G;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAQpG"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The lockfiles of the CLI servers: one module for `mark` and the `server.*` procedures.
3
+ *
4
+ * `mark --server` writes `~/.mark/servers/<port>.lock` with its token, the folder it runs in,
5
+ * the build of `mark` and its peer id. Before, five copies of this logic had drifted, and a
6
+ * server counted as alive when its PID existed: Windows reuses PIDs, so a stale lockfile broke
7
+ * every `mark` command and `server stop` killed an unrelated process (deep dive CLI-4). Now a
8
+ * server is alive only when its health endpoint answers with the peer id of its lockfile.
9
+ */
10
+ import * as fs from "node:fs";
11
+ import * as os from "node:os";
12
+ import * as path from "node:path";
13
+ const MARK_DIR = path.join(os.homedir(), ".mark");
14
+ const SERVERS_DIR = path.join(MARK_DIR, "servers");
15
+ // The single lockfile of older versions: it is read only to remove it
16
+ const LEGACY_LOCKFILE_PATH = path.join(MARK_DIR, "server.lock");
17
+ export function getMarkDir() {
18
+ return MARK_DIR;
19
+ }
20
+ export function getServersDir() {
21
+ return SERVERS_DIR;
22
+ }
23
+ function lockfilePath(port) {
24
+ return path.join(SERVERS_DIR, `${port}.lock`);
25
+ }
26
+ /** This function writes a lockfile that only its user can read (it holds the token). */
27
+ export function writeLockfile(data) {
28
+ fs.mkdirSync(SERVERS_DIR, { recursive: true });
29
+ fs.writeFileSync(lockfilePath(data.port), JSON.stringify(data, null, 2), { mode: 0o600 });
30
+ }
31
+ export function readLockfileForPort(port) {
32
+ try {
33
+ return JSON.parse(fs.readFileSync(lockfilePath(port), "utf-8"));
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ export function readAllLockfiles() {
40
+ const results = [];
41
+ let files = [];
42
+ try {
43
+ files = fs.readdirSync(SERVERS_DIR);
44
+ }
45
+ catch {
46
+ return results; // The folder does not exist yet
47
+ }
48
+ for (const file of files) {
49
+ if (!file.endsWith(".lock"))
50
+ continue;
51
+ try {
52
+ results.push(JSON.parse(fs.readFileSync(path.join(SERVERS_DIR, file), "utf-8")));
53
+ }
54
+ catch {
55
+ // Skip a corrupt lockfile
56
+ }
57
+ }
58
+ return results;
59
+ }
60
+ export function removeLockfileForPort(port) {
61
+ try {
62
+ fs.unlinkSync(lockfilePath(port));
63
+ }
64
+ catch {
65
+ // Already gone
66
+ }
67
+ try {
68
+ const legacy = JSON.parse(fs.readFileSync(LEGACY_LOCKFILE_PATH, "utf-8"));
69
+ if (legacy.port === port)
70
+ fs.unlinkSync(LEGACY_LOCKFILE_PATH);
71
+ }
72
+ catch {
73
+ // No legacy lockfile
74
+ }
75
+ }
76
+ /**
77
+ * The state of a lockfile's server:
78
+ * - "alive": the health endpoint answers with the lockfile's peer id;
79
+ * - "dead": nothing answers (the lockfile is stale);
80
+ * - "other": something else answers on the port (another server, or a lockfile without a peer id).
81
+ */
82
+ export async function checkServer(lockfile, timeoutMs = 1000) {
83
+ let response;
84
+ try {
85
+ response = await fetch(`${lockfile.endpoint}/health`, { signal: AbortSignal.timeout(timeoutMs) });
86
+ }
87
+ catch {
88
+ return "dead";
89
+ }
90
+ try {
91
+ const health = (await response.json());
92
+ return lockfile.peerId !== undefined && health.peerId === lockfile.peerId ? "alive" : "other";
93
+ }
94
+ catch {
95
+ return "other";
96
+ }
97
+ }
98
+ /**
99
+ * The lockfile of a running server that this caller can use: it has a token, it runs in `cwd`
100
+ * with the build `build`, and it answers as the peer of its lockfile. A dead server's lockfile
101
+ * is removed.
102
+ */
103
+ export async function findServer(match) {
104
+ for (const lockfile of readAllLockfiles()) {
105
+ if (!lockfile.token || lockfile.cwd !== match.cwd || lockfile.build !== match.build)
106
+ continue;
107
+ const state = await checkServer(lockfile);
108
+ if (state === "alive")
109
+ return lockfile;
110
+ if (state === "dead")
111
+ removeLockfileForPort(lockfile.port);
112
+ }
113
+ return null;
114
+ }
115
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../src/lockfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Manifest Generation Module
3
+ *
4
+ * Generates procedure manifests in various formats.
5
+ */
6
+ export { generateTypeScript } from "./typescript.js";
7
+ export { generateJson, generateJsonString, type ProcedureManifest } from "./json.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Manifest Generation Module
3
+ *
4
+ * Generates procedure manifests in various formats.
5
+ */
6
+ export { generateTypeScript } from "./typescript.js";
7
+ export { generateJson, generateJsonString } from "./json.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/manifest/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAA0B,MAAM,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * JSON Manifest Generator
3
+ *
4
+ * Generates JSON manifests from procedure definitions
5
+ * for runtime discovery and visualization.
6
+ */
7
+ import type { ProcedureInfo } from "../types.js";
8
+ /**
9
+ * JSON manifest structure
10
+ */
11
+ export interface ProcedureManifest {
12
+ /** Manifest version */
13
+ version: string;
14
+ /** Generation timestamp */
15
+ generatedAt: string;
16
+ /** All procedures */
17
+ procedures: ProcedureInfo[];
18
+ }
19
+ /**
20
+ * Generate JSON manifest
21
+ */
22
+ export declare function generateJson(procedures: ProcedureInfo[]): ProcedureManifest;
23
+ /**
24
+ * Generate JSON string (formatted)
25
+ */
26
+ export declare function generateJsonString(procedures: ProcedureInfo[]): string;
27
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/manifest/json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,iBAAiB,CAM3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAGtE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * JSON Manifest Generator
3
+ *
4
+ * Generates JSON manifests from procedure definitions
5
+ * for runtime discovery and visualization.
6
+ */
7
+ /**
8
+ * Generate JSON manifest
9
+ */
10
+ export function generateJson(procedures) {
11
+ return {
12
+ version: "1.0.0",
13
+ generatedAt: new Date().toISOString(),
14
+ procedures,
15
+ };
16
+ }
17
+ /**
18
+ * Generate JSON string (formatted)
19
+ */
20
+ export function generateJsonString(procedures) {
21
+ const manifest = generateJson(procedures);
22
+ return JSON.stringify(manifest, null, 2);
23
+ }
24
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/manifest/json.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAA2B;IACtD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA2B;IAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * TypeScript Declaration Generator
3
+ *
4
+ * Generates .d.ts files from procedure definitions
5
+ * for static type checking on clients.
6
+ */
7
+ import type { ProcedureInfo } from "../types.js";
8
+ /**
9
+ * Generate TypeScript declaration file content
10
+ */
11
+ export declare function generateTypeScript(procedures: ProcedureInfo[]): string;
12
+ /**
13
+ * The TypeScript type of a JSON Schema: objects, arrays, records, enums, constants and unions.
14
+ * A schema that it cannot read is `unknown`.
15
+ */
16
+ export declare function jsonSchemaToTs(schema: unknown, indent?: string): string;
17
+ //# sourceMappingURL=typescript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../../src/manifest/typescript.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,CAoDtE;AAqBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,SAAK,GAAG,MAAM,CAwCnE"}