@llm-dev-ops/agentics-cli 1.3.7 → 1.3.9
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/dist/adapters/base-adapter.d.ts +58 -1
- package/dist/adapters/base-adapter.d.ts.map +1 -1
- package/dist/adapters/base-adapter.js +110 -0
- package/dist/adapters/base-adapter.js.map +1 -1
- package/dist/cli/index.js +992 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/deploy.d.ts +95 -13
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +420 -14
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/erp.d.ts +302 -0
- package/dist/commands/erp.d.ts.map +1 -0
- package/dist/commands/erp.js +1064 -0
- package/dist/commands/erp.js.map +1 -0
- package/dist/commands/export.d.ts +40 -13
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +434 -14
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/index.d.ts +20 -12
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +10 -6
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/inspect.d.ts +84 -18
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +585 -131
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/logout.d.ts +34 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +73 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/plan.d.ts +147 -14
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +557 -16
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/policy.d.ts +136 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +460 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/quantify.d.ts +131 -13
- package/dist/commands/quantify.d.ts.map +1 -1
- package/dist/commands/quantify.js +425 -14
- package/dist/commands/quantify.js.map +1 -1
- package/dist/commands/simulate.d.ts +119 -13
- package/dist/commands/simulate.d.ts.map +1 -1
- package/dist/commands/simulate.js +363 -14
- package/dist/commands/simulate.js.map +1 -1
- package/dist/commands/usage.d.ts +110 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +507 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/whoami.d.ts +33 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +93 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config/endpoints.d.ts.map +1 -1
- package/dist/config/endpoints.js +16 -1
- package/dist/config/endpoints.js.map +1 -1
- package/dist/contracts/schemas/index.d.ts +4 -0
- package/dist/contracts/schemas/index.d.ts.map +1 -1
- package/dist/contracts/schemas/index.js +2 -0
- package/dist/contracts/schemas/index.js.map +1 -1
- package/dist/contracts/validator.d.ts.map +1 -1
- package/dist/contracts/validator.js +55 -148
- package/dist/contracts/validator.js.map +1 -1
- package/dist/modules/artifact-handoff.d.ts +5 -0
- package/dist/modules/artifact-handoff.d.ts.map +1 -1
- package/dist/modules/artifact-handoff.js +47 -11
- package/dist/modules/artifact-handoff.js.map +1 -1
- package/dist/modules/command-parser.d.ts +1 -1
- package/dist/modules/command-parser.d.ts.map +1 -1
- package/dist/modules/command-parser.js +6 -1
- package/dist/modules/command-parser.js.map +1 -1
- package/dist/modules/output-renderer.d.ts +1 -0
- package/dist/modules/output-renderer.d.ts.map +1 -1
- package/dist/modules/output-renderer.js +25 -1
- package/dist/modules/output-renderer.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Command - Standalone CRUD Command for Policy Management
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE:
|
|
5
|
+
* - This is a TERMINAL command with its own control flow
|
|
6
|
+
* - Does NOT participate in orchestration pipelines
|
|
7
|
+
* - Uses local file-based persistence in .agentics/policies/
|
|
8
|
+
* - Has its own error handling and exit codes
|
|
9
|
+
*
|
|
10
|
+
* SUBCOMMANDS:
|
|
11
|
+
* - list List all policies
|
|
12
|
+
* - inspect Inspect a specific policy by ID
|
|
13
|
+
* - create Create a new policy
|
|
14
|
+
* - edit Edit an existing policy
|
|
15
|
+
* - delete Delete a policy
|
|
16
|
+
* - enable Enable a policy
|
|
17
|
+
* - disable Disable a policy
|
|
18
|
+
*/
|
|
19
|
+
import type { CommandOptions } from '../types/index.js';
|
|
20
|
+
export declare const POLICY_EXIT_CODES: {
|
|
21
|
+
readonly SUCCESS: 0;
|
|
22
|
+
readonly INPUT_ERROR: 100;
|
|
23
|
+
readonly NOT_FOUND: 100;
|
|
24
|
+
readonly ALREADY_EXISTS: 100;
|
|
25
|
+
readonly INVALID_STATE: 100;
|
|
26
|
+
readonly IO_ERROR: 74;
|
|
27
|
+
readonly UNEXPECTED_ERROR: 1;
|
|
28
|
+
};
|
|
29
|
+
export interface Policy {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
type: PolicyType;
|
|
34
|
+
status: PolicyStatus;
|
|
35
|
+
rules: PolicyRule[];
|
|
36
|
+
created_at: string;
|
|
37
|
+
updated_at: string;
|
|
38
|
+
version: number;
|
|
39
|
+
metadata?: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
export type PolicyType = 'access-control' | 'rate-limit' | 'cost-limit' | 'compliance' | 'security' | 'custom';
|
|
42
|
+
export type PolicyStatus = 'enabled' | 'disabled' | 'draft';
|
|
43
|
+
export interface PolicyRule {
|
|
44
|
+
id: string;
|
|
45
|
+
condition: string;
|
|
46
|
+
action: 'allow' | 'deny' | 'warn' | 'log';
|
|
47
|
+
priority: number;
|
|
48
|
+
}
|
|
49
|
+
export interface PolicyListInput {
|
|
50
|
+
status?: PolicyStatus;
|
|
51
|
+
type?: PolicyType;
|
|
52
|
+
limit?: number;
|
|
53
|
+
}
|
|
54
|
+
export interface PolicyListResult {
|
|
55
|
+
policies: Policy[];
|
|
56
|
+
count: number;
|
|
57
|
+
timing: number;
|
|
58
|
+
}
|
|
59
|
+
export interface PolicyInspectInput {
|
|
60
|
+
id: string;
|
|
61
|
+
}
|
|
62
|
+
export interface PolicyInspectResult {
|
|
63
|
+
policy: Policy | null;
|
|
64
|
+
found: boolean;
|
|
65
|
+
timing: number;
|
|
66
|
+
}
|
|
67
|
+
export interface PolicyCreateInput {
|
|
68
|
+
name: string;
|
|
69
|
+
description?: string;
|
|
70
|
+
type?: PolicyType;
|
|
71
|
+
rules?: PolicyRule[];
|
|
72
|
+
metadata?: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
export interface PolicyCreateResult {
|
|
75
|
+
policy: Policy;
|
|
76
|
+
timing: number;
|
|
77
|
+
}
|
|
78
|
+
export interface PolicyEditInput {
|
|
79
|
+
id: string;
|
|
80
|
+
name?: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
type?: PolicyType;
|
|
83
|
+
rules?: PolicyRule[];
|
|
84
|
+
metadata?: Record<string, unknown>;
|
|
85
|
+
}
|
|
86
|
+
export interface PolicyEditResult {
|
|
87
|
+
policy: Policy;
|
|
88
|
+
timing: number;
|
|
89
|
+
}
|
|
90
|
+
export interface PolicyDeleteInput {
|
|
91
|
+
id: string;
|
|
92
|
+
}
|
|
93
|
+
export interface PolicyDeleteResult {
|
|
94
|
+
deleted: boolean;
|
|
95
|
+
id: string;
|
|
96
|
+
timing: number;
|
|
97
|
+
}
|
|
98
|
+
export interface PolicyToggleInput {
|
|
99
|
+
id: string;
|
|
100
|
+
}
|
|
101
|
+
export interface PolicyToggleResult {
|
|
102
|
+
policy: Policy;
|
|
103
|
+
previous_status: PolicyStatus;
|
|
104
|
+
timing: number;
|
|
105
|
+
}
|
|
106
|
+
export declare function formatPolicyForDisplay(policy: Policy): string;
|
|
107
|
+
export declare function formatPoliciesListForDisplay(policies: Policy[]): string;
|
|
108
|
+
/**
|
|
109
|
+
* List all policies with optional filtering
|
|
110
|
+
*/
|
|
111
|
+
export declare function executePolicyListCommand(input: PolicyListInput, _options: CommandOptions): Promise<PolicyListResult>;
|
|
112
|
+
/**
|
|
113
|
+
* Inspect a specific policy by ID
|
|
114
|
+
*/
|
|
115
|
+
export declare function executePolicyInspectCommand(input: PolicyInspectInput, _options: CommandOptions): Promise<PolicyInspectResult>;
|
|
116
|
+
/**
|
|
117
|
+
* Create a new policy
|
|
118
|
+
*/
|
|
119
|
+
export declare function executePolicyCreateCommand(input: PolicyCreateInput, options: CommandOptions): Promise<PolicyCreateResult>;
|
|
120
|
+
/**
|
|
121
|
+
* Edit an existing policy
|
|
122
|
+
*/
|
|
123
|
+
export declare function executePolicyEditCommand(input: PolicyEditInput, options: CommandOptions): Promise<PolicyEditResult>;
|
|
124
|
+
/**
|
|
125
|
+
* Delete a policy
|
|
126
|
+
*/
|
|
127
|
+
export declare function executePolicyDeleteCommand(input: PolicyDeleteInput, options: CommandOptions): Promise<PolicyDeleteResult>;
|
|
128
|
+
/**
|
|
129
|
+
* Enable a policy
|
|
130
|
+
*/
|
|
131
|
+
export declare function executePolicyEnableCommand(input: PolicyToggleInput, options: CommandOptions): Promise<PolicyToggleResult>;
|
|
132
|
+
/**
|
|
133
|
+
* Disable a policy
|
|
134
|
+
*/
|
|
135
|
+
export declare function executePolicyDisableCommand(input: PolicyToggleInput, options: CommandOptions): Promise<PolicyToggleResult>;
|
|
136
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/commands/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,460 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy Command - Standalone CRUD Command for Policy Management
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE:
|
|
5
|
+
* - This is a TERMINAL command with its own control flow
|
|
6
|
+
* - Does NOT participate in orchestration pipelines
|
|
7
|
+
* - Uses local file-based persistence in .agentics/policies/
|
|
8
|
+
* - Has its own error handling and exit codes
|
|
9
|
+
*
|
|
10
|
+
* SUBCOMMANDS:
|
|
11
|
+
* - list List all policies
|
|
12
|
+
* - inspect Inspect a specific policy by ID
|
|
13
|
+
* - create Create a new policy
|
|
14
|
+
* - edit Edit an existing policy
|
|
15
|
+
* - delete Delete a policy
|
|
16
|
+
* - enable Enable a policy
|
|
17
|
+
* - disable Disable a policy
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'node:fs';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import { CLIError } from '../errors/index.js';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Policy-Specific Exit Codes
|
|
24
|
+
// ============================================================================
|
|
25
|
+
export const POLICY_EXIT_CODES = {
|
|
26
|
+
SUCCESS: 0,
|
|
27
|
+
INPUT_ERROR: 100,
|
|
28
|
+
NOT_FOUND: 100, // Use ARG_VALIDATION_ERROR for not found
|
|
29
|
+
ALREADY_EXISTS: 100,
|
|
30
|
+
INVALID_STATE: 100,
|
|
31
|
+
IO_ERROR: 74,
|
|
32
|
+
UNEXPECTED_ERROR: 1,
|
|
33
|
+
};
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Storage Configuration
|
|
36
|
+
// ============================================================================
|
|
37
|
+
function getPoliciesDir() {
|
|
38
|
+
const baseDir = process.env['AGENTICS_DATA_DIR'] ?? process.cwd();
|
|
39
|
+
return path.join(baseDir, '.agentics', 'policies');
|
|
40
|
+
}
|
|
41
|
+
function ensurePoliciesDir() {
|
|
42
|
+
const dir = getPoliciesDir();
|
|
43
|
+
if (!fs.existsSync(dir)) {
|
|
44
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function getPolicyPath(id) {
|
|
48
|
+
return path.join(getPoliciesDir(), `${id}.json`);
|
|
49
|
+
}
|
|
50
|
+
// ============================================================================
|
|
51
|
+
// Storage Operations
|
|
52
|
+
// ============================================================================
|
|
53
|
+
function loadPolicy(id) {
|
|
54
|
+
const filePath = getPolicyPath(id);
|
|
55
|
+
if (!fs.existsSync(filePath)) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
60
|
+
return JSON.parse(content);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function savePolicy(policy) {
|
|
67
|
+
ensurePoliciesDir();
|
|
68
|
+
const filePath = getPolicyPath(policy.id);
|
|
69
|
+
fs.writeFileSync(filePath, JSON.stringify(policy, null, 2), 'utf-8');
|
|
70
|
+
}
|
|
71
|
+
function deletePolicy(id) {
|
|
72
|
+
const filePath = getPolicyPath(id);
|
|
73
|
+
if (!fs.existsSync(filePath)) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
fs.unlinkSync(filePath);
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
function listAllPolicies() {
|
|
80
|
+
const dir = getPoliciesDir();
|
|
81
|
+
if (!fs.existsSync(dir)) {
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
const files = fs.readdirSync(dir).filter(f => f.endsWith('.json'));
|
|
85
|
+
const policies = [];
|
|
86
|
+
for (const file of files) {
|
|
87
|
+
try {
|
|
88
|
+
const content = fs.readFileSync(path.join(dir, file), 'utf-8');
|
|
89
|
+
policies.push(JSON.parse(content));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Skip invalid files
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return policies;
|
|
96
|
+
}
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// ID Generation
|
|
99
|
+
// ============================================================================
|
|
100
|
+
function generatePolicyId() {
|
|
101
|
+
const timestamp = Date.now().toString(36);
|
|
102
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
103
|
+
return `pol-${timestamp}-${random}`;
|
|
104
|
+
}
|
|
105
|
+
function generateRuleId() {
|
|
106
|
+
const random = Math.random().toString(36).substring(2, 10);
|
|
107
|
+
return `rule-${random}`;
|
|
108
|
+
}
|
|
109
|
+
// ============================================================================
|
|
110
|
+
// Validation
|
|
111
|
+
// ============================================================================
|
|
112
|
+
function validatePolicyId(id, correlationId) {
|
|
113
|
+
if (!id || typeof id !== 'string' || id.trim() === '') {
|
|
114
|
+
throw new CLIError({
|
|
115
|
+
code: 'ECLI-POLICY-001',
|
|
116
|
+
category: 'INPUT_ERROR',
|
|
117
|
+
message: 'Policy ID is required',
|
|
118
|
+
details: { provided: id },
|
|
119
|
+
module: 'policy',
|
|
120
|
+
correlationId,
|
|
121
|
+
recoverable: false,
|
|
122
|
+
exitCode: POLICY_EXIT_CODES.INPUT_ERROR,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function validatePolicyName(name, correlationId) {
|
|
127
|
+
if (!name || typeof name !== 'string' || name.trim() === '') {
|
|
128
|
+
throw new CLIError({
|
|
129
|
+
code: 'ECLI-POLICY-002',
|
|
130
|
+
category: 'INPUT_ERROR',
|
|
131
|
+
message: 'Policy name is required',
|
|
132
|
+
details: { provided: name },
|
|
133
|
+
module: 'policy',
|
|
134
|
+
correlationId,
|
|
135
|
+
recoverable: false,
|
|
136
|
+
exitCode: POLICY_EXIT_CODES.INPUT_ERROR,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
if (name.length > 256) {
|
|
140
|
+
throw new CLIError({
|
|
141
|
+
code: 'ECLI-POLICY-003',
|
|
142
|
+
category: 'INPUT_ERROR',
|
|
143
|
+
message: 'Policy name cannot exceed 256 characters',
|
|
144
|
+
details: { provided_length: name.length, max_length: 256 },
|
|
145
|
+
module: 'policy',
|
|
146
|
+
correlationId,
|
|
147
|
+
recoverable: false,
|
|
148
|
+
exitCode: POLICY_EXIT_CODES.INPUT_ERROR,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function validatePolicyType(type, correlationId) {
|
|
153
|
+
const validTypes = [
|
|
154
|
+
'access-control',
|
|
155
|
+
'rate-limit',
|
|
156
|
+
'cost-limit',
|
|
157
|
+
'compliance',
|
|
158
|
+
'security',
|
|
159
|
+
'custom',
|
|
160
|
+
];
|
|
161
|
+
if (!validTypes.includes(type)) {
|
|
162
|
+
throw new CLIError({
|
|
163
|
+
code: 'ECLI-POLICY-004',
|
|
164
|
+
category: 'INPUT_ERROR',
|
|
165
|
+
message: `Invalid policy type: ${type}`,
|
|
166
|
+
details: { provided: type, valid_types: validTypes },
|
|
167
|
+
module: 'policy',
|
|
168
|
+
correlationId,
|
|
169
|
+
recoverable: false,
|
|
170
|
+
exitCode: POLICY_EXIT_CODES.INPUT_ERROR,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ============================================================================
|
|
175
|
+
// Display Formatting
|
|
176
|
+
// ============================================================================
|
|
177
|
+
export function formatPolicyForDisplay(policy) {
|
|
178
|
+
const lines = [];
|
|
179
|
+
const statusIcon = policy.status === 'enabled' ? '[ON]' : policy.status === 'disabled' ? '[OFF]' : '[DRAFT]';
|
|
180
|
+
lines.push(`${statusIcon} ${policy.id}`);
|
|
181
|
+
lines.push(` Name: ${policy.name}`);
|
|
182
|
+
lines.push(` Type: ${policy.type}`);
|
|
183
|
+
lines.push(` Status: ${policy.status}`);
|
|
184
|
+
lines.push(` Description: ${policy.description || '(none)'}`);
|
|
185
|
+
lines.push(` Rules: ${policy.rules.length}`);
|
|
186
|
+
lines.push(` Version: ${policy.version}`);
|
|
187
|
+
lines.push(` Created: ${new Date(policy.created_at).toLocaleString()}`);
|
|
188
|
+
lines.push(` Updated: ${new Date(policy.updated_at).toLocaleString()}`);
|
|
189
|
+
return lines.join('\n');
|
|
190
|
+
}
|
|
191
|
+
export function formatPoliciesListForDisplay(policies) {
|
|
192
|
+
if (policies.length === 0) {
|
|
193
|
+
return 'No policies found.';
|
|
194
|
+
}
|
|
195
|
+
const lines = [];
|
|
196
|
+
lines.push(`Found ${policies.length} polic${policies.length === 1 ? 'y' : 'ies'}:`);
|
|
197
|
+
lines.push('');
|
|
198
|
+
for (const policy of policies) {
|
|
199
|
+
const statusIcon = policy.status === 'enabled' ? '[ON]' : policy.status === 'disabled' ? '[OFF]' : '[DRAFT]';
|
|
200
|
+
lines.push(`${statusIcon} ${policy.id} - ${policy.name} (${policy.type})`);
|
|
201
|
+
}
|
|
202
|
+
return lines.join('\n');
|
|
203
|
+
}
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Command Implementations
|
|
206
|
+
// ============================================================================
|
|
207
|
+
/**
|
|
208
|
+
* List all policies with optional filtering
|
|
209
|
+
*/
|
|
210
|
+
export async function executePolicyListCommand(input, _options) {
|
|
211
|
+
const startTime = Date.now();
|
|
212
|
+
let policies = listAllPolicies();
|
|
213
|
+
// Apply filters
|
|
214
|
+
if (input.status) {
|
|
215
|
+
policies = policies.filter(p => p.status === input.status);
|
|
216
|
+
}
|
|
217
|
+
if (input.type) {
|
|
218
|
+
policies = policies.filter(p => p.type === input.type);
|
|
219
|
+
}
|
|
220
|
+
// Sort by updated_at descending
|
|
221
|
+
policies.sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime());
|
|
222
|
+
// Apply limit
|
|
223
|
+
if (input.limit && input.limit > 0) {
|
|
224
|
+
policies = policies.slice(0, input.limit);
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
policies,
|
|
228
|
+
count: policies.length,
|
|
229
|
+
timing: Date.now() - startTime,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Inspect a specific policy by ID
|
|
234
|
+
*/
|
|
235
|
+
export async function executePolicyInspectCommand(input, _options) {
|
|
236
|
+
const startTime = Date.now();
|
|
237
|
+
const correlationId = _options.trace_id ?? crypto.randomUUID();
|
|
238
|
+
validatePolicyId(input.id, correlationId);
|
|
239
|
+
const policy = loadPolicy(input.id);
|
|
240
|
+
return {
|
|
241
|
+
policy,
|
|
242
|
+
found: policy !== null,
|
|
243
|
+
timing: Date.now() - startTime,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Create a new policy
|
|
248
|
+
*/
|
|
249
|
+
export async function executePolicyCreateCommand(input, options) {
|
|
250
|
+
const startTime = Date.now();
|
|
251
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
252
|
+
validatePolicyName(input.name, correlationId);
|
|
253
|
+
if (input.type) {
|
|
254
|
+
validatePolicyType(input.type, correlationId);
|
|
255
|
+
}
|
|
256
|
+
const now = new Date().toISOString();
|
|
257
|
+
const policy = {
|
|
258
|
+
id: generatePolicyId(),
|
|
259
|
+
name: input.name.trim(),
|
|
260
|
+
description: input.description?.trim() ?? '',
|
|
261
|
+
type: input.type ?? 'custom',
|
|
262
|
+
status: 'draft',
|
|
263
|
+
rules: (input.rules ?? []).map(r => ({
|
|
264
|
+
...r,
|
|
265
|
+
id: r.id || generateRuleId(),
|
|
266
|
+
})),
|
|
267
|
+
created_at: now,
|
|
268
|
+
updated_at: now,
|
|
269
|
+
version: 1,
|
|
270
|
+
metadata: input.metadata,
|
|
271
|
+
};
|
|
272
|
+
try {
|
|
273
|
+
savePolicy(policy);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
throw new CLIError({
|
|
277
|
+
code: 'ECLI-POLICY-IO-001',
|
|
278
|
+
category: 'INTERNAL_ERROR',
|
|
279
|
+
message: 'Failed to save policy',
|
|
280
|
+
details: { error: error instanceof Error ? error.message : String(error) },
|
|
281
|
+
module: 'policy',
|
|
282
|
+
correlationId,
|
|
283
|
+
recoverable: false,
|
|
284
|
+
exitCode: POLICY_EXIT_CODES.IO_ERROR,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
policy,
|
|
289
|
+
timing: Date.now() - startTime,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Edit an existing policy
|
|
294
|
+
*/
|
|
295
|
+
export async function executePolicyEditCommand(input, options) {
|
|
296
|
+
const startTime = Date.now();
|
|
297
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
298
|
+
validatePolicyId(input.id, correlationId);
|
|
299
|
+
const existing = loadPolicy(input.id);
|
|
300
|
+
if (!existing) {
|
|
301
|
+
throw new CLIError({
|
|
302
|
+
code: 'ECLI-POLICY-NOT-FOUND',
|
|
303
|
+
category: 'INPUT_ERROR',
|
|
304
|
+
message: `Policy not found: ${input.id}`,
|
|
305
|
+
details: { id: input.id },
|
|
306
|
+
module: 'policy',
|
|
307
|
+
correlationId,
|
|
308
|
+
recoverable: false,
|
|
309
|
+
exitCode: POLICY_EXIT_CODES.NOT_FOUND,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (input.name) {
|
|
313
|
+
validatePolicyName(input.name, correlationId);
|
|
314
|
+
}
|
|
315
|
+
if (input.type) {
|
|
316
|
+
validatePolicyType(input.type, correlationId);
|
|
317
|
+
}
|
|
318
|
+
const updated = {
|
|
319
|
+
...existing,
|
|
320
|
+
name: input.name?.trim() ?? existing.name,
|
|
321
|
+
description: input.description?.trim() ?? existing.description,
|
|
322
|
+
type: input.type ?? existing.type,
|
|
323
|
+
rules: input.rules !== undefined
|
|
324
|
+
? input.rules.map(r => ({ ...r, id: r.id || generateRuleId() }))
|
|
325
|
+
: existing.rules,
|
|
326
|
+
metadata: input.metadata !== undefined ? input.metadata : existing.metadata,
|
|
327
|
+
updated_at: new Date().toISOString(),
|
|
328
|
+
version: existing.version + 1,
|
|
329
|
+
};
|
|
330
|
+
try {
|
|
331
|
+
savePolicy(updated);
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
throw new CLIError({
|
|
335
|
+
code: 'ECLI-POLICY-IO-002',
|
|
336
|
+
category: 'INTERNAL_ERROR',
|
|
337
|
+
message: 'Failed to update policy',
|
|
338
|
+
details: { error: error instanceof Error ? error.message : String(error) },
|
|
339
|
+
module: 'policy',
|
|
340
|
+
correlationId,
|
|
341
|
+
recoverable: false,
|
|
342
|
+
exitCode: POLICY_EXIT_CODES.IO_ERROR,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
policy: updated,
|
|
347
|
+
timing: Date.now() - startTime,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Delete a policy
|
|
352
|
+
*/
|
|
353
|
+
export async function executePolicyDeleteCommand(input, options) {
|
|
354
|
+
const startTime = Date.now();
|
|
355
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
356
|
+
validatePolicyId(input.id, correlationId);
|
|
357
|
+
const deleted = deletePolicy(input.id);
|
|
358
|
+
if (!deleted) {
|
|
359
|
+
throw new CLIError({
|
|
360
|
+
code: 'ECLI-POLICY-NOT-FOUND',
|
|
361
|
+
category: 'INPUT_ERROR',
|
|
362
|
+
message: `Policy not found: ${input.id}`,
|
|
363
|
+
details: { id: input.id },
|
|
364
|
+
module: 'policy',
|
|
365
|
+
correlationId,
|
|
366
|
+
recoverable: false,
|
|
367
|
+
exitCode: POLICY_EXIT_CODES.NOT_FOUND,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
deleted: true,
|
|
372
|
+
id: input.id,
|
|
373
|
+
timing: Date.now() - startTime,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Enable a policy
|
|
378
|
+
*/
|
|
379
|
+
export async function executePolicyEnableCommand(input, options) {
|
|
380
|
+
const startTime = Date.now();
|
|
381
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
382
|
+
validatePolicyId(input.id, correlationId);
|
|
383
|
+
const existing = loadPolicy(input.id);
|
|
384
|
+
if (!existing) {
|
|
385
|
+
throw new CLIError({
|
|
386
|
+
code: 'ECLI-POLICY-NOT-FOUND',
|
|
387
|
+
category: 'INPUT_ERROR',
|
|
388
|
+
message: `Policy not found: ${input.id}`,
|
|
389
|
+
details: { id: input.id },
|
|
390
|
+
module: 'policy',
|
|
391
|
+
correlationId,
|
|
392
|
+
recoverable: false,
|
|
393
|
+
exitCode: POLICY_EXIT_CODES.NOT_FOUND,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
const previousStatus = existing.status;
|
|
397
|
+
if (existing.status === 'enabled') {
|
|
398
|
+
// Already enabled - return current state without error
|
|
399
|
+
return {
|
|
400
|
+
policy: existing,
|
|
401
|
+
previous_status: previousStatus,
|
|
402
|
+
timing: Date.now() - startTime,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
const updated = {
|
|
406
|
+
...existing,
|
|
407
|
+
status: 'enabled',
|
|
408
|
+
updated_at: new Date().toISOString(),
|
|
409
|
+
version: existing.version + 1,
|
|
410
|
+
};
|
|
411
|
+
savePolicy(updated);
|
|
412
|
+
return {
|
|
413
|
+
policy: updated,
|
|
414
|
+
previous_status: previousStatus,
|
|
415
|
+
timing: Date.now() - startTime,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Disable a policy
|
|
420
|
+
*/
|
|
421
|
+
export async function executePolicyDisableCommand(input, options) {
|
|
422
|
+
const startTime = Date.now();
|
|
423
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
424
|
+
validatePolicyId(input.id, correlationId);
|
|
425
|
+
const existing = loadPolicy(input.id);
|
|
426
|
+
if (!existing) {
|
|
427
|
+
throw new CLIError({
|
|
428
|
+
code: 'ECLI-POLICY-NOT-FOUND',
|
|
429
|
+
category: 'INPUT_ERROR',
|
|
430
|
+
message: `Policy not found: ${input.id}`,
|
|
431
|
+
details: { id: input.id },
|
|
432
|
+
module: 'policy',
|
|
433
|
+
correlationId,
|
|
434
|
+
recoverable: false,
|
|
435
|
+
exitCode: POLICY_EXIT_CODES.NOT_FOUND,
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
const previousStatus = existing.status;
|
|
439
|
+
if (existing.status === 'disabled') {
|
|
440
|
+
// Already disabled - return current state without error
|
|
441
|
+
return {
|
|
442
|
+
policy: existing,
|
|
443
|
+
previous_status: previousStatus,
|
|
444
|
+
timing: Date.now() - startTime,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
const updated = {
|
|
448
|
+
...existing,
|
|
449
|
+
status: 'disabled',
|
|
450
|
+
updated_at: new Date().toISOString(),
|
|
451
|
+
version: existing.version + 1,
|
|
452
|
+
};
|
|
453
|
+
savePolicy(updated);
|
|
454
|
+
return {
|
|
455
|
+
policy: updated,
|
|
456
|
+
previous_status: previousStatus,
|
|
457
|
+
timing: Date.now() - startTime,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/commands/policy.ts"],"names":[],"mappings":"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"}
|