feat: v1.3.1 - Multi-transport + Production deployment

- Add HTTP transport (StreamableHTTPServerTransport)
- Add shared server module (src/server/)
- Configure production for hub.descomplicar.pt
- Add SSH tunnel script (start-tunnel.sh)
- Fix connection leak in pg-client.ts
- Fix atomicity bug in comments deletion
- Update docs with test plan for 164 tools

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-31 17:06:30 +00:00
parent 0329a1179a
commit 5f49cb63e8
15 changed files with 1381 additions and 464 deletions

View File

@@ -14,22 +14,22 @@ export class PgClient {
constructor(config: DatabaseConfig) {
const poolConfig: PoolConfig = config.connectionString
? {
connectionString: config.connectionString,
max: config.max,
idleTimeoutMillis: config.idleTimeoutMillis,
connectionTimeoutMillis: config.connectionTimeoutMillis
}
connectionString: config.connectionString,
max: config.max,
idleTimeoutMillis: config.idleTimeoutMillis,
connectionTimeoutMillis: config.connectionTimeoutMillis
}
: {
host: config.host,
port: config.port,
user: config.user,
password: config.password,
database: config.database,
ssl: config.ssl ? { rejectUnauthorized: false } : false,
max: config.max,
idleTimeoutMillis: config.idleTimeoutMillis,
connectionTimeoutMillis: config.connectionTimeoutMillis
};
host: config.host,
port: config.port,
user: config.user,
password: config.password,
database: config.database,
ssl: config.ssl ? { rejectUnauthorized: false } : false,
max: config.max,
idleTimeoutMillis: config.idleTimeoutMillis,
connectionTimeoutMillis: config.connectionTimeoutMillis
};
this.pool = new Pool(poolConfig);
@@ -50,10 +50,10 @@ export class PgClient {
* Test database connection
*/
async testConnection(): Promise<boolean> {
let client = null;
try {
const client = await this.pool.connect();
client = await this.pool.connect();
await client.query('SELECT 1');
client.release();
this.isConnected = true;
logger.info('PostgreSQL connection successful');
return true;
@@ -63,6 +63,10 @@ export class PgClient {
});
this.isConnected = false;
return false;
} finally {
if (client) {
client.release();
}
}
}
@@ -119,7 +123,13 @@ export class PgClient {
await client.query('COMMIT');
return result;
} catch (error) {
await client.query('ROLLBACK');
try {
await client.query('ROLLBACK');
} catch (rollbackError) {
logger.error('Rollback failed', {
error: rollbackError instanceof Error ? rollbackError.message : String(rollbackError),
});
}
throw error;
} finally {
client.release();