neural-loom 0.2.47 → 0.2.49
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +4 -0
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/cache/.tsbuildinfo +1 -1
- package/.next/diagnostics/route-bundle-stats.json +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/routes-manifest.json +24 -0
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/context/aider/route.js.nft.json +1 -1
- package/.next/server/app/api/context/claude/route.js.nft.json +1 -1
- package/.next/server/app/api/context/route.js.nft.json +1 -1
- package/.next/server/app/api/context/ssh/route.js.nft.json +1 -1
- package/.next/server/app/api/recents/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/input/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/scope/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/start/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -1
- package/.next/server/app/api/sql/connections/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/connections/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/connections/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/connections/route.js +6 -0
- package/.next/server/app/api/sql/connections/route.js.map +5 -0
- package/.next/server/app/api/sql/connections/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/connections/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/sql/mcp/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/mcp/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/mcp/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/mcp/route.js +6 -0
- package/.next/server/app/api/sql/mcp/route.js.map +5 -0
- package/.next/server/app/api/sql/mcp/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/mcp/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/sql/query/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/query/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/query/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/query/route.js +6 -0
- package/.next/server/app/api/sql/query/route.js.map +5 -0
- package/.next/server/app/api/sql/query/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/query/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/sql/schema/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/sql/schema/route/build-manifest.json +9 -0
- package/.next/server/app/api/sql/schema/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/sql/schema/route.js +6 -0
- package/.next/server/app/api/sql/schema/route.js.map +5 -0
- package/.next/server/app/api/sql/schema/route.js.nft.json +1 -0
- package/.next/server/app/api/sql/schema/route_client-reference-manifest.js +3 -0
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/page/react-loadable-manifest.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -0
- package/.next/server/chunks/[root-of-the-server]__0.ptwor._.js +86 -0
- package/.next/server/chunks/[root-of-the-server]__0.ptwor._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__00l5btc._.js +74 -0
- package/.next/server/chunks/[root-of-the-server]__00l5btc._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__06men8g._.js +74 -0
- package/.next/server/chunks/[root-of-the-server]__06men8g._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0_o7_jj._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0_o7_jj._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0co.g5k._.js +74 -0
- package/.next/server/chunks/[root-of-the-server]__0co.g5k._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_connections_route_actions_11cib8~.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_connections_route_actions_11cib8~.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_mcp_route_actions_0wihfps.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_mcp_route_actions_0wihfps.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_query_route_actions_11x3q3c.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_query_route_actions_11x3q3c.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_schema_route_actions_015okwb.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_sql_schema_route_actions_015okwb.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/03f4bqk_d65hs.js +6 -0
- package/.next/static/chunks/{15zf~gqr_i8s1.js → 0~6gm~u8rgtpd.js} +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/.next/types/routes.d.ts +5 -1
- package/.next/types/validator.ts +36 -0
- package/bin/cli.js +76 -0
- package/package.json +2 -2
- package/src/app/api/sql/connections/route.ts +60 -0
- package/src/app/api/sql/mcp/route.ts +27 -0
- package/src/app/api/sql/query/route.ts +56 -0
- package/src/app/api/sql/schema/route.ts +42 -0
- package/src/app/components/DbExplorer.tsx +1279 -0
- package/src/app/components/IdeLayout.tsx +27 -1
- package/src/app/layout.tsx +1 -0
- package/src/lib/sql/ConnectionManager.ts +207 -0
- package/src/lib/sql/DbAdapter.ts +62 -0
- package/src/lib/sql/McpServer.ts +278 -0
- package/src/lib/sql/adapters/MysqlAdapter.ts +120 -0
- package/src/lib/sql/adapters/PostgresAdapter.ts +139 -0
- package/src/lib/sql/adapters/SqliteAdapter.ts +111 -0
- package/.next/static/chunks/0bclk7hf35ac4.js +0 -1
- /package/.next/static/{kPeXDg1G9iPLf0aCjKTXh → BoncS4SNz6CDpSdR8oY-K}/_buildManifest.js +0 -0
- /package/.next/static/{kPeXDg1G9iPLf0aCjKTXh → BoncS4SNz6CDpSdR8oY-K}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{kPeXDg1G9iPLf0aCjKTXh → BoncS4SNz6CDpSdR8oY-K}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-require-imports, @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { DbAdapter, TableSchema, ColumnSchema, QueryResult } from "../DbAdapter";
|
|
3
|
+
|
|
4
|
+
export class MysqlAdapter extends DbAdapter {
|
|
5
|
+
private connection: any = null;
|
|
6
|
+
private dbName: string = "";
|
|
7
|
+
|
|
8
|
+
constructor(config: any) {
|
|
9
|
+
super(config);
|
|
10
|
+
this.dbName = config.database || "";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async connect(): Promise<void> {
|
|
14
|
+
if (this.connection) return;
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
let mysql;
|
|
18
|
+
try {
|
|
19
|
+
mysql = require("mysql2/promise");
|
|
20
|
+
} catch (err) {
|
|
21
|
+
throw new Error(
|
|
22
|
+
"MySQL driver 'mysql2' is not installed. Please run `npm install mysql2` in the neural-loom environment."
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
this.connection = await mysql.createConnection({
|
|
27
|
+
host: this.config.host || "localhost",
|
|
28
|
+
port: this.config.port || 3306,
|
|
29
|
+
database: this.dbName,
|
|
30
|
+
user: this.config.username || "root",
|
|
31
|
+
password: this.config.password || "",
|
|
32
|
+
ssl: this.config.ssl ? this.config.ssl : undefined
|
|
33
|
+
});
|
|
34
|
+
} catch (err: any) {
|
|
35
|
+
console.error("[MysqlAdapter] Connect failed:", err);
|
|
36
|
+
this.connection = null;
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async query(sql: string, params: any[] = []): Promise<QueryResult> {
|
|
42
|
+
await this.connect();
|
|
43
|
+
try {
|
|
44
|
+
const [rows, fields] = await this.connection.execute(sql, params);
|
|
45
|
+
|
|
46
|
+
const isArray = Array.isArray(rows);
|
|
47
|
+
return {
|
|
48
|
+
rows: isArray ? rows : [],
|
|
49
|
+
fields: fields ? fields.map((f: any) => f.name) : [],
|
|
50
|
+
affectedRows: !isArray && (rows as any).affectedRows !== undefined ? (rows as any).affectedRows : undefined
|
|
51
|
+
};
|
|
52
|
+
} catch (err: any) {
|
|
53
|
+
console.error("[MysqlAdapter] Query failed:", err);
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async listTables(): Promise<TableSchema[]> {
|
|
59
|
+
const sql = `
|
|
60
|
+
SELECT table_name as name, table_type as type
|
|
61
|
+
FROM information_schema.tables
|
|
62
|
+
WHERE table_schema = ? AND table_type IN ('BASE TABLE', 'VIEW')
|
|
63
|
+
ORDER BY table_name
|
|
64
|
+
`;
|
|
65
|
+
const res = await this.query(sql, [this.dbName]);
|
|
66
|
+
return res.rows.map(row => ({
|
|
67
|
+
name: row.name,
|
|
68
|
+
type: row.type === "BASE TABLE" ? "table" : "view"
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async describeTable(tableName: string): Promise<ColumnSchema[]> {
|
|
73
|
+
const columnsSql = `
|
|
74
|
+
SELECT
|
|
75
|
+
column_name as name,
|
|
76
|
+
column_type as type,
|
|
77
|
+
is_nullable as nullable,
|
|
78
|
+
column_default as default_value,
|
|
79
|
+
column_key as col_key
|
|
80
|
+
FROM information_schema.columns
|
|
81
|
+
WHERE table_schema = ? AND table_name = ?
|
|
82
|
+
ORDER BY ordinal_position
|
|
83
|
+
`;
|
|
84
|
+
|
|
85
|
+
const fksSql = `
|
|
86
|
+
SELECT
|
|
87
|
+
column_name AS local_column,
|
|
88
|
+
referenced_table_name AS foreign_table,
|
|
89
|
+
referenced_column_name AS foreign_column
|
|
90
|
+
FROM information_schema.key_column_usage
|
|
91
|
+
WHERE table_schema = ?
|
|
92
|
+
AND table_name = ?
|
|
93
|
+
AND referenced_table_name IS NOT NULL
|
|
94
|
+
`;
|
|
95
|
+
|
|
96
|
+
const colsRes = await this.query(columnsSql, [this.dbName, tableName]);
|
|
97
|
+
const fksRes = await this.query(fksSql, [this.dbName, tableName]);
|
|
98
|
+
|
|
99
|
+
return colsRes.rows.map((row: any) => {
|
|
100
|
+
const fk = fksRes.rows.find((f: any) => f.local_column === row.name);
|
|
101
|
+
return {
|
|
102
|
+
name: row.name,
|
|
103
|
+
type: row.type || "VARCHAR",
|
|
104
|
+
nullable: row.nullable === "YES",
|
|
105
|
+
defaultValue: row.default_value,
|
|
106
|
+
isPrimaryKey: row.col_key === "PRI",
|
|
107
|
+
isForeignKey: !!fk,
|
|
108
|
+
referencedTable: fk ? fk.foreign_table : null,
|
|
109
|
+
referencedColumn: fk ? fk.foreign_column : null
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async disconnect(): Promise<void> {
|
|
115
|
+
if (this.connection) {
|
|
116
|
+
await this.connection.end();
|
|
117
|
+
this.connection = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-require-imports, @typescript-eslint/no-unused-vars */
|
|
2
|
+
import { DbAdapter, TableSchema, ColumnSchema, QueryResult } from "../DbAdapter";
|
|
3
|
+
|
|
4
|
+
export class PostgresAdapter extends DbAdapter {
|
|
5
|
+
private client: any = null;
|
|
6
|
+
private schema: string = "public";
|
|
7
|
+
|
|
8
|
+
constructor(config: any) {
|
|
9
|
+
super(config);
|
|
10
|
+
this.schema = config.schema || "public";
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async connect(): Promise<void> {
|
|
14
|
+
if (this.client) return;
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
let ClientClass;
|
|
18
|
+
try {
|
|
19
|
+
const pg = require("pg");
|
|
20
|
+
ClientClass = pg.Client;
|
|
21
|
+
} catch (err) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
"PostgreSQL driver 'pg' is not installed. Please run `npm install pg` in the neural-loom environment."
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
this.client = new ClientClass({
|
|
28
|
+
host: this.config.host || "localhost",
|
|
29
|
+
port: this.config.port || 5432,
|
|
30
|
+
database: this.config.database || "postgres",
|
|
31
|
+
user: this.config.username || "postgres",
|
|
32
|
+
password: this.config.password || "",
|
|
33
|
+
ssl: this.config.ssl ? this.config.ssl : undefined
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
await this.client.connect();
|
|
37
|
+
} catch (err: any) {
|
|
38
|
+
console.error("[PostgresAdapter] Connect failed:", err);
|
|
39
|
+
this.client = null;
|
|
40
|
+
throw err;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async query(sql: string, params: any[] = []): Promise<QueryResult> {
|
|
45
|
+
await this.connect();
|
|
46
|
+
try {
|
|
47
|
+
const res = await this.client.query(sql, params);
|
|
48
|
+
const rows = res.rows || [];
|
|
49
|
+
const fields = res.fields ? res.fields.map((f: any) => f.name) : [];
|
|
50
|
+
return {
|
|
51
|
+
rows,
|
|
52
|
+
fields,
|
|
53
|
+
affectedRows: res.rowCount !== null ? res.rowCount : undefined
|
|
54
|
+
};
|
|
55
|
+
} catch (err: any) {
|
|
56
|
+
console.error("[PostgresAdapter] Query failed:", err);
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async listTables(): Promise<TableSchema[]> {
|
|
62
|
+
const sql = `
|
|
63
|
+
SELECT table_name as name, table_type as type
|
|
64
|
+
FROM information_schema.tables
|
|
65
|
+
WHERE table_schema = $1 AND table_type IN ('BASE TABLE', 'VIEW')
|
|
66
|
+
ORDER BY table_name
|
|
67
|
+
`;
|
|
68
|
+
const res = await this.query(sql, [this.schema]);
|
|
69
|
+
return res.rows.map(row => ({
|
|
70
|
+
name: row.name,
|
|
71
|
+
type: row.type === "BASE TABLE" ? "table" : "view"
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async describeTable(tableName: string): Promise<ColumnSchema[]> {
|
|
76
|
+
const columnsSql = `
|
|
77
|
+
SELECT
|
|
78
|
+
c.column_name as name,
|
|
79
|
+
c.data_type as type,
|
|
80
|
+
c.is_nullable as nullable,
|
|
81
|
+
c.column_default as default_value,
|
|
82
|
+
(
|
|
83
|
+
SELECT COUNT(*)
|
|
84
|
+
FROM information_schema.table_constraints tc
|
|
85
|
+
JOIN information_schema.key_column_usage kcu
|
|
86
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
87
|
+
AND tc.table_schema = kcu.table_schema
|
|
88
|
+
WHERE tc.constraint_type = 'PRIMARY KEY'
|
|
89
|
+
AND tc.table_name = c.table_name
|
|
90
|
+
AND kcu.column_name = c.column_name
|
|
91
|
+
AND tc.table_schema = c.table_schema
|
|
92
|
+
) > 0 as is_pk
|
|
93
|
+
FROM information_schema.columns c
|
|
94
|
+
WHERE c.table_schema = $1 AND c.table_name = $2
|
|
95
|
+
ORDER BY c.ordinal_position
|
|
96
|
+
`;
|
|
97
|
+
|
|
98
|
+
const fksSql = `
|
|
99
|
+
SELECT
|
|
100
|
+
kcu.column_name AS local_column,
|
|
101
|
+
ccu.table_name AS foreign_table,
|
|
102
|
+
ccu.column_name AS foreign_column
|
|
103
|
+
FROM information_schema.table_constraints AS tc
|
|
104
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
105
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
106
|
+
AND tc.table_schema = kcu.table_schema
|
|
107
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
108
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
109
|
+
AND ccu.table_schema = tc.table_schema
|
|
110
|
+
WHERE tc.constraint_type = 'FOREIGN KEY'
|
|
111
|
+
AND tc.table_schema = $1
|
|
112
|
+
AND tc.table_name = $2
|
|
113
|
+
`;
|
|
114
|
+
|
|
115
|
+
const colsRes = await this.query(columnsSql, [this.schema, tableName]);
|
|
116
|
+
const fksRes = await this.query(fksSql, [this.schema, tableName]);
|
|
117
|
+
|
|
118
|
+
return colsRes.rows.map((row: any) => {
|
|
119
|
+
const fk = fksRes.rows.find((f: any) => f.local_column === row.name);
|
|
120
|
+
return {
|
|
121
|
+
name: row.name,
|
|
122
|
+
type: row.type,
|
|
123
|
+
nullable: row.nullable === "YES",
|
|
124
|
+
defaultValue: row.default_value,
|
|
125
|
+
isPrimaryKey: row.is_pk,
|
|
126
|
+
isForeignKey: !!fk,
|
|
127
|
+
referencedTable: fk ? fk.foreign_table : null,
|
|
128
|
+
referencedColumn: fk ? fk.foreign_column : null
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async disconnect(): Promise<void> {
|
|
134
|
+
if (this.client) {
|
|
135
|
+
await this.client.end();
|
|
136
|
+
this.client = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-require-imports, @typescript-eslint/no-unused-vars */
|
|
2
|
+
import path from "path";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import { DbAdapter, TableSchema, ColumnSchema, QueryResult } from "../DbAdapter";
|
|
5
|
+
|
|
6
|
+
export class SqliteAdapter extends DbAdapter {
|
|
7
|
+
private db: any = null;
|
|
8
|
+
private resolvedPath: string = "";
|
|
9
|
+
|
|
10
|
+
constructor(config: any, workspaceRoot?: string) {
|
|
11
|
+
super(config);
|
|
12
|
+
const rawPath = config.filepath || "dev.db";
|
|
13
|
+
// Resolve relative path against workspaceRoot or process CWD
|
|
14
|
+
if (path.isAbsolute(rawPath)) {
|
|
15
|
+
this.resolvedPath = rawPath.replace(/\\/g, "/");
|
|
16
|
+
} else {
|
|
17
|
+
const root = workspaceRoot || process.cwd();
|
|
18
|
+
this.resolvedPath = path.resolve(root, rawPath).replace(/\\/g, "/");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async connect(): Promise<void> {
|
|
23
|
+
if (this.db) return;
|
|
24
|
+
|
|
25
|
+
// Ensure parent directory exists
|
|
26
|
+
const dir = path.dirname(this.resolvedPath);
|
|
27
|
+
if (!fs.existsSync(dir)) {
|
|
28
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
// Lazy load better-sqlite3
|
|
33
|
+
let Database;
|
|
34
|
+
try {
|
|
35
|
+
Database = require("better-sqlite3");
|
|
36
|
+
} catch (err) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
"SQLite driver 'better-sqlite3' is not installed. Please run `npm install better-sqlite3` in the neural-loom environment."
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
this.db = new Database(this.resolvedPath);
|
|
43
|
+
} catch (err: any) {
|
|
44
|
+
console.error("[SqliteAdapter] Connect failed:", err);
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async query(sql: string, params: any[] = []): Promise<QueryResult> {
|
|
50
|
+
await this.connect();
|
|
51
|
+
try {
|
|
52
|
+
const isSelect = sql.trim().toLowerCase().startsWith("select") ||
|
|
53
|
+
sql.trim().toLowerCase().startsWith("pragma") ||
|
|
54
|
+
sql.trim().toLowerCase().startsWith("explain");
|
|
55
|
+
|
|
56
|
+
if (isSelect) {
|
|
57
|
+
const rows = this.db.prepare(sql).all(params);
|
|
58
|
+
const fields = rows.length > 0 ? Object.keys(rows[0]) : [];
|
|
59
|
+
return { rows, fields };
|
|
60
|
+
} else {
|
|
61
|
+
const info = this.db.prepare(sql).run(params);
|
|
62
|
+
return {
|
|
63
|
+
rows: [],
|
|
64
|
+
affectedRows: info.changes
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
} catch (err: any) {
|
|
68
|
+
console.error("[SqliteAdapter] Query execution failed:", err);
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async listTables(): Promise<TableSchema[]> {
|
|
74
|
+
const sql = `SELECT name, type FROM sqlite_master WHERE type IN ('table', 'view') AND name NOT LIKE 'sqlite_%'`;
|
|
75
|
+
const res = await this.query(sql);
|
|
76
|
+
return res.rows.map(row => ({
|
|
77
|
+
name: row.name,
|
|
78
|
+
type: row.type === "table" ? "table" : "view"
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async describeTable(tableName: string): Promise<ColumnSchema[]> {
|
|
83
|
+
await this.connect();
|
|
84
|
+
|
|
85
|
+
// Get table columns
|
|
86
|
+
const columnsInfo = this.db.prepare(`PRAGMA table_info(\`${tableName}\`)`).all();
|
|
87
|
+
// Get foreign keys
|
|
88
|
+
const foreignKeys = this.db.prepare(`PRAGMA foreign_key_list(\`${tableName}\`)`).all();
|
|
89
|
+
|
|
90
|
+
return columnsInfo.map((col: any) => {
|
|
91
|
+
const fk = foreignKeys.find((f: any) => f.from === col.name);
|
|
92
|
+
return {
|
|
93
|
+
name: col.name,
|
|
94
|
+
type: col.type || "TEXT",
|
|
95
|
+
nullable: col.notnull === 0,
|
|
96
|
+
defaultValue: col.dflt_value,
|
|
97
|
+
isPrimaryKey: col.pk > 0,
|
|
98
|
+
isForeignKey: !!fk,
|
|
99
|
+
referencedTable: fk ? fk.table : null,
|
|
100
|
+
referencedColumn: fk ? fk.to : null
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async disconnect(): Promise<void> {
|
|
106
|
+
if (this.db) {
|
|
107
|
+
this.db.close();
|
|
108
|
+
this.db = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,3839,e=>{"use strict";var t=e.i(43476),r=e.i(71645),o=e.i(5991),n=e.i(54370);function i({content:e}){let o=(0,r.useMemo)(()=>{if(!e)return[];let t=e.split("\n"),r=[],o=null;for(let e=0;e<t.length;e++){let n=t[e];if(o&&"code"===o.type){n.trim().startsWith("```")?(r.push(o),o=null):o.content.push(n);continue}if(o&&"table"===o.type)if(n.trim().startsWith("|")){o.content.push(n);continue}else r.push(o),o=null;let i=n.trim();if(i.startsWith("```")){o&&r.push(o),o={type:"code",language:i.substring(3).trim(),content:[]};continue}if(/^(\s*[-*_]\s*){3,}$/.test(i)){o&&r.push(o),r.push({type:"hr"}),o=null;continue}let l=n.match(/^(#{1,6})\s+(.*)$/);if(l){o&&r.push(o),r.push({type:"h",level:l[1].length,content:l[2]}),o=null;continue}let a=n.match(/^>\s*(.*)$/);if(a){if(o)if("blockquote"===o.type){o.content.push(a[1]);continue}else r.push(o);o={type:"blockquote",content:[a[1]]};continue}let s=n.match(/^([-*+])\s+(.*)$/);if(s){if(o)if("ul"===o.type){o.content.push(s[2]);continue}else r.push(o);o={type:"ul",content:[s[2]]};continue}let d=n.match(/^(\d+)\.\s+(.*)$/);if(d){if(o)if("ol"===o.type){o.content.push(d[2]);continue}else r.push(o);o={type:"ol",content:[d[2]]};continue}if(i.startsWith("|")){o&&r.push(o),o={type:"table",content:[n]};continue}if(""===i){o&&(r.push(o),o=null);continue}o?"p"===o.type?o.content=o.content+" "+i:(r.push(o),o={type:"p",content:i}):o={type:"p",content:i}}return o&&r.push(o),r},[e]),n=0;function z(e){return function e(r){if(!r)return[];let o=r.match(/`(.*?)`/),i=r.match(/\*\*(.*?)\*\*/),l=r.match(/\*(.*?)\*/),a=r.match(/\[(.*?)\]\((.*?)\)/),s=[o?{index:o.index,type:"code",match:o}:null,i?{index:i.index,type:"bold",match:i}:null,l?{index:l.index,type:"italic",match:l}:null,a?{index:a.index,type:"link",match:a}:null].filter(Boolean);if(0===s.length)return[r];s.sort((e,t)=>e.index-t.index);let d=s[0],c=r.substring(0,d.index),p=d.match[0],u=r.substring(d.index+p.length),m=[];c&&m.push(c);let h=`inline-${d.type}-${n++}`;return"code"===d.type?m.push((0,t.jsx)("code",{style:x,children:d.match[1]},h)):"bold"===d.type?m.push((0,t.jsx)("strong",{style:{fontWeight:700,color:"var(--foreground)"},children:e(d.match[1])},h)):"italic"===d.type?m.push((0,t.jsx)("em",{style:{fontStyle:"italic"},children:e(d.match[1])},h)):"link"===d.type&&m.push((0,t.jsx)("a",{href:d.match[2],target:"_blank",rel:"noopener noreferrer",style:y,children:e(d.match[1])},h)),[...m,...e(u)]}(e)}return(0,t.jsx)("div",{style:a,children:o.map((e,r)=>{let o=`block-${e.type}-${r}`;switch(e.type){case"h":{let r=z(e.content);switch(e.level){case 1:return(0,t.jsx)("h1",{style:d,children:r},o);case 2:return(0,t.jsx)("h2",{style:c,children:r},o);case 3:return(0,t.jsx)("h3",{style:p,children:r},o);default:return(0,t.jsx)("h4",{style:u,children:r},o)}}case"code":{let r=e.content.join("\n");return(0,t.jsx)(l,{code:r,language:e.language||""},o)}case"blockquote":return(0,t.jsx)("blockquote",{style:k,children:e.content&&e.content.map((e,r)=>(0,t.jsx)("p",{style:{margin:"0.25rem 0"},children:z(e)},r))},o);case"ul":return(0,t.jsx)("ul",{style:m,children:e.content&&e.content.map((e,r)=>(0,t.jsxs)("li",{style:g,children:[(0,t.jsx)("span",{style:{marginRight:"0.5rem",color:"var(--accent)"},children:"•"}),(0,t.jsx)("div",{style:{flex:1},children:z(e)})]},r))},o);case"ol":return(0,t.jsx)("ol",{style:h,children:e.content&&e.content.map((e,r)=>(0,t.jsxs)("li",{style:g,children:[(0,t.jsxs)("span",{style:{marginRight:"0.5rem",color:"var(--accent)",fontWeight:600},children:[r+1,"."]}),(0,t.jsx)("div",{style:{flex:1},children:z(e)})]},r))},o);case"table":return function(e,r){let o=e.map(e=>e.split("|").map(e=>e.trim()).filter((e,t,r)=>t>0&&t<r.length-1));if(0===o.length)return null;let n=o[0],i=o.slice(1).filter(e=>!e.every(e=>e.startsWith("-")||""===e));return(0,t.jsx)("div",{style:b,children:(0,t.jsxs)("table",{style:v,children:[(0,t.jsx)("thead",{children:(0,t.jsx)("tr",{children:n.map((e,r)=>(0,t.jsx)("th",{style:j,children:z(e)},r))})}),(0,t.jsx)("tbody",{children:i.map((e,r)=>(0,t.jsx)("tr",{style:r%2==0?w:S,children:e.map((e,r)=>(0,t.jsx)("td",{style:C,children:z(e)},r))},r))})]})},r)}(e.content,o);case"hr":return(0,t.jsx)("hr",{style:f},o);case"p":return(0,t.jsx)("p",{style:s,children:z(e.content)},o);default:return null}})})}function l({code:e,language:o}){let[n,i]=(0,r.useState)(!1);return(0,t.jsxs)("div",{style:z,children:[(0,t.jsxs)("div",{style:T,children:[(0,t.jsx)("span",{children:o||"code"}),(0,t.jsx)("button",{onClick:()=>{navigator.clipboard.writeText(e),i(!0),setTimeout(()=>i(!1),2e3)},style:P,children:n?"Copied! ✓":"Copy"})]}),(0,t.jsx)("pre",{style:R,children:(0,t.jsx)("code",{children:e})})]})}let a={fontFamily:"var(--font-sans), sans-serif",color:"var(--foreground)",lineHeight:1.6,padding:"1.5rem",overflowY:"auto",height:"100%",backgroundColor:"#080c14",borderLeft:"1px solid var(--border)"},s={fontSize:"0.875rem",marginBottom:"1rem",color:"var(--foreground-muted, #94a3b8)"},d={fontSize:"1.5rem",fontWeight:700,margin:"1.5rem 0 1rem 0",paddingBottom:"0.3rem",borderBottom:"1px solid var(--border)",color:"var(--foreground)",background:"linear-gradient(135deg, #fff 0%, #a855f7 100%)",WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"},c={fontSize:"1.25rem",fontWeight:650,margin:"1.25rem 0 0.85rem 0",paddingBottom:"0.25rem",borderBottom:"1px solid var(--border)",color:"var(--foreground)"},p={fontSize:"1.05rem",fontWeight:600,margin:"1rem 0 0.75rem 0",color:"var(--foreground)"},u={fontSize:"0.925rem",fontWeight:600,margin:"0.85rem 0 0.5rem 0",color:"var(--foreground)"},m={listStyleType:"none",padding:0,margin:"0 0 1rem 0"},h={listStyleType:"none",padding:0,margin:"0 0 1rem 0"},g={display:"flex",alignItems:"flex-start",fontSize:"0.875rem",marginBottom:"0.375rem",color:"var(--foreground-muted, #94a3b8)"},f={border:"none",height:"1px",background:"linear-gradient(90deg, var(--border) 0%, rgba(255,255,255,0.05) 100%)",margin:"1.5rem 0"},x={fontFamily:"var(--font-mono), monospace",fontSize:"0.85em",backgroundColor:"rgba(255, 255, 255, 0.06)",border:"1px solid rgba(255, 255, 255, 0.08)",borderRadius:"4px",padding:"0.1rem 0.3rem",color:"#f87171"},y={color:"#60a5fa",textDecoration:"underline",fontWeight:500},b={width:"100%",overflowX:"auto",margin:"1rem 0",borderRadius:"8px",border:"1px solid var(--border)",backgroundColor:"rgba(255, 255, 255, 0.01)"},v={width:"100%",borderCollapse:"collapse",fontSize:"0.85rem"},j={backgroundColor:"rgba(255, 255, 255, 0.03)",borderBottom:"2px solid var(--border)",padding:"0.5rem 0.75rem",fontWeight:700,textAlign:"left",color:"var(--foreground)"},C={borderBottom:"1px solid var(--border)",padding:"0.5rem 0.75rem",color:"var(--foreground-muted, #94a3b8)"},w={backgroundColor:"rgba(255, 255, 255, 0.01)"},S={backgroundColor:"transparent"},k={borderLeft:"4px solid #a855f7",backgroundColor:"rgba(168, 85, 247, 0.03)",padding:"0.5rem 1rem",margin:"1rem 0",borderRadius:"4px",fontStyle:"italic",color:"var(--muted)"},z={margin:"1rem 0",borderRadius:"8px",border:"1px solid var(--border)",backgroundColor:"#05070a",overflow:"hidden"},T={display:"flex",justifyContent:"space-between",alignItems:"center",padding:"0.35rem 0.75rem",backgroundColor:"rgba(255, 255, 255, 0.02)",borderBottom:"1px solid var(--border)",fontSize:"0.7rem",color:"var(--muted)",textTransform:"uppercase",fontFamily:"var(--font-mono), monospace"},R={margin:0,padding:"1rem",overflowX:"auto",fontSize:"0.8rem",fontFamily:"var(--font-mono), monospace",lineHeight:1.5,color:"#e2e8f0"},P={background:"none",border:"1px solid var(--border)",borderRadius:"4px",padding:"2px 6px",color:"var(--muted)",cursor:"pointer",fontSize:"0.65rem",transition:"all 0.1s ease"},W={display:"flex",width:"100%",height:"100%",flex:1,minHeight:0,backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"12px",overflow:"hidden",boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.6)"},I={width:"50px",backgroundColor:"#030406",borderRight:"1px solid var(--border)",display:"flex",flexDirection:"column",justifyContent:"space-between",alignItems:"center",padding:"0.75rem 0"},L={display:"flex",flexDirection:"column",width:"100%",gap:"0.5rem"},F={width:"100%",height:"45px",display:"flex",alignItems:"center",justifyContent:"center",cursor:"pointer",fontSize:"1.25rem",transition:"all 0.15s ease"},O={width:"300px",backgroundColor:"#080c14",borderRight:"1px solid var(--border)",display:"flex",flexDirection:"column",overflow:"hidden"},B={padding:"0.75rem 1rem",borderBottom:"1px solid var(--border)",display:"flex",alignItems:"center",justifyContent:"space-between",background:"rgba(255,255,255,0.02)"},D={flex:1,overflowY:"auto",padding:"0.75rem 0"},E={padding:"0.25rem 1rem",fontSize:"0.75rem",fontWeight:700,color:"var(--muted)",display:"flex",alignItems:"center",justifyContent:"space-between",textTransform:"uppercase",letterSpacing:"0.05em"},M={fontSize:"0.6rem",backgroundColor:"rgba(59, 130, 246, 0.1)",color:"#3b82f6",padding:"0.1rem 0.3rem",borderRadius:"3px",textTransform:"none",letterSpacing:"normal"},N={fontSize:"0.75rem",fontWeight:600,color:"var(--foreground)"},A={flex:1,display:"flex",flexDirection:"column",overflow:"hidden",backgroundColor:"#0b101b"},$={flex:1,display:"flex",flexDirection:"column",borderBottom:"1px solid var(--border)",overflow:"hidden"},U={height:"35px",backgroundColor:"#05070a",borderBottom:"1px solid var(--border)",display:"flex",alignItems:"center",justifyContent:"space-between",paddingRight:"0.75rem"},J={display:"flex",height:"100%",overflowX:"auto"},V={padding:"0 1rem",height:"100%",display:"flex",alignItems:"center",gap:"0.75rem",fontSize:"0.75rem",borderRight:"1px solid var(--border)",borderBottom:"2px solid transparent",cursor:"pointer",transition:"all 0.15s ease",maxWidth:"150px"},H={fontSize:"0.65rem",color:"var(--muted)",cursor:"pointer",padding:"2px"},G={color:"var(--primary)",fontSize:"0.65rem",marginLeft:"2px"},K={padding:"0.25rem 0.5rem",borderRadius:"4px",border:"1px solid var(--border-focus)",backgroundColor:"rgba(16, 185, 129, 0.15)",color:"var(--success)",fontSize:"0.7rem",fontWeight:600},_={flex:1,position:"relative",overflow:"hidden"},Y={width:"100%",height:"100%",backgroundColor:"#0b101b",border:"none",outline:"none",color:"#e2e8f0",fontFamily:"var(--font-mono), monospace",fontSize:"0.85rem",padding:"1rem",resize:"none",lineHeight:1.5},X={display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",color:"var(--muted)",textAlign:"center",padding:"2rem"},q={flex:1.4,backgroundColor:"#05070a",display:"flex",flexDirection:"column",overflow:"hidden"},Q={padding:"0.5rem 1rem",borderBottom:"1px solid var(--border)",display:"flex",alignItems:"center",justifyContent:"space-between",backgroundColor:"rgba(255,255,255,0.01)"},Z={padding:"0.3rem 0.6rem",borderRadius:"4px",border:"1px solid var(--primary)",backgroundColor:"transparent",color:"var(--primary)",fontSize:"0.7rem",fontWeight:600,cursor:"pointer"},ee={padding:"0.3rem 0.6rem",borderRadius:"4px",border:"1px solid var(--success)",backgroundColor:"transparent",color:"var(--success)",fontSize:"0.7rem",fontWeight:600,cursor:"pointer"},et={flex:1,overflow:"hidden"};function er({node:e,onSelect:o,onCreate:n,onRename:i,onDelete:l,isReadOnly:a=!1}){let[s,d]=(0,r.useState)(!1),[c,p]=(0,r.useState)(!1),u="directory"===e.type,m={padding:"0.25rem 0.5rem",display:"flex",alignItems:"center",justifyContent:"space-between",fontSize:"0.8rem",fontFamily:"var(--font-mono), monospace",cursor:"pointer",color:"var(--foreground)",borderRadius:"4px",transition:"background 0.1s ease",userSelect:"none",backgroundColor:c?"rgba(255, 255, 255, 0.05)":"transparent",minWidth:0,width:"100%"},h={display:"flex",alignItems:"center",gap:"0.375rem",flex:1,minWidth:0,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},g={display:c?"flex":"none",alignItems:"center",gap:"0.25rem",paddingLeft:"0.5rem",flexShrink:0},f={background:"none",border:"none",padding:"2px 4px",cursor:"pointer",fontSize:"0.75rem",color:"var(--muted)",borderRadius:"3px",transition:"all 0.1s ease"},x=(e,t)=>{e.stopPropagation(),t()};return u?(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{onClick:()=>d(!s),style:m,onMouseEnter:()=>p(!0),onMouseLeave:()=>p(!1),children:[(0,t.jsxs)("div",{style:h,children:[(0,t.jsx)("span",{style:{color:"#eab308"},children:s?"📂":"📁"}),(0,t.jsx)("span",{style:{fontWeight:600,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name})]}),!a&&(0,t.jsxs)("div",{style:g,children:[(0,t.jsx)("button",{onClick:t=>x(t,()=>n(e.path,"file")),style:f,title:"New File inside...",onMouseEnter:e=>e.currentTarget.style.color="var(--success)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"📄+"}),(0,t.jsx)("button",{onClick:t=>x(t,()=>n(e.path,"directory")),style:f,title:"New Folder inside...",onMouseEnter:e=>e.currentTarget.style.color="var(--success)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"📁+"}),(0,t.jsx)("button",{onClick:t=>x(t,()=>i(e.path)),style:f,title:"Rename...",onMouseEnter:e=>e.currentTarget.style.color="var(--primary)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"✏️"}),(0,t.jsx)("button",{onClick:t=>x(t,()=>l(e.path)),style:f,title:"Delete Folder",onMouseEnter:e=>e.currentTarget.style.color="var(--danger)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"🗑️"})]})]}),s&&e.children&&(0,t.jsx)("div",{style:{paddingLeft:"10px",borderLeft:"1px solid rgba(255, 255, 255, 0.05)",marginLeft:"8px"},children:e.children.map(e=>(0,t.jsx)(er,{node:e,onSelect:o,onCreate:n,onRename:i,onDelete:l,isReadOnly:a},e.path))})]}):(0,t.jsxs)("div",{onClick:()=>o(e.path),style:m,onMouseEnter:()=>p(!0),onMouseLeave:()=>p(!1),children:[(0,t.jsxs)("div",{style:h,children:[(0,t.jsx)("span",{style:{color:"#3b82f6"},children:"📄"}),(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name})]}),!a&&(0,t.jsxs)("div",{style:g,children:[(0,t.jsx)("button",{onClick:t=>x(t,()=>i(e.path)),style:f,title:"Rename...",onMouseEnter:e=>e.currentTarget.style.color="var(--primary)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"✏️"}),(0,t.jsx)("button",{onClick:t=>x(t,()=>l(e.path)),style:f,title:"Delete File",onMouseEnter:e=>e.currentTarget.style.color="var(--danger)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"🗑️"})]})]})}let eo={position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(0,0,0,0.7)",display:"flex",alignItems:"center",justifyContent:"center",zIndex:1e3,backdropFilter:"blur(4px)"},en={width:"420px",backgroundColor:"#080c14",border:"1px solid var(--border)",borderRadius:"12px",padding:"1.5rem",boxShadow:"0 20px 25px -5px rgba(0, 0, 0, 0.8)"},ei={width:"100%",backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"6px",padding:"0.5rem 0.75rem",color:"#e2e8f0",fontSize:"0.85rem",outline:"none",marginBottom:"1.5rem",fontFamily:"var(--font-mono), monospace"},el={display:"flex",justifyContent:"flex-end",gap:"0.75rem"},ea={backgroundColor:"transparent",border:"1px solid var(--border)",color:"var(--foreground)",padding:"0.5rem 1rem",borderRadius:"6px",fontSize:"0.8rem",fontWeight:600,cursor:"pointer"},es={backgroundColor:"var(--primary)",border:"none",color:"#ffffff",padding:"0.5rem 1rem",borderRadius:"6px",fontSize:"0.8rem",fontWeight:600,cursor:"pointer"},ed={background:"none",border:"none",color:"var(--muted)",cursor:"pointer",fontSize:"0.8rem",padding:"4px",borderRadius:"3px",transition:"all 0.1s ease"},ec={position:"fixed",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(0,0,0,0.5)",display:"flex",alignItems:"flex-start",justifyContent:"center",zIndex:1100,paddingTop:"5vh",backdropFilter:"blur(2px)"},ep={width:"600px",backgroundColor:"#080c14",border:"1px solid var(--border)",borderRadius:"8px",boxShadow:"0 10px 25px -5px rgba(0, 0, 0, 0.8)",display:"flex",flexDirection:"column",overflow:"hidden"},eu={width:"100%",backgroundColor:"#05070a",border:"none",borderBottom:"1px solid var(--border)",padding:"0.75rem 1rem",color:"#e2e8f0",fontSize:"0.9rem",outline:"none",fontFamily:"var(--font-mono), monospace"},em={maxHeight:"300px",overflowY:"auto",padding:"0.25rem 0"},eh={display:"flex",alignItems:"center",padding:"0.5rem 1rem",cursor:"pointer",transition:"all 0.1s ease",justifyContent:"space-between"},eg={backgroundColor:"rgba(255,255,255,0.02)",border:"1px solid var(--border)",borderRadius:"6px",padding:"0.5rem 0.75rem",display:"flex",flexDirection:"column",gap:"0.25rem"},ef={fontSize:"0.6rem",color:"var(--muted)",textTransform:"uppercase"},ex={fontSize:"1.1rem",fontWeight:700,fontFamily:"var(--font-mono)"},ey={width:"100%",height:"6px",backgroundColor:"rgba(255,255,255,0.05)",borderRadius:"3px",overflow:"hidden"},eb={height:"100%",borderRadius:"3px",transition:"width 0.5s ease-out"},ev={padding:"0.35rem 1rem",borderBottom:"1px solid var(--border)",backgroundColor:"#030406",display:"flex",alignItems:"center",gap:"0.75rem",flexWrap:"nowrap",overflowX:"auto"},ej={padding:"0.15rem 0.45rem",borderRadius:"4px",border:"1px solid var(--border)",backgroundColor:"rgba(255,255,255,0.02)",color:"var(--muted)",fontSize:"0.7rem",fontFamily:"var(--font-mono)",fontWeight:600,cursor:"pointer",transition:"all 0.1s ease"},eC={backgroundColor:"#05070a",borderBottom:"1px solid var(--border)",padding:"0.25rem 0.75rem 0 0.75rem",display:"flex",alignItems:"center",justifyContent:"space-between"},ew={padding:"0.35rem 0.75rem",borderRadius:"6px 6px 0 0",border:"1px solid var(--border)",borderBottom:"none",display:"flex",alignItems:"center",gap:"0.5rem",cursor:"pointer",transition:"all 0.15s ease"},eS={display:"flex",alignItems:"center",backgroundColor:"rgba(0, 0, 0, 0.3)",border:"1px solid var(--border)",borderRadius:"6px",padding:"2px",marginRight:"0.5rem"},ek={padding:"0.2rem 0.5rem",borderRadius:"4px",border:"1px solid transparent",fontSize:"0.65rem",fontWeight:600,cursor:"pointer",transition:"all 0.15s ease",display:"flex",alignItems:"center",gap:"3px"};function ez({file:e,isStaged:o,onAction:n,onSelect:i,onIgnore:l,onDiscard:a}){let[s,d]=(0,r.useState)(!1),c="#eab308",p=o?e.indexStatus||"M":e.worktreeStatus||"M";return("??"===p||"?"===p)&&(c="#10b981"),"A"===p&&(c="#10b981"),"D"===p&&(c="#ef4444"),(0,t.jsxs)("div",{onClick:()=>i(e),onMouseEnter:()=>d(!0),onMouseLeave:()=>d(!1),style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0.35rem 0.5rem",borderRadius:"4px",backgroundColor:"rgba(255,255,255,0.02)",cursor:"pointer",fontSize:"0.75rem",fontFamily:"var(--font-mono)",position:"relative"},children:[(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1,marginRight:"0.5rem"},title:e.relativePath,children:e.name}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.35rem"},children:[s&&(0,t.jsxs)("div",{style:{display:"flex",gap:"0.25rem"},children:[!o&&l&&(0,t.jsx)("button",{onClick:t=>{t.stopPropagation(),l(e.relativePath)},title:"Add to .gitignore",style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.65rem",color:"var(--muted)",padding:"1px 4px",borderRadius:"3px",backgroundColor:"rgba(255,255,255,0.05)"},onMouseEnter:e=>e.currentTarget.style.color="var(--danger)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"🚫"}),!o&&a&&(0,t.jsx)("button",{onClick:t=>{t.stopPropagation(),a(e.relativePath)},title:"Discard changes",style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.65rem",color:"var(--muted)",padding:"1px 4px",borderRadius:"3px",backgroundColor:"rgba(255,255,255,0.05)"},onMouseEnter:e=>e.currentTarget.style.color="var(--danger)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"🗑️"}),(0,t.jsx)("button",{onClick:t=>{t.stopPropagation(),n(e.relativePath)},title:o?"Unstage Change":"Stage Change",style:{background:"none",border:"none",cursor:"pointer",fontSize:"0.65rem",color:"var(--muted)",padding:"1px 4px",borderRadius:"3px",backgroundColor:"rgba(255,255,255,0.05)"},onMouseEnter:e=>e.currentTarget.style.color="var(--foreground)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:o?"➖":"➕"})]}),(0,t.jsx)("span",{style:{fontSize:"0.6rem",padding:"0.1rem 0.3rem",borderRadius:"3px",backgroundColor:c+"22",color:c,fontWeight:700,width:"1.2rem",display:"inline-block",textAlign:"center"},children:p.substring(0,1)})]})]})}function eT({url:e}){let[o,n]=(0,r.useState)(e),[i,l]=(0,r.useState)(e),[a,s]=(0,r.useState)(0);(0,r.useEffect)(()=>{n(e),l(e)},[e]);let d=()=>{let e=o.trim();e&&!/^https?:\/\//i.test(e)&&(e="http://"+e),n(e),l(e)};return(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%",backgroundColor:"#0b101b"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem",padding:"0.5rem",backgroundColor:"#05070a",borderBottom:"1px solid var(--border)"},children:[(0,t.jsx)("button",{onClick:()=>{s(e=>e+1)},title:"Hard Reload Frame",style:{background:"none",border:"1px solid var(--border)",borderRadius:"4px",color:"var(--muted)",cursor:"pointer",fontSize:"0.85rem",padding:"0.25rem 0.5rem",display:"flex",alignItems:"center",backgroundColor:"rgba(255,255,255,0.02)"},onMouseEnter:e=>e.currentTarget.style.color="var(--foreground)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"🔄"}),(0,t.jsx)("input",{type:"text",value:o,onChange:e=>n(e.target.value),onKeyDown:e=>{"Enter"===e.key&&d()},style:{flex:1,backgroundColor:"#080c14",border:"1px solid var(--border)",borderRadius:"4px",padding:"0.25rem 0.75rem",color:"#ffffff",fontSize:"0.8rem",outline:"none",fontFamily:"var(--font-mono), monospace"}}),(0,t.jsx)("button",{onClick:d,title:"Go to URL",style:{background:"none",border:"1px solid var(--border)",borderRadius:"4px",color:"var(--primary)",cursor:"pointer",fontSize:"0.8rem",padding:"0.25rem 0.5rem",display:"flex",alignItems:"center",backgroundColor:"rgba(255,255,255,0.02)"},children:"➔"}),(0,t.jsx)("button",{onClick:()=>{window.open(i,"_blank")},title:"Open in External Browser",style:{background:"none",border:"1px solid var(--border)",borderRadius:"4px",color:"var(--muted)",cursor:"pointer",fontSize:"0.85rem",padding:"0.25rem 0.5rem",display:"flex",alignItems:"center",backgroundColor:"rgba(255,255,255,0.02)"},onMouseEnter:e=>e.currentTarget.style.color="var(--foreground)",onMouseLeave:e=>e.currentTarget.style.color="var(--muted)",children:"🌐"})]}),(0,t.jsx)("div",{style:{flex:1,position:"relative",width:"100%",height:"100%",backgroundColor:"#ffffff"},children:(0,t.jsx)("iframe",{src:i,style:{width:"100%",height:"100%",border:"none",backgroundColor:"#ffffff"},sandbox:"allow-scripts allow-same-origin allow-popups allow-forms"},a)})]})}function eR({content:e,filePath:r}){let o=e.split(/\r?\n/),n=0,i=0,l=0,a=0,s=o.map(e=>{let t="normal",r=e,o=null,s=null;if(e.startsWith("diff --git")||e.startsWith("index ")||e.startsWith("--- ")||e.startsWith("+++ "))t="header";else if(e.startsWith("@@")){t="hunk";let r=e.match(/^@@\s+-(\d+)(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@/);r&&(n=parseInt(r[1],10),i=parseInt(r[2],10))}else e.startsWith("+")?(t="addition",r=e.substring(1),s=i++,l++):e.startsWith("-")?(t="deletion",r=e.substring(1),o=n++,a++):(t="normal",e.startsWith(" ")&&(r=e.substring(1)),n>0&&(o=n++),i>0&&(s=i++));return{type:t,content:r,oldNum:o,newNum:s,raw:e}});return(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",height:"100%",backgroundColor:"#0b101b"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0.5rem 1rem",backgroundColor:"#05070a",borderBottom:"1px solid var(--border)"},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.5rem"},children:[(0,t.jsx)("span",{style:{fontSize:"1rem"},children:"📄"}),(0,t.jsx)("span",{style:{fontWeight:600,fontSize:"0.85rem",color:"var(--foreground)",fontFamily:"var(--font-mono)"},children:r})]}),(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem",fontSize:"0.75rem"},children:[l>0&&(0,t.jsxs)("span",{style:{color:"#4ade80",backgroundColor:"rgba(74, 222, 128, 0.1)",padding:"0.15rem 0.4rem",borderRadius:"4px",fontWeight:600},children:["+",l," lines"]}),a>0&&(0,t.jsxs)("span",{style:{color:"#f87171",backgroundColor:"rgba(248, 113, 113, 0.1)",padding:"0.15rem 0.4rem",borderRadius:"4px",fontWeight:600},children:["-",a," lines"]}),(0,t.jsxs)("span",{style:{color:"var(--muted)"},children:[s.length," lines in diff"]})]})]}),(0,t.jsx)("div",{style:{flex:1,overflow:"auto",padding:"0.5rem 0"},children:(0,t.jsx)("table",{style:{width:"100%",borderCollapse:"collapse",fontFamily:"var(--font-mono), monospace",fontSize:"0.8rem",lineHeight:1.5},children:(0,t.jsx)("tbody",{children:s.map((e,r)=>{if("header"===e.type)return(0,t.jsx)("tr",{style:{backgroundColor:"rgba(255,255,255,0.02)"},children:(0,t.jsx)("td",{colSpan:4,style:{color:"var(--muted)",padding:"0.25rem 1rem",fontSize:"0.75rem",borderBottom:"1px solid rgba(255,255,255,0.03)"},children:e.raw})},r);if("hunk"===e.type)return(0,t.jsxs)("tr",{style:{backgroundColor:"rgba(96, 165, 250, 0.05)"},children:[(0,t.jsx)("td",{colSpan:2,style:{width:"80px",textAlign:"center",color:"rgba(96, 165, 250, 0.6)",borderRight:"1px solid rgba(96, 165, 250, 0.15)",userSelect:"none",padding:"0.25rem 0",fontSize:"0.7rem"},children:"@@"}),(0,t.jsx)("td",{style:{width:"25px",borderRight:"1px solid rgba(255, 255, 255, 0.05)"}}),(0,t.jsx)("td",{style:{color:"#60a5fa",padding:"0.25rem 1rem",fontStyle:"italic",fontSize:"0.75rem"},children:e.raw})]},r);let o="transparent",n="var(--foreground)",i=" ",l="transparent";return"addition"===e.type?(o="rgba(74, 222, 128, 0.08)",n="#4ade80",i="+",l="rgba(74, 222, 128, 0.4)"):"deletion"===e.type&&(o="rgba(248, 113, 113, 0.08)",n="#f87171",i="-",l="rgba(248, 113, 113, 0.4)"),(0,t.jsxs)("tr",{style:{backgroundColor:o},children:[(0,t.jsx)("td",{style:{width:"40px",textAlign:"right",paddingRight:"0.75rem",color:"var(--muted)",opacity:e.oldNum?.6:.2,userSelect:"none",borderRight:"1px solid rgba(255, 255, 255, 0.05)",fontSize:"0.75rem"},children:e.oldNum||""}),(0,t.jsx)("td",{style:{width:"40px",textAlign:"right",paddingRight:"0.75rem",color:"var(--muted)",opacity:e.newNum?.6:.2,userSelect:"none",borderRight:"1px solid rgba(255, 255, 255, 0.05)",fontSize:"0.75rem"},children:e.newNum||""}),(0,t.jsx)("td",{style:{width:"25px",textAlign:"center",color:l,userSelect:"none",fontWeight:"bold",fontSize:"0.85rem",borderRight:"1px solid rgba(255, 255, 255, 0.05)"},children:i}),(0,t.jsx)("td",{style:{paddingLeft:"0.75rem",color:n,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:e.content})]},r)})})})})]})}let eP={width:"100%",minHeight:"60px",backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"6px",padding:"0.5rem",color:"#e2e8f0",fontSize:"0.75rem",resize:"vertical",outline:"none",fontFamily:"var(--font-sans), sans-serif"},eW={width:"100%",padding:"0.35rem",backgroundColor:"var(--primary)",border:"none",color:"#ffffff",borderRadius:"6px",fontSize:"0.75rem",fontWeight:600,cursor:"pointer",transition:"opacity 0.1s ease"},eI={background:"none",border:"1px solid var(--border)",borderRadius:"4px",padding:"2px 5px",cursor:"pointer",fontSize:"0.7rem",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"rgba(255,255,255,0.02)"},eL={background:"none",border:"none",cursor:"pointer",fontSize:"0.65rem",color:"var(--muted)",padding:"2px 4px",borderRadius:"3px",display:"flex",alignItems:"center",justifyContent:"center"};e.s(["default",0,function({sessionId:e,workspaceRoot:l,scopedDirs:a,onClose:s,sessions:d,onSwitchSession:c,onRefreshSessions:p,wsPort:u=3001}){let m=JSON.stringify(a),h=d.find(t=>t.id===e),[g,f]=(0,r.useState)(null),[x,y]=(0,r.useState)([]),[b,v]=(0,r.useState)(!1),j=async t=>{try{let r=await fetch("/api/sessions/scope",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:e,path:t,action:"add"})});if(r.ok)p&&p();else{let e=await r.json();alert(e.error||"Failed to add scoped folder.")}}catch(e){console.error(e),alert("Network error: failed to add scoped folder.")}},C=async t=>{try{let r=await fetch("/api/sessions/scope",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:e,path:t,action:"remove"})});if(r.ok)p&&p();else{let e=await r.json();alert(e.error||"Failed to remove scoped folder.")}}catch(e){console.error(e),alert("Network error: failed to remove scoped folder.")}},[w,S]=(0,r.useState)({}),[k,z]=(0,r.useState)({}),T=w[e]||[],R=k[e]||null,P=(0,r.useCallback)(t=>{S(r=>{let o=r[e]||[],n="function"==typeof t?t(o):t;return{...r,[e]:n}})},[e]),eF=(0,r.useCallback)(t=>{z(r=>({...r,[e]:t}))},[e]),[eO,eB]=(0,r.useState)("edit"),[eD,eE]=(0,r.useState)(!0),[eM,eN]=(0,r.useState)("explorer"),[eA,e$]=(0,r.useState)("http://localhost:3000"),[eU,eJ]=(0,r.useState)(!1),[eV,eH]=(0,r.useState)(300),[eG,eK]=(0,r.useState)(!1),[e_,eY]=(0,r.useState)(380),[eX,eq]=(0,r.useState)(!1),eQ=(0,r.useCallback)(e=>{e.preventDefault(),eK(!0)},[]),eZ=(0,r.useCallback)(e=>{e.preventDefault(),eq(!0)},[]);(0,r.useEffect)(()=>{let e=e=>{if(eG){let t=document.getElementById("loom-ide-container");if(t){let r=t.getBoundingClientRect(),o=e.clientX-r.left-50;o>150&&o<600&&eH(o)}}if(eX){let t=document.getElementById("loom-ide-container");if(t){let r=t.getBoundingClientRect(),o=r.bottom-e.clientY;o>100&&o<r.height-150&&eY(o)}}},t=()=>{eK(!1),eq(!1)};return(eG||eX)&&(window.addEventListener("mousemove",e),window.addEventListener("mouseup",t),document.body.style.cursor=eG?"col-resize":"row-resize",document.body.style.userSelect="none"),()=>{window.removeEventListener("mousemove",e),window.removeEventListener("mouseup",t),document.body.style.cursor="",document.body.style.userSelect=""}},[eG,eX]);let[e0,e5]=(0,r.useState)([]),[e1,e2]=(0,r.useState)(!1),[e7,e8]=(0,r.useState)(!1),[e3,e4]=(0,r.useState)(""),[e6,e9]=(0,r.useState)({ahead:0,behind:0}),[te,tt]=(0,r.useState)(""),[tr,to]=(0,r.useState)(null),[tn,ti]=(0,r.useState)(null),[tl,ta]=(0,r.useState)(""),[ts,td]=(0,r.useState)([]),[tc,tp]=(0,r.useState)(""),[tu,tm]=(0,r.useState)(""),[th,tg]=(0,r.useState)(null),tf=(0,r.useCallback)(async()=>{await new Promise(e=>setTimeout(e,0)),e8(!0);try{let e=await fetch(`/api/git?action=status&root=${encodeURIComponent(l)}`);if(e.ok){let t=await e.json();t.success&&(e2(t.isGit),e5(t.files||[]),e4(t.branch||""),e9({ahead:t.ahead||0,behind:t.behind||0}))}}catch(e){console.error("Failed to load git status:",e)}finally{e8(!1)}},[l]);(0,r.useEffect)(()=>{setTimeout(()=>{tf()},0);let e=setInterval(tf,5e3);return()=>clearInterval(e)},[tf]);let tx=async e=>{try{(await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"stage",file:e,rootPath:l})})).ok&&await tf()}catch(e){console.error(e)}},ty=async e=>{try{(await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"ignore",file:e,rootPath:l})})).ok&&await tf()}catch(e){console.error(e)}},tb=async e=>{if(confirm(`Are you sure you want to discard changes in "${e}"? This action cannot be undone.`))try{(await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"discard",file:e,rootPath:l})})).ok&&await tf()}catch(e){console.error(e)}},tv=async()=>{try{(await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"stage",rootPath:l})})).ok&&await tf()}catch(e){console.error(e)}},tj=async e=>{try{(await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"unstage",file:e,rootPath:l})})).ok&&await tf()}catch(e){console.error(e)}},tC=async()=>{try{(await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"unstage",rootPath:l})})).ok&&await tf()}catch(e){console.error(e)}},tw=async()=>{if(te.trim())try{let e=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"commit",message:te,rootPath:l})});if(e.ok)tt(""),await tf();else{let t=await e.json();alert(t.error||"Git commit failed")}}catch(e){console.error(e)}},tS=async()=>{try{let e=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"pull",rootPath:l})});if(e.ok){let t=await e.json();alert(t.output||"Git pull completed successfully."),await tf()}else{let t=await e.json();alert(t.error||"Git pull failed")}}catch(e){console.error(e)}},tk=async()=>{try{let e=await fetch("/api/git",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"push",rootPath:l})});if(e.ok){let t=await e.json();alert(t.output||"Git push completed successfully."),await tf()}else{let t=await e.json();alert(t.error||"Git push failed")}}catch(e){console.error(e)}},tz=async e=>{try{let t=await fetch(`/api/git?action=diff&file=${encodeURIComponent(e.relativePath)}&root=${encodeURIComponent(l)}`);if(t.ok){let r=await t.json();if(r.success){let t=`diff:${e.relativePath}`;T.some(e=>e.path===t)||P(o=>[...o,{name:`Diff: ${e.name}`,path:t,content:r.diff,isModified:!1}]),eF(t)}}}catch(e){console.error(e)}};(0,r.useEffect)(()=>{let t=async()=>{try{let t=await fetch(`/api/sessions?id=${e}`);if(t.ok){let e=await t.json();to(e)}}catch(e){console.error("Failed to fetch session status:",e)}};t();let r=setInterval(t,3e3);return()=>clearInterval(r)},[e]),(0,r.useEffect)(()=>{let t=async()=>{try{let t=await fetch(`/api/sessions/stats?id=${e}`);if(t.ok){let e=await t.json();ti(e)}}catch(e){console.error("Failed to fetch container/process stats:",e)}};t();let r=setInterval(t,3e3);return()=>clearInterval(r)},[e]),(0,r.useEffect)(()=>{let e=localStorage.getItem("neural_loom_custom_commands");if(e)try{let t=JSON.parse(e);setTimeout(()=>{td(t)},0)}catch{}},[]);let tT=e=>{td(e),localStorage.setItem("neural_loom_custom_commands",JSON.stringify(e))},tR=async t=>{try{await fetch("/api/sessions/inject",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e,command:t})})}catch(e){console.error("Failed to inject command:",e)}},tP=tr?.type?.includes("aider"),[tW,tI]=(0,r.useState)({type:null,targetPath:null,inputValue:"",error:null}),[tL,tF]=(0,r.useState)(!1),[tO,tB]=(0,r.useState)(""),[tD,tE]=(0,r.useState)([]),[tM,tN]=(0,r.useState)(0),tA=(0,r.useCallback)(async()=>{await new Promise(e=>setTimeout(e,0)),eJ(!0);try{let e=a&&a.length>0?`&scoped=${encodeURIComponent(a.join(","))}`:"",t=await fetch(`/api/files?action=list&root=${encodeURIComponent(l)}${e}`);if(t.ok){let e=await t.json();e.success&&(f(e.workspace),y(e.scoped||[]))}}catch(e){console.error("Failed to load file explorer:",e)}finally{eJ(!1)}},[l,m]);(0,r.useEffect)(()=>{tA();let e=setInterval(()=>{tA()},3e3);return()=>clearInterval(e)},[tA]);let t$=(e,t)=>{tI({type:"file"===t?"create-file":"create-folder",targetPath:e,inputValue:"",error:null})},tU=e=>{let t=e.split(/[/\\]/).pop()||"";tI({type:"rename",targetPath:e,inputValue:t,error:null})},tJ=e=>{tI({type:"delete",targetPath:e,inputValue:"",error:null})},tV=async e=>{if(e&&e.preventDefault(),tW.type&&tW.targetPath){tI(e=>({...e,error:null}));try{if("create-file"===tW.type||"create-folder"===tW.type){if(!tW.inputValue.trim())return void tI(e=>({...e,error:"Name cannot be empty"}));let e=`${tW.targetPath}/${tW.inputValue.trim()}`,t="create-file"===tW.type?"file":"directory",r=await fetch("/api/files",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"create",path:e,type:t})});if(r.ok){let o=await r.json();o.success?(tI({type:null,targetPath:null,inputValue:"",error:null}),await tA(),"file"===t&&await tG(e)):tI(e=>({...e,error:o.error||"Failed to create item"}))}else{let e=await r.json();tI(t=>({...t,error:e.error||"Failed to create item"}))}}if("rename"===tW.type){if(!tW.inputValue.trim())return void tI(e=>({...e,error:"Name cannot be empty"}));let e=tW.targetPath.replace(/\\/g,"/"),t=e.substring(0,e.lastIndexOf("/")),r=t?`${t}/${tW.inputValue.trim()}`:tW.inputValue.trim(),o=await fetch("/api/files",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"rename",oldPath:tW.targetPath,newPath:r})});if(o.ok){let e=await o.json();e.success?(P(e=>e.map(e=>e.path===tW.targetPath?{...e,path:r,name:tW.inputValue.trim()}:e)),R===tW.targetPath&&eF(r),tI({type:null,targetPath:null,inputValue:"",error:null}),await tA()):tI(t=>({...t,error:e.error||"Failed to rename item"}))}else{let e=await o.json();tI(t=>({...t,error:e.error||"Failed to rename item"}))}}if("delete"===tW.type){let e=await fetch("/api/files",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"delete",path:tW.targetPath})});if(e.ok){let t=await e.json();t.success?(tK(tW.targetPath),tI({type:null,targetPath:null,inputValue:"",error:null}),await tA()):tI(e=>({...e,error:t.error||"Failed to delete item"}))}else{let t=await e.json();tI(e=>({...e,error:t.error||"Failed to delete item"}))}}}catch(e){console.error("File operation failed:",e),tI(e=>({...e,error:"An unexpected error occurred"}))}}},tH=(0,r.useCallback)(async()=>{try{let e=a&&a.length>0?`&scoped=${encodeURIComponent(a.join(","))}`:"",t=await fetch(`/api/files?action=flat_list&root=${encodeURIComponent(l)}${e}`);if(t.ok){let e=await t.json();e.success&&e.files&&tE(e.files)}}catch(e){console.error("Failed to load flat files list:",e)}},[l,m]);(0,r.useEffect)(()=>{tL&&setTimeout(()=>{tB(""),tN(0),tH()},0)},[tL,tH]);let tG=async e=>{if(T.find(t=>t.path===e))return void eF(e);try{let t=await fetch(`/api/files?action=read&path=${encodeURIComponent(e)}`);if(t.ok){let r=await t.json();if(r.success){let t={name:e.split(/[/\\]/).pop()||"Untitled",path:e,content:r.content,isModified:!1};P([...T,t]),eF(e)}}}catch(t){console.error(`Failed to read file ${e}:`,t)}},tK=e=>{let t=T.filter(t=>t.path!==e);P(t),R===e&&eF(t.length>0?t[t.length-1].path:null)},t_=e=>{let t=e.trim();if(!t)return;let r=`browser:${t}`;T.find(e=>e.path===r)||P(e=>[...e,{name:`Browser: ${t.replace(/^https?:\/\//,"")}`,path:r,content:t,isModified:!1}]),eF(r)},tY=T.find(e=>e.path===R),tX=!!tY&&tY.path.toLowerCase().endsWith(".md"),tq=tX?eO:"edit",tQ=e0.filter(e=>e.indexStatus&&" "!==e.indexStatus&&"?"!==e.indexStatus),tZ=e0.filter(e=>e.worktreeStatus&&" "!==e.worktreeStatus||"??"===e.status),t0=e=>{R&&P(T.map(t=>t.path===R?{...t,content:e,isModified:!0}:t))},t5=(0,r.useCallback)(async()=>{if(!(!tY||tY.path.startsWith("diff:")||tY.path.startsWith("browser:")))try{(await fetch("/api/files",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"write",path:tY.path,content:tY.content})})).ok&&P(e=>e.map(e=>e.path===R?{...e,isModified:!1}:e))}catch(e){console.error(`Failed to save file ${tY.path}:`,e)}},[tY,R,P]);(0,r.useEffect)(()=>{let e=e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),t5()),(e.ctrlKey||e.metaKey)&&"p"===e.key&&(e.preventDefault(),tF(e=>!e))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[t5]);let t1=tD.filter(e=>e.name.toLowerCase().includes(tO.toLowerCase())||e.relativePath.toLowerCase().includes(tO.toLowerCase())).slice(0,10);return(0,t.jsxs)("div",{id:"loom-ide-container",style:W,children:[(0,t.jsxs)("div",{style:I,children:[(0,t.jsxs)("div",{style:L,children:[(0,t.jsx)("div",{onClick:()=>{"explorer"===eM?eE(!eD):(eN("explorer"),eE(!0))},style:{...F,backgroundColor:"explorer"===eM&&eD?"rgba(255,255,255,0.08)":"transparent",borderLeft:"explorer"===eM&&eD?"2px solid var(--primary)":"2px solid transparent"},title:"File Explorer (Ctrl+P to search files)",children:"📁"}),(0,t.jsx)("div",{onClick:()=>{"git"===eM?eE(!eD):(eN("git"),eE(!0))},style:{...F,backgroundColor:"git"===eM&&eD?"rgba(255,255,255,0.08)":"transparent",borderLeft:"git"===eM&&eD?"2px solid var(--primary)":"2px solid transparent"},title:"Source Control (Git Changes)",children:"🌿"}),(0,t.jsx)("div",{onClick:()=>{"analytics"===eM?eE(!eD):(eN("analytics"),eE(!0))},style:{...F,backgroundColor:"analytics"===eM&&eD?"rgba(255,255,255,0.08)":"transparent",borderLeft:"analytics"===eM&&eD?"2px solid var(--primary)":"2px solid transparent"},title:"Token Usage & Cost Analytics",children:"📊"}),(0,t.jsx)("div",{onClick:()=>{"auditor"===eM?eE(!eD):(eN("auditor"),eE(!0))},style:{...F,backgroundColor:"auditor"===eM&&eD?"rgba(255,255,255,0.08)":"transparent",borderLeft:"auditor"===eM&&eD?"2px solid var(--primary)":"2px solid transparent"},title:"Session Log Auditor & Search",children:"🔍"}),(0,t.jsx)("div",{onClick:()=>{"browser"===eM?eE(!eD):(eN("browser"),eE(!0))},style:{...F,backgroundColor:"browser"===eM&&eD?"rgba(255,255,255,0.08)":"transparent",borderLeft:"browser"===eM&&eD?"2px solid var(--primary)":"2px solid transparent"},title:"Local Web Browser Test Preview",children:"🌐"})]}),(0,t.jsx)("div",{onClick:s,style:{...F,color:"var(--danger)",fontSize:"1rem"},title:"Exit Session Layout",children:"✖"})]}),eD&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{style:{...O,width:`${eV}px`,borderRight:"none"},children:[(0,t.jsxs)("div",{style:B,children:[(0,t.jsxs)("span",{style:{fontWeight:700,fontSize:"0.75rem",textTransform:"uppercase",letterSpacing:"0.05em"},children:["explorer"===eM&&"Workspace Explorer","git"===eM&&"Source Control","analytics"===eM&&"Telemetry & Cost","auditor"===eM&&"Session Auditor","browser"===eM&&"Browser Preview"]}),"explorer"===eM&&(0,t.jsxs)("div",{style:{display:"flex",gap:"0.25rem"},children:[g&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>t$(g.path,"file"),style:ed,title:"New File at Root...",children:"📄+"}),(0,t.jsx)("button",{onClick:()=>t$(g.path,"directory"),style:ed,title:"New Folder at Root...",children:"📁+"})]}),(0,t.jsx)("button",{onClick:tA,disabled:eU,style:ed,title:"Refresh tree",children:"🔄"})]}),"git"===eM&&(0,t.jsx)("button",{onClick:tf,disabled:e7,style:ed,title:"Refresh git status",children:"🔄"})]}),(0,t.jsxs)("div",{style:D,children:["explorer"===eM&&(0,t.jsxs)(t.Fragment,{children:[g?(0,t.jsxs)("div",{style:{marginBottom:"1.5rem"},children:[(0,t.jsxs)("div",{style:E,children:["💼 ",g.name," ",(0,t.jsx)("span",{style:M,title:g.path,children:"root"})]}),(0,t.jsx)("div",{style:{padding:"0.25rem 0.5rem"},children:g.tree.map(e=>(0,t.jsx)(er,{node:e,onSelect:tG,onCreate:t$,onRename:tU,onDelete:tJ,isReadOnly:!1},e.path))})]}):(0,t.jsx)("div",{style:{padding:"1rem",color:"var(--muted)",fontSize:"0.8rem"},children:"Scanning Workspace directory..."}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{...E,borderTop:"1px solid var(--border)",paddingTop:"1rem"},children:[(0,t.jsxs)("span",{children:["🔍 Scoped Folders (",x.length,")"]}),(0,t.jsx)("button",{onClick:()=>v(!0),style:ed,title:"Add Scoped Folder...",children:"➕"})]}),x.length>0?x.map(e=>(0,t.jsxs)("div",{style:{marginTop:"0.75rem",padding:"0 0.5rem"},children:[(0,t.jsxs)("div",{style:{...N,display:"flex",gap:"0.25rem",color:"#a855f7",fontSize:"0.75rem",fontWeight:700,padding:"0.25rem",justifyContent:"space-between",alignItems:"center"},title:e.path,children:[(0,t.jsxs)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",flex:1},children:["🔗 ",e.name,"/"]}),(0,t.jsx)("button",{onClick:()=>C(e.path),style:{background:"none",border:"none",color:"var(--danger)",cursor:"pointer",fontSize:"0.75rem",padding:"0 0.25rem"},title:"Remove Scoped Folder",children:"✖"})]}),(0,t.jsx)("div",{style:{paddingLeft:"0.25rem"},children:e.tree.map(e=>(0,t.jsx)(er,{node:e,onSelect:tG,onCreate:t$,onRename:tU,onDelete:tJ,isReadOnly:!0},e.path))})]},e.path)):(0,t.jsx)("div",{style:{padding:"0.5rem 1rem",color:"var(--muted)",fontSize:"0.75rem",fontStyle:"italic"},children:"No extra scoped folders. Click [+] to mount a folder."})]})]}),"git"===eM&&(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",height:"100%",overflow:"hidden"},children:[(0,t.jsxs)("div",{style:{padding:"0.5rem 1rem",borderBottom:"1px solid var(--border)",display:"flex",alignItems:"center",justifyContent:"space-between",backgroundColor:"rgba(255,255,255,0.01)",flexShrink:0},children:[(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.4rem",fontSize:"0.75rem",fontWeight:600,overflow:"hidden",whiteSpace:"nowrap",textOverflow:"ellipsis",flex:1},children:[(0,t.jsx)("span",{style:{color:"var(--primary)",flexShrink:0},children:"🌿"}),(0,t.jsx)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:e3,children:e1?e3||"HEAD detached":"No Repository"})]}),e1&&(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.35rem",flexShrink:0},children:[e6.ahead>0&&(0,t.jsxs)("span",{style:{fontSize:"0.65rem",color:"#10b981",fontWeight:700},title:"Commits ahead of remote",children:["↑",e6.ahead]}),e6.behind>0&&(0,t.jsxs)("span",{style:{fontSize:"0.65rem",color:"#ef4444",fontWeight:700},title:"Commits behind remote",children:["↓",e6.behind]}),(0,t.jsx)("button",{onClick:tS,title:"Pull changes",style:eI,onMouseEnter:e=>e.currentTarget.style.backgroundColor="rgba(255,255,255,0.08)",onMouseLeave:e=>e.currentTarget.style.backgroundColor="rgba(255,255,255,0.02)",children:"📥"}),(0,t.jsx)("button",{onClick:tk,title:"Push commits",style:eI,onMouseEnter:e=>e.currentTarget.style.backgroundColor="rgba(255,255,255,0.08)",onMouseLeave:e=>e.currentTarget.style.backgroundColor="rgba(255,255,255,0.02)",children:"📤"})]})]}),e1?(0,t.jsxs)("div",{style:{flex:1,overflowY:"auto",padding:"0.5rem 1rem",display:"flex",flexDirection:"column",gap:"1rem"},children:[(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.4rem"},children:[(0,t.jsx)("textarea",{value:te,onChange:e=>tt(e.target.value),placeholder:"Commit message (Ctrl+Enter to commit)...",style:eP,onKeyDown:e=>{"Enter"===e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),tw())}}),(0,t.jsx)("button",{onClick:tw,disabled:0===e0.length,style:{...eW,opacity:e0.length>0?1:.5,cursor:e0.length>0?"pointer":"not-allowed"},children:"✓ Commit"})]}),tQ.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.35rem"},children:[(0,t.jsxs)("span",{style:{fontSize:"0.7rem",fontWeight:700,textTransform:"uppercase",color:"var(--muted)"},children:["Staged Changes (",tQ.length,")"]}),(0,t.jsx)("button",{onClick:()=>tC(),title:"Unstage All",style:eL,children:"➖"})]}),(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.25rem"},children:tQ.map(e=>(0,t.jsx)(ez,{file:e,isStaged:!0,onAction:tj,onSelect:tz},e.relativePath))})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"0.35rem"},children:[(0,t.jsxs)("span",{style:{fontSize:"0.7rem",fontWeight:700,textTransform:"uppercase",color:"var(--muted)"},children:["Changes (",tZ.length,")"]}),tZ.length>0&&(0,t.jsx)("button",{onClick:()=>tv(),title:"Stage All",style:eL,children:"➕"})]}),0===tZ.length&&0===tQ.length?(0,t.jsx)("div",{style:{color:"var(--success)",fontSize:"0.75rem",padding:"0.5rem 0"},children:"✔ Workspace clean."}):0===tZ.length?(0,t.jsx)("div",{style:{color:"var(--muted)",fontSize:"0.7rem",fontStyle:"italic",padding:"0.25rem 0"},children:"No unstaged changes."}):(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.25rem"},children:tZ.map(e=>(0,t.jsx)(ez,{file:e,isStaged:!1,onAction:tx,onSelect:tz,onIgnore:ty,onDiscard:tb},e.relativePath))})]})]}):(0,t.jsx)("div",{style:{padding:"1rem",color:"var(--muted)",fontSize:"0.75rem",fontStyle:"italic"},children:"Not a git repository."})]}),"browser"===eM&&(0,t.jsxs)("div",{style:{padding:"1rem",display:"flex",flexDirection:"column",gap:"1rem"},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{style:{fontSize:"0.7rem",fontWeight:700,textTransform:"uppercase",color:"var(--muted)",display:"block",marginBottom:"0.4rem"},children:"Url Address"}),(0,t.jsxs)("div",{style:{display:"flex",gap:"0.25rem"},children:[(0,t.jsx)("input",{type:"text",value:eA,onChange:e=>e$(e.target.value),placeholder:"http://localhost:3000",style:{flex:1,backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"4px",padding:"0.35rem 0.5rem",color:"#ffffff",fontSize:"0.75rem",outline:"none"},onKeyDown:e=>{"Enter"===e.key&&t_(eA)}}),(0,t.jsx)("button",{onClick:()=>t_(eA),style:{backgroundColor:"var(--primary)",border:"none",color:"#ffffff",padding:"0.35rem 0.75rem",borderRadius:"4px",fontSize:"0.75rem",fontWeight:600,cursor:"pointer"},children:"Go"})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{style:{fontSize:"0.7rem",fontWeight:700,textTransform:"uppercase",color:"var(--muted)",display:"block",marginBottom:"0.5rem"},children:"Quick Launch Ports"}),(0,t.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"0.35rem"},children:[{label:"Next.js App (3000)",url:"http://localhost:3000"},{label:"WebSocket Gateway (3001)",url:"http://localhost:3001"},{label:"Vite Server (5173)",url:"http://localhost:5173"}].map((e,r)=>(0,t.jsxs)("div",{onClick:()=>{e$(e.url),t_(e.url)},style:{display:"flex",alignItems:"center",justifyContent:"space-between",padding:"0.5rem 0.75rem",borderRadius:"4px",backgroundColor:"rgba(255,255,255,0.02)",border:"1px solid var(--border)",cursor:"pointer",fontSize:"0.75rem",transition:"all 0.15s ease"},onMouseEnter:e=>e.currentTarget.style.backgroundColor="rgba(255,255,255,0.06)",onMouseLeave:e=>e.currentTarget.style.backgroundColor="rgba(255,255,255,0.02)",children:[(0,t.jsx)("span",{style:{color:"var(--foreground)"},children:e.label}),(0,t.jsx)("span",{style:{color:"var(--primary)",fontSize:"0.8rem"},children:"🌐➔"})]},r))})]}),(0,t.jsxs)("div",{style:{marginTop:"auto",padding:"0.5rem",borderRadius:"6px",backgroundColor:"rgba(234, 179, 8, 0.05)",border:"1px solid rgba(234, 179, 8, 0.15)",fontSize:"0.65rem",color:"var(--muted)",lineHeight:"1.4"},children:[(0,t.jsx)("span",{style:{color:"#eab308",fontWeight:700},children:"⚠️ Iframe CSP Note"}),": Some public websites (e.g. Google, GitHub) block loading inside frames via security headers. Use this tab primarily to preview and debug local development webservers."]})]}),"analytics"===eM&&(0,t.jsxs)("div",{style:{padding:"0.5rem 1rem",display:"flex",flexDirection:"column",gap:"1.25rem"},children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:"0.75rem",fontWeight:700,textTransform:"uppercase",color:"var(--muted)",marginBottom:"0.5rem"},children:"Token Usage"}),(0,t.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:"0.5rem"},children:[(0,t.jsxs)("div",{style:eg,children:[(0,t.jsx)("div",{style:ef,children:"Input"}),(0,t.jsx)("div",{style:ex,children:(tr?.tokenUsage?.input??0).toLocaleString()})]}),(0,t.jsxs)("div",{style:eg,children:[(0,t.jsx)("div",{style:ef,children:"Output"}),(0,t.jsx)("div",{style:ex,children:(tr?.tokenUsage?.output??0).toLocaleString()})]}),(0,t.jsxs)("div",{style:{...eg,gridColumn:"span 2"},children:[(0,t.jsx)("div",{style:ef,children:"Cost"}),(0,t.jsxs)("div",{style:{...ex,color:"#10b981",fontSize:"1.25rem"},children:["$",(tr?.tokenUsage?.cost??0).toFixed(4)]})]})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{style:{fontSize:"0.75rem",fontWeight:700,textTransform:"uppercase",color:"var(--muted)",marginBottom:"0.5rem"},children:"Resource Telemetry"}),(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",fontSize:"0.7rem",marginBottom:"0.25rem"},children:[(0,t.jsx)("span",{children:"CPU Usage"}),(0,t.jsx)("span",{style:{fontWeight:600,color:"var(--primary)"},children:tn?.cpu??"0.0%"})]}),(0,t.jsx)("div",{style:ey,children:(0,t.jsx)("div",{style:{...eb,width:tn?.cpu||"0%",backgroundColor:"var(--primary)"}})})]}),(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",fontSize:"0.7rem",marginBottom:"0.25rem"},children:[(0,t.jsx)("span",{children:"Memory Usage"}),(0,t.jsx)("span",{style:{fontWeight:600,color:"#eab308"},children:tn?.memory??"0.0MiB"})]}),(0,t.jsx)("div",{style:ey,children:(0,t.jsx)("div",{style:{...eb,width:tn?.memoryPercent||"0%",backgroundColor:"#eab308"}})})]}),(0,t.jsx)("div",{style:{fontSize:"0.6rem",color:"var(--muted)",marginTop:"0.25rem",fontStyle:"italic"},children:tn?.type?.includes("docker")?"🐳 Docker container statistics":"💻 Local process statistics"})]})]})]}),"auditor"===eM&&(0,t.jsxs)("div",{style:{padding:"0.5rem 1rem",display:"flex",flexDirection:"column",gap:"1rem",height:"100%"},children:[(0,t.jsxs)("div",{style:{display:"flex",gap:"0.25rem"},children:[(0,t.jsx)("input",{type:"text",placeholder:"Search logs...",value:tl,onChange:e=>ta(e.target.value),style:{flex:1,backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"4px",padding:"0.25rem 0.5rem",color:"#ffffff",fontSize:"0.75rem",outline:"none"}}),(0,t.jsx)("button",{onClick:()=>{if(!tr?.logs)return;let t=new Blob([tr.logs.join("").replace(/\x1b\[[0-9;]*m/g,"")],{type:"text/plain;charset=utf-8"}),r=URL.createObjectURL(t),o=document.createElement("a");o.href=r,o.download=`session-${e}-logs.txt`,o.click(),URL.revokeObjectURL(r)},style:{backgroundColor:"rgba(59, 130, 246, 0.15)",border:"1px solid #3b82f6",color:"#3b82f6",padding:"0.25rem 0.5rem",borderRadius:"4px",fontSize:"0.7rem",fontWeight:600,cursor:"pointer"},children:"Export"})]}),(0,t.jsx)("div",{style:{height:"220px",overflowY:"auto",backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"6px",padding:"0.5rem",fontFamily:"var(--font-mono)",fontSize:"0.7rem",lineHeight:"1.4",whiteSpace:"pre-wrap",color:"#cbd5e1"},children:(()=>{if(!tr?.logs||0===tr.logs.length)return(0,t.jsx)("div",{style:{color:"var(--muted)",fontStyle:"italic",textAlign:"center"},children:"No logs captured."});let e=tr.logs.join("").replace(/\x1b\[[0-9;]*m/g,"").split(/\r?\n/),r=tl.trim()?e.filter(e=>e.toLowerCase().includes(tl.toLowerCase())):e;return 0===r.length?(0,t.jsx)("div",{style:{color:"var(--muted)",fontStyle:"italic",textAlign:"center"},children:"No matches."}):r.map((e,r)=>{if(!tl.trim())return(0,t.jsx)("div",{children:e},r);let o=e.split(RegExp(`(${tl})`,"gi"));return(0,t.jsx)("div",{children:o.map((e,r)=>e.toLowerCase()===tl.toLowerCase()?(0,t.jsx)("span",{style:{backgroundColor:"#eab308",color:"#000000",fontWeight:600},children:e},r):e)},r)})})()}),(0,t.jsxs)("div",{style:{borderTop:"1px solid var(--border)",paddingTop:"0.75rem"},children:[(0,t.jsx)("div",{style:{fontSize:"0.75rem",fontWeight:700,color:"var(--muted)",marginBottom:"0.5rem"},children:"Custom Buttons"}),(0,t.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"0.35rem"},children:[(0,t.jsx)("input",{type:"text",placeholder:"Button Name (e.g. /undo)",value:tc,onChange:e=>tp(e.target.value),style:{backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"4px",padding:"0.25rem 0.5rem",color:"#ffffff",fontSize:"0.7rem",outline:"none"}}),(0,t.jsx)("input",{type:"text",placeholder:"Injection Command",value:tu,onChange:e=>tm(e.target.value),style:{backgroundColor:"#05070a",border:"1px solid var(--border)",borderRadius:"4px",padding:"0.25rem 0.5rem",color:"#ffffff",fontSize:"0.7rem",outline:"none"}}),(0,t.jsx)("button",{onClick:()=>{tc.trim()&&tu.trim()&&(tT([...ts,{name:tc.trim(),command:tu.trim()}]),tp(""),tm(""))},style:{backgroundColor:"rgba(168, 85, 247, 0.15)",border:"1px solid #a855f7",color:"#c084fc",padding:"0.3rem",borderRadius:"4px",fontSize:"0.7rem",fontWeight:600,cursor:"pointer"},children:"+ Add Button"}),ts.length>0&&(0,t.jsx)("div",{style:{marginTop:"0.25rem",maxHeight:"60px",overflowY:"auto"},children:ts.map((e,r)=>(0,t.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",fontSize:"0.65rem",backgroundColor:"rgba(255,255,255,0.02)",padding:"0.1rem 0.25rem",borderRadius:"3px",marginTop:"0.15rem"},children:[(0,t.jsx)("span",{style:{color:"#c084fc"},children:e.name}),(0,t.jsx)("span",{onClick:()=>{tT(ts.filter((e,t)=>t!==r))},style:{color:"var(--danger)",cursor:"pointer"},children:"✖"})]},r))})]})]})]})]})]}),(0,t.jsx)("div",{onMouseDown:eQ,style:{width:"4px",cursor:"col-resize",backgroundColor:eG?"var(--primary)":"var(--border)",transition:"background-color 0.15s ease",zIndex:10,alignSelf:"stretch"},onMouseEnter:e=>{eG||(e.currentTarget.style.backgroundColor="var(--border-focus)")},onMouseLeave:e=>{eG||(e.currentTarget.style.backgroundColor="var(--border)")},title:"Drag to resize sidebar"})]}),(0,t.jsxs)("div",{style:A,children:[(0,t.jsx)("div",{style:eC,children:(0,t.jsx)("div",{style:{display:"flex",gap:"0.25rem",overflowX:"auto"},children:d.map(r=>{let o=r.id===e,n="running"===r.status?"#10b981":"rgba(255,255,255,0.2)";return(0,t.jsxs)("div",{onClick:()=>{th===r.id&&tg(null),c(r.id)},style:{...ew,backgroundColor:o?"#0b101b":"rgba(8,12,20,0.6)",borderColor:o?"var(--border-focus)":"var(--border)",color:o?"var(--foreground)":"var(--muted)"},children:[(0,t.jsx)("span",{style:{width:"6px",height:"6px",borderRadius:"50%",backgroundColor:n,display:"inline-block"}}),(0,t.jsx)("span",{style:{fontSize:"0.75rem",fontWeight:o?600:500},children:r.name}),(0,t.jsx)("span",{style:{fontSize:"0.6rem",color:"var(--muted)",backgroundColor:"rgba(255,255,255,0.05)",padding:"1px 4px",borderRadius:"3px"},children:r.type.replace("claude-","").replace("aider-","")})]},r.id)})})}),(0,t.jsxs)("div",{style:{...$,borderBottom:"none"},children:[(0,t.jsxs)("div",{style:U,children:[(0,t.jsx)("div",{style:J,children:T.map(e=>(0,t.jsxs)("div",{style:{...V,backgroundColor:R===e.path?"#0b101b":"rgba(8,12,20,0.4)",borderColor:R===e.path?"var(--border-focus)":"transparent",color:R===e.path?"var(--foreground)":"var(--muted)"},onClick:()=>eF(e.path),children:[(0,t.jsxs)("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[e.name," ",e.isModified&&(0,t.jsx)("span",{style:G,children:"●"})]}),(0,t.jsx)("span",{onClick:t=>{t.stopPropagation(),tK(e.path)},style:H,children:"✖"})]},e.path))}),tY&&!tY.path.startsWith("diff:")&&!tY.path.startsWith("browser:")&&(0,t.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.75rem"},children:[tX&&(0,t.jsxs)("div",{style:eS,children:[(0,t.jsx)("button",{onClick:()=>eB("edit"),style:{...ek,backgroundColor:"edit"===tq?"rgba(255,255,255,0.08)":"transparent",color:"edit"===tq?"var(--foreground)":"var(--muted)",borderColor:"edit"===tq?"var(--border-focus)":"transparent"},title:"Edit file",children:"✏️ Edit"}),(0,t.jsx)("button",{onClick:()=>eB("split"),style:{...ek,backgroundColor:"split"===tq?"rgba(255,255,255,0.08)":"transparent",color:"split"===tq?"var(--foreground)":"var(--muted)",borderColor:"split"===tq?"var(--border-focus)":"transparent"},title:"Split editor & preview",children:"🥞 Split"}),(0,t.jsx)("button",{onClick:()=>eB("preview"),style:{...ek,backgroundColor:"preview"===tq?"rgba(255,255,255,0.08)":"transparent",color:"preview"===tq?"var(--foreground)":"var(--muted)",borderColor:"preview"===tq?"var(--border-focus)":"transparent"},title:"Preview rendered document",children:"👁️ Preview"})]}),(0,t.jsx)("button",{onClick:t5,disabled:!tY.isModified,style:{...K,opacity:tY.isModified?1:.5,cursor:tY.isModified?"pointer":"not-allowed"},children:"💾 Save (Ctrl+S)"})]})]}),(0,t.jsx)("div",{style:_,children:tY?tY.path.startsWith("browser:")?(0,t.jsx)(eT,{url:tY.content}):tY.path.startsWith("diff:")?(0,t.jsx)(eR,{content:tY.content,filePath:tY.path.substring(5)}):tX?"preview"===tq?(0,t.jsx)("div",{style:{height:"100%",overflow:"hidden"},children:(0,t.jsx)(i,{content:tY.content})}):"split"===tq?(0,t.jsxs)("div",{style:{display:"flex",width:"100%",height:"100%",overflow:"hidden"},children:[(0,t.jsx)("div",{style:{flex:1,height:"100%"},children:(0,t.jsx)("textarea",{value:tY.content,onChange:e=>t0(e.target.value),style:Y,spellCheck:!1})}),(0,t.jsx)("div",{style:{flex:1,height:"100%",overflow:"hidden"},children:(0,t.jsx)(i,{content:tY.content})})]}):(0,t.jsx)("textarea",{value:tY.content,onChange:e=>t0(e.target.value),style:Y,spellCheck:!1}):(0,t.jsx)("textarea",{value:tY.content,onChange:e=>t0(e.target.value),style:Y,spellCheck:!1}):(0,t.jsxs)("div",{style:X,children:[(0,t.jsx)("div",{style:{fontSize:"2rem",marginBottom:"1rem"},children:"💻"}),(0,t.jsx)("h4",{style:{margin:0,fontWeight:600},children:"NeuralLoom Workspace Editor"}),(0,t.jsx)("p",{style:{margin:"0.5rem 0 0 0",color:"var(--muted)",fontSize:"0.8rem"},children:"Select files from the left explorer panel to view and edit. Use Ctrl+S to save changes."}),(0,t.jsxs)("p",{style:{margin:"0.5rem 0 0 0",color:"var(--muted)",fontSize:"0.75rem",fontStyle:"italic"},children:["Press ",(0,t.jsx)("kbd",{style:{background:"rgba(255,255,255,0.1)",padding:"2px 4px",borderRadius:"3px"},children:"Ctrl+P"})," to search files."]})]})})]}),(0,t.jsx)("div",{onMouseDown:eZ,style:{height:"4px",cursor:"row-resize",backgroundColor:eX?"var(--primary)":"var(--border)",transition:"background-color 0.15s ease",zIndex:10,width:"100%"},onMouseEnter:e=>{eX||(e.currentTarget.style.backgroundColor="var(--border-focus)")},onMouseLeave:e=>{eX||(e.currentTarget.style.backgroundColor="var(--border)")},title:"Drag to resize console"}),(0,t.jsxs)("div",{style:{...q,flex:"none",height:`${e_}px`},children:[(0,t.jsxs)("div",{style:Q,children:[(0,t.jsxs)("span",{style:{display:"flex",alignItems:"center",gap:"0.5rem",fontWeight:600,fontSize:"0.8rem"},children:["🖥️ Session Console Bridge ",th&&"(Split View Active)"]}),(0,t.jsxs)("div",{style:{display:"flex",gap:"0.5rem",alignItems:"center"},children:[h?.status==="stopped"&&(0,t.jsx)("button",{onClick:async()=>{try{let t=await fetch("/api/sessions/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e})});if(t.ok)p&&p();else{let e=await t.json();alert(e.error||"Failed to restart session.")}}catch(e){console.error("Failed to restart session:",e),alert("Network error: failed to restart session.")}},style:{padding:"0.3rem 0.6rem",borderRadius:"4px",border:"1px solid #eab308",backgroundColor:"rgba(234, 179, 8, 0.15)",color:"#eab308",fontSize:"0.7rem",fontWeight:600,cursor:"pointer",boxShadow:"0 0 8px rgba(234, 179, 8, 0.2)"},title:"Restart the stopped session process runner",children:"⚡ Restart Session"}),(0,t.jsxs)("select",{onChange:e=>{tg(e.target.value||null)},value:th||"",style:{backgroundColor:"#080c14",border:"1px solid var(--border)",borderRadius:"4px",padding:"0.2rem 0.5rem",color:"var(--foreground)",fontSize:"0.7rem",outline:"none",cursor:"pointer"},children:[(0,t.jsx)("option",{value:"",children:"🖥️ Single Terminal"}),d.filter(t=>t.id!==e&&"running"===t.status).map(e=>(0,t.jsxs)("option",{value:e.id,children:["🖥️|🖥️ Split: ",e.name]},e.id))]}),(0,t.jsx)("button",{onClick:async()=>{await fetch("/api/sessions/inject",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e,command:"/ccc"})})},style:Z,children:"🚀 Mount Context (/ccc)"}),(0,t.jsx)("button",{onClick:async()=>{await fetch("/api/sessions/inject",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e,command:"/ccp"})})},style:ee,children:"⚡ Trigger Prompt (/ccp)"})]})]}),(0,t.jsxs)("div",{style:ev,children:[(0,t.jsx)("span",{style:{fontSize:"0.7rem",color:"var(--muted)",textTransform:"uppercase",letterSpacing:"0.05em",fontWeight:700},children:"Quick Commands:"}),(0,t.jsxs)("div",{style:{display:"flex",gap:"0.35rem",flexWrap:"wrap",alignItems:"center"},children:[tP?(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>tR("/undo"),style:ej,title:"Aider: undo last commit",children:"/undo"}),(0,t.jsx)("button",{onClick:()=>tR("/diff"),style:ej,title:"Aider: show git diff",children:"/diff"}),(0,t.jsx)("button",{onClick:()=>tR("/commit"),style:ej,title:"Aider: commit edits",children:"/commit"}),(0,t.jsx)("button",{onClick:()=>tR("/test"),style:ej,title:"Aider: run tests",children:"/test"}),(0,t.jsx)("button",{onClick:()=>tR("/clear"),style:ej,title:"Clear terminal screen",children:"/clear"})]}):(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("button",{onClick:()=>tR("/compact"),style:ej,title:"Claude Code: compact history",children:"/compact"}),(0,t.jsx)("button",{onClick:()=>tR("/history"),style:ej,title:"Claude Code: view history",children:"/history"}),(0,t.jsx)("button",{onClick:()=>tR("/reset"),style:ej,title:"Claude Code: reset conversation",children:"/reset"}),(0,t.jsx)("button",{onClick:()=>tR("/help"),style:ej,title:"Claude Code: show help",children:"/help"})]}),ts.map((e,r)=>(0,t.jsx)("button",{onClick:()=>tR(e.command),style:{...ej,borderColor:"rgba(168, 85, 247, 0.4)",color:"#c084fc"},title:`Inject command: ${e.command}`,children:e.name},r))]})]}),(0,t.jsxs)("div",{style:{...et,display:"flex",width:"100%"},children:[(0,t.jsx)("div",{style:{flex:1,height:"100%",borderRight:th?"1px solid var(--border)":"none",overflow:"hidden"},children:(0,t.jsx)(o.default,{sessionId:e,height:"100%",wsPort:u})}),th&&(0,t.jsxs)("div",{style:{flex:1,height:"100%",overflow:"hidden",display:"flex",flexDirection:"column"},children:[(0,t.jsxs)("div",{style:{padding:"0.25rem 0.5rem",backgroundColor:"#030406",fontSize:"0.7rem",borderBottom:"1px solid var(--border)",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,t.jsxs)("span",{style:{color:"#a855f7",fontWeight:600},children:["🔗 Focused PTY Connection: ",d.find(e=>e.id===th)?.name]}),(0,t.jsx)("button",{onClick:()=>tg(null),style:{background:"none",border:"none",color:"var(--danger)",cursor:"pointer",fontSize:"0.7rem"},children:"Close Split ✖"})]}),(0,t.jsx)("div",{style:{flex:1,overflow:"hidden"},children:(0,t.jsx)(o.default,{sessionId:th,height:"100%",wsPort:u})})]})]})]})]}),tW.type&&(0,t.jsx)("div",{style:eo,children:(0,t.jsxs)("div",{style:en,children:[(0,t.jsxs)("h3",{style:{margin:"0 0 1rem 0",fontSize:"1rem",fontWeight:600},children:["create-file"===tW.type&&"Create New File","create-folder"===tW.type&&"Create New Folder","rename"===tW.type&&"Rename Item","delete"===tW.type&&"Confirm Deletion"]}),tW.error&&(0,t.jsxs)("div",{style:{color:"var(--danger)",fontSize:"0.8rem",marginBottom:"1rem"},children:["⚠️ ",tW.error]}),"delete"!==tW.type?(0,t.jsxs)("form",{onSubmit:tV,children:[(0,t.jsxs)("div",{style:{marginBottom:"0.5rem",fontSize:"0.75rem",color:"var(--muted)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},title:tW.targetPath||"",children:["Target: ",tW.targetPath]}),(0,t.jsx)("input",{type:"text",value:tW.inputValue,onChange:e=>tI({...tW,inputValue:e.target.value}),style:ei,autoFocus:!0,placeholder:"rename"===tW.type?"Enter new name":"Enter name"}),(0,t.jsxs)("div",{style:el,children:[(0,t.jsx)("button",{type:"button",onClick:()=>tI({type:null,targetPath:null,inputValue:"",error:null}),style:ea,children:"Cancel"}),(0,t.jsx)("button",{type:"submit",style:es,children:"Submit"})]})]}):(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{style:{fontSize:"0.85rem",marginBottom:"1.5rem",color:"var(--muted)",overflowWrap:"break-word"},children:["Are you sure you want to delete this item? This action is permanent.",(0,t.jsx)("div",{style:{marginTop:"0.5rem",color:"#e2e8f0",fontFamily:"var(--font-mono)",fontSize:"0.75rem",background:"rgba(255,255,255,0.05)",padding:"0.5rem",borderRadius:"4px"},children:tW.targetPath})]}),(0,t.jsxs)("div",{style:el,children:[(0,t.jsx)("button",{type:"button",onClick:()=>tI({type:null,targetPath:null,inputValue:"",error:null}),style:ea,children:"Cancel"}),(0,t.jsx)("button",{onClick:()=>tV(),style:{...es,backgroundColor:"var(--danger)"},children:"Delete Permanently"})]})]})]})}),tL&&(0,t.jsx)("div",{style:ec,onClick:()=>tF(!1),children:(0,t.jsxs)("div",{style:ep,onClick:e=>e.stopPropagation(),children:[(0,t.jsx)("input",{type:"text",value:tO,onChange:e=>{tB(e.target.value),tN(0)},onKeyDown:e=>{"ArrowDown"===e.key?(e.preventDefault(),tN(e=>(e+1)%Math.max(1,t1.length))):"ArrowUp"===e.key?(e.preventDefault(),tN(e=>(e-1+t1.length)%Math.max(1,t1.length))):"Enter"===e.key?(e.preventDefault(),t1[tM]&&(tG(t1[tM].path),tF(!1))):"Escape"===e.key&&(e.preventDefault(),tF(!1))},placeholder:"Search files by name or path...",style:eu,autoFocus:!0}),(0,t.jsx)("div",{style:em,children:t1.length>0?t1.map((e,r)=>(0,t.jsxs)("div",{onClick:()=>{tG(e.path),tF(!1)},style:{...eh,backgroundColor:r===tM?"rgba(168, 85, 247, 0.15)":"transparent",borderLeft:r===tM?"3px solid var(--primary)":"3px solid transparent"},children:[(0,t.jsx)("span",{style:{fontSize:"0.85rem",fontWeight:600},children:e.name}),(0,t.jsx)("span",{style:{fontSize:"0.7rem",color:"var(--muted)",marginLeft:"0.5rem",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.relativePath})]},e.path)):(0,t.jsx)("div",{style:{padding:"0.75rem 1rem",color:"var(--muted)",fontSize:"0.8rem",textAlign:"center"},children:"No matching files found"})}),(0,t.jsx)("div",{style:{padding:"0.5rem 1rem",borderTop:"1px solid var(--border)",fontSize:"0.65rem",color:"var(--muted)",textAlign:"right"},children:"Use ↑↓ to navigate, Enter to select, Esc to close"})]})}),b&&(0,t.jsx)(n.default,{title:"Add Scoped Directory",initialPath:l,onClose:()=>v(!1),onSelect:e=>{j(e),v(!1)}})]})}],3839)},97722,e=>{e.n(e.i(3839))}]);
|
|
File without changes
|
/package/.next/static/{kPeXDg1G9iPLf0aCjKTXh → BoncS4SNz6CDpSdR8oY-K}/_clientMiddlewareManifest.js
RENAMED
|
File without changes
|
|
File without changes
|