sfcc-dev-mcp 1.0.21 → 1.0.22
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/README.md +79 -30
- package/dist/clients/agent-instructions-client.d.ts +3 -0
- package/dist/clients/agent-instructions-client.d.ts.map +1 -1
- package/dist/clients/agent-instructions-client.js +42 -10
- package/dist/clients/agent-instructions-client.js.map +1 -1
- package/dist/clients/base/abstract-documentation-client.d.ts +4 -0
- package/dist/clients/base/abstract-documentation-client.d.ts.map +1 -1
- package/dist/clients/base/abstract-documentation-client.js +9 -1
- package/dist/clients/base/abstract-documentation-client.js.map +1 -1
- package/dist/clients/base/http-client.d.ts +10 -3
- package/dist/clients/base/http-client.d.ts.map +1 -1
- package/dist/clients/base/http-client.js +94 -16
- package/dist/clients/base/http-client.js.map +1 -1
- package/dist/clients/base/oauth-token.d.ts +3 -0
- package/dist/clients/base/oauth-token.d.ts.map +1 -1
- package/dist/clients/base/oauth-token.js +23 -3
- package/dist/clients/base/oauth-token.js.map +1 -1
- package/dist/clients/base/ocapi-auth-client.d.ts.map +1 -1
- package/dist/clients/base/ocapi-auth-client.js +22 -2
- package/dist/clients/base/ocapi-auth-client.js.map +1 -1
- package/dist/clients/docs/class-name-resolver.d.ts +7 -4
- package/dist/clients/docs/class-name-resolver.d.ts.map +1 -1
- package/dist/clients/docs/class-name-resolver.js.map +1 -1
- package/dist/clients/docs/documentation-scanner.d.ts +2 -0
- package/dist/clients/docs/documentation-scanner.d.ts.map +1 -1
- package/dist/clients/docs/documentation-scanner.js +39 -17
- package/dist/clients/docs/documentation-scanner.js.map +1 -1
- package/dist/clients/docs-client.d.ts +4 -3
- package/dist/clients/docs-client.d.ts.map +1 -1
- package/dist/clients/docs-client.js.map +1 -1
- package/dist/clients/logs/log-client.d.ts +1 -0
- package/dist/clients/logs/log-client.d.ts.map +1 -1
- package/dist/clients/logs/log-client.js +13 -21
- package/dist/clients/logs/log-client.js.map +1 -1
- package/dist/clients/logs/log-file-discovery.d.ts +1 -0
- package/dist/clients/logs/log-file-discovery.d.ts.map +1 -1
- package/dist/clients/logs/log-file-discovery.js +19 -6
- package/dist/clients/logs/log-file-discovery.js.map +1 -1
- package/dist/clients/logs/log-file-reader.d.ts +2 -0
- package/dist/clients/logs/log-file-reader.d.ts.map +1 -1
- package/dist/clients/logs/log-file-reader.js +31 -8
- package/dist/clients/logs/log-file-reader.js.map +1 -1
- package/dist/clients/logs/log-formatter.d.ts +2 -2
- package/dist/clients/logs/log-formatter.d.ts.map +1 -1
- package/dist/clients/logs/log-formatter.js.map +1 -1
- package/dist/clients/logs/log-types.d.ts +4 -0
- package/dist/clients/logs/log-types.d.ts.map +1 -1
- package/dist/clients/logs/webdav-client-manager.d.ts.map +1 -1
- package/dist/clients/logs/webdav-client-manager.js.map +1 -1
- package/dist/clients/ocapi/code-versions-client.d.ts +23 -4
- package/dist/clients/ocapi/code-versions-client.d.ts.map +1 -1
- package/dist/clients/ocapi/code-versions-client.js +2 -2
- package/dist/clients/ocapi/code-versions-client.js.map +1 -1
- package/dist/clients/ocapi/site-preferences-client.d.ts +2 -42
- package/dist/clients/ocapi/site-preferences-client.d.ts.map +1 -1
- package/dist/clients/ocapi/site-preferences-client.js.map +1 -1
- package/dist/clients/ocapi/system-objects-client.d.ts +7 -39
- package/dist/clients/ocapi/system-objects-client.d.ts.map +1 -1
- package/dist/clients/ocapi/system-objects-client.js.map +1 -1
- package/dist/clients/script-debugger/script-debugger-client.d.ts +9 -1
- package/dist/clients/script-debugger/script-debugger-client.d.ts.map +1 -1
- package/dist/clients/script-debugger/script-debugger-client.js +182 -127
- package/dist/clients/script-debugger/script-debugger-client.js.map +1 -1
- package/dist/clients/sfra-client.d.ts.map +1 -1
- package/dist/clients/sfra-client.js.map +1 -1
- package/dist/config/cli-options.d.ts +16 -0
- package/dist/config/cli-options.d.ts.map +1 -0
- package/dist/config/cli-options.js +56 -0
- package/dist/config/cli-options.js.map +1 -0
- package/dist/config/configuration-factory.d.ts.map +1 -1
- package/dist/config/configuration-factory.js +12 -6
- package/dist/config/configuration-factory.js.map +1 -1
- package/dist/config/credential-validation.d.ts +25 -0
- package/dist/config/credential-validation.d.ts.map +1 -0
- package/dist/config/credential-validation.js +42 -0
- package/dist/config/credential-validation.js.map +1 -0
- package/dist/config/dw-json-loader.d.ts.map +1 -1
- package/dist/config/dw-json-loader.js +19 -68
- package/dist/config/dw-json-loader.js.map +1 -1
- package/dist/config/path-security-policy.d.ts +6 -0
- package/dist/config/path-security-policy.d.ts.map +1 -0
- package/dist/config/path-security-policy.js +63 -0
- package/dist/config/path-security-policy.js.map +1 -0
- package/dist/config/workspace-roots.d.ts +1 -0
- package/dist/config/workspace-roots.d.ts.map +1 -1
- package/dist/config/workspace-roots.js +26 -77
- package/dist/config/workspace-roots.js.map +1 -1
- package/dist/core/handlers/abstract-client-handler.d.ts +23 -2
- package/dist/core/handlers/abstract-client-handler.d.ts.map +1 -1
- package/dist/core/handlers/abstract-client-handler.js +33 -3
- package/dist/core/handlers/abstract-client-handler.js.map +1 -1
- package/dist/core/handlers/agent-instructions-handler.d.ts +1 -1
- package/dist/core/handlers/agent-instructions-handler.d.ts.map +1 -1
- package/dist/core/handlers/agent-instructions-handler.js +2 -2
- package/dist/core/handlers/agent-instructions-handler.js.map +1 -1
- package/dist/core/handlers/base-handler.d.ts +14 -11
- package/dist/core/handlers/base-handler.d.ts.map +1 -1
- package/dist/core/handlers/base-handler.js +38 -22
- package/dist/core/handlers/base-handler.js.map +1 -1
- package/dist/core/handlers/cartridge-handler.d.ts +3 -8
- package/dist/core/handlers/cartridge-handler.d.ts.map +1 -1
- package/dist/core/handlers/cartridge-handler.js +10 -18
- package/dist/core/handlers/cartridge-handler.js.map +1 -1
- package/dist/core/handlers/code-version-handler.d.ts +3 -9
- package/dist/core/handlers/code-version-handler.d.ts.map +1 -1
- package/dist/core/handlers/code-version-handler.js +10 -21
- package/dist/core/handlers/code-version-handler.js.map +1 -1
- package/dist/core/handlers/job-log-handler.d.ts +3 -9
- package/dist/core/handlers/job-log-handler.d.ts.map +1 -1
- package/dist/core/handlers/job-log-handler.js +10 -21
- package/dist/core/handlers/job-log-handler.js.map +1 -1
- package/dist/core/handlers/lifecycle-utils.d.ts +5 -0
- package/dist/core/handlers/lifecycle-utils.d.ts.map +1 -0
- package/dist/core/handlers/lifecycle-utils.js +18 -0
- package/dist/core/handlers/lifecycle-utils.js.map +1 -0
- package/dist/core/handlers/log-handler.d.ts +3 -9
- package/dist/core/handlers/log-handler.d.ts.map +1 -1
- package/dist/core/handlers/log-handler.js +10 -21
- package/dist/core/handlers/log-handler.js.map +1 -1
- package/dist/core/handlers/script-debugger-handler.d.ts +3 -9
- package/dist/core/handlers/script-debugger-handler.d.ts.map +1 -1
- package/dist/core/handlers/script-debugger-handler.js +10 -21
- package/dist/core/handlers/script-debugger-handler.js.map +1 -1
- package/dist/core/handlers/simple-client-handler.d.ts +3 -3
- package/dist/core/handlers/simple-client-handler.d.ts.map +1 -1
- package/dist/core/handlers/simple-client-handler.js +5 -3
- package/dist/core/handlers/simple-client-handler.js.map +1 -1
- package/dist/core/handlers/system-object-handler.d.ts +3 -9
- package/dist/core/handlers/system-object-handler.d.ts.map +1 -1
- package/dist/core/handlers/system-object-handler.js +10 -21
- package/dist/core/handlers/system-object-handler.js.map +1 -1
- package/dist/core/handlers/validation-helpers.d.ts +5 -26
- package/dist/core/handlers/validation-helpers.d.ts.map +1 -1
- package/dist/core/handlers/validation-helpers.js +79 -81
- package/dist/core/handlers/validation-helpers.js.map +1 -1
- package/dist/core/instruction-advisor.d.ts +3 -0
- package/dist/core/instruction-advisor.d.ts.map +1 -1
- package/dist/core/instruction-advisor.js +25 -2
- package/dist/core/instruction-advisor.js.map +1 -1
- package/dist/core/server-tool-call-lifecycle.d.ts +38 -0
- package/dist/core/server-tool-call-lifecycle.d.ts.map +1 -0
- package/dist/core/server-tool-call-lifecycle.js +128 -0
- package/dist/core/server-tool-call-lifecycle.js.map +1 -0
- package/dist/core/server-tool-catalog.d.ts +19 -0
- package/dist/core/server-tool-catalog.d.ts.map +1 -0
- package/dist/core/server-tool-catalog.js +52 -0
- package/dist/core/server-tool-catalog.js.map +1 -0
- package/dist/core/server-workspace-discovery.d.ts +38 -0
- package/dist/core/server-workspace-discovery.d.ts.map +1 -0
- package/dist/core/server-workspace-discovery.js +68 -0
- package/dist/core/server-workspace-discovery.js.map +1 -0
- package/dist/core/server.d.ts +27 -3
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +247 -165
- package/dist/core/server.js.map +1 -1
- package/dist/core/tool-argument-validator.d.ts +24 -0
- package/dist/core/tool-argument-validator.d.ts.map +1 -0
- package/dist/core/tool-argument-validator.js +186 -0
- package/dist/core/tool-argument-validator.js.map +1 -0
- package/dist/core/tool-error-response.d.ts +21 -0
- package/dist/core/tool-error-response.d.ts.map +1 -0
- package/dist/core/tool-error-response.js +64 -0
- package/dist/core/tool-error-response.js.map +1 -0
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts +4 -0
- package/dist/core/tool-schemas/agent-instruction-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/agent-instruction-tools.js +6 -2
- package/dist/core/tool-schemas/agent-instruction-tools.js.map +1 -1
- package/dist/core/tool-schemas/cartridge-tools.d.ts +3 -0
- package/dist/core/tool-schemas/cartridge-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/cartridge-tools.js +3 -0
- package/dist/core/tool-schemas/cartridge-tools.js.map +1 -1
- package/dist/core/tool-schemas/code-version-tools.d.ts +1 -0
- package/dist/core/tool-schemas/code-version-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/code-version-tools.js +1 -0
- package/dist/core/tool-schemas/code-version-tools.js.map +1 -1
- package/dist/core/tool-schemas/documentation-tools.d.ts +6 -0
- package/dist/core/tool-schemas/documentation-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/documentation-tools.js +6 -0
- package/dist/core/tool-schemas/documentation-tools.js.map +1 -1
- package/dist/core/tool-schemas/isml-tools.d.ts +3 -0
- package/dist/core/tool-schemas/isml-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/isml-tools.js +4 -1
- package/dist/core/tool-schemas/isml-tools.js.map +1 -1
- package/dist/core/tool-schemas/log-tools.d.ts +28 -0
- package/dist/core/tool-schemas/log-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/log-tools.js +21 -7
- package/dist/core/tool-schemas/log-tools.js.map +1 -1
- package/dist/core/tool-schemas/script-debugger-tools.d.ts +7 -0
- package/dist/core/tool-schemas/script-debugger-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/script-debugger-tools.js +9 -2
- package/dist/core/tool-schemas/script-debugger-tools.js.map +1 -1
- package/dist/core/tool-schemas/sfra-tools.d.ts +3 -0
- package/dist/core/tool-schemas/sfra-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/sfra-tools.js +3 -0
- package/dist/core/tool-schemas/sfra-tools.js.map +1 -1
- package/dist/core/tool-schemas/shared-schemas.d.ts +72 -4
- package/dist/core/tool-schemas/shared-schemas.d.ts.map +1 -1
- package/dist/core/tool-schemas/shared-schemas.js +29 -3
- package/dist/core/tool-schemas/shared-schemas.js.map +1 -1
- package/dist/core/tool-schemas/system-object-tools.d.ts +93 -4
- package/dist/core/tool-schemas/system-object-tools.d.ts.map +1 -1
- package/dist/core/tool-schemas/system-object-tools.js +13 -6
- package/dist/core/tool-schemas/system-object-tools.js.map +1 -1
- package/dist/docs/isml/isprint.md +1 -1
- package/dist/docs/isml/isredirect.md +1 -1
- package/dist/docs/isml/isremove.md +1 -1
- package/dist/docs/isml/isreplace.md +1 -1
- package/dist/docs/isml/isscript.md +1 -1
- package/dist/main.js +18 -33
- package/dist/main.js.map +1 -1
- package/dist/tool-configs/agent-instructions-tool-config.d.ts +1 -1
- package/dist/tool-configs/agent-instructions-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/agent-instructions-tool-config.js +0 -33
- package/dist/tool-configs/agent-instructions-tool-config.js.map +1 -1
- package/dist/tool-configs/cartridge-tool-config.d.ts +1 -1
- package/dist/tool-configs/cartridge-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/cartridge-tool-config.js +3 -5
- package/dist/tool-configs/cartridge-tool-config.js.map +1 -1
- package/dist/tool-configs/code-version-tool-config.d.ts +1 -1
- package/dist/tool-configs/code-version-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/code-version-tool-config.js +0 -4
- package/dist/tool-configs/code-version-tool-config.js.map +1 -1
- package/dist/tool-configs/docs-tool-config.d.ts +1 -1
- package/dist/tool-configs/docs-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/docs-tool-config.js +0 -13
- package/dist/tool-configs/docs-tool-config.js.map +1 -1
- package/dist/tool-configs/isml-tool-config.d.ts +1 -1
- package/dist/tool-configs/isml-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/isml-tool-config.js +0 -10
- package/dist/tool-configs/isml-tool-config.js.map +1 -1
- package/dist/tool-configs/job-log-tool-config.d.ts +1 -1
- package/dist/tool-configs/job-log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/job-log-tool-config.js +1 -21
- package/dist/tool-configs/job-log-tool-config.js.map +1 -1
- package/dist/tool-configs/log-tool-config.d.ts +1 -1
- package/dist/tool-configs/log-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/log-tool-config.js +6 -16
- package/dist/tool-configs/log-tool-config.js.map +1 -1
- package/dist/tool-configs/script-debugger-tool-config.d.ts +1 -1
- package/dist/tool-configs/script-debugger-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/script-debugger-tool-config.js +0 -8
- package/dist/tool-configs/script-debugger-tool-config.js.map +1 -1
- package/dist/tool-configs/sfra-tool-config.d.ts +1 -1
- package/dist/tool-configs/sfra-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/sfra-tool-config.js +0 -10
- package/dist/tool-configs/sfra-tool-config.js.map +1 -1
- package/dist/tool-configs/system-object-tool-config.d.ts +1 -1
- package/dist/tool-configs/system-object-tool-config.d.ts.map +1 -1
- package/dist/tool-configs/system-object-tool-config.js +14 -24
- package/dist/tool-configs/system-object-tool-config.js.map +1 -1
- package/dist/types/ocapi-search.d.ts +50 -0
- package/dist/types/ocapi-search.d.ts.map +1 -0
- package/dist/types/ocapi-search.js +7 -0
- package/dist/types/ocapi-search.js.map +1 -0
- package/dist/types/types.d.ts +4 -4
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils/abort-utils.d.ts +18 -0
- package/dist/utils/abort-utils.d.ts.map +1 -0
- package/dist/utils/abort-utils.js +60 -0
- package/dist/utils/abort-utils.js.map +1 -0
- package/dist/utils/cache.d.ts +7 -7
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/category-utils.d.ts +0 -10
- package/dist/utils/category-utils.d.ts.map +1 -1
- package/dist/utils/category-utils.js +0 -12
- package/dist/utils/category-utils.js.map +1 -1
- package/dist/utils/log-tool-constants.d.ts +3 -4
- package/dist/utils/log-tool-constants.d.ts.map +1 -1
- package/dist/utils/log-tool-constants.js +2 -13
- package/dist/utils/log-tool-constants.js.map +1 -1
- package/dist/utils/logger.d.ts +20 -7
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +72 -11
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/query-builder.d.ts +2 -5
- package/dist/utils/query-builder.d.ts.map +1 -1
- package/dist/utils/query-builder.js +1 -4
- package/dist/utils/query-builder.js.map +1 -1
- package/dist/utils/validator.d.ts +5 -3
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +20 -14
- package/dist/utils/validator.js.map +1 -1
- package/package.json +14 -7
- package/dist/clients/docs/index.d.ts +0 -10
- package/dist/clients/docs/index.d.ts.map +0 -1
- package/dist/clients/docs/index.js +0 -10
- package/dist/clients/docs/index.js.map +0 -1
- package/dist/constants/index.d.ts +0 -1
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -3
- package/dist/constants/index.js.map +0 -1
- package/dist/utils/path-validation.d.ts +0 -40
- package/dist/utils/path-validation.d.ts.map +0 -1
- package/dist/utils/path-validation.js +0 -84
- package/dist/utils/path-validation.js.map +0 -1
|
@@ -3,77 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { HandlerError } from './base-handler.js';
|
|
5
5
|
import { isValidLogLevel, LogLevelValues } from '../../utils/log-tool-constants.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
static validateArguments(args, rules, toolName) {
|
|
11
|
-
for (const rule of rules) {
|
|
12
|
-
const value = args?.[rule.field];
|
|
13
|
-
// Check required fields
|
|
14
|
-
if (rule.required && (value === undefined || value === null || value === '')) {
|
|
15
|
-
throw new HandlerError(rule.errorMessage ?? `${rule.field} is required`, toolName, 'MISSING_ARGUMENT', { field: rule.field, rules });
|
|
16
|
-
}
|
|
17
|
-
// Skip type and custom validation if value is not present and not required
|
|
18
|
-
if (!rule.required && (value === undefined || value === null)) {
|
|
19
|
-
continue;
|
|
20
|
-
}
|
|
21
|
-
// Check type (including for required fields that have values)
|
|
22
|
-
if (rule.type && value !== undefined && value !== null && !this.validateType(value, rule.type)) {
|
|
23
|
-
throw new HandlerError(rule.errorMessage ?? `${rule.field} must be of type ${rule.type}`, toolName, 'INVALID_TYPE', { field: rule.field, expectedType: rule.type, actualType: typeof value });
|
|
24
|
-
}
|
|
25
|
-
// Custom validation
|
|
26
|
-
if (rule.validator && !rule.validator(value)) {
|
|
27
|
-
throw new HandlerError(rule.errorMessage ?? `${rule.field} validation failed`, toolName, 'VALIDATION_FAILED', { field: rule.field, value });
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
static validateType(value, type) {
|
|
32
|
-
switch (type) {
|
|
33
|
-
case 'string':
|
|
34
|
-
return typeof value === 'string';
|
|
35
|
-
case 'number':
|
|
36
|
-
return typeof value === 'number' && !isNaN(value);
|
|
37
|
-
case 'boolean':
|
|
38
|
-
return typeof value === 'boolean';
|
|
39
|
-
case 'object':
|
|
40
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
41
|
-
case 'array':
|
|
42
|
-
return Array.isArray(value);
|
|
43
|
-
default:
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Common validation rules factory
|
|
50
|
-
*/
|
|
51
|
-
export const CommonValidations = {
|
|
52
|
-
/** Create a required string field validation */
|
|
53
|
-
requiredString: (field, customMessage) => [{
|
|
54
|
-
field,
|
|
55
|
-
required: true,
|
|
56
|
-
type: 'string',
|
|
57
|
-
validator: (value) => value.trim().length > 0,
|
|
58
|
-
errorMessage: customMessage ?? `${field} must be a non-empty string`,
|
|
59
|
-
}],
|
|
60
|
-
/** Create a required field validation with custom validator */
|
|
61
|
-
requiredField: (field, type, validator, errorMessage) => [{
|
|
62
|
-
field,
|
|
63
|
-
required: true,
|
|
64
|
-
type,
|
|
65
|
-
validator,
|
|
66
|
-
errorMessage,
|
|
67
|
-
}],
|
|
68
|
-
/** Create an optional field validation */
|
|
69
|
-
optionalField: (field, type, validator, errorMessage) => [{
|
|
70
|
-
field,
|
|
71
|
-
required: false,
|
|
72
|
-
type,
|
|
73
|
-
validator,
|
|
74
|
-
errorMessage,
|
|
75
|
-
}],
|
|
76
|
-
};
|
|
6
|
+
import { resolve, relative, isAbsolute } from 'path';
|
|
7
|
+
import { homedir } from 'os';
|
|
8
|
+
import { existsSync, realpathSync } from 'fs';
|
|
77
9
|
// =============================================================================
|
|
78
10
|
// Log-specific validators (consolidated from log-validation.ts)
|
|
79
11
|
// =============================================================================
|
|
@@ -81,7 +13,7 @@ export const CommonValidations = {
|
|
|
81
13
|
export function validateLogLevel(level, toolName) {
|
|
82
14
|
if (!isValidLogLevel(level)) {
|
|
83
15
|
const validLevels = Object.values(LogLevelValues).join(', ');
|
|
84
|
-
throw new
|
|
16
|
+
throw new HandlerError(`Invalid log level '${level}' for ${toolName}. Valid levels: ${validLevels}`, toolName, 'INVALID_ARGUMENT', { field: 'level', value: level, validLevels: Object.values(LogLevelValues) });
|
|
85
17
|
}
|
|
86
18
|
}
|
|
87
19
|
/** Validate limit parameter */
|
|
@@ -90,10 +22,10 @@ export function validateLimit(limit, toolName) {
|
|
|
90
22
|
return;
|
|
91
23
|
}
|
|
92
24
|
if (typeof limit !== 'number' || isNaN(limit)) {
|
|
93
|
-
throw new
|
|
25
|
+
throw new HandlerError(`Invalid limit '${limit}' for ${toolName}. Must be a valid number`, toolName, 'INVALID_ARGUMENT', { field: 'limit', value: limit });
|
|
94
26
|
}
|
|
95
27
|
if (limit <= 0 || limit > 1000) {
|
|
96
|
-
throw new
|
|
28
|
+
throw new HandlerError(`Invalid limit '${limit}' for ${toolName}. Must be between 1 and 1000`, toolName, 'INVALID_ARGUMENT', { field: 'limit', value: limit, min: 1, max: 1000 });
|
|
97
29
|
}
|
|
98
30
|
}
|
|
99
31
|
/** Validate maxBytes parameter */
|
|
@@ -102,32 +34,32 @@ export function validateMaxBytes(maxBytes, toolName) {
|
|
|
102
34
|
return;
|
|
103
35
|
}
|
|
104
36
|
if (typeof maxBytes !== 'number' || isNaN(maxBytes)) {
|
|
105
|
-
throw new
|
|
37
|
+
throw new HandlerError(`Invalid maxBytes '${maxBytes}' for ${toolName}. Must be a valid number`, toolName, 'INVALID_ARGUMENT', { field: 'maxBytes', value: maxBytes });
|
|
106
38
|
}
|
|
107
39
|
if (maxBytes <= 0 || maxBytes > 10_000_000) {
|
|
108
|
-
throw new
|
|
40
|
+
throw new HandlerError(`Invalid maxBytes '${maxBytes}' for ${toolName}. Must be between 1 and 10,000,000`, toolName, 'INVALID_ARGUMENT', { field: 'maxBytes', value: maxBytes, min: 1, max: 10_000_000 });
|
|
109
41
|
}
|
|
110
42
|
}
|
|
111
43
|
/** Validate filename parameter */
|
|
112
44
|
export function validateFilename(filename, toolName) {
|
|
113
45
|
if (!filename || filename.trim().length === 0) {
|
|
114
|
-
throw new
|
|
46
|
+
throw new HandlerError(`Filename is required for ${toolName}`, toolName, 'MISSING_ARGUMENT', { field: 'filename' });
|
|
115
47
|
}
|
|
116
48
|
// Check for path traversal attempts
|
|
117
49
|
if (filename.includes('..') || filename.includes('\\')) {
|
|
118
|
-
throw new
|
|
50
|
+
throw new HandlerError(`Invalid filename '${filename}' for ${toolName}. Path traversal not allowed`, toolName, 'INVALID_ARGUMENT', { field: 'filename', value: filename, reason: 'path_traversal' });
|
|
119
51
|
}
|
|
120
52
|
// Check for null byte injection
|
|
121
53
|
if (filename.includes('\0') || filename.includes('\x00')) {
|
|
122
|
-
throw new
|
|
54
|
+
throw new HandlerError(`Invalid filename for ${toolName}. Contains invalid characters`, toolName, 'INVALID_ARGUMENT', { field: 'filename', value: filename, reason: 'invalid_characters' });
|
|
123
55
|
}
|
|
124
56
|
// Check for absolute path attempts
|
|
125
57
|
if (filename.startsWith('/') && !filename.startsWith('/Logs/') && !filename.startsWith('/jobs/')) {
|
|
126
|
-
throw new
|
|
58
|
+
throw new HandlerError(`Invalid filename '${filename}' for ${toolName}. Absolute paths outside /Logs/ are not allowed`, toolName, 'INVALID_ARGUMENT', { field: 'filename', value: filename, reason: 'absolute_path_not_allowed' });
|
|
127
59
|
}
|
|
128
60
|
// Check filename length to prevent DoS
|
|
129
61
|
if (filename.length > 1024) {
|
|
130
|
-
throw new
|
|
62
|
+
throw new HandlerError(`Invalid filename for ${toolName}. Filename too long`, toolName, 'INVALID_ARGUMENT', { field: 'filename', length: filename.length, maxLength: 1024 });
|
|
131
63
|
}
|
|
132
64
|
}
|
|
133
65
|
/** Format log operation message */
|
|
@@ -159,4 +91,70 @@ export function formatLogMessage(operation, params = {}) {
|
|
|
159
91
|
}
|
|
160
92
|
return parts.join(' ');
|
|
161
93
|
}
|
|
94
|
+
function isPathWithinRoot(rootPath, candidatePath) {
|
|
95
|
+
const rel = relative(rootPath, candidatePath);
|
|
96
|
+
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
97
|
+
}
|
|
98
|
+
function resolvePathForBoundaryCheck(inputPath) {
|
|
99
|
+
const normalizedPath = resolve(inputPath);
|
|
100
|
+
if (existsSync(normalizedPath)) {
|
|
101
|
+
return realpathSync(normalizedPath);
|
|
102
|
+
}
|
|
103
|
+
// Resolve symlinks in the nearest existing parent so non-existing targets are checked safely.
|
|
104
|
+
let parentPath = normalizedPath;
|
|
105
|
+
while (true) {
|
|
106
|
+
const nextParent = resolve(parentPath, '..');
|
|
107
|
+
if (nextParent === parentPath) {
|
|
108
|
+
return normalizedPath;
|
|
109
|
+
}
|
|
110
|
+
parentPath = nextParent;
|
|
111
|
+
if (!existsSync(parentPath)) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const realParent = realpathSync(parentPath);
|
|
115
|
+
const relativeSuffix = relative(parentPath, normalizedPath);
|
|
116
|
+
return resolve(realParent, relativeSuffix);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Validate targetPath writes stay inside workspace roots (if discovered) or current working directory.
|
|
121
|
+
*/
|
|
122
|
+
export function validateTargetPathWithinWorkspace(targetPath, context, toolName) {
|
|
123
|
+
const hasExplicitTargetPath = typeof targetPath === 'string' && targetPath.trim().length > 0;
|
|
124
|
+
if (targetPath !== undefined && targetPath !== null && typeof targetPath !== 'string') {
|
|
125
|
+
throw new HandlerError(`Invalid targetPath for ${toolName}. targetPath must be a string when provided`, toolName, 'INVALID_ARGUMENT', { field: 'targetPath', actualType: typeof targetPath });
|
|
126
|
+
}
|
|
127
|
+
if (typeof targetPath === 'string' && (targetPath.includes('\0') || targetPath.includes('\x00'))) {
|
|
128
|
+
throw new HandlerError(`Invalid targetPath for ${toolName}. Contains invalid characters`, toolName, 'INVALID_ARGUMENT', { field: 'targetPath', reason: 'invalid_characters' });
|
|
129
|
+
}
|
|
130
|
+
const resolvedTargetPath = hasExplicitTargetPath
|
|
131
|
+
? resolve(targetPath)
|
|
132
|
+
: resolve(process.cwd());
|
|
133
|
+
const canonicalTargetPath = resolvePathForBoundaryCheck(resolvedTargetPath);
|
|
134
|
+
const workspaceRoots = context.handlerContext.workspaceRootsService
|
|
135
|
+
?.getRoots()
|
|
136
|
+
.map(root => resolve(root.path)) ?? [];
|
|
137
|
+
const cwdRoot = resolve(process.cwd());
|
|
138
|
+
const homeRoot = resolve(homedir());
|
|
139
|
+
if (workspaceRoots.length === 0 && cwdRoot === homeRoot) {
|
|
140
|
+
throw new HandlerError(`Invalid targetPath for ${toolName}. Workspace roots are unavailable and current working directory resolves to the home directory`, toolName, 'TARGET_PATH_OUTSIDE_WORKSPACE', {
|
|
141
|
+
field: 'targetPath',
|
|
142
|
+
targetPath: canonicalTargetPath,
|
|
143
|
+
cwd: cwdRoot,
|
|
144
|
+
reason: 'home_directory_cwd_without_workspace_roots',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const allowedRoots = (workspaceRoots.length > 0
|
|
148
|
+
? workspaceRoots
|
|
149
|
+
: [cwdRoot]).map(root => resolvePathForBoundaryCheck(root));
|
|
150
|
+
const isAllowed = allowedRoots.some(root => isPathWithinRoot(root, canonicalTargetPath));
|
|
151
|
+
if (!isAllowed) {
|
|
152
|
+
throw new HandlerError(`Invalid targetPath for ${toolName}. Path must be within workspace roots or current working directory`, toolName, 'TARGET_PATH_OUTSIDE_WORKSPACE', {
|
|
153
|
+
field: 'targetPath',
|
|
154
|
+
targetPath: canonicalTargetPath,
|
|
155
|
+
allowedRoots,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return hasExplicitTargetPath ? canonicalTargetPath : undefined;
|
|
159
|
+
}
|
|
162
160
|
//# sourceMappingURL=validation-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-helpers.js","sourceRoot":"","sources":["../../../src/core/handlers/validation-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"validation-helpers.js","sourceRoot":"","sources":["../../../src/core/handlers/validation-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,9 @@ export interface McpDevConfig {
|
|
|
10
10
|
export declare class InstructionAdvisor {
|
|
11
11
|
private readonly client;
|
|
12
12
|
private readonly logger;
|
|
13
|
+
private noticeEvaluated;
|
|
14
|
+
private noticeToShow?;
|
|
15
|
+
private hasShownNotice;
|
|
13
16
|
constructor(client: AgentInstructionsClient, logger: Logger);
|
|
14
17
|
/**
|
|
15
18
|
* Check if agent sync is disabled via mcp-dev.json in the workspace root.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instruction-advisor.d.ts","sourceRoot":"","sources":["../../src/core/instruction-advisor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"instruction-advisor.d.ts","sourceRoot":"","sources":["../../src/core/instruction-advisor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM;IAK3D;;OAEG;IACG,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYlE;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BvF,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA0E9C,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -7,6 +7,9 @@ import path from 'path';
|
|
|
7
7
|
export class InstructionAdvisor {
|
|
8
8
|
client;
|
|
9
9
|
logger;
|
|
10
|
+
noticeEvaluated = false;
|
|
11
|
+
noticeToShow;
|
|
12
|
+
hasShownNotice = false;
|
|
10
13
|
constructor(client, logger) {
|
|
11
14
|
this.client = client;
|
|
12
15
|
this.logger = logger;
|
|
@@ -57,6 +60,16 @@ export class InstructionAdvisor {
|
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
async getNotice() {
|
|
63
|
+
if (this.hasShownNotice) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (this.noticeEvaluated) {
|
|
67
|
+
if (this.noticeToShow) {
|
|
68
|
+
this.hasShownNotice = true;
|
|
69
|
+
return this.noticeToShow;
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
60
73
|
try {
|
|
61
74
|
const status = await this.client.getStatus();
|
|
62
75
|
this.logger.debug('[InstructionAdvisor] Status', {
|
|
@@ -69,15 +82,20 @@ export class InstructionAdvisor {
|
|
|
69
82
|
});
|
|
70
83
|
// If we cannot determine a workspace root, skip the notice (can't reliably detect presence)
|
|
71
84
|
if (!status.workspaceRoot) {
|
|
85
|
+
// Not definitive yet: workspace roots may be discovered later.
|
|
72
86
|
return undefined;
|
|
73
87
|
}
|
|
74
88
|
// Check if agent sync is disabled via mcp-dev.json
|
|
75
89
|
const syncDisabled = await this.isAgentSyncDisabled(status.workspaceRoot);
|
|
76
90
|
if (syncDisabled) {
|
|
77
91
|
this.logger.debug('[InstructionAdvisor] Agent sync disabled via mcp-dev.json');
|
|
92
|
+
this.noticeEvaluated = true;
|
|
93
|
+
this.noticeToShow = undefined;
|
|
78
94
|
return undefined;
|
|
79
95
|
}
|
|
80
96
|
if (status.hasAgents && status.hasSkills) {
|
|
97
|
+
this.noticeEvaluated = true;
|
|
98
|
+
this.noticeToShow = undefined;
|
|
81
99
|
return undefined;
|
|
82
100
|
}
|
|
83
101
|
const missingParts = [];
|
|
@@ -91,7 +109,7 @@ export class InstructionAdvisor {
|
|
|
91
109
|
? `Missing skills: ${status.missingSkills.join(', ')}`
|
|
92
110
|
: 'All skills will be installed.';
|
|
93
111
|
this.logger.debug('[InstructionAdvisor] Issuing workspace-root notice');
|
|
94
|
-
|
|
112
|
+
this.noticeToShow = [
|
|
95
113
|
'📋 Agent instructions available for this SFCC project.',
|
|
96
114
|
`Missing: ${missingParts.join(' + ')}`,
|
|
97
115
|
missingSkills,
|
|
@@ -101,6 +119,9 @@ export class InstructionAdvisor {
|
|
|
101
119
|
'If YES: Run sync_agent_instructions with dryRun=false',
|
|
102
120
|
'If NO: Create mcp-dev.json with {"disableAgentSync": true} to permanently disable this suggestion.',
|
|
103
121
|
].join('\n');
|
|
122
|
+
this.noticeEvaluated = true;
|
|
123
|
+
this.hasShownNotice = true;
|
|
124
|
+
return this.noticeToShow;
|
|
104
125
|
}
|
|
105
126
|
catch (error) {
|
|
106
127
|
this.logger.debug('InstructionAdvisor failed to evaluate status', error);
|
|
@@ -108,7 +129,9 @@ export class InstructionAdvisor {
|
|
|
108
129
|
}
|
|
109
130
|
}
|
|
110
131
|
reset() {
|
|
111
|
-
|
|
132
|
+
this.noticeEvaluated = false;
|
|
133
|
+
this.noticeToShow = undefined;
|
|
134
|
+
this.hasShownNotice = false;
|
|
112
135
|
}
|
|
113
136
|
}
|
|
114
137
|
//# sourceMappingURL=instruction-advisor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instruction-advisor.js","sourceRoot":"","sources":["../../src/core/instruction-advisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAQxB;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAA0B;IAChC,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"instruction-advisor.js","sourceRoot":"","sources":["../../src/core/instruction-advisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { ToolArgumentValidator } from './tool-argument-validator.js';
|
|
3
|
+
import { BaseToolHandler } from './handlers/base-handler.js';
|
|
4
|
+
import { Logger } from '../utils/logger.js';
|
|
5
|
+
import { LogCapabilityState } from './server-tool-catalog.js';
|
|
6
|
+
export type ProgressToken = string | number;
|
|
7
|
+
export interface ToolRequestExecutionExtras {
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
sendNotification?: (notification: {
|
|
10
|
+
method: string;
|
|
11
|
+
params?: Record<string, unknown>;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
interface ToolCallRequest {
|
|
15
|
+
params: {
|
|
16
|
+
name: string;
|
|
17
|
+
arguments?: Record<string, unknown>;
|
|
18
|
+
_meta?: {
|
|
19
|
+
progressToken?: ProgressToken;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface ToolCallLifecycleContext {
|
|
24
|
+
logger: Logger;
|
|
25
|
+
getHandlers: () => BaseToolHandler[];
|
|
26
|
+
logCapabilityToolNames: Set<string>;
|
|
27
|
+
ensureLogCapabilityResolved: () => Promise<void>;
|
|
28
|
+
isToolAvailable: (toolName: string) => boolean;
|
|
29
|
+
getCapabilitySnapshot: () => {
|
|
30
|
+
logCapabilityState: LogCapabilityState;
|
|
31
|
+
canAccessOCAPI: boolean;
|
|
32
|
+
};
|
|
33
|
+
toolArgumentValidator: ToolArgumentValidator;
|
|
34
|
+
getPreflightNotice: () => Promise<string | undefined>;
|
|
35
|
+
}
|
|
36
|
+
export declare function createToolCallHandler(context: ToolCallLifecycleContext): (request: ToolCallRequest, extra?: ToolRequestExecutionExtras) => Promise<CallToolResult>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=server-tool-call-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-tool-call-lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/server-tool-call-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,EAAE,eAAe,EAAuB,MAAM,4BAA4B,CAAC;AAElF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1G;AAED,UAAU,eAAe;IACvB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,KAAK,CAAC,EAAE;YAAE,aAAa,CAAC,EAAE,aAAa,CAAA;SAAE,CAAC;KAC3C,CAAC;CACH;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,eAAe,EAAE,CAAC;IACrC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,2BAA2B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC/C,qBAAqB,EAAE,MAAM;QAC3B,kBAAkB,EAAE,kBAAkB,CAAC;QACvC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,kBAAkB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,wBAAwB,GAChC,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,0BAA0B,KAAK,OAAO,CAAC,cAAc,CAAC,CAqF3F"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createToolErrorResponse } from './tool-error-response.js';
|
|
2
|
+
import { ValidationError } from '../utils/validator.js';
|
|
3
|
+
export function createToolCallHandler(context) {
|
|
4
|
+
return async (request, extra) => {
|
|
5
|
+
const { name, arguments: args } = request.params;
|
|
6
|
+
const startTime = Date.now();
|
|
7
|
+
const progressToken = request.params._meta?.progressToken;
|
|
8
|
+
const executionExtras = {
|
|
9
|
+
signal: extra?.signal,
|
|
10
|
+
sendNotification: extra?.sendNotification,
|
|
11
|
+
};
|
|
12
|
+
context.logger.methodEntry(`handleToolRequest:${name}`, args);
|
|
13
|
+
try {
|
|
14
|
+
assertRequestNotCancelled(name, executionExtras.signal);
|
|
15
|
+
await emitProgress(context.logger, executionExtras, progressToken, 0, 100, `Starting ${name}`);
|
|
16
|
+
if (context.logCapabilityToolNames.has(name)) {
|
|
17
|
+
await context.ensureLogCapabilityResolved();
|
|
18
|
+
}
|
|
19
|
+
assertRequestNotCancelled(name, executionExtras.signal);
|
|
20
|
+
await emitProgress(context.logger, executionExtras, progressToken, 20, 100, 'Resolving handler');
|
|
21
|
+
const handler = context.getHandlers().find((h) => h.canHandle(name));
|
|
22
|
+
if (!handler) {
|
|
23
|
+
throw new ValidationError(`Unknown tool: ${name}`, 'UNKNOWN_TOOL', { toolName: name });
|
|
24
|
+
}
|
|
25
|
+
if (!context.isToolAvailable(name)) {
|
|
26
|
+
const capabilitySnapshot = context.getCapabilitySnapshot();
|
|
27
|
+
throw new ValidationError(`Tool not available in current mode: ${name}`, 'TOOL_NOT_AVAILABLE', {
|
|
28
|
+
toolName: name,
|
|
29
|
+
canAccessLogs: capabilitySnapshot.logCapabilityState === 'available',
|
|
30
|
+
logCapabilityState: capabilitySnapshot.logCapabilityState,
|
|
31
|
+
canAccessOCAPI: capabilitySnapshot.canAccessOCAPI,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
assertRequestNotCancelled(name, executionExtras.signal);
|
|
35
|
+
await emitProgress(context.logger, executionExtras, progressToken, 40, 100, 'Validating arguments');
|
|
36
|
+
context.toolArgumentValidator.validate(name, args ?? {});
|
|
37
|
+
assertRequestNotCancelled(name, executionExtras.signal);
|
|
38
|
+
await emitProgress(context.logger, executionExtras, progressToken, 60, 100, 'Executing tool');
|
|
39
|
+
const preflightNotice = await context.getPreflightNotice();
|
|
40
|
+
const result = await awaitWithCancellation(name, handler.handle(name, args ?? {}, startTime), executionExtras.signal);
|
|
41
|
+
const decoratedResult = preflightNotice
|
|
42
|
+
? appendPreflightNotice(result, preflightNotice)
|
|
43
|
+
: result;
|
|
44
|
+
await emitProgress(context.logger, executionExtras, progressToken, 100, 100, `${name} complete`);
|
|
45
|
+
context.logger.debug(`Full response for ${name}:`, {
|
|
46
|
+
contentItems: decoratedResult.content?.length ?? 0,
|
|
47
|
+
contentTypes: (decoratedResult.content ?? []).map((item) => item.type),
|
|
48
|
+
hasStructuredContent: decoratedResult.structuredContent !== undefined,
|
|
49
|
+
isError: decoratedResult.isError ?? false,
|
|
50
|
+
});
|
|
51
|
+
return {
|
|
52
|
+
content: decoratedResult.content,
|
|
53
|
+
structuredContent: decoratedResult.structuredContent,
|
|
54
|
+
isError: decoratedResult.isError,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
context.logger.error(`Error handling tool "${name}":`, error);
|
|
59
|
+
context.logger.timing(`${name}_error`, startTime);
|
|
60
|
+
const errorResult = createToolErrorResponse(name, error);
|
|
61
|
+
context.logger.debug(`Error response for ${name}:`, errorResult);
|
|
62
|
+
return errorResult;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
context.logger.methodExit(`handleToolRequest:${name}`);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function appendPreflightNotice(result, notice) {
|
|
70
|
+
const trimmedNotice = notice.trim();
|
|
71
|
+
if (trimmedNotice.length === 0) {
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
const content = result?.content ?? [];
|
|
75
|
+
const alreadyIncluded = content.some((item) => item.type === 'text' && item.text === trimmedNotice);
|
|
76
|
+
if (alreadyIncluded) {
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
...result,
|
|
81
|
+
content: [...content, { type: 'text', text: trimmedNotice }],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function assertRequestNotCancelled(toolName, signal) {
|
|
85
|
+
if (signal?.aborted) {
|
|
86
|
+
throw new ValidationError(`Tool call cancelled: ${toolName}`, 'REQUEST_CANCELLED', { toolName });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function awaitWithCancellation(toolName, operation, signal) {
|
|
90
|
+
assertRequestNotCancelled(toolName, signal);
|
|
91
|
+
if (!signal) {
|
|
92
|
+
return operation;
|
|
93
|
+
}
|
|
94
|
+
return await new Promise((resolve, reject) => {
|
|
95
|
+
const onAbort = () => {
|
|
96
|
+
reject(new ValidationError(`Tool call cancelled: ${toolName}`, 'REQUEST_CANCELLED', { toolName }));
|
|
97
|
+
};
|
|
98
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
99
|
+
operation.then((value) => {
|
|
100
|
+
signal.removeEventListener('abort', onAbort);
|
|
101
|
+
resolve(value);
|
|
102
|
+
}, (error) => {
|
|
103
|
+
signal.removeEventListener('abort', onAbort);
|
|
104
|
+
reject(error);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
async function emitProgress(logger, extra, progressToken, progress, total, message) {
|
|
109
|
+
if (progressToken === undefined || !extra.sendNotification) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await extra.sendNotification({
|
|
114
|
+
method: 'notifications/progress',
|
|
115
|
+
params: {
|
|
116
|
+
progressToken,
|
|
117
|
+
progress,
|
|
118
|
+
total,
|
|
119
|
+
message,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
125
|
+
logger.debug(`[Server] Failed to emit progress notification: ${reason}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=server-tool-call-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-tool-call-lifecycle.js","sourceRoot":"","sources":["../../src/core/server-tool-call-lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiCxD,MAAM,UAAU,qBAAqB,CACnC,OAAiC;IAEjC,OAAO,KAAK,EAAE,OAAwB,EAAE,KAAkC,EAA2B,EAAE;QACrG,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC;QAC1D,MAAM,eAAe,GAA+B;YAClD,MAAM,EAAE,KAAK,EAAE,MAAM;YACrB,gBAAgB,EAAE,KAAK,EAAE,gBAAgB;SAC1C,CAAC;QAEF,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,yBAAyB,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC;YAE/F,IAAI,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,OAAO,CAAC,2BAA2B,EAAE,CAAC;YAC9C,CAAC;YAED,yBAAyB,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;YAEjG,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,eAAe,CAAC,iBAAiB,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,kBAAkB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBAC3D,MAAM,IAAI,eAAe,CACvB,uCAAuC,IAAI,EAAE,EAC7C,oBAAoB,EACpB;oBACE,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,kBAAkB,CAAC,kBAAkB,KAAK,WAAW;oBACpE,kBAAkB,EAAE,kBAAkB,CAAC,kBAAkB;oBACzD,cAAc,EAAE,kBAAkB,CAAC,cAAc;iBAClD,CACF,CAAC;YACJ,CAAC;YAED,yBAAyB,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;YAEpG,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;YAEzD,yBAAyB,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;YAE9F,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,MAAM,qBAAqB,CACxC,IAAI,EACJ,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,EAC3C,eAAe,CAAC,MAAM,CACvB,CAAC;YACF,MAAM,eAAe,GAAG,eAAe;gBACrC,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,eAAe,CAAC;gBAChD,CAAC,CAAC,MAAM,CAAC;YAEX,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,WAAW,CAAC,CAAC;YAEjG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,GAAG,EAAE;gBACjD,YAAY,EAAE,eAAe,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;gBAClD,YAAY,EAAE,CAAC,eAAe,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;gBACtE,oBAAoB,EAAE,eAAe,CAAC,iBAAiB,KAAK,SAAS;gBACrE,OAAO,EAAE,eAAe,CAAC,OAAO,IAAI,KAAK;aAC1C,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,eAAe,CAAC,OAAO;gBAChC,iBAAiB,EAAE,eAAe,CAAC,iBAAiB;gBACpD,OAAO,EAAE,eAAe,CAAC,OAAO;aACjC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,QAAQ,EAAE,SAAS,CAAC,CAAC;YAClD,MAAM,WAAW,GAAmB,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,IAAI,GAAG,EAAE,WAAW,CAAC,CAAC;YACjE,OAAO,WAAW,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA2B,EAAE,MAAc;IACxE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IACpG,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,QAAgB,EAAE,MAAoB;IACvE,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CACvB,wBAAwB,QAAQ,EAAE,EAClC,mBAAmB,EACnB,EAAE,QAAQ,EAAE,CACb,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAgB,EAChB,SAAqB,EACrB,MAAoB;IAEpB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,IAAI,eAAe,CACxB,wBAAwB,QAAQ,EAAE,EAClC,mBAAmB,EACnB,EAAE,QAAQ,EAAE,CACb,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,SAAS,CAAC,IAAI,CACZ,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,KAAiC,EACjC,aAAwC,EACxC,QAAgB,EAChB,KAAa,EACb,OAAe;IAEf,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,gBAAgB,CAAC;YAC3B,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE;gBACN,aAAa;gBACb,QAAQ;gBACR,KAAK;gBACL,OAAO;aACR;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,kDAAkD,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type LogCapabilityState = 'available' | 'unavailable' | 'unknown';
|
|
2
|
+
export type ToolDefinition = {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: unknown;
|
|
6
|
+
};
|
|
7
|
+
export type ToolNameSets = {
|
|
8
|
+
alwaysAvailable: Set<string>;
|
|
9
|
+
logCapability: Set<string>;
|
|
10
|
+
ocapiCapability: Set<string>;
|
|
11
|
+
};
|
|
12
|
+
export declare const ALWAYS_AVAILABLE_TOOLS: ToolDefinition[];
|
|
13
|
+
export declare const LOG_CAPABILITY_TOOLS: ToolDefinition[];
|
|
14
|
+
export declare const OCAPI_CAPABILITY_TOOLS: ToolDefinition[];
|
|
15
|
+
export declare const ALL_TOOL_DEFINITIONS: ToolDefinition[];
|
|
16
|
+
export declare function createToolNameSets(): ToolNameSets;
|
|
17
|
+
export declare function getAvailableTools(logCapabilityState: LogCapabilityState, canAccessOCAPI: boolean): ToolDefinition[];
|
|
18
|
+
export declare function isToolAvailable(toolName: string, logCapabilityState: LogCapabilityState, canAccessOCAPI: boolean, toolNames: ToolNameSets): boolean;
|
|
19
|
+
//# sourceMappingURL=server-tool-catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-tool-catalog.d.ts","sourceRoot":"","sources":["../../src/core/server-tool-catalog.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAMlD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAIhD,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,cAAc,EAGlD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAIhD,CAAC;AAEF,wBAAgB,kBAAkB,IAAI,YAAY,CAMjD;AAED,wBAAgB,iBAAiB,CAC/B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,OAAO,GACtB,cAAc,EAAE,CAYlB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,OAAO,EACvB,SAAS,EAAE,YAAY,GACtB,OAAO,CAcT"}
|