@mako10k/shell-server 0.1.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.
- package/LICENSE +21 -0
- package/README.md +114 -0
- package/dist/backoffice/index.d.ts +2 -0
- package/dist/backoffice/index.d.ts.map +1 -0
- package/dist/backoffice/index.js +47 -0
- package/dist/backoffice/index.js.map +1 -0
- package/dist/backoffice/server.d.ts +45 -0
- package/dist/backoffice/server.d.ts.map +1 -0
- package/dist/backoffice/server.js +610 -0
- package/dist/backoffice/server.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +525 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config-manager.d.ts +80 -0
- package/dist/core/config-manager.d.ts.map +1 -0
- package/dist/core/config-manager.js +218 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/enhanced-history-manager.d.ts +84 -0
- package/dist/core/enhanced-history-manager.d.ts.map +1 -0
- package/dist/core/enhanced-history-manager.js +319 -0
- package/dist/core/enhanced-history-manager.js.map +1 -0
- package/dist/core/file-manager.d.ts +79 -0
- package/dist/core/file-manager.d.ts.map +1 -0
- package/dist/core/file-manager.js +338 -0
- package/dist/core/file-manager.js.map +1 -0
- package/dist/core/file-storage-subscriber.d.ts +38 -0
- package/dist/core/file-storage-subscriber.d.ts.map +1 -0
- package/dist/core/file-storage-subscriber.js +132 -0
- package/dist/core/file-storage-subscriber.js.map +1 -0
- package/dist/core/monitoring-manager.d.ts +32 -0
- package/dist/core/monitoring-manager.d.ts.map +1 -0
- package/dist/core/monitoring-manager.js +296 -0
- package/dist/core/monitoring-manager.js.map +1 -0
- package/dist/core/process-manager.d.ts +105 -0
- package/dist/core/process-manager.d.ts.map +1 -0
- package/dist/core/process-manager.js +1374 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/realtime-stream-subscriber.d.ts +93 -0
- package/dist/core/realtime-stream-subscriber.d.ts.map +1 -0
- package/dist/core/realtime-stream-subscriber.js +200 -0
- package/dist/core/realtime-stream-subscriber.js.map +1 -0
- package/dist/core/remote-http-client.d.ts +15 -0
- package/dist/core/remote-http-client.d.ts.map +1 -0
- package/dist/core/remote-http-client.js +60 -0
- package/dist/core/remote-http-client.js.map +1 -0
- package/dist/core/remote-process-service.d.ts +50 -0
- package/dist/core/remote-process-service.d.ts.map +1 -0
- package/dist/core/remote-process-service.js +20 -0
- package/dist/core/remote-process-service.js.map +1 -0
- package/dist/core/server-manager.d.ts +71 -0
- package/dist/core/server-manager.d.ts.map +1 -0
- package/dist/core/server-manager.js +680 -0
- package/dist/core/server-manager.js.map +1 -0
- package/dist/core/stream-publisher.d.ts +75 -0
- package/dist/core/stream-publisher.d.ts.map +1 -0
- package/dist/core/stream-publisher.js +127 -0
- package/dist/core/stream-publisher.js.map +1 -0
- package/dist/core/streaming-pipeline-reader.d.ts +67 -0
- package/dist/core/streaming-pipeline-reader.d.ts.map +1 -0
- package/dist/core/streaming-pipeline-reader.js +191 -0
- package/dist/core/streaming-pipeline-reader.js.map +1 -0
- package/dist/core/terminal-manager.d.ts +96 -0
- package/dist/core/terminal-manager.d.ts.map +1 -0
- package/dist/core/terminal-manager.js +515 -0
- package/dist/core/terminal-manager.js.map +1 -0
- package/dist/daemon/server.d.ts +8 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +416 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/uds-transport.d.ts +31 -0
- package/dist/daemon/uds-transport.d.ts.map +1 -0
- package/dist/daemon/uds-transport.js +149 -0
- package/dist/daemon/uds-transport.js.map +1 -0
- package/dist/executor/server.d.ts +20 -0
- package/dist/executor/server.d.ts.map +1 -0
- package/dist/executor/server.js +375 -0
- package/dist/executor/server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/daemon-runtime.d.ts +4 -0
- package/dist/runtime/daemon-runtime.d.ts.map +1 -0
- package/dist/runtime/daemon-runtime.js +4 -0
- package/dist/runtime/daemon-runtime.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/tool-runtime.d.ts +52 -0
- package/dist/runtime/tool-runtime.d.ts.map +1 -0
- package/dist/runtime/tool-runtime.js +161 -0
- package/dist/runtime/tool-runtime.js.map +1 -0
- package/dist/security/chat-completion-adapter.d.ts +443 -0
- package/dist/security/chat-completion-adapter.d.ts.map +1 -0
- package/dist/security/chat-completion-adapter.js +475 -0
- package/dist/security/chat-completion-adapter.js.map +1 -0
- package/dist/security/enhanced-evaluator.d.ts +139 -0
- package/dist/security/enhanced-evaluator.d.ts.map +1 -0
- package/dist/security/enhanced-evaluator.js +1208 -0
- package/dist/security/enhanced-evaluator.js.map +1 -0
- package/dist/security/evaluator-types.d.ts +614 -0
- package/dist/security/evaluator-types.d.ts.map +1 -0
- package/dist/security/evaluator-types.js +124 -0
- package/dist/security/evaluator-types.js.map +1 -0
- package/dist/security/manager.d.ts +76 -0
- package/dist/security/manager.d.ts.map +1 -0
- package/dist/security/manager.js +445 -0
- package/dist/security/manager.js.map +1 -0
- package/dist/security/security-llm-prompt-generator.d.ts +105 -0
- package/dist/security/security-llm-prompt-generator.d.ts.map +1 -0
- package/dist/security/security-llm-prompt-generator.js +323 -0
- package/dist/security/security-llm-prompt-generator.js.map +1 -0
- package/dist/security/security-tools.d.ts +174 -0
- package/dist/security/security-tools.d.ts.map +1 -0
- package/dist/security/security-tools.js +159 -0
- package/dist/security/security-tools.js.map +1 -0
- package/dist/security/validator-criteria-manager.d.ts +47 -0
- package/dist/security/validator-criteria-manager.d.ts.map +1 -0
- package/dist/security/validator-criteria-manager.js +169 -0
- package/dist/security/validator-criteria-manager.js.map +1 -0
- package/dist/tools/shell-tools.d.ts +474 -0
- package/dist/tools/shell-tools.d.ts.map +1 -0
- package/dist/tools/shell-tools.js +861 -0
- package/dist/tools/shell-tools.js.map +1 -0
- package/dist/types/enhanced-security.d.ts +529 -0
- package/dist/types/enhanced-security.d.ts.map +1 -0
- package/dist/types/enhanced-security.js +286 -0
- package/dist/types/enhanced-security.js.map +1 -0
- package/dist/types/index.d.ts +282 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +158 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/quick-schemas.d.ts +177 -0
- package/dist/types/quick-schemas.d.ts.map +1 -0
- package/dist/types/quick-schemas.js +113 -0
- package/dist/types/quick-schemas.js.map +1 -0
- package/dist/types/response-schemas.d.ts +41 -0
- package/dist/types/response-schemas.d.ts.map +1 -0
- package/dist/types/response-schemas.js +41 -0
- package/dist/types/response-schemas.js.map +1 -0
- package/dist/types/schemas.d.ts +578 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +498 -0
- package/dist/types/schemas.js.map +1 -0
- package/dist/utils/criteria-manager.d.ts +47 -0
- package/dist/utils/criteria-manager.d.ts.map +1 -0
- package/dist/utils/criteria-manager.js +228 -0
- package/dist/utils/criteria-manager.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +67 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/helpers.d.ts +85 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +400 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/json-repair.d.ts +23 -0
- package/dist/utils/json-repair.d.ts.map +1 -0
- package/dist/utils/json-repair.js +208 -0
- package/dist/utils/json-repair.js.map +1 -0
- package/dist/utils/process-utils.d.ts +31 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +217 -0
- package/dist/utils/process-utils.js.map +1 -0
- package/dist/utils/server-helpers.d.ts +4 -0
- package/dist/utils/server-helpers.d.ts.map +1 -0
- package/dist/utils/server-helpers.js +10 -0
- package/dist/utils/server-helpers.js.map +1 -0
- package/dist/utils/sse.d.ts +2 -0
- package/dist/utils/sse.d.ts.map +1 -0
- package/dist/utils/sse.js +6 -0
- package/dist/utils/sse.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Evaluation Tools for Function Calling
|
|
3
|
+
* New individual tool approach - each evaluation result has its own tool
|
|
4
|
+
*/
|
|
5
|
+
// Individual Security Evaluation Tools
|
|
6
|
+
export const allowTool = {
|
|
7
|
+
type: 'function',
|
|
8
|
+
function: {
|
|
9
|
+
name: 'allow',
|
|
10
|
+
description: 'Allow command execution - the command is safe to execute',
|
|
11
|
+
parameters: {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: {
|
|
14
|
+
reasoning: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: 'Detailed reasoning for why the command is safe'
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
required: ['reasoning'],
|
|
20
|
+
additionalProperties: false
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const denyTool = {
|
|
25
|
+
type: 'function',
|
|
26
|
+
function: {
|
|
27
|
+
name: 'deny',
|
|
28
|
+
description: 'Deny command execution - the command is too dangerous to execute',
|
|
29
|
+
parameters: {
|
|
30
|
+
type: "object",
|
|
31
|
+
properties: {
|
|
32
|
+
reasoning: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: 'Detailed reasoning for why the command is dangerous'
|
|
35
|
+
},
|
|
36
|
+
suggested_alternatives: {
|
|
37
|
+
type: "array",
|
|
38
|
+
items: { type: "string" },
|
|
39
|
+
description: 'List of safer alternative commands'
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: ['reasoning', 'suggested_alternatives'],
|
|
43
|
+
additionalProperties: false
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export const userConfirmTool = {
|
|
48
|
+
type: 'function',
|
|
49
|
+
function: {
|
|
50
|
+
name: 'user_confirm',
|
|
51
|
+
description: 'Request user confirmation - the command requires explicit user permission before execution',
|
|
52
|
+
parameters: {
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
reasoning: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description: 'Detailed reasoning for why user confirmation is needed'
|
|
58
|
+
},
|
|
59
|
+
confirmation_question: {
|
|
60
|
+
type: "string",
|
|
61
|
+
description: 'Specific question to ask the user for confirmation (include alternatives if applicable)'
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
required: ['reasoning', 'confirmation_question'],
|
|
65
|
+
additionalProperties: false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
export const addMoreHistoryTool = {
|
|
70
|
+
type: 'function',
|
|
71
|
+
function: {
|
|
72
|
+
name: 'add_more_history',
|
|
73
|
+
description: 'Request additional command history - need more system context to make a decision',
|
|
74
|
+
parameters: {
|
|
75
|
+
type: "object",
|
|
76
|
+
properties: {
|
|
77
|
+
reasoning: {
|
|
78
|
+
type: "string",
|
|
79
|
+
description: 'Detailed reasoning for why more history is needed'
|
|
80
|
+
},
|
|
81
|
+
command_history_depth: {
|
|
82
|
+
type: "number",
|
|
83
|
+
minimum: 1,
|
|
84
|
+
maximum: 50,
|
|
85
|
+
description: 'How many more commands back in history to examine'
|
|
86
|
+
},
|
|
87
|
+
execution_results_count: {
|
|
88
|
+
type: "number",
|
|
89
|
+
minimum: 0,
|
|
90
|
+
maximum: 10,
|
|
91
|
+
description: 'How many recent commands need their execution details'
|
|
92
|
+
},
|
|
93
|
+
user_intent_search_keywords: {
|
|
94
|
+
type: "array",
|
|
95
|
+
items: { type: "string" },
|
|
96
|
+
description: 'Keywords to search for in previous user intent responses'
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
required: ['reasoning', 'command_history_depth'],
|
|
100
|
+
additionalProperties: false
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
export const aiAssistantConfirmTool = {
|
|
105
|
+
type: 'function',
|
|
106
|
+
function: {
|
|
107
|
+
name: 'ai_assistant_confirm',
|
|
108
|
+
description: 'Request information from AI assistant - need additional context that assistant can provide',
|
|
109
|
+
parameters: {
|
|
110
|
+
type: "object",
|
|
111
|
+
properties: {
|
|
112
|
+
reasoning: {
|
|
113
|
+
type: "string",
|
|
114
|
+
description: 'Detailed reasoning for why assistant information is needed'
|
|
115
|
+
},
|
|
116
|
+
assistant_request_message: {
|
|
117
|
+
type: "string",
|
|
118
|
+
description: 'Specific message/question to show to the AI assistant'
|
|
119
|
+
},
|
|
120
|
+
next_action: {
|
|
121
|
+
type: "object",
|
|
122
|
+
description: 'Next action for the AI assistant to take',
|
|
123
|
+
properties: {
|
|
124
|
+
instruction: {
|
|
125
|
+
type: "string",
|
|
126
|
+
description: 'Clear instruction for what the assistant should do'
|
|
127
|
+
},
|
|
128
|
+
method: {
|
|
129
|
+
type: "string",
|
|
130
|
+
description: 'How the assistant should gather the required information'
|
|
131
|
+
},
|
|
132
|
+
expected_outcome: {
|
|
133
|
+
type: "string",
|
|
134
|
+
description: 'What result is expected from the assistant action'
|
|
135
|
+
},
|
|
136
|
+
executable_commands: {
|
|
137
|
+
type: "array",
|
|
138
|
+
items: { type: "string" },
|
|
139
|
+
description: 'List of specific commands the assistant should execute to gather information'
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
required: ['instruction', 'method', 'expected_outcome'],
|
|
143
|
+
additionalProperties: false
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
required: ['reasoning', 'assistant_request_message', 'next_action'],
|
|
147
|
+
additionalProperties: false
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
// Combined tools array for easy import
|
|
152
|
+
export const newSecurityEvaluationTools = [
|
|
153
|
+
allowTool,
|
|
154
|
+
denyTool,
|
|
155
|
+
userConfirmTool,
|
|
156
|
+
addMoreHistoryTool,
|
|
157
|
+
aiAssistantConfirmTool
|
|
158
|
+
];
|
|
159
|
+
//# sourceMappingURL=security-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-tools.js","sourceRoot":"","sources":["../../src/security/security-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator-side criteria management for security evaluation
|
|
3
|
+
* This manages criteria files that the Validator uses to evaluate commands
|
|
4
|
+
* Separate from MCP client-side criteria management for security isolation
|
|
5
|
+
*/
|
|
6
|
+
export interface ValidatorCriteriaConfig {
|
|
7
|
+
criteriaText: string;
|
|
8
|
+
lastModified: Date;
|
|
9
|
+
backupPath?: string | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare class ValidatorCriteriaManager {
|
|
12
|
+
private static instance;
|
|
13
|
+
private readonly defaultCriteriaPath;
|
|
14
|
+
private readonly backupDirectory;
|
|
15
|
+
private currentCriteria;
|
|
16
|
+
private lastFileModTime;
|
|
17
|
+
private constructor();
|
|
18
|
+
static getInstance(): ValidatorCriteriaManager;
|
|
19
|
+
/**
|
|
20
|
+
* Adjust validator criteria with backup support
|
|
21
|
+
*/
|
|
22
|
+
adjustCriteria(criteriaText: string, backupExisting?: boolean): Promise<{
|
|
23
|
+
success: boolean;
|
|
24
|
+
message: string;
|
|
25
|
+
backupPath?: string;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Load current criteria for validator use
|
|
29
|
+
*/
|
|
30
|
+
loadCriteria(): Promise<string | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Get current criteria configuration
|
|
33
|
+
*/
|
|
34
|
+
getCriteriaConfig(): Promise<ValidatorCriteriaConfig | null>;
|
|
35
|
+
private createBackup;
|
|
36
|
+
private getLatestBackupPath;
|
|
37
|
+
private ensureDirectoryExists;
|
|
38
|
+
/**
|
|
39
|
+
* Get criteria file paths for debugging
|
|
40
|
+
*/
|
|
41
|
+
getCriteriaPaths(): {
|
|
42
|
+
criteriaPath: string;
|
|
43
|
+
backupDirectory: string;
|
|
44
|
+
environmentVariable: string | undefined;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=validator-criteria-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator-criteria-manager.d.ts","sourceRoot":"","sources":["../../src/security/validator-criteria-manager.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AAEH,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAa;IAEpC,OAAO;WAWO,WAAW,IAAI,wBAAwB;IAOrD;;OAEG;IACU,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,GAAE,OAAc,GAAG,OAAO,CAAC;QACzF,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAoCF;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2BnD;;OAEG;IACU,iBAAiB,IAAI,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;YAwB3D,YAAY;IAQ1B,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,qBAAqB;IAW7B;;OAEG;IACI,gBAAgB,IAAI;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;KACzC;CAOF"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UNUSED (2025-08-13)
|
|
3
|
+
* This ValidatorCriteriaManager implementation is currently NOT referenced anywhere in the codebase.
|
|
4
|
+
* Rationale: A parallel design was explored to separate validator-side criteria storage from the
|
|
5
|
+
* generic criteria manager in `src/utils/criteria-manager.ts`. The active system now only uses the
|
|
6
|
+
* util-based functions (adjustCriteria / loadCriteria, etc.).
|
|
7
|
+
* We keep this file temporarily to preserve the concept of a future isolated validator process
|
|
8
|
+
* that might require a distinct storage path & singleton lifecycle with backup introspection.
|
|
9
|
+
* If this isolation is not implemented by a future release, this file should be deleted.
|
|
10
|
+
*
|
|
11
|
+
* To re-enable: import ValidatorCriteriaManager where validator-specific criteria loading is needed
|
|
12
|
+
* and replace direct calls to util `adjustCriteria` with the class API.
|
|
13
|
+
*/
|
|
14
|
+
import * as fs from 'fs';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { logger } from '../utils/helpers.js';
|
|
17
|
+
export class ValidatorCriteriaManager {
|
|
18
|
+
static instance;
|
|
19
|
+
defaultCriteriaPath;
|
|
20
|
+
backupDirectory;
|
|
21
|
+
currentCriteria = null;
|
|
22
|
+
lastFileModTime = 0;
|
|
23
|
+
constructor() {
|
|
24
|
+
// Default path for validator criteria (separate from MCP client path)
|
|
25
|
+
this.defaultCriteriaPath = process.env['VALIDATOR_CRITERIA_PATH'] ||
|
|
26
|
+
'/tmp/mcp-shell-server/validator_criteria.txt';
|
|
27
|
+
this.backupDirectory = path.dirname(this.defaultCriteriaPath) + '/criteria_backups';
|
|
28
|
+
// Ensure directories exist
|
|
29
|
+
this.ensureDirectoryExists(path.dirname(this.defaultCriteriaPath));
|
|
30
|
+
this.ensureDirectoryExists(this.backupDirectory);
|
|
31
|
+
}
|
|
32
|
+
static getInstance() {
|
|
33
|
+
if (!ValidatorCriteriaManager.instance) {
|
|
34
|
+
ValidatorCriteriaManager.instance = new ValidatorCriteriaManager();
|
|
35
|
+
}
|
|
36
|
+
return ValidatorCriteriaManager.instance;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Adjust validator criteria with backup support
|
|
40
|
+
*/
|
|
41
|
+
async adjustCriteria(criteriaText, backupExisting = true) {
|
|
42
|
+
try {
|
|
43
|
+
let backupPath;
|
|
44
|
+
// Create backup if requested and file exists
|
|
45
|
+
if (backupExisting && fs.existsSync(this.defaultCriteriaPath)) {
|
|
46
|
+
backupPath = await this.createBackup();
|
|
47
|
+
logger.info('Validator criteria backup created', { backupPath });
|
|
48
|
+
}
|
|
49
|
+
// Write new criteria
|
|
50
|
+
await fs.promises.writeFile(this.defaultCriteriaPath, criteriaText, 'utf-8');
|
|
51
|
+
// Update cached criteria
|
|
52
|
+
this.currentCriteria = criteriaText;
|
|
53
|
+
this.lastFileModTime = Date.now();
|
|
54
|
+
logger.info('Validator criteria updated successfully', {
|
|
55
|
+
criteriaLength: criteriaText.length,
|
|
56
|
+
backupCreated: !!backupPath
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
success: true,
|
|
60
|
+
message: 'Validator criteria updated successfully',
|
|
61
|
+
...(backupPath && { backupPath })
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
logger.error('Failed to adjust validator criteria', { error });
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
message: `Failed to update criteria: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Load current criteria for validator use
|
|
74
|
+
*/
|
|
75
|
+
async loadCriteria() {
|
|
76
|
+
try {
|
|
77
|
+
if (!fs.existsSync(this.defaultCriteriaPath)) {
|
|
78
|
+
logger.debug('Validator criteria file not found, using default criteria');
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
const fileStats = await fs.promises.stat(this.defaultCriteriaPath);
|
|
82
|
+
const currentModTime = fileStats.mtime.getTime();
|
|
83
|
+
// Reload if file was modified or not cached
|
|
84
|
+
if (currentModTime !== this.lastFileModTime || this.currentCriteria === null) {
|
|
85
|
+
this.currentCriteria = await fs.promises.readFile(this.defaultCriteriaPath, 'utf-8');
|
|
86
|
+
this.lastFileModTime = currentModTime;
|
|
87
|
+
logger.debug('Validator criteria loaded/refreshed', {
|
|
88
|
+
criteriaLength: this.currentCriteria.length,
|
|
89
|
+
lastModified: new Date(currentModTime).toISOString()
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return this.currentCriteria;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
logger.error('Failed to load validator criteria', { error });
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get current criteria configuration
|
|
101
|
+
*/
|
|
102
|
+
async getCriteriaConfig() {
|
|
103
|
+
try {
|
|
104
|
+
if (!fs.existsSync(this.defaultCriteriaPath)) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const criteriaText = await this.loadCriteria();
|
|
108
|
+
if (!criteriaText) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const fileStats = await fs.promises.stat(this.defaultCriteriaPath);
|
|
112
|
+
return {
|
|
113
|
+
criteriaText,
|
|
114
|
+
lastModified: fileStats.mtime,
|
|
115
|
+
...(this.getLatestBackupPath() && { backupPath: this.getLatestBackupPath() })
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
logger.error('Failed to get validator criteria config', { error });
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
async createBackup() {
|
|
124
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
125
|
+
const backupPath = path.join(this.backupDirectory, `validator_criteria_${timestamp}.txt`);
|
|
126
|
+
await fs.promises.copyFile(this.defaultCriteriaPath, backupPath);
|
|
127
|
+
return backupPath;
|
|
128
|
+
}
|
|
129
|
+
getLatestBackupPath() {
|
|
130
|
+
try {
|
|
131
|
+
if (!fs.existsSync(this.backupDirectory)) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
const backupFiles = fs.readdirSync(this.backupDirectory)
|
|
135
|
+
.filter(file => file.startsWith('validator_criteria_') && file.endsWith('.txt'))
|
|
136
|
+
.sort()
|
|
137
|
+
.reverse();
|
|
138
|
+
return backupFiles.length > 0 && backupFiles[0]
|
|
139
|
+
? path.join(this.backupDirectory, backupFiles[0])
|
|
140
|
+
: undefined;
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
logger.warn('Failed to find latest backup', { error });
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
ensureDirectoryExists(dirPath) {
|
|
148
|
+
try {
|
|
149
|
+
if (!fs.existsSync(dirPath)) {
|
|
150
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
151
|
+
logger.debug('Validator criteria directory created', { dirPath });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
logger.error('Failed to create validator criteria directory', { dirPath, error });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get criteria file paths for debugging
|
|
160
|
+
*/
|
|
161
|
+
getCriteriaPaths() {
|
|
162
|
+
return {
|
|
163
|
+
criteriaPath: this.defaultCriteriaPath,
|
|
164
|
+
backupDirectory: this.backupDirectory,
|
|
165
|
+
environmentVariable: process.env['VALIDATOR_CRITERIA_PATH']
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=validator-criteria-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator-criteria-manager.js","sourceRoot":"","sources":["../../src/security/validator-criteria-manager.ts"],"names":[],"mappings":"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"}
|