granttap-mcp 0.8.60 → 0.8.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/bridge/src/managed-admission/README.md +4 -0
- package/apps/bridge/src/monitor/handlers/inbound.ts +1 -1
- package/apps/mcp/src/desktop/delivery/task-handoff.ts +3 -1
- package/apps/mcp/src/mcp-tools/connect/relay.ts +3 -1
- package/apps/mcp/src/mcp-tools/mesh/relay.ts +2 -1
- package/cursor-plugin/README.md +1 -1
- package/cursor-plugin/mcp.json +1 -1
- package/cursor-plugin/stdio-bootstrap.cjs +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,10 @@ chooses the stable computer identity and enforces Personal seats; QR rooms and
|
|
|
6
6
|
native agent sessions do not take additional seats. Own-relay connections never
|
|
7
7
|
call billing. Tickets are transport headers and are not prompt content.
|
|
8
8
|
|
|
9
|
+
The background monitor, MCP tool connection, desktop Task handoff, agent hooks
|
|
10
|
+
and machine-role Mesh connections all use this entry point. Their leases renew
|
|
11
|
+
on the existing socket; the provider conversation and task keys remain intact.
|
|
12
|
+
|
|
9
13
|
Legacy free beta servers may not issue leases. Commercial relay mode requires
|
|
10
14
|
a valid signed lease independently, including when a modified client omits it.
|
|
11
15
|
Expiry/refund stops hosted delivery; local provider approval remains available,
|
|
@@ -55,7 +55,7 @@ export async function handleMonitorMessage(
|
|
|
55
55
|
if (payload.type === "pairing.join") {
|
|
56
56
|
return handleInboundPairingJoin(payload);
|
|
57
57
|
}
|
|
58
|
-
recordPhoneSeen();
|
|
58
|
+
recordPhoneSeen(Date.now(), input.peerPublicKey);
|
|
59
59
|
// Codex may start one MCP server per open task. Exactly one instance owns
|
|
60
60
|
// phone routing, so a single phone message can never create duplicate tasks.
|
|
61
61
|
if (!leadership.acquire()) return false;
|
|
@@ -7,12 +7,14 @@ import { observedComputerId } from "../../../../bridge/src/mesh/identity/compute
|
|
|
7
7
|
import { prepareMeshHandoff } from "../../../../bridge/src/mesh/runtime";
|
|
8
8
|
import { readStoreState } from "../../../../bridge/src/mesh/store/state";
|
|
9
9
|
import { controllerPeerGate } from "../../../../bridge/src/pairing/controllers";
|
|
10
|
+
import { managedAdmissionOptions } from "../../../../bridge/src/managed-admission";
|
|
10
11
|
|
|
11
12
|
type Prepare = (request: HandoffRequest) => Promise<boolean>;
|
|
12
13
|
|
|
13
14
|
async function prepareThroughRelay(request: HandoffRequest): Promise<boolean> {
|
|
14
15
|
const config = applyNetworkRoute(loadConfig(machineConfigPath()));
|
|
15
|
-
const client = new RelayClient(config, {
|
|
16
|
+
const client = new RelayClient(config, { ...managedAdmissionOptions(config),
|
|
17
|
+
peerAllowed: controllerPeerGate(config) });
|
|
16
18
|
try {
|
|
17
19
|
await client.connect();
|
|
18
20
|
return await prepareMeshHandoff(client, request);
|
|
@@ -14,6 +14,7 @@ import { completeEnrollment } from "../../connection-center/enrollment";
|
|
|
14
14
|
import { confirmPendingController, controllerPeerGate } from "../../../../bridge/src/pairing/controllers";
|
|
15
15
|
import { applyNetworkRoute } from "../../../../bridge/src/device-network/settings";
|
|
16
16
|
import { startEndpointPublisher } from "../../../../bridge/src/device-network/directory";
|
|
17
|
+
import { managedAdmissionOptions } from "../../../../bridge/src/managed-admission";
|
|
17
18
|
|
|
18
19
|
const ASK_TIMEOUT_MS = Number(
|
|
19
20
|
process.env.GRANTTAP_ASK_TIMEOUT_MS ?? process.env.NODVOX_ASK_TIMEOUT_MS ?? 180_000,
|
|
@@ -35,7 +36,8 @@ export async function relay(): Promise<RelayClient | null> {
|
|
|
35
36
|
try {
|
|
36
37
|
if (!client) {
|
|
37
38
|
const config = applyNetworkRoute(loadConfig(machineConfigPath()));
|
|
38
|
-
client = new RelayClient(config, {
|
|
39
|
+
client = new RelayClient(config, { ...managedAdmissionOptions(config),
|
|
40
|
+
autoReconnect: true, peerAllowed: controllerPeerGate(config) });
|
|
39
41
|
client.onMessage((payload, peerPublicKey) => {
|
|
40
42
|
if (payload.type === "pairing.join") {
|
|
41
43
|
const result = applyPairingJoin(payload);
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
loadGrokBotEndpoint,
|
|
7
7
|
} from "../../../../bridge/src/mesh/identity/endpoint";
|
|
8
8
|
import { localMeshStore } from "../../../../bridge/src/mesh/local-remote/local";
|
|
9
|
+
import { managedAdmissionOptions } from "../../../../bridge/src/managed-admission";
|
|
9
10
|
|
|
10
11
|
let client: RelayClient | null = null;
|
|
11
12
|
let credentialId: string | null = null;
|
|
@@ -43,7 +44,7 @@ export async function grokBotRelay(): Promise<RelayClient> {
|
|
|
43
44
|
});
|
|
44
45
|
if (!client || credentialId !== bundle.credential.credentialId) {
|
|
45
46
|
client?.close();
|
|
46
|
-
client = new RelayClient(bundle.pairing, { autoReconnect: true });
|
|
47
|
+
client = new RelayClient(bundle.pairing, { ...managedAdmissionOptions(bundle.pairing), autoReconnect: true });
|
|
47
48
|
credentialId = bundle.credential.credentialId;
|
|
48
49
|
client.onMessage(receive);
|
|
49
50
|
}
|
package/cursor-plugin/README.md
CHANGED
|
@@ -10,7 +10,7 @@ keeps each phone response tied to the exact originating chat and prompt.
|
|
|
10
10
|
Install the supported CLI on this computer, then run:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
npm install -g granttap-mcp@0.8.
|
|
13
|
+
npm install -g granttap-mcp@0.8.62
|
|
14
14
|
granttap setup
|
|
15
15
|
granttap status
|
|
16
16
|
```
|
package/cursor-plugin/mcp.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"command": "node",
|
|
5
5
|
"args": [
|
|
6
6
|
"-e",
|
|
7
|
-
"\"use strict\";\n\n// Cursor may start this MCP from any cwd. Execute JavaScript entry points with\n// Node itself: Windows batch shims require shell quoting that differs by host.\nconst { spawn } = require(\"node:child_process\");\nconst { existsSync } = require(\"node:fs\");\nconst { delimiter, dirname, join } = require(\"node:path\");\n\nconst PACKAGE = \"granttap-mcp@0.8.
|
|
7
|
+
"\"use strict\";\n\n// Cursor may start this MCP from any cwd. Execute JavaScript entry points with\n// Node itself: Windows batch shims require shell quoting that differs by host.\nconst { spawn } = require(\"node:child_process\");\nconst { existsSync } = require(\"node:fs\");\nconst { delimiter, dirname, join } = require(\"node:path\");\n\nconst PACKAGE = \"granttap-mcp@0.8.62\";\nconst dryRun = process.env.GRANTTAP_BOOTSTRAP_DRY_RUN === \"1\";\nconst platform = dryRun && process.env.GRANTTAP_BOOTSTRAP_PLATFORM\n ? process.env.GRANTTAP_BOOTSTRAP_PLATFORM : process.platform;\nconst nodeRoot = dryRun && process.env.GRANTTAP_BOOTSTRAP_NODE_ROOT\n ? process.env.GRANTTAP_BOOTSTRAP_NODE_ROOT : dirname(process.execPath);\nconst pathRoots = (process.env.PATH || \"\").split(delimiter).filter(Boolean);\nconst appData = process.env.APPDATA;\nconst roots = [nodeRoot, ...pathRoots, ...(appData ? [join(appData, \"npm\")] : [])];\nconst first = (paths) => paths.find((path) => existsSync(path));\n\nfunction launch() {\n if (platform !== \"win32\") {\n const installed = first(roots.map((root) => join(root, \"granttap-mcp\")));\n if (installed) return { command: installed, args: [] };\n const npx = first(roots.map((root) => join(root, \"npx\"))) || \"npx\";\n return { command: npx, args: [\"-y\", PACKAGE] };\n }\n const installed = first(roots.map((root) =>\n join(root, \"node_modules\", \"granttap-mcp\", \"bin\", \"granttap-mcp.mjs\")));\n if (installed) return { command: process.execPath, args: [installed] };\n const npx = first(roots.map((root) =>\n join(root, \"node_modules\", \"npm\", \"bin\", \"npx-cli.js\")));\n if (npx) return { command: process.execPath, args: [npx, \"-y\", PACKAGE] };\n throw new Error(\"Node.js/npm 20+ is required on this Windows device. Install npm and retry GrantTap.\");\n}\n\nlet target;\ntry { target = launch(); }\ncatch (error) {\n process.stderr.write(`[granttap] ${error.message}\\n`);\n process.exit(1);\n}\n\nif (dryRun) {\n process.stdout.write(JSON.stringify(target));\n process.exit(0);\n}\n\nconst child = spawn(target.command, target.args, { stdio: \"inherit\", windowsHide: true });\nchild.on(\"error\", (error) => {\n process.stderr.write(`[granttap] ${error.message}\\n`);\n process.exit(1);\n});\nchild.on(\"exit\", (code, signal) => {\n if (signal && platform !== \"win32\") {\n try { process.kill(process.pid, signal); } catch { process.exit(code ?? 1); }\n return;\n }\n process.exit(code ?? 1);\n});\n"
|
|
8
8
|
]
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -7,7 +7,7 @@ const { spawn } = require("node:child_process");
|
|
|
7
7
|
const { existsSync } = require("node:fs");
|
|
8
8
|
const { delimiter, dirname, join } = require("node:path");
|
|
9
9
|
|
|
10
|
-
const PACKAGE = "granttap-mcp@0.8.
|
|
10
|
+
const PACKAGE = "granttap-mcp@0.8.62";
|
|
11
11
|
const dryRun = process.env.GRANTTAP_BOOTSTRAP_DRY_RUN === "1";
|
|
12
12
|
const platform = dryRun && process.env.GRANTTAP_BOOTSTRAP_PLATFORM
|
|
13
13
|
? process.env.GRANTTAP_BOOTSTRAP_PLATFORM : process.platform;
|