korinfra 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 +191 -0
- package/README.md +361 -0
- package/bin/korinfra.js +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.mjs +1954 -0
- package/dist/storage/migrations/001_initial.sql +145 -0
- package/dist/storage/migrations/002_add_indexes.sql +4 -0
- package/dist/storage/migrations/003_add_cascade_deletes.sql +90 -0
- package/package.json +144 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
-- korinfra initial schema
|
|
2
|
+
-- All tables use IF NOT EXISTS for idempotent migrations.
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
5
|
+
version INTEGER PRIMARY KEY,
|
|
6
|
+
applied_at DATETIME NOT NULL DEFAULT (datetime('now'))
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
CREATE TABLE IF NOT EXISTS scans (
|
|
10
|
+
id TEXT PRIMARY KEY,
|
|
11
|
+
started_at DATETIME NOT NULL,
|
|
12
|
+
completed_at DATETIME,
|
|
13
|
+
status TEXT NOT NULL DEFAULT 'running',
|
|
14
|
+
terraform_path TEXT,
|
|
15
|
+
aws_profile TEXT,
|
|
16
|
+
aws_region TEXT,
|
|
17
|
+
total_resources INTEGER DEFAULT 0,
|
|
18
|
+
total_cost REAL DEFAULT 0,
|
|
19
|
+
total_recommendations INTEGER DEFAULT 0,
|
|
20
|
+
total_savings REAL DEFAULT 0,
|
|
21
|
+
scenario_a_count INTEGER DEFAULT 0,
|
|
22
|
+
scenario_b_count INTEGER DEFAULT 0,
|
|
23
|
+
scenario_c_count INTEGER DEFAULT 0,
|
|
24
|
+
metadata TEXT,
|
|
25
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE IF NOT EXISTS resources (
|
|
29
|
+
id TEXT PRIMARY KEY,
|
|
30
|
+
scan_id TEXT NOT NULL REFERENCES scans(id),
|
|
31
|
+
resource_id TEXT NOT NULL,
|
|
32
|
+
arn TEXT,
|
|
33
|
+
type TEXT NOT NULL,
|
|
34
|
+
name TEXT,
|
|
35
|
+
region TEXT,
|
|
36
|
+
state TEXT,
|
|
37
|
+
instance_type TEXT,
|
|
38
|
+
monthly_cost REAL DEFAULT 0,
|
|
39
|
+
tags TEXT,
|
|
40
|
+
utilization TEXT,
|
|
41
|
+
configuration TEXT,
|
|
42
|
+
scenario TEXT,
|
|
43
|
+
terraform_address TEXT,
|
|
44
|
+
collected_at DATETIME,
|
|
45
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE IF NOT EXISTS costs (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
scan_id TEXT NOT NULL REFERENCES scans(id),
|
|
51
|
+
service_name TEXT NOT NULL,
|
|
52
|
+
region TEXT,
|
|
53
|
+
cost_date DATE NOT NULL,
|
|
54
|
+
daily_cost REAL DEFAULT 0,
|
|
55
|
+
monthly_cost REAL DEFAULT 0,
|
|
56
|
+
currency TEXT DEFAULT 'USD',
|
|
57
|
+
usage_type TEXT,
|
|
58
|
+
tags TEXT,
|
|
59
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
CREATE TABLE IF NOT EXISTS recommendations (
|
|
63
|
+
id TEXT PRIMARY KEY,
|
|
64
|
+
scan_id TEXT NOT NULL REFERENCES scans(id),
|
|
65
|
+
resource_id TEXT,
|
|
66
|
+
resource_type TEXT,
|
|
67
|
+
type TEXT NOT NULL,
|
|
68
|
+
title TEXT NOT NULL,
|
|
69
|
+
description TEXT,
|
|
70
|
+
reasoning TEXT,
|
|
71
|
+
estimated_savings REAL DEFAULT 0,
|
|
72
|
+
confidence REAL DEFAULT 0,
|
|
73
|
+
quality_score INTEGER DEFAULT 0,
|
|
74
|
+
impact TEXT DEFAULT 'medium',
|
|
75
|
+
risk TEXT DEFAULT 'low',
|
|
76
|
+
status TEXT DEFAULT 'draft',
|
|
77
|
+
current_config TEXT,
|
|
78
|
+
suggested_config TEXT,
|
|
79
|
+
patch_content TEXT,
|
|
80
|
+
file_path TEXT,
|
|
81
|
+
implementation_steps TEXT,
|
|
82
|
+
ai_model TEXT,
|
|
83
|
+
scenario TEXT,
|
|
84
|
+
applied_at DATETIME,
|
|
85
|
+
dismissed_at DATETIME,
|
|
86
|
+
dismiss_reason TEXT,
|
|
87
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE TABLE IF NOT EXISTS virtual_tags (
|
|
91
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
92
|
+
resource_id TEXT NOT NULL,
|
|
93
|
+
resource_type TEXT NOT NULL,
|
|
94
|
+
dimension TEXT NOT NULL,
|
|
95
|
+
value TEXT NOT NULL,
|
|
96
|
+
allocation_pct REAL DEFAULT 100.0,
|
|
97
|
+
source TEXT DEFAULT 'manual',
|
|
98
|
+
confidence REAL DEFAULT 1.0,
|
|
99
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
100
|
+
UNIQUE(resource_id, dimension, value)
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
CREATE TABLE IF NOT EXISTS pricing_cache (
|
|
104
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
105
|
+
service_code TEXT NOT NULL,
|
|
106
|
+
resource_key TEXT NOT NULL,
|
|
107
|
+
region TEXT NOT NULL,
|
|
108
|
+
hourly_price REAL NOT NULL,
|
|
109
|
+
price_unit TEXT DEFAULT 'Hrs',
|
|
110
|
+
attributes TEXT,
|
|
111
|
+
fetched_at DATETIME NOT NULL,
|
|
112
|
+
expires_at DATETIME NOT NULL,
|
|
113
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
114
|
+
UNIQUE(service_code, resource_key, region)
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE TABLE IF NOT EXISTS api_call_log (
|
|
118
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
119
|
+
scan_id TEXT REFERENCES scans(id),
|
|
120
|
+
service TEXT NOT NULL,
|
|
121
|
+
operation TEXT NOT NULL,
|
|
122
|
+
region TEXT,
|
|
123
|
+
estimated_cost REAL DEFAULT 0,
|
|
124
|
+
duration_ms INTEGER,
|
|
125
|
+
status TEXT NOT NULL,
|
|
126
|
+
error_message TEXT,
|
|
127
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
-- Indexes
|
|
131
|
+
CREATE INDEX IF NOT EXISTS idx_resources_scan ON resources(scan_id);
|
|
132
|
+
CREATE INDEX IF NOT EXISTS idx_resources_type ON resources(type);
|
|
133
|
+
CREATE INDEX IF NOT EXISTS idx_resources_scenario ON resources(scenario);
|
|
134
|
+
CREATE INDEX IF NOT EXISTS idx_costs_scan ON costs(scan_id);
|
|
135
|
+
CREATE INDEX IF NOT EXISTS idx_costs_service ON costs(service_name);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS idx_costs_date ON costs(cost_date);
|
|
137
|
+
CREATE INDEX IF NOT EXISTS idx_recommendations_scan ON recommendations(scan_id);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS idx_recommendations_status ON recommendations(status);
|
|
139
|
+
CREATE INDEX IF NOT EXISTS idx_recommendations_type ON recommendations(type);
|
|
140
|
+
CREATE INDEX IF NOT EXISTS idx_virtual_tags_resource ON virtual_tags(resource_id);
|
|
141
|
+
CREATE INDEX IF NOT EXISTS idx_pricing_cache_key ON pricing_cache(service_code, resource_key, region);
|
|
142
|
+
CREATE INDEX IF NOT EXISTS idx_pricing_cache_expires ON pricing_cache(expires_at);
|
|
143
|
+
CREATE INDEX IF NOT EXISTS idx_api_call_log_scan ON api_call_log(scan_id);
|
|
144
|
+
CREATE INDEX IF NOT EXISTS idx_api_call_log_service ON api_call_log(service);
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_scans_created_at ON scans(created_at);
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
-- Add composite indexes for common queries
|
|
2
|
+
CREATE INDEX IF NOT EXISTS idx_resources_scan_type ON resources(scan_id, type);
|
|
3
|
+
CREATE INDEX IF NOT EXISTS idx_recommendations_scan_resource_status ON recommendations(scan_id, resource_id, status);
|
|
4
|
+
CREATE INDEX IF NOT EXISTS idx_costs_scan_service_date ON costs(scan_id, service_name, cost_date);
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
-- Add ON DELETE CASCADE to foreign keys
|
|
2
|
+
-- SQLite doesn't support modifying constraints, so we recreate tables
|
|
3
|
+
|
|
4
|
+
ALTER TABLE resources RENAME TO resources_old;
|
|
5
|
+
CREATE TABLE resources (
|
|
6
|
+
id TEXT PRIMARY KEY,
|
|
7
|
+
scan_id TEXT NOT NULL REFERENCES scans(id) ON DELETE CASCADE,
|
|
8
|
+
resource_id TEXT NOT NULL,
|
|
9
|
+
arn TEXT,
|
|
10
|
+
type TEXT NOT NULL,
|
|
11
|
+
name TEXT,
|
|
12
|
+
region TEXT,
|
|
13
|
+
state TEXT,
|
|
14
|
+
instance_type TEXT,
|
|
15
|
+
monthly_cost REAL DEFAULT 0,
|
|
16
|
+
monthly_cost_source TEXT,
|
|
17
|
+
tags TEXT,
|
|
18
|
+
utilization TEXT,
|
|
19
|
+
configuration TEXT,
|
|
20
|
+
scenario TEXT,
|
|
21
|
+
terraform_address TEXT,
|
|
22
|
+
collected_at DATETIME,
|
|
23
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
24
|
+
);
|
|
25
|
+
INSERT INTO resources SELECT id, scan_id, resource_id, arn, type, name, region, state, instance_type, monthly_cost, NULL, tags, utilization, configuration, scenario, terraform_address, collected_at, created_at FROM resources_old;
|
|
26
|
+
DROP TABLE resources_old;
|
|
27
|
+
|
|
28
|
+
ALTER TABLE costs RENAME TO costs_old;
|
|
29
|
+
CREATE TABLE costs (
|
|
30
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
31
|
+
scan_id TEXT NOT NULL REFERENCES scans(id) ON DELETE CASCADE,
|
|
32
|
+
service_name TEXT NOT NULL,
|
|
33
|
+
region TEXT,
|
|
34
|
+
cost_date DATE NOT NULL,
|
|
35
|
+
daily_cost REAL DEFAULT 0,
|
|
36
|
+
monthly_cost REAL DEFAULT 0,
|
|
37
|
+
currency TEXT DEFAULT 'USD',
|
|
38
|
+
usage_type TEXT,
|
|
39
|
+
tags TEXT,
|
|
40
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
41
|
+
);
|
|
42
|
+
INSERT INTO costs SELECT * FROM costs_old;
|
|
43
|
+
DROP TABLE costs_old;
|
|
44
|
+
|
|
45
|
+
ALTER TABLE recommendations RENAME TO recommendations_old;
|
|
46
|
+
CREATE TABLE recommendations (
|
|
47
|
+
id TEXT PRIMARY KEY,
|
|
48
|
+
scan_id TEXT NOT NULL REFERENCES scans(id) ON DELETE CASCADE,
|
|
49
|
+
resource_id TEXT,
|
|
50
|
+
resource_type TEXT,
|
|
51
|
+
type TEXT NOT NULL,
|
|
52
|
+
title TEXT NOT NULL,
|
|
53
|
+
description TEXT,
|
|
54
|
+
reasoning TEXT,
|
|
55
|
+
estimated_savings REAL DEFAULT 0,
|
|
56
|
+
confidence REAL DEFAULT 0,
|
|
57
|
+
quality_score INTEGER DEFAULT 0,
|
|
58
|
+
impact TEXT DEFAULT 'medium',
|
|
59
|
+
risk TEXT DEFAULT 'low',
|
|
60
|
+
status TEXT DEFAULT 'draft',
|
|
61
|
+
current_config TEXT,
|
|
62
|
+
suggested_config TEXT,
|
|
63
|
+
patch_content TEXT,
|
|
64
|
+
file_path TEXT,
|
|
65
|
+
implementation_steps TEXT,
|
|
66
|
+
ai_model TEXT,
|
|
67
|
+
scenario TEXT,
|
|
68
|
+
applied_at DATETIME,
|
|
69
|
+
dismissed_at DATETIME,
|
|
70
|
+
dismiss_reason TEXT,
|
|
71
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
72
|
+
);
|
|
73
|
+
INSERT INTO recommendations SELECT * FROM recommendations_old;
|
|
74
|
+
DROP TABLE recommendations_old;
|
|
75
|
+
|
|
76
|
+
ALTER TABLE api_call_log RENAME TO api_call_log_old;
|
|
77
|
+
CREATE TABLE api_call_log (
|
|
78
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
79
|
+
scan_id TEXT REFERENCES scans(id) ON DELETE CASCADE,
|
|
80
|
+
service TEXT NOT NULL,
|
|
81
|
+
operation TEXT NOT NULL,
|
|
82
|
+
region TEXT,
|
|
83
|
+
estimated_cost REAL DEFAULT 0,
|
|
84
|
+
duration_ms INTEGER,
|
|
85
|
+
status TEXT NOT NULL,
|
|
86
|
+
error_message TEXT,
|
|
87
|
+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
88
|
+
);
|
|
89
|
+
INSERT INTO api_call_log SELECT * FROM api_call_log_old;
|
|
90
|
+
DROP TABLE api_call_log_old;
|
package/package.json
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "korinfra",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-powered AWS FinOps CLI — cost optimization, drift detection, security scanning",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"bin": {
|
|
8
|
+
"korinfra": "bin/korinfra.js"
|
|
9
|
+
},
|
|
10
|
+
"main": "./dist/index.mjs",
|
|
11
|
+
"types": "./dist/index.d.mts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.mjs",
|
|
15
|
+
"types": "./dist/index.d.mts"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/",
|
|
20
|
+
"!dist/**/*.map",
|
|
21
|
+
"bin/korinfra.js",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22.0.0"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"postinstall": "node scripts/patch-ink-types.mjs",
|
|
30
|
+
"build": "tsdown",
|
|
31
|
+
"postbuild": "node --input-type=module -e \"import{cpSync,existsSync}from 'node:fs';if(existsSync('src/storage/migrations'))cpSync('src/storage/migrations','dist/storage/migrations',{recursive:true})\"",
|
|
32
|
+
"dev": "tsx --disable-warning=ExperimentalWarning src/index.ts",
|
|
33
|
+
"start": "node dist/index.mjs",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"test:coverage": "vitest run --coverage",
|
|
37
|
+
"bench": "vitest bench --run",
|
|
38
|
+
"bench:watch": "vitest bench --watch",
|
|
39
|
+
"lint": "eslint src/ tests/ --cache --cache-location node_modules/.cache/eslint/",
|
|
40
|
+
"lint:fix": "eslint src/ tests/ --fix --cache --cache-location node_modules/.cache/eslint/",
|
|
41
|
+
"lint:md": "markdownlint-cli2 \"**/*.md\" \"#node_modules\" \"#dist\"",
|
|
42
|
+
"typecheck": "tsc --noEmit",
|
|
43
|
+
"check": "run-p typecheck lint lint:md test",
|
|
44
|
+
"compile": "tsx scripts/compile.ts",
|
|
45
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
46
|
+
"lint:secrets": "secretlint \"**/*\"",
|
|
47
|
+
"lint:lockfile": "lockfile-lint --path package-lock.json --type npm --allowed-hosts npm --validate-https --validate-integrity",
|
|
48
|
+
"lint:knip": "knip"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"aws",
|
|
52
|
+
"finops",
|
|
53
|
+
"cost-optimization",
|
|
54
|
+
"terraform",
|
|
55
|
+
"security",
|
|
56
|
+
"ai-agent",
|
|
57
|
+
"cli",
|
|
58
|
+
"mcp"
|
|
59
|
+
],
|
|
60
|
+
"author": "Vladimir Mocanu",
|
|
61
|
+
"license": "Apache-2.0",
|
|
62
|
+
"repository": {
|
|
63
|
+
"type": "git",
|
|
64
|
+
"url": "git+https://github.com/korinfra/korinfra.git"
|
|
65
|
+
},
|
|
66
|
+
"bugs": {
|
|
67
|
+
"url": "https://github.com/korinfra/korinfra/issues"
|
|
68
|
+
},
|
|
69
|
+
"homepage": "https://github.com/korinfra/korinfra#readme",
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.126",
|
|
72
|
+
"@anthropic-ai/sdk": "^0.95.2",
|
|
73
|
+
"@aws-sdk/client-cloudtrail": "^3.1045.0",
|
|
74
|
+
"@aws-sdk/client-cloudwatch": "^3.1040.0",
|
|
75
|
+
"@aws-sdk/client-cost-explorer": "^3.1040.0",
|
|
76
|
+
"@aws-sdk/client-dynamodb": "^3.1040.0",
|
|
77
|
+
"@aws-sdk/client-ec2": "^3.1040.0",
|
|
78
|
+
"@aws-sdk/client-ecs": "^3.1040.0",
|
|
79
|
+
"@aws-sdk/client-elastic-load-balancing-v2": "^3.1040.0",
|
|
80
|
+
"@aws-sdk/client-elasticache": "^3.1040.0",
|
|
81
|
+
"@aws-sdk/client-lambda": "^3.1040.0",
|
|
82
|
+
"@aws-sdk/client-pricing": "^3.1040.0",
|
|
83
|
+
"@aws-sdk/client-rds": "^3.1040.0",
|
|
84
|
+
"@aws-sdk/client-resource-groups-tagging-api": "^3.1040.0",
|
|
85
|
+
"@aws-sdk/client-s3": "^3.1040.0",
|
|
86
|
+
"@aws-sdk/client-sts": "^3.1040.0",
|
|
87
|
+
"@aws-sdk/credential-providers": "^3.1040.0",
|
|
88
|
+
"@cdktf/hcl2json": "^0.21.0",
|
|
89
|
+
"@inkjs/ui": "2.0.0",
|
|
90
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
91
|
+
"@smithy/node-http-handler": "^4.6.1",
|
|
92
|
+
"better-sqlite3": "^12.9.0",
|
|
93
|
+
"cosmiconfig": "9.0.1",
|
|
94
|
+
"gradient-string": "^3.0.0",
|
|
95
|
+
"ink": "7.0.2",
|
|
96
|
+
"ink-spinner": "^5.0.0",
|
|
97
|
+
"js-yaml": "4.1.1",
|
|
98
|
+
"p-limit": "7.3.0",
|
|
99
|
+
"p-throttle": "8.1.0",
|
|
100
|
+
"pino": "10.3.1",
|
|
101
|
+
"pino-pretty": "13.1.3",
|
|
102
|
+
"react": "^19.2.5",
|
|
103
|
+
"string-width": "^8.2.1",
|
|
104
|
+
"zod": "4.4.3"
|
|
105
|
+
},
|
|
106
|
+
"devDependencies": {
|
|
107
|
+
"@aws-sdk/types": "^3.973.8",
|
|
108
|
+
"@eslint/js": "10.0.1",
|
|
109
|
+
"@secretlint/secretlint-rule-aws": "^13.0.0",
|
|
110
|
+
"@secretlint/secretlint-rule-gcp": "^13.0.0",
|
|
111
|
+
"@secretlint/secretlint-rule-no-dotenv": "^13.0.0",
|
|
112
|
+
"@secretlint/secretlint-rule-npm": "^13.0.0",
|
|
113
|
+
"@secretlint/secretlint-rule-privatekey": "^13.0.0",
|
|
114
|
+
"@types/better-sqlite3": "7.6.13",
|
|
115
|
+
"@types/gradient-string": "^1.1.6",
|
|
116
|
+
"@types/js-yaml": "4.0.9",
|
|
117
|
+
"@types/node": "^25.6.0",
|
|
118
|
+
"@types/react": "19.2.14",
|
|
119
|
+
"@vitest/coverage-v8": "^4.1.5",
|
|
120
|
+
"eslint": "10.3.0",
|
|
121
|
+
"eslint-plugin-react-hooks": "^7.1.1",
|
|
122
|
+
"ink-testing-library": "^4.0.0",
|
|
123
|
+
"knip": "^6.9.0",
|
|
124
|
+
"lockfile-lint": "^5.0.0",
|
|
125
|
+
"markdownlint-cli2": "^0.22.1",
|
|
126
|
+
"npm-run-all2": "^8.0.4",
|
|
127
|
+
"secretlint": "^13.0.0",
|
|
128
|
+
"tsdown": "^0.22.0",
|
|
129
|
+
"tsx": "4.21.0",
|
|
130
|
+
"typescript": "6.0.3",
|
|
131
|
+
"typescript-eslint": "^8.59.1",
|
|
132
|
+
"unrun": "^0.3.0",
|
|
133
|
+
"vitest": "^4.1.5"
|
|
134
|
+
},
|
|
135
|
+
"overrides": {
|
|
136
|
+
"@anthropic-ai/sdk": "^0.95.2",
|
|
137
|
+
"@anthropic-ai/claude-agent-sdk": {
|
|
138
|
+
"@anthropic-ai/sdk": "^0.95.2"
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"optionalDependencies": {
|
|
142
|
+
"react-devtools-core": "^7.0.1"
|
|
143
|
+
}
|
|
144
|
+
}
|