granttap-mcp 0.8.100 → 0.8.101
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/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
- package/packages/core/outbound-scheduler/README.md +6 -0
- package/packages/core/outbound-scheduler/index.ts +2 -2
- package/packages/core/relay-client-types.ts +2 -0
- package/packages/core/relay-client.ts +3 -2
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.101
|
|
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.101\";\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 22.13.0+ 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.101";
|
|
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;
|
package/package.json
CHANGED
|
@@ -26,3 +26,9 @@ controller, with priority over queued periodic snapshots. Older callers without
|
|
|
26
26
|
a requester retain the complete authorized recipient set. Every explicit target
|
|
27
27
|
passes the pairing and controller authorization checks. Routing never deletes a
|
|
28
28
|
pairing or changes approval policy.
|
|
29
|
+
|
|
30
|
+
Requested image chunks retain their local scheduling priority through task
|
|
31
|
+
encryption and precede background transcript backfill. The local `urgent` send
|
|
32
|
+
hint is never serialized into relay routing metadata and does not request APNs.
|
|
33
|
+
The image-priority test receives and decrypts both layers and verifies ordering
|
|
34
|
+
while preserving every background frame and the existing six-millisecond pace.
|
|
@@ -71,7 +71,7 @@ export class OutboundFrameQueue {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
export const priorityControlPayload = (type: Payload["type"]) => type === "hello" || type.startsWith("approval.")
|
|
74
|
+
export const priorityControlPayload = (type: Payload["type"]) => type === "hello" || type === "session.image.chunk" || type.startsWith("approval.")
|
|
75
75
|
|| type.startsWith("config.") || type.startsWith("pairing.") || type === "session.key.grant"
|
|
76
76
|
|| type === "delivery.receipt" || type === "sessions.status" || type === "machine.heartbeat" || type === "approvals.status";
|
|
77
77
|
|
|
@@ -83,6 +83,6 @@ export async function sendEncryptedPayload(queue: OutboundFrameQueue, config: Pe
|
|
|
83
83
|
if (!peers.length) throw new Error("no authorized pairing peers");
|
|
84
84
|
for (const peerPublicKey of peers) {
|
|
85
85
|
await queue.send(sealEnvelope({ ...config, peerPublicKey }, payload, to,
|
|
86
|
-
peers.length === 1 ? options : { ...options, deliveryId: undefined }), priorityControlPayload(payload.type) || options.wake === true);
|
|
86
|
+
peers.length === 1 ? options : { ...options, deliveryId: undefined }), priorityControlPayload(payload.type) || options.urgent === true || options.wake === true);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -46,6 +46,8 @@ export type RelayClientOptions = {
|
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
export type SendOptions = {
|
|
49
|
+
/** Local scheduling only; never serialized into relay routing metadata. */
|
|
50
|
+
urgent?: boolean;
|
|
49
51
|
/** Negotiated opaque latest-state replay, independent of delivery ACKs. */
|
|
50
52
|
retainedState?: boolean;
|
|
51
53
|
stateKey?: string;
|
|
@@ -214,7 +214,7 @@ export class RelayClient {
|
|
|
214
214
|
|| !this.peerIsAllowed(peerPublicKey)) throw new Error("controller peer is not authorized");
|
|
215
215
|
if (!this.frames) throw new Error("relay not connected");
|
|
216
216
|
await this.frames.send(sealEnvelope({ ...this.cfg, peerPublicKey }, payload, this.otherRole(), { ...retainedPayloadOptions(payload), ...options, retainedState: this.retainedState, recipientRouting: this.recipientRouting }),
|
|
217
|
-
priorityControlPayload(payload.type) || options.wake === true);
|
|
217
|
+
priorityControlPayload(payload.type) || options.urgent === true || options.wake === true);
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
setSessionKey(sessionId: string, key: string): void {
|
|
@@ -232,7 +232,8 @@ export class RelayClient {
|
|
|
232
232
|
to: Role | "all" = this.otherRole(),
|
|
233
233
|
options: SendOptions = {},
|
|
234
234
|
): Promise<void> {
|
|
235
|
-
await this.send(sealSessionPayload(payload, sessionId, this.sessionKeys.get(sessionId)), to, { ...retainedPayloadOptions(payload), ...options
|
|
235
|
+
await this.send(sealSessionPayload(payload, sessionId, this.sessionKeys.get(sessionId)), to, { ...retainedPayloadOptions(payload), ...options,
|
|
236
|
+
urgent: options.urgent === true || priorityControlPayload(payload.type) });
|
|
236
237
|
}
|
|
237
238
|
|
|
238
239
|
/** Register before connect so only durable receivers advertise task-job support. */
|