@essentialai/cogent-bridge 1.0.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 (156) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +311 -0
  3. package/dist/backend/backend-provider.d.ts +28 -0
  4. package/dist/backend/backend-provider.d.ts.map +1 -0
  5. package/dist/backend/backend-provider.js +60 -0
  6. package/dist/backend/backend-provider.js.map +1 -0
  7. package/dist/backend/file-backend.d.ts +22 -0
  8. package/dist/backend/file-backend.d.ts.map +1 -0
  9. package/dist/backend/file-backend.js +46 -0
  10. package/dist/backend/file-backend.js.map +1 -0
  11. package/dist/backend/http-backend.d.ts +94 -0
  12. package/dist/backend/http-backend.d.ts.map +1 -0
  13. package/dist/backend/http-backend.js +185 -0
  14. package/dist/backend/http-backend.js.map +1 -0
  15. package/dist/backend/index.d.ts +5 -0
  16. package/dist/backend/index.d.ts.map +1 -0
  17. package/dist/backend/index.js +4 -0
  18. package/dist/backend/index.js.map +1 -0
  19. package/dist/backend/storage-backend.d.ts +22 -0
  20. package/dist/backend/storage-backend.d.ts.map +1 -0
  21. package/dist/backend/storage-backend.js +2 -0
  22. package/dist/backend/storage-backend.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +18 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/cloud/backoff.d.ts +19 -0
  28. package/dist/cloud/backoff.d.ts.map +1 -0
  29. package/dist/cloud/backoff.js +32 -0
  30. package/dist/cloud/backoff.js.map +1 -0
  31. package/dist/cloud/credential-store.d.ts +29 -0
  32. package/dist/cloud/credential-store.d.ts.map +1 -0
  33. package/dist/cloud/credential-store.js +38 -0
  34. package/dist/cloud/credential-store.js.map +1 -0
  35. package/dist/cloud/http-client.d.ts +36 -0
  36. package/dist/cloud/http-client.d.ts.map +1 -0
  37. package/dist/cloud/http-client.js +94 -0
  38. package/dist/cloud/http-client.js.map +1 -0
  39. package/dist/cloud/index.d.ts +10 -0
  40. package/dist/cloud/index.d.ts.map +1 -0
  41. package/dist/cloud/index.js +7 -0
  42. package/dist/cloud/index.js.map +1 -0
  43. package/dist/cloud/message-inbox.d.ts +49 -0
  44. package/dist/cloud/message-inbox.d.ts.map +1 -0
  45. package/dist/cloud/message-inbox.js +109 -0
  46. package/dist/cloud/message-inbox.js.map +1 -0
  47. package/dist/cloud/ws-client.d.ts +112 -0
  48. package/dist/cloud/ws-client.d.ts.map +1 -0
  49. package/dist/cloud/ws-client.js +241 -0
  50. package/dist/cloud/ws-client.js.map +1 -0
  51. package/dist/cloud/ws-frames.d.ts +66 -0
  52. package/dist/cloud/ws-frames.d.ts.map +1 -0
  53. package/dist/cloud/ws-frames.js +19 -0
  54. package/dist/cloud/ws-frames.js.map +1 -0
  55. package/dist/config.d.ts +40 -0
  56. package/dist/config.d.ts.map +1 -0
  57. package/dist/config.js +39 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/constants.d.ts +3 -0
  60. package/dist/constants.d.ts.map +1 -0
  61. package/dist/constants.js +6 -0
  62. package/dist/constants.js.map +1 -0
  63. package/dist/e2e/helpers.d.ts +101 -0
  64. package/dist/e2e/helpers.d.ts.map +1 -0
  65. package/dist/e2e/helpers.js +228 -0
  66. package/dist/e2e/helpers.js.map +1 -0
  67. package/dist/errors.d.ts +40 -0
  68. package/dist/errors.d.ts.map +1 -0
  69. package/dist/errors.js +53 -0
  70. package/dist/errors.js.map +1 -0
  71. package/dist/index.d.ts +2 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +108 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/logger.d.ts +22 -0
  76. package/dist/logger.d.ts.map +1 -0
  77. package/dist/logger.js +79 -0
  78. package/dist/logger.js.map +1 -0
  79. package/dist/services/cc-cli.d.ts +8 -0
  80. package/dist/services/cc-cli.d.ts.map +1 -0
  81. package/dist/services/cc-cli.js +104 -0
  82. package/dist/services/cc-cli.js.map +1 -0
  83. package/dist/services/health-check.d.ts +33 -0
  84. package/dist/services/health-check.d.ts.map +1 -0
  85. package/dist/services/health-check.js +96 -0
  86. package/dist/services/health-check.js.map +1 -0
  87. package/dist/services/peer-registry.d.ts +9 -0
  88. package/dist/services/peer-registry.d.ts.map +1 -0
  89. package/dist/services/peer-registry.js +207 -0
  90. package/dist/services/peer-registry.js.map +1 -0
  91. package/dist/startup.d.ts +18 -0
  92. package/dist/startup.d.ts.map +1 -0
  93. package/dist/startup.js +270 -0
  94. package/dist/startup.js.map +1 -0
  95. package/dist/tools/create-session.d.ts +12 -0
  96. package/dist/tools/create-session.d.ts.map +1 -0
  97. package/dist/tools/create-session.js +113 -0
  98. package/dist/tools/create-session.js.map +1 -0
  99. package/dist/tools/deregister-peer.d.ts +3 -0
  100. package/dist/tools/deregister-peer.d.ts.map +1 -0
  101. package/dist/tools/deregister-peer.js +38 -0
  102. package/dist/tools/deregister-peer.js.map +1 -0
  103. package/dist/tools/get-history.d.ts +3 -0
  104. package/dist/tools/get-history.d.ts.map +1 -0
  105. package/dist/tools/get-history.js +40 -0
  106. package/dist/tools/get-history.js.map +1 -0
  107. package/dist/tools/health-check.d.ts +3 -0
  108. package/dist/tools/health-check.d.ts.map +1 -0
  109. package/dist/tools/health-check.js +28 -0
  110. package/dist/tools/health-check.js.map +1 -0
  111. package/dist/tools/join-session.d.ts +12 -0
  112. package/dist/tools/join-session.d.ts.map +1 -0
  113. package/dist/tools/join-session.js +90 -0
  114. package/dist/tools/join-session.js.map +1 -0
  115. package/dist/tools/list-peers.d.ts +3 -0
  116. package/dist/tools/list-peers.d.ts.map +1 -0
  117. package/dist/tools/list-peers.js +36 -0
  118. package/dist/tools/list-peers.js.map +1 -0
  119. package/dist/tools/register-peer.d.ts +3 -0
  120. package/dist/tools/register-peer.d.ts.map +1 -0
  121. package/dist/tools/register-peer.js +155 -0
  122. package/dist/tools/register-peer.js.map +1 -0
  123. package/dist/tools/send-message.d.ts +3 -0
  124. package/dist/tools/send-message.d.ts.map +1 -0
  125. package/dist/tools/send-message.js +121 -0
  126. package/dist/tools/send-message.js.map +1 -0
  127. package/dist/types.d.ts +31 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/wizard/detect.d.ts +4 -0
  132. package/dist/wizard/detect.d.ts.map +1 -0
  133. package/dist/wizard/detect.js +21 -0
  134. package/dist/wizard/detect.js.map +1 -0
  135. package/dist/wizard/index.d.ts +5 -0
  136. package/dist/wizard/index.d.ts.map +1 -0
  137. package/dist/wizard/index.js +140 -0
  138. package/dist/wizard/index.js.map +1 -0
  139. package/dist/wizard/prompts.d.ts +18 -0
  140. package/dist/wizard/prompts.d.ts.map +1 -0
  141. package/dist/wizard/prompts.js +66 -0
  142. package/dist/wizard/prompts.js.map +1 -0
  143. package/dist/wizard/scaffold-demo.d.ts +6 -0
  144. package/dist/wizard/scaffold-demo.d.ts.map +1 -0
  145. package/dist/wizard/scaffold-demo.js +37 -0
  146. package/dist/wizard/scaffold-demo.js.map +1 -0
  147. package/dist/wizard/scaffold-real.d.ts +16 -0
  148. package/dist/wizard/scaffold-real.d.ts.map +1 -0
  149. package/dist/wizard/scaffold-real.js +64 -0
  150. package/dist/wizard/scaffold-real.js.map +1 -0
  151. package/dist/wizard/templates.d.ts +9 -0
  152. package/dist/wizard/templates.d.ts.map +1 -0
  153. package/dist/wizard/templates.js +182 -0
  154. package/dist/wizard/templates.js.map +1 -0
  155. package/package.json +71 -0
  156. package/server.json +60 -0
@@ -0,0 +1,90 @@
1
+ import { z } from "zod";
2
+ import { getConfig } from "../config.js";
3
+ import { successResult, errorResult } from "../errors.js";
4
+ import { saveCredentials } from "../cloud/credential-store.js";
5
+ import { logger } from "../logger.js";
6
+ /**
7
+ * Register the cogent_join_session MCP tool.
8
+ *
9
+ * Joins an existing cloud bridge session using a session ID and shared secret.
10
+ * Only available when COGENT_ENDPOINT is configured.
11
+ * After joining, persists credentials locally and reinitializes
12
+ * the cloud backend so runtime HttpClient and CloudWsClient use
13
+ * the new token/sessionId.
14
+ */
15
+ export function registerJoinSessionTool(server) {
16
+ server.registerTool("cogent_join_session", {
17
+ title: "Join Cloud Session",
18
+ description: "Join an existing cloud bridge session using a session ID and shared secret. " +
19
+ "Returns a bearer token for subsequent operations.",
20
+ inputSchema: {
21
+ sessionId: z
22
+ .string()
23
+ .describe("The session ID to join"),
24
+ secret: z
25
+ .string()
26
+ .min(1)
27
+ .describe("The shared secret for the session"),
28
+ },
29
+ annotations: {
30
+ readOnlyHint: false,
31
+ destructiveHint: false,
32
+ idempotentHint: true,
33
+ openWorldHint: true,
34
+ },
35
+ }, async ({ sessionId, secret }) => {
36
+ try {
37
+ const config = getConfig();
38
+ if (!config.COGENT_ENDPOINT) {
39
+ return errorResult(new Error("COGENT_ENDPOINT not configured. Set it to use cloud mode."));
40
+ }
41
+ // POST to join session (unauthenticated endpoint)
42
+ const joinPath = `/api/sessions/${encodeURIComponent(sessionId)}/join`;
43
+ const resp = await fetch(`${config.COGENT_ENDPOINT}${joinPath}`, {
44
+ method: "POST",
45
+ headers: { "Content-Type": "application/json" },
46
+ body: JSON.stringify({ secret }),
47
+ });
48
+ if (!resp.ok) {
49
+ const body = await resp.text().catch(() => "");
50
+ return errorResult(new Error(`Failed to join session: HTTP ${resp.status}${body ? ` - ${body}` : ""}`));
51
+ }
52
+ const data = (await resp.json());
53
+ // Persist credentials locally
54
+ await saveCredentials({
55
+ endpoint: config.COGENT_ENDPOINT,
56
+ sessionId: data.sessionId,
57
+ token: data.token,
58
+ savedAt: new Date().toISOString(),
59
+ });
60
+ // Reinitialize cloud backend with new credentials.
61
+ // Uses dynamic import to avoid compile-time dependency on startup.ts
62
+ // (reinitCloudBackend is added in Plan 05). Cast to Record to avoid
63
+ // TS2339 since the export doesn't exist yet.
64
+ try {
65
+ const startupModule = (await import("../startup.js"));
66
+ if (typeof startupModule.reinitCloudBackend === "function") {
67
+ await startupModule.reinitCloudBackend(config.COGENT_ENDPOINT, data.sessionId, data.token);
68
+ logger.info("Cloud backend reinitialized after joining session");
69
+ }
70
+ }
71
+ catch (err) {
72
+ // reinitCloudBackend may not exist yet (Plan 05 adds it).
73
+ // Credentials are persisted, so a restart will pick them up.
74
+ logger.debug(`Backend reinit not available: ${err}`);
75
+ }
76
+ return successResult({
77
+ success: true,
78
+ sessionId: data.sessionId,
79
+ token: data.token,
80
+ peerCount: data.peerCount,
81
+ note: "Successfully joined session. Credentials saved locally. Cloud backend updated. You can now use cogent_register_peer.",
82
+ });
83
+ }
84
+ catch (err) {
85
+ logger.error("join-session failed", { error: err });
86
+ return errorResult(err);
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=join-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-session.js","sourceRoot":"","sources":["../../src/tools/join-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerListPeersTool(server: McpServer): void;
3
+ //# sourceMappingURL=list-peers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-peers.d.ts","sourceRoot":"","sources":["../../src/tools/list-peers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkC7D"}
@@ -0,0 +1,36 @@
1
+ import { getBackend } from "../backend/index.js";
2
+ import { getConfig } from "../config.js";
3
+ import { successResult, errorResult } from "../errors.js";
4
+ import { logger } from "../logger.js";
5
+ export function registerListPeersTool(server) {
6
+ server.registerTool("cogent_list_peers", {
7
+ title: "List Peers",
8
+ description: "List all currently registered Claude Code peers on the bridge. " +
9
+ "Returns peer IDs, session IDs, working directories, labels, and flags peers " +
10
+ "as potentially stale if idle beyond the configured timeout.",
11
+ inputSchema: {},
12
+ annotations: {
13
+ readOnlyHint: true,
14
+ destructiveHint: false,
15
+ idempotentHint: true,
16
+ openWorldHint: false,
17
+ },
18
+ }, async () => {
19
+ try {
20
+ const backend = getBackend();
21
+ const peers = await backend.listPeers();
22
+ const staleTimeout = getConfig().COGENT_STALE_TIMEOUT_MS;
23
+ const now = Date.now();
24
+ const enriched = peers.map(peer => ({
25
+ ...peer,
26
+ potentiallyStale: staleTimeout > 0 && (now - new Date(peer.lastSeenAt).getTime()) > staleTimeout,
27
+ }));
28
+ return successResult({ peers: enriched, count: enriched.length });
29
+ }
30
+ catch (err) {
31
+ logger.error("list-peers failed", { error: err });
32
+ return errorResult(err);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=list-peers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-peers.js","sourceRoot":"","sources":["../../src/tools/list-peers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,iEAAiE;YACjE,8EAA8E;YAC9E,6DAA6D;QAC/D,WAAW,EAAE,EAAE;QACf,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,KAAK;SACrB;KACF,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,YAAY,GAAG,SAAS,EAAE,CAAC,uBAAuB,CAAC;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClC,GAAG,IAAI;gBACP,gBAAgB,EAAE,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY;aACjG,CAAC,CAAC,CAAC;YACJ,OAAO,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAClD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerRegisterPeerTool(server: McpServer): void;
3
+ //# sourceMappingURL=register-peer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-peer.d.ts","sourceRoot":"","sources":["../../src/tools/register-peer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmMhE"}
@@ -0,0 +1,155 @@
1
+ import crypto from "node:crypto";
2
+ import { z } from "zod";
3
+ import { getConfig } from "../config.js";
4
+ import { getBackend, isCloudEndpoint } from "../backend/index.js";
5
+ import { successResult, errorResult } from "../errors.js";
6
+ import { saveCredentials, loadCredentials, } from "../cloud/credential-store.js";
7
+ import { logger } from "../logger.js";
8
+ export function registerRegisterPeerTool(server) {
9
+ server.registerTool("cogent_register_peer", {
10
+ title: "Register Peer",
11
+ description: "Register a Claude Code session as a named peer on the bridge. " +
12
+ "Each peer needs a unique peerId, the CC sessionId to resume, " +
13
+ "the working directory (cwd), and a human-readable label.",
14
+ inputSchema: {
15
+ peerId: z
16
+ .string()
17
+ .describe("Unique identifier for this peer, e.g. 'backend' or 'frontend'"),
18
+ sessionId: z
19
+ .string()
20
+ .describe("Claude Code session ID (used with --resume)"),
21
+ cwd: z
22
+ .string()
23
+ .describe("Absolute path to the project working directory"),
24
+ label: z
25
+ .string()
26
+ .describe("Human-readable label, e.g. 'Cogent_Backend' or 'Cogent_Frontend'"),
27
+ },
28
+ annotations: {
29
+ readOnlyHint: false,
30
+ destructiveHint: false,
31
+ idempotentHint: true,
32
+ openWorldHint: false,
33
+ },
34
+ }, async ({ peerId, sessionId, cwd, label }) => {
35
+ try {
36
+ const config = getConfig();
37
+ const isCloud = config.COGENT_ENDPOINT &&
38
+ isCloudEndpoint(config.COGENT_ENDPOINT);
39
+ // Track auto-create state for enriching the response
40
+ let sessionCreated = false;
41
+ let cloudSessionId;
42
+ let autoSecret;
43
+ if (isCloud && config.COGENT_ENDPOINT) {
44
+ const endpoint = config.COGENT_ENDPOINT;
45
+ // Check if we have cloud credentials (from env vars or persisted)
46
+ cloudSessionId = config.COGENT_SESSION_ID;
47
+ let cloudToken;
48
+ if (!cloudSessionId) {
49
+ // Try loading persisted credentials
50
+ const persisted = await loadCredentials();
51
+ if (persisted &&
52
+ persisted.endpoint === endpoint) {
53
+ cloudSessionId = persisted.sessionId;
54
+ cloudToken = persisted.token;
55
+ }
56
+ }
57
+ if (!cloudSessionId) {
58
+ // Auto-create session: no session configured at all
59
+ autoSecret = crypto.randomBytes(16).toString("hex");
60
+ const resp = await fetch(`${endpoint}/api/sessions`, {
61
+ method: "POST",
62
+ headers: { "Content-Type": "application/json" },
63
+ body: JSON.stringify({
64
+ secret: autoSecret,
65
+ label: `Auto-created by ${label}`,
66
+ }),
67
+ });
68
+ if (!resp.ok) {
69
+ return errorResult(new Error(`Failed to auto-create session: HTTP ${resp.status}`));
70
+ }
71
+ const created = (await resp.json());
72
+ cloudSessionId = created.sessionId;
73
+ cloudToken = created.token;
74
+ sessionCreated = true;
75
+ // Persist for future restarts
76
+ await saveCredentials({
77
+ endpoint,
78
+ sessionId: cloudSessionId,
79
+ token: cloudToken,
80
+ savedAt: new Date().toISOString(),
81
+ });
82
+ // Reinit cloud backend with new credentials
83
+ // (same dynamic import pattern as create-session/join-session)
84
+ try {
85
+ const startupModule = (await import("../startup.js"));
86
+ if (typeof startupModule.reinitCloudBackend === "function") {
87
+ await startupModule.reinitCloudBackend(endpoint, cloudSessionId, cloudToken);
88
+ }
89
+ }
90
+ catch {
91
+ // reinitCloudBackend may not exist yet
92
+ }
93
+ logger.info(`Auto-created cloud session ${cloudSessionId}`);
94
+ }
95
+ }
96
+ // Proceed with normal peer registration via the active backend
97
+ const backend = getBackend();
98
+ const existing = await backend.getPeer(peerId);
99
+ const peer = await backend.registerPeer(peerId, sessionId, cwd, label);
100
+ // Build the result, enriched with auto-create info if applicable
101
+ const result = {
102
+ success: true,
103
+ action: existing ? "updated" : "registered",
104
+ peer,
105
+ };
106
+ if (sessionCreated && cloudSessionId && autoSecret) {
107
+ result.session_created = true;
108
+ result.credentials = {
109
+ sessionId: cloudSessionId,
110
+ secret: autoSecret,
111
+ };
112
+ const ep = config.COGENT_ENDPOINT ?? "";
113
+ result.config_snippet = {
114
+ env_vars: `COGENT_ENDPOINT=${ep}\n` +
115
+ `COGENT_SESSION_ID=${cloudSessionId}\n` +
116
+ `COGENT_SECRET=${autoSecret}`,
117
+ mcp_config: {
118
+ "cogent-bridge": {
119
+ command: "npx",
120
+ args: ["@essentialai/cogent-bridge"],
121
+ env: {
122
+ COGENT_ENDPOINT: ep,
123
+ COGENT_SESSION_ID: cloudSessionId,
124
+ COGENT_SECRET: autoSecret,
125
+ },
126
+ },
127
+ },
128
+ };
129
+ }
130
+ // After successful peer registration in cloud mode, trigger WebSocket
131
+ // connection by calling setPeerId() on the CloudWsClient created during
132
+ // startup. Use dynamic import to avoid circular dependency with startup.ts.
133
+ if (isCloud) {
134
+ try {
135
+ const startup = await import("../startup.js");
136
+ if (startup.cloudWsClient) {
137
+ startup.cloudWsClient.setPeerId(peerId);
138
+ // setPeerId() internally calls connect() if state is "disconnected" and peerId is non-empty
139
+ logger.info(`WebSocket connection triggered for peer ${peerId}`);
140
+ }
141
+ }
142
+ catch (err) {
143
+ // Non-fatal: WS is optional, polling fallback will work
144
+ logger.warn(`Could not trigger WebSocket connection: ${err}`);
145
+ }
146
+ }
147
+ return successResult(result);
148
+ }
149
+ catch (err) {
150
+ logger.error("register-peer failed", { error: err });
151
+ return errorResult(err);
152
+ }
153
+ });
154
+ }
155
+ //# sourceMappingURL=register-peer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-peer.js","sourceRoot":"","sources":["../../src/tools/register-peer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerSendMessageTool(server: McpServer): void;
3
+ //# sourceMappingURL=send-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-message.d.ts","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuI/D"}
@@ -0,0 +1,121 @@
1
+ import { z } from "zod";
2
+ import { getBackend } from "../backend/index.js";
3
+ import { BridgeError, BridgeErrorCode, successResult, errorResult } from "../errors.js";
4
+ import { logger } from "../logger.js";
5
+ const RETRY_TIMEOUT_MS = 30_000;
6
+ function formatBridgeMessage(fromLabel, fromPeerId, message) {
7
+ return (`[Cogent Bridge message from ${fromLabel} (${fromPeerId})]\n\n` +
8
+ `${message}\n\n` +
9
+ `---\n` +
10
+ `Respond directly to the message above. Your entire response will be relayed back to ${fromLabel}. ` +
11
+ `Do NOT use cogent_send_message or any bridge tools — just answer normally.`);
12
+ }
13
+ export function registerSendMessageTool(server) {
14
+ server.registerTool("cogent_send_message", {
15
+ title: "Send Message to Peer",
16
+ description: "Send a message from one registered peer to another. " +
17
+ "The message is relayed by resuming the target's Claude Code session " +
18
+ "via CLI subprocess. Returns the target's response.",
19
+ inputSchema: {
20
+ fromPeerId: z
21
+ .string()
22
+ .describe("Peer ID of the sender, e.g. 'backend'"),
23
+ toPeerId: z
24
+ .string()
25
+ .describe("Peer ID of the recipient, e.g. 'frontend'"),
26
+ message: z
27
+ .string()
28
+ .describe("The message content to send to the target peer"),
29
+ },
30
+ annotations: {
31
+ readOnlyHint: false,
32
+ destructiveHint: false,
33
+ idempotentHint: false,
34
+ openWorldHint: true,
35
+ },
36
+ }, async ({ fromPeerId, toPeerId, message }) => {
37
+ try {
38
+ const backend = getBackend();
39
+ const from = await backend.getPeer(fromPeerId);
40
+ if (!from) {
41
+ return errorResult(new BridgeError(BridgeErrorCode.PEER_NOT_FOUND, `Sender peer '${fromPeerId}' not registered`, "Register the peer first with cogent_register_peer"));
42
+ }
43
+ const to = await backend.getPeer(toPeerId);
44
+ if (!to) {
45
+ return errorResult(new BridgeError(BridgeErrorCode.PEER_NOT_FOUND, `Target peer '${toPeerId}' not registered`, "Register the peer first with cogent_register_peer"));
46
+ }
47
+ // Fast-fail: check if the target session file exists on disk
48
+ const sessionValid = await backend.validateSession(to.sessionId, to.cwd);
49
+ if (!sessionValid) {
50
+ return errorResult(new BridgeError(BridgeErrorCode.CLI_EXEC_FAILED, `Session '${to.sessionId}' not found for peer '${toPeerId}'. The session may have ended or the ID is wrong`, `Ask '${toPeerId}' to re-register with their current session ID`));
51
+ }
52
+ const prefixed = formatBridgeMessage(from.label, fromPeerId, message);
53
+ const startMs = Date.now();
54
+ try {
55
+ let result = await backend.execClaude(to.sessionId, prefixed, to.cwd);
56
+ // On timeout, retry once with a shorter timeout
57
+ if (result.exitCode === null) {
58
+ logger.info(`Message to '${toPeerId}' timed out, retrying with ${RETRY_TIMEOUT_MS}ms timeout`);
59
+ result = await backend.execClaude(to.sessionId, prefixed, to.cwd, RETRY_TIMEOUT_MS);
60
+ }
61
+ const durationMs = Date.now() - startMs;
62
+ const success = result.exitCode === 0;
63
+ // Update sender lastSeenAt (sender is always active)
64
+ try {
65
+ await backend.updateLastSeen(fromPeerId);
66
+ }
67
+ catch (e) {
68
+ logger.error("Failed to update lastSeenAt for sender", { error: e });
69
+ }
70
+ // Update target lastSeenAt only on success
71
+ if (success) {
72
+ try {
73
+ await backend.updateLastSeen(toPeerId);
74
+ }
75
+ catch (e) {
76
+ logger.error("Failed to update lastSeenAt for target", { error: e });
77
+ }
78
+ }
79
+ await backend.recordMessage({
80
+ fromPeerId,
81
+ toPeerId,
82
+ message,
83
+ response: success ? result.stdout : null,
84
+ durationMs,
85
+ success,
86
+ error: success ? null : result.stderr,
87
+ });
88
+ return successResult({
89
+ success,
90
+ response: success ? result.stdout : null,
91
+ error: success ? null : result.stderr,
92
+ durationMs,
93
+ });
94
+ }
95
+ catch (err) {
96
+ const durationMs = Date.now() - startMs;
97
+ const errorMsg = err instanceof Error ? err.message : String(err);
98
+ try {
99
+ await backend.recordMessage({
100
+ fromPeerId,
101
+ toPeerId,
102
+ message,
103
+ response: null,
104
+ durationMs,
105
+ success: false,
106
+ error: errorMsg,
107
+ });
108
+ }
109
+ catch (recordErr) {
110
+ logger.error("Failed to record failed message", { error: recordErr });
111
+ }
112
+ return errorResult(err);
113
+ }
114
+ }
115
+ catch (err) {
116
+ logger.error("send-message failed", { error: err });
117
+ return errorResult(err);
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=send-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../src/tools/send-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface PeerInfo {
2
+ peerId: string;
3
+ sessionId: string;
4
+ cwd: string;
5
+ label: string;
6
+ registeredAt: string;
7
+ lastSeenAt: string;
8
+ }
9
+ export interface MessageRecord {
10
+ id: string;
11
+ fromPeerId: string;
12
+ toPeerId: string;
13
+ message: string;
14
+ response: string | null;
15
+ timestamp: string;
16
+ durationMs: number | null;
17
+ success: boolean;
18
+ error: string | null;
19
+ }
20
+ export interface SendMessageResult {
21
+ success: boolean;
22
+ response: string | null;
23
+ error: string | null;
24
+ durationMs: number;
25
+ }
26
+ export interface CliExecResult {
27
+ stdout: string;
28
+ stderr: string;
29
+ exitCode: number | null;
30
+ }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export declare function detectNpxPath(): string;
2
+ export declare function detectClaudePath(): string | null;
3
+ export declare function isNvmPath(p: string): boolean;
4
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/wizard/detect.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAMhD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5C"}
@@ -0,0 +1,21 @@
1
+ import { execSync } from "node:child_process";
2
+ export function detectNpxPath() {
3
+ try {
4
+ return execSync("which npx", { encoding: "utf-8" }).trim();
5
+ }
6
+ catch {
7
+ return "npx";
8
+ }
9
+ }
10
+ export function detectClaudePath() {
11
+ try {
12
+ return execSync("which claude", { encoding: "utf-8" }).trim();
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ export function isNvmPath(p) {
19
+ return p.includes(".nvm/versions/");
20
+ }
21
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/wizard/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type RealScaffoldResult } from "./scaffold-real.js";
2
+ export declare function printDemoNextSteps(baseDir: string): void;
3
+ export declare function printRealNextSteps(pathA: string, idA: string, labelA: string, pathB: string, idB: string, labelB: string, result: RealScaffoldResult): void;
4
+ export declare function runWizard(): Promise<void>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAwBxD;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,kBAAkB,GACzB,IAAI,CAuBN;AAYD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAuF/C"}