pgserve 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +86 -0
- package/README.md +105 -1
- package/bin/autopg-wrapper.cjs +16 -0
- package/bin/pgserve-wrapper.cjs +31 -6
- package/bin/postgres-server.js +80 -7
- package/console/README.md +131 -0
- package/console/api.js +173 -0
- package/console/app.jsx +483 -0
- package/console/colors_and_type.css +227 -0
- package/console/components.jsx +167 -0
- package/console/console.css +1666 -0
- package/console/data.jsx +350 -0
- package/console/index.html +31 -0
- package/console/screens/databases.jsx +5 -0
- package/console/screens/health.jsx +5 -0
- package/console/screens/ingress.jsx +5 -0
- package/console/screens/optimizer.jsx +5 -0
- package/console/screens/rlm-sim.jsx +5 -0
- package/console/screens/rlm-trace.jsx +5 -0
- package/console/screens/security.jsx +5 -0
- package/console/screens/settings.jsx +611 -0
- package/console/screens/sql.jsx +5 -0
- package/console/screens/sync.jsx +5 -0
- package/console/screens/tables.jsx +5 -0
- package/console/tweaks-panel.jsx +425 -0
- package/package.json +11 -1
- package/src/cli-config.cjs +310 -0
- package/src/cli-install.cjs +98 -11
- package/src/cli-restart.cjs +228 -0
- package/src/cli-ui.cjs +580 -0
- package/src/cluster.js +43 -38
- package/src/postgres.js +141 -19
- package/src/settings-loader.cjs +235 -0
- package/src/settings-migrate.cjs +212 -0
- package/src/settings-pg-args.cjs +146 -0
- package/src/settings-schema.cjs +422 -0
- package/src/settings-validator.cjs +416 -0
- package/src/settings-writer.cjs +288 -0
- package/.claude/context/windows-debug.md +0 -119
- package/.genie/AGENTS.md +0 -15
- package/.genie/agents/README.md +0 -110
- package/.genie/agents/analyze.md +0 -176
- package/.genie/agents/forge.md +0 -290
- package/.genie/agents/garbage-cleaner.md +0 -324
- package/.genie/agents/garbage-collector.md +0 -596
- package/.genie/agents/github-issue-gc.md +0 -618
- package/.genie/agents/review.md +0 -380
- package/.genie/agents/semantic-analyzer/find-duplicates.md +0 -90
- package/.genie/agents/semantic-analyzer/find-orphans.md +0 -99
- package/.genie/agents/semantic-analyzer.md +0 -101
- package/.genie/agents/update.md +0 -182
- package/.genie/agents/wish.md +0 -357
- package/.genie/brainstorms/pgserve-v2/DESIGN.md +0 -174
- package/.genie/code/AGENTS.md +0 -694
- package/.genie/code/agents/audit/risk.md +0 -173
- package/.genie/code/agents/audit/security.md +0 -189
- package/.genie/code/agents/audit.md +0 -145
- package/.genie/code/agents/challenge.md +0 -230
- package/.genie/code/agents/change-reviewer.md +0 -295
- package/.genie/code/agents/code-garbage-collector.md +0 -425
- package/.genie/code/agents/code-quality.md +0 -410
- package/.genie/code/agents/commit-suggester.md +0 -255
- package/.genie/code/agents/commit.md +0 -124
- package/.genie/code/agents/consensus.md +0 -204
- package/.genie/code/agents/daily-standup.md +0 -722
- package/.genie/code/agents/docgen.md +0 -48
- package/.genie/code/agents/explore.md +0 -79
- package/.genie/code/agents/fix.md +0 -100
- package/.genie/code/agents/git/commit-advisory.md +0 -219
- package/.genie/code/agents/git/workflows/issue.md +0 -244
- package/.genie/code/agents/git/workflows/pr.md +0 -179
- package/.genie/code/agents/git/workflows/release.md +0 -460
- package/.genie/code/agents/git/workflows/report.md +0 -342
- package/.genie/code/agents/git.md +0 -432
- package/.genie/code/agents/implementor.md +0 -161
- package/.genie/code/agents/install.md +0 -515
- package/.genie/code/agents/issue-creator.md +0 -344
- package/.genie/code/agents/polish.md +0 -116
- package/.genie/code/agents/qa.md +0 -653
- package/.genie/code/agents/refactor.md +0 -294
- package/.genie/code/agents/release.md +0 -1129
- package/.genie/code/agents/roadmap.md +0 -885
- package/.genie/code/agents/tests.md +0 -557
- package/.genie/code/agents/tracer.md +0 -50
- package/.genie/code/agents/update/upstream-update.md +0 -85
- package/.genie/code/agents/update/versions/generic-update.md +0 -305
- package/.genie/code/agents/vibe.md +0 -1317
- package/.genie/code/spells/agent-configuration.md +0 -58
- package/.genie/code/spells/automated-rc-publishing.md +0 -106
- package/.genie/code/spells/branch-tracker-guidance.md +0 -28
- package/.genie/code/spells/debug.md +0 -320
- package/.genie/code/spells/emoji-naming-convention.md +0 -303
- package/.genie/code/spells/evidence-storage.md +0 -26
- package/.genie/code/spells/file-naming-rules.md +0 -35
- package/.genie/code/spells/forge-code-blueprints.md +0 -195
- package/.genie/code/spells/genie-integration.md +0 -153
- package/.genie/code/spells/publishing-protocol.md +0 -61
- package/.genie/code/spells/team-consultation-protocol.md +0 -284
- package/.genie/code/spells/tool-requirements.md +0 -20
- package/.genie/code/spells/triad-maintenance-protocol.md +0 -154
- package/.genie/code/teams/tech-council/council.md +0 -328
- package/.genie/code/teams/tech-council/jt.md +0 -352
- package/.genie/code/teams/tech-council/nayr.md +0 -305
- package/.genie/code/teams/tech-council/oettam.md +0 -375
- package/.genie/neurons/README.md +0 -193
- package/.genie/neurons/forge.md +0 -106
- package/.genie/neurons/genie.md +0 -63
- package/.genie/neurons/review.md +0 -106
- package/.genie/neurons/wish.md +0 -104
- package/.genie/product/README.md +0 -20
- package/.genie/product/cli-automation.md +0 -359
- package/.genie/product/environment.md +0 -60
- package/.genie/product/mission.md +0 -60
- package/.genie/product/roadmap.md +0 -44
- package/.genie/product/tech-stack.md +0 -34
- package/.genie/product/templates/context-template.md +0 -218
- package/.genie/product/templates/qa-done-report-template.md +0 -68
- package/.genie/product/templates/review-report-template.md +0 -89
- package/.genie/product/templates/wish-template.md +0 -120
- package/.genie/scripts/helpers/analyze-commit.js +0 -195
- package/.genie/scripts/helpers/bullet-counter.js +0 -194
- package/.genie/scripts/helpers/bullet-find.js +0 -289
- package/.genie/scripts/helpers/bullet-id.js +0 -244
- package/.genie/scripts/helpers/check-secrets.js +0 -237
- package/.genie/scripts/helpers/count-tokens.js +0 -200
- package/.genie/scripts/helpers/create-frontmatter.js +0 -456
- package/.genie/scripts/helpers/detect-markers.js +0 -293
- package/.genie/scripts/helpers/detect-todos.js +0 -267
- package/.genie/scripts/helpers/detect-unlabeled-blocks.js +0 -135
- package/.genie/scripts/helpers/embeddings.js +0 -344
- package/.genie/scripts/helpers/find-empty-sections.js +0 -158
- package/.genie/scripts/helpers/index.js +0 -319
- package/.genie/scripts/helpers/validate-frontmatter.js +0 -578
- package/.genie/scripts/helpers/validate-links.js +0 -207
- package/.genie/scripts/helpers/validate-paths.js +0 -373
- package/.genie/spells/README.md +0 -9
- package/.genie/spells/ace-protocol.md +0 -118
- package/.genie/spells/ask-one-at-a-time.md +0 -175
- package/.genie/spells/backup-analyzer.md +0 -542
- package/.genie/spells/blocker.md +0 -12
- package/.genie/spells/break-things-move-fast.md +0 -56
- package/.genie/spells/context-candidates.md +0 -72
- package/.genie/spells/context-critic.md +0 -51
- package/.genie/spells/defer-to-expertise.md +0 -278
- package/.genie/spells/delegate-dont-do.md +0 -292
- package/.genie/spells/error-investigation-protocol.md +0 -328
- package/.genie/spells/evidence-based-completion.md +0 -273
- package/.genie/spells/experiment.md +0 -65
- package/.genie/spells/file-creation-protocol.md +0 -229
- package/.genie/spells/forge-integration.md +0 -281
- package/.genie/spells/forge-orchestration.md +0 -514
- package/.genie/spells/gather-context.md +0 -18
- package/.genie/spells/global-health-check.md +0 -34
- package/.genie/spells/global-noop-roundtrip.md +0 -25
- package/.genie/spells/install-genie.md +0 -1232
- package/.genie/spells/install.md +0 -82
- package/.genie/spells/investigate-before-commit.md +0 -112
- package/.genie/spells/know-yourself.md +0 -288
- package/.genie/spells/learn.md +0 -828
- package/.genie/spells/mcp-diagnostic-protocol.md +0 -246
- package/.genie/spells/mcp-first.md +0 -124
- package/.genie/spells/multi-step-execution.md +0 -67
- package/.genie/spells/orchestration-boundary-protocol.md +0 -256
- package/.genie/spells/orchestrator-not-implementor.md +0 -189
- package/.genie/spells/prompt.md +0 -746
- package/.genie/spells/reflect.md +0 -404
- package/.genie/spells/routing-decision-matrix.md +0 -368
- package/.genie/spells/run-in-parallel.md +0 -12
- package/.genie/spells/session-state-updater-example.md +0 -196
- package/.genie/spells/session-state-updater.md +0 -220
- package/.genie/spells/track-long-running-tasks.md +0 -133
- package/.genie/spells/troubleshoot-infrastructure.md +0 -176
- package/.genie/spells/upgrade-genie.md +0 -415
- package/.genie/spells/url-presentation-protocol.md +0 -301
- package/.genie/spells/wish-initiation.md +0 -158
- package/.genie/spells/wish-issue-linkage.md +0 -410
- package/.genie/spells/wish-lifecycle.md +0 -100
- package/.genie/state/provider-status.json +0 -3
- package/.genie/state/version.json +0 -16
- package/.genie/wishes/canonical-pgserve-pm2-supervision/WISH.md +0 -290
- package/.genie/wishes/pgserve-v2/BRIEF-from-genie-pgserve.md +0 -99
- package/.genie/wishes/pgserve-v2/WISH.md +0 -442
- package/.genie/wishes/release-system-genie-pattern/WISH.md +0 -268
- package/.genie/wishes/release-system-genie-pattern/validation.md +0 -205
- package/.gitguardian.yaml +0 -29
- package/.gitguardianignore +0 -16
- package/.github/workflows/ci.yml +0 -122
- package/.github/workflows/release.yml +0 -289
- package/.github/workflows/version.yml +0 -228
- package/.husky/pre-commit +0 -2
- package/AGENTS.md +0 -433
- package/CLAUDE.md +0 -1
- package/Makefile +0 -285
- package/assets/icon.ico +0 -0
- package/bun.lock +0 -435
- package/bunfig.toml +0 -28
- package/ecosystem.config.cjs +0 -23
- package/eslint.config.js +0 -63
- package/examples/multi-tenant-demo.js +0 -104
- package/install.sh +0 -123
- package/knip.json +0 -9
- package/scripts/test-bun-self-heal.sh +0 -163
- package/scripts/test-npx.sh +0 -60
- package/tests/audit.test.js +0 -189
- package/tests/backpressure.test.js +0 -167
- package/tests/benchmarks/runner.js +0 -1197
- package/tests/benchmarks/vector-generator.js +0 -368
- package/tests/cli-install.test.js +0 -322
- package/tests/control-db.test.js +0 -285
- package/tests/daemon-control.test.js +0 -171
- package/tests/daemon-fingerprint-integration.test.js +0 -111
- package/tests/daemon-pr24-regression.test.js +0 -198
- package/tests/fingerprint.test.js +0 -263
- package/tests/fixtures/240-orphan-seed.sql +0 -30
- package/tests/multi-tenant.test.js +0 -374
- package/tests/orphan-cleanup.test.js +0 -390
- package/tests/pg-version-regex.test.js +0 -129
- package/tests/quick-bench.js +0 -135
- package/tests/router-handshake-retry.test.js +0 -119
- package/tests/router-handshake-watchdog.test.js +0 -110
- package/tests/sdk.test.js +0 -71
- package/tests/stale-postmaster-pid.test.js +0 -85
- package/tests/stress-test.js +0 -439
- package/tests/sync-perf-test.js +0 -150
- package/tests/tcp-listen.test.js +0 -368
- package/tests/tenancy.test.js +0 -403
- package/tests/wrapper-supervision.test.js +0 -107
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Backpressure / Large Message Regression Tests
|
|
3
|
-
*
|
|
4
|
-
* Reproduces the deadlock from issue #14: TCP proxy drops bytes when
|
|
5
|
-
* socket buffers are full, causing PostgreSQL to wait forever for the
|
|
6
|
-
* remainder of a truncated wire protocol message.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { startMultiTenantServer } from '../src/index.js';
|
|
10
|
-
import pg from 'pg';
|
|
11
|
-
import { test, expect } from 'bun:test';
|
|
12
|
-
import fs from 'fs';
|
|
13
|
-
|
|
14
|
-
const { Client } = pg;
|
|
15
|
-
|
|
16
|
-
const TEST_PORT = 15433;
|
|
17
|
-
const testDataDir = './test-data-backpressure';
|
|
18
|
-
|
|
19
|
-
function cleanup() {
|
|
20
|
-
if (fs.existsSync(testDataDir)) {
|
|
21
|
-
fs.rmSync(testDataDir, { recursive: true, force: true });
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** Create a connected pg.Client */
|
|
26
|
-
async function connect(dbName) {
|
|
27
|
-
const client = new Client({
|
|
28
|
-
host: '127.0.0.1',
|
|
29
|
-
port: TEST_PORT,
|
|
30
|
-
database: dbName,
|
|
31
|
-
user: 'postgres',
|
|
32
|
-
password: 'postgres',
|
|
33
|
-
});
|
|
34
|
-
await client.connect();
|
|
35
|
-
return client;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
test('Large INSERT (~360KB payload) does not deadlock', async () => {
|
|
39
|
-
cleanup();
|
|
40
|
-
const router = await startMultiTenantServer({
|
|
41
|
-
port: TEST_PORT,
|
|
42
|
-
baseDir: testDataDir,
|
|
43
|
-
logLevel: 'warn',
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
let client;
|
|
47
|
-
try {
|
|
48
|
-
client = await connect('bp_insert');
|
|
49
|
-
await client.query('CREATE TABLE big (id SERIAL PRIMARY KEY, payload TEXT)');
|
|
50
|
-
|
|
51
|
-
// ~360KB of text — exceeds typical socket buffer size
|
|
52
|
-
const bigPayload = 'x'.repeat(360_000);
|
|
53
|
-
await client.query('INSERT INTO big (payload) VALUES ($1)', [bigPayload]);
|
|
54
|
-
|
|
55
|
-
const res = await client.query('SELECT length(payload) AS len FROM big');
|
|
56
|
-
expect(Number(res.rows[0].len)).toBe(360000);
|
|
57
|
-
} finally {
|
|
58
|
-
if (client) await client.end().catch(() => {});
|
|
59
|
-
await router.stop();
|
|
60
|
-
cleanup();
|
|
61
|
-
}
|
|
62
|
-
}, 30_000);
|
|
63
|
-
|
|
64
|
-
test('Large SELECT result (500KB+) does not deadlock', async () => {
|
|
65
|
-
cleanup();
|
|
66
|
-
const router = await startMultiTenantServer({
|
|
67
|
-
port: TEST_PORT,
|
|
68
|
-
baseDir: testDataDir,
|
|
69
|
-
logLevel: 'warn',
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
let client;
|
|
73
|
-
try {
|
|
74
|
-
client = await connect('bp_select');
|
|
75
|
-
await client.query('CREATE TABLE chunks (id SERIAL PRIMARY KEY, data TEXT)');
|
|
76
|
-
|
|
77
|
-
// Insert many rows that sum to >500KB
|
|
78
|
-
const chunkSize = 10_000;
|
|
79
|
-
const numChunks = 60; // 60 * 10KB = 600KB total
|
|
80
|
-
const chunk = 'y'.repeat(chunkSize);
|
|
81
|
-
|
|
82
|
-
for (let i = 0; i < numChunks; i++) {
|
|
83
|
-
await client.query('INSERT INTO chunks (data) VALUES ($1)', [chunk]);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Fetch all rows in a single result set (PG→Client backpressure)
|
|
87
|
-
const res = await client.query('SELECT * FROM chunks');
|
|
88
|
-
expect(res.rows.length).toBe(numChunks);
|
|
89
|
-
expect(res.rows[0].data.length).toBe(chunkSize);
|
|
90
|
-
} finally {
|
|
91
|
-
if (client) await client.end().catch(() => {});
|
|
92
|
-
await router.stop();
|
|
93
|
-
cleanup();
|
|
94
|
-
}
|
|
95
|
-
}, 30_000);
|
|
96
|
-
|
|
97
|
-
test('Large single query with multi-value INSERT (500KB+)', async () => {
|
|
98
|
-
cleanup();
|
|
99
|
-
const router = await startMultiTenantServer({
|
|
100
|
-
port: TEST_PORT,
|
|
101
|
-
baseDir: testDataDir,
|
|
102
|
-
logLevel: 'warn',
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
let client;
|
|
106
|
-
try {
|
|
107
|
-
client = await connect('bp_multivalue');
|
|
108
|
-
await client.query('CREATE TABLE items (id INT, val TEXT)');
|
|
109
|
-
|
|
110
|
-
// Build a single INSERT with many value tuples to produce a large wire message
|
|
111
|
-
const rowCount = 500;
|
|
112
|
-
const rowValue = 'z'.repeat(1_000); // 1KB per row → ~500KB total
|
|
113
|
-
const values = [];
|
|
114
|
-
const params = [];
|
|
115
|
-
for (let i = 0; i < rowCount; i++) {
|
|
116
|
-
values.push(`($${i * 2 + 1}, $${i * 2 + 2})`);
|
|
117
|
-
params.push(i, rowValue);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const sql = `INSERT INTO items (id, val) VALUES ${values.join(', ')}`;
|
|
121
|
-
await client.query(sql, params);
|
|
122
|
-
|
|
123
|
-
const res = await client.query('SELECT count(*)::int AS cnt FROM items');
|
|
124
|
-
expect(res.rows[0].cnt).toBe(rowCount);
|
|
125
|
-
} finally {
|
|
126
|
-
if (client) await client.end().catch(() => {});
|
|
127
|
-
await router.stop();
|
|
128
|
-
cleanup();
|
|
129
|
-
}
|
|
130
|
-
}, 30_000);
|
|
131
|
-
|
|
132
|
-
test('Concurrent large operations (5 clients x 300KB)', async () => {
|
|
133
|
-
cleanup();
|
|
134
|
-
const router = await startMultiTenantServer({
|
|
135
|
-
port: TEST_PORT,
|
|
136
|
-
baseDir: testDataDir,
|
|
137
|
-
logLevel: 'warn',
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
try {
|
|
141
|
-
const numClients = 5;
|
|
142
|
-
const payloadSize = 300_000;
|
|
143
|
-
const payload = 'c'.repeat(payloadSize);
|
|
144
|
-
|
|
145
|
-
// Run all clients concurrently
|
|
146
|
-
const results = await Promise.all(
|
|
147
|
-
Array.from({ length: numClients }, async (_, i) => {
|
|
148
|
-
const dbName = `bp_concurrent_${i}`;
|
|
149
|
-
const client = await connect(dbName);
|
|
150
|
-
await client.query('CREATE TABLE stress (id SERIAL PRIMARY KEY, data TEXT)');
|
|
151
|
-
await client.query('INSERT INTO stress (data) VALUES ($1)', [payload]);
|
|
152
|
-
|
|
153
|
-
const res = await client.query('SELECT length(data) AS len FROM stress');
|
|
154
|
-
await client.end();
|
|
155
|
-
return parseInt(res.rows[0].len, 10);
|
|
156
|
-
})
|
|
157
|
-
);
|
|
158
|
-
|
|
159
|
-
// All clients should have successfully stored the full payload
|
|
160
|
-
for (const len of results) {
|
|
161
|
-
expect(len).toBe(payloadSize);
|
|
162
|
-
}
|
|
163
|
-
} finally {
|
|
164
|
-
await router.stop();
|
|
165
|
-
cleanup();
|
|
166
|
-
}
|
|
167
|
-
}, 60_000);
|