mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-10-09 15:58:34 +00:00
61a2473a7c
* feat(capabilities): add shared agent capability layer for MCP and CLI Introduce a registry-driven capability foundation so terminal, SFTP, vault, and port-forward tools can be extended from one policy and surface definition. Wire mcpServerBridge permission checks and the Skills CLI RPC client through the shared layer without changing existing AI runtime behavior. Co-authored-by: Cursor <cursoragent@cursor.com> * fix(capabilities): restore SFTP cancel gating and home RPC timeout Match legacy mcpServerBridge behavior by blocking SFTP write RPCs after chat cancel and treating sftp/home as a long-running operation for timeout budget calculation. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
"use strict";
|
|
|
|
const { CAPABILITY_SURFACES, PERMISSION_MODES, RPC_TIMEOUT_DEFAULTS } = require("./constants.cjs");
|
|
const { getCapabilityByRpcMethod } = require("./registry.cjs");
|
|
const { requiresApprovalInConfirmMode } = require("./policy.cjs");
|
|
|
|
const {
|
|
DEFAULT_RPC_TIMEOUT_MS,
|
|
DEFAULT_OPERATION_TIMEOUT_MS,
|
|
RPC_TIMEOUT_BUFFER_MS,
|
|
DEFAULT_APPROVAL_TIMEOUT_MS,
|
|
} = RPC_TIMEOUT_DEFAULTS;
|
|
|
|
function isLongRunningRpcMethod(method, surface = CAPABILITY_SURFACES.BUILTIN) {
|
|
const capability = getCapabilityByRpcMethod(method, surface);
|
|
return Boolean(capability?.policy.longRunning);
|
|
}
|
|
|
|
function isApprovalWaitRpcMethod(method, surface, permissionMode) {
|
|
if (permissionMode !== PERMISSION_MODES.CONFIRM) return false;
|
|
const capability = getCapabilityByRpcMethod(method, surface);
|
|
return requiresApprovalInConfirmMode(capability, surface);
|
|
}
|
|
|
|
function resolveRpcTimeoutMs(
|
|
method,
|
|
{
|
|
surface = CAPABILITY_SURFACES.BUILTIN,
|
|
bridgeCommandTimeoutMs = null,
|
|
bridgePermissionMode = null,
|
|
bridgeApprovalTimeoutMs = null,
|
|
defaultOperationTimeoutMs = DEFAULT_OPERATION_TIMEOUT_MS,
|
|
defaultApprovalTimeoutMs = DEFAULT_APPROVAL_TIMEOUT_MS,
|
|
defaultRpcTimeoutMs = DEFAULT_RPC_TIMEOUT_MS,
|
|
timeoutBufferMs = RPC_TIMEOUT_BUFFER_MS,
|
|
} = {},
|
|
) {
|
|
const operationTimeoutMs = isLongRunningRpcMethod(method, surface)
|
|
? (Number.isFinite(bridgeCommandTimeoutMs) && bridgeCommandTimeoutMs > 0
|
|
? bridgeCommandTimeoutMs
|
|
: defaultOperationTimeoutMs)
|
|
: 0;
|
|
|
|
const approvalTimeoutMs = isApprovalWaitRpcMethod(method, surface, bridgePermissionMode)
|
|
? (Number.isFinite(bridgeApprovalTimeoutMs) && bridgeApprovalTimeoutMs > 0
|
|
? bridgeApprovalTimeoutMs
|
|
: defaultApprovalTimeoutMs)
|
|
: 0;
|
|
|
|
if (operationTimeoutMs > 0 && approvalTimeoutMs > 0) {
|
|
return Math.max(defaultRpcTimeoutMs, approvalTimeoutMs + operationTimeoutMs + timeoutBufferMs);
|
|
}
|
|
if (operationTimeoutMs > 0) {
|
|
return Math.max(defaultRpcTimeoutMs, operationTimeoutMs + timeoutBufferMs);
|
|
}
|
|
if (approvalTimeoutMs > 0) {
|
|
return Math.max(defaultRpcTimeoutMs, approvalTimeoutMs + timeoutBufferMs);
|
|
}
|
|
return defaultRpcTimeoutMs;
|
|
}
|
|
|
|
module.exports = {
|
|
isLongRunningRpcMethod,
|
|
isApprovalWaitRpcMethod,
|
|
resolveRpcTimeoutMs,
|
|
RPC_TIMEOUT_DEFAULTS,
|
|
};
|