@unbrained/pm-web 2026.9.6 → 2026.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +10 -4
- package/dist/index.js +1 -1
- package/dist/services/realtime-bus.d.ts +7 -2
- package/dist/services/realtime-bus.js +17 -5
- package/dist/services/realtime-bus.js.map +1 -1
- package/manifest.json +2 -2
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.9.8 - 2026-09-08
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Prove that a write arriving from another surface reaches a connected subscriber ([pm-web-pi1i](https://github.com/unbraind/pm-web/blob/main/.agents/pm/features/pm-web-pi1i.toon))
|
|
8
|
+
|
|
9
|
+
### Security
|
|
10
|
+
|
|
11
|
+
- Consume the canonical attestation gate instead of carrying a copy of it ([pm-web-tg1s](https://github.com/unbraind/pm-web/blob/main/.agents/pm/chores/pm-web-tg1s.toon))
|
|
12
|
+
|
|
13
|
+
### Other
|
|
14
|
+
|
|
15
|
+
- Harden the attestation consumer suite to match the rest of the converged fleet ([pm-web-qq0i](https://github.com/unbraind/pm-web/blob/main/.agents/pm/chores/pm-web-qq0i.toon))
|
|
16
|
+
|
|
3
17
|
## 2026.9.5 - 2026-09-05
|
|
4
18
|
|
|
5
19
|
### Fixed
|
package/README.md
CHANGED
|
@@ -149,18 +149,24 @@ primitive. The current pm SDK serializes activation-backed `PmClient` calls
|
|
|
149
149
|
within each Node process, so high-throughput installations should run multiple
|
|
150
150
|
pm-web replicas behind a shared PostgreSQL realtime bus. Independent replicas
|
|
151
151
|
converge through PostgreSQL notifications and the mutation-event watcher.
|
|
152
|
+
When the PostgreSQL listener reconnects, it invalidates the workspace and
|
|
153
|
+
extension catalog of each locally connected project so viewers, including the
|
|
154
|
+
Packages view, reload authorized state that may have changed while the listener
|
|
155
|
+
was disconnected. These recovery signals contain no item content and stay
|
|
156
|
+
local to the recovering process; PostgreSQL notifications are transient and
|
|
157
|
+
are not a durable event replay mechanism.
|
|
152
158
|
|
|
153
159
|
Whole-project graph fallback, board, local search, iCalendar, and export reads
|
|
154
160
|
use the SDK's high-level `listAllComplete` operation. pm-web accepts those rows
|
|
155
|
-
only after the shared SDK certificate agrees. pm CLI 2026.8.31
|
|
156
|
-
source counters, omission receipt, output receipt, and truncation
|
|
157
|
-
itself, so pm-web keeps just one supplemental check: it refuses an
|
|
161
|
+
only after the shared SDK certificate agrees. Since pm CLI 2026.8.31, the SDK
|
|
162
|
+
certifies the source counters, omission receipt, output receipt, and truncation
|
|
163
|
+
disclosure itself, so pm-web keeps just one supplemental check: it refuses an
|
|
158
164
|
`output_budget_exceeded` disclosure, which the SDK still accepts even though it
|
|
159
165
|
means the rows may be short of the whole corpus. The public `/pm/list-all`
|
|
160
166
|
HTTP compatibility route remains deliberately paginated for interactive clients,
|
|
161
167
|
but invokes canonical `list --all` internally; consumers that need the whole
|
|
162
168
|
workspace must use a complete-read endpoint rather than assembling a page as if
|
|
163
|
-
it were the corpus. The standalone server exact-pins pm CLI/SDK 2026.
|
|
169
|
+
it were the corpus. The standalone server exact-pins pm CLI/SDK 2026.9.7, and
|
|
164
170
|
the extension manifest refuses older hosts through the same compatibility floor.
|
|
165
171
|
Commands that render their own text or JSON (`web status`, `web stop`, and
|
|
166
172
|
`web doctor`) return the public SDK output-suppression marker, so the host never
|
package/dist/index.js
CHANGED
|
@@ -262,7 +262,7 @@ function processAlive(pid) {
|
|
|
262
262
|
}
|
|
263
263
|
export default defineExtension({
|
|
264
264
|
name: "pm-web",
|
|
265
|
-
version: "2026.9.
|
|
265
|
+
version: "2026.9.9",
|
|
266
266
|
activate(api) {
|
|
267
267
|
// -----------------------------------------------------------------------
|
|
268
268
|
// Command: pm web [--port <port>] [--detach]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Pool } from "pg";
|
|
1
2
|
import { type SSEEvent } from "./sse.ts";
|
|
2
3
|
interface RealtimeEnvelope {
|
|
3
4
|
projectId: string;
|
|
@@ -50,9 +51,13 @@ export declare function handleIncomingEnvelope(raw: string | undefined, instance
|
|
|
50
51
|
* is `"false"`. Otherwise reserves a pool client on the `pm_workspace_events`
|
|
51
52
|
* channel, fans incoming envelopes out to local SSE clients (skipping this
|
|
52
53
|
* instance's own), publishes local events via `pg_notify`, and reconnects with
|
|
53
|
-
* exponential backoff on disconnect.
|
|
54
|
+
* exponential backoff on disconnect. After reconnecting, existing viewers get
|
|
55
|
+
* local workspace and extension-catalog invalidations because notifications
|
|
56
|
+
* during the disconnected interval cannot be replayed. The returned function
|
|
57
|
+
* undoes all of it.
|
|
54
58
|
*
|
|
59
|
+
* @param database - PostgreSQL pool used for listening and publishing.
|
|
55
60
|
* @returns A function that stops the bus and releases the listener.
|
|
56
61
|
*/
|
|
57
|
-
export declare function startRealtimeBus(): Promise<() => Promise<void>>;
|
|
62
|
+
export declare function startRealtimeBus(database?: Pick<Pool, "connect" | "query">): Promise<() => Promise<void>>;
|
|
58
63
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { pool } from "../db.js";
|
|
3
|
-
import { configureProjectEventPublisher, deliverProjectEvent, } from "./sse.js";
|
|
3
|
+
import { configureProjectEventPublisher, deliverProjectEvent, getActiveProjectIds, } from "./sse.js";
|
|
4
4
|
const CHANNEL = "pm_workspace_events";
|
|
5
5
|
const INSTANCE_ID = randomUUID();
|
|
6
6
|
const PROJECT_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
@@ -99,17 +99,22 @@ export function handleIncomingEnvelope(raw, instanceId, deliver) {
|
|
|
99
99
|
* is `"false"`. Otherwise reserves a pool client on the `pm_workspace_events`
|
|
100
100
|
* channel, fans incoming envelopes out to local SSE clients (skipping this
|
|
101
101
|
* instance's own), publishes local events via `pg_notify`, and reconnects with
|
|
102
|
-
* exponential backoff on disconnect.
|
|
102
|
+
* exponential backoff on disconnect. After reconnecting, existing viewers get
|
|
103
|
+
* local workspace and extension-catalog invalidations because notifications
|
|
104
|
+
* during the disconnected interval cannot be replayed. The returned function
|
|
105
|
+
* undoes all of it.
|
|
103
106
|
*
|
|
107
|
+
* @param database - PostgreSQL pool used for listening and publishing.
|
|
104
108
|
* @returns A function that stops the bus and releases the listener.
|
|
105
109
|
*/
|
|
106
|
-
export async function startRealtimeBus() {
|
|
110
|
+
export async function startRealtimeBus(database = pool) {
|
|
107
111
|
if (process.env.PM_REALTIME_ENABLED === "false")
|
|
108
112
|
return async () => undefined;
|
|
109
113
|
let listener = null;
|
|
110
114
|
let reconnectTimer = null;
|
|
111
115
|
let reconnectDelayMs = 250;
|
|
112
116
|
let stopped = false;
|
|
117
|
+
let hasConnected = false;
|
|
113
118
|
let connecting = null;
|
|
114
119
|
const handlers = new Map();
|
|
115
120
|
const safeDiagnostic = (error) => {
|
|
@@ -143,7 +148,7 @@ export async function startRealtimeBus() {
|
|
|
143
148
|
reconnectTimer.unref();
|
|
144
149
|
};
|
|
145
150
|
const connectOnce = async () => {
|
|
146
|
-
const client = await
|
|
151
|
+
const client = await database.connect();
|
|
147
152
|
const notification = (message) => {
|
|
148
153
|
handleIncomingEnvelope(message.payload, INSTANCE_ID, deliverProjectEvent);
|
|
149
154
|
};
|
|
@@ -175,6 +180,13 @@ export async function startRealtimeBus() {
|
|
|
175
180
|
return;
|
|
176
181
|
}
|
|
177
182
|
reconnectDelayMs = 250;
|
|
183
|
+
if (hasConnected) {
|
|
184
|
+
for (const projectId of getActiveProjectIds()) {
|
|
185
|
+
deliverProjectEvent(projectId, { type: "workspace-changed", data: { source: "realtime-reconnect" } });
|
|
186
|
+
deliverProjectEvent(projectId, { type: "extensions-changed", data: { source: "realtime-reconnect" } });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
hasConnected = true;
|
|
178
190
|
};
|
|
179
191
|
const connect = () => {
|
|
180
192
|
if (connecting)
|
|
@@ -186,7 +198,7 @@ export async function startRealtimeBus() {
|
|
|
186
198
|
configureProjectEventPublisher(async (projectId, event) => {
|
|
187
199
|
const payload = buildEnvelope(projectId, event, INSTANCE_ID);
|
|
188
200
|
if (payload) {
|
|
189
|
-
await
|
|
201
|
+
await database.query("SELECT pg_notify($1, $2)", [CHANNEL, payload]);
|
|
190
202
|
}
|
|
191
203
|
else {
|
|
192
204
|
console.warn(`Realtime event payload exceeded size limit: ${projectId}/${event.type}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-bus.js","sourceRoot":"","sources":["../../src/services/realtime-bus.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"realtime-bus.js","sourceRoot":"","sources":["../../src/services/realtime-bus.ts"],"names":[],"mappings":"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"}
|
package/manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pm-web",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.9",
|
|
4
4
|
"description": "Full web UI for pm-cli — browse, create, update, search and manage pm projects in the browser. Self-hosted via Docker or Node.js.",
|
|
5
5
|
"author": "@unbraind",
|
|
6
6
|
"entry": "./dist/index.js",
|
|
7
7
|
"priority": 50,
|
|
8
|
-
"pm_min_version": "2026.
|
|
8
|
+
"pm_min_version": "2026.9.7",
|
|
9
9
|
"capabilities": [
|
|
10
10
|
"commands",
|
|
11
11
|
"schema"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unbrained/pm-web",
|
|
3
|
-
"version": "2026.9.
|
|
3
|
+
"version": "2026.9.9",
|
|
4
4
|
"description": "Full web UI for pm-cli — browse, create, update, search and manage pm projects in the browser. Self-hosted via Docker or Node.js.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"verify:release-publish-attestation": "node scripts/verify-release-publish-attestation.ts"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@unbrained/pm-cli": "2026.
|
|
49
|
+
"@unbrained/pm-cli": "2026.9.7",
|
|
50
50
|
"bcryptjs": "^3.0.3",
|
|
51
51
|
"cookie-parser": "^1.4.7",
|
|
52
52
|
"express": "^5.2.1",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"@types/node": "^26.2.0",
|
|
65
65
|
"@types/pg": "^8.23.1",
|
|
66
66
|
"@types/uuid": "^11.0.0",
|
|
67
|
-
"pm-changelog": "2026.
|
|
68
|
-
"pm-ops": "2026.
|
|
67
|
+
"pm-changelog": "2026.9.6",
|
|
68
|
+
"pm-ops": "^2026.9.7",
|
|
69
69
|
"tsx": "^4.23.12",
|
|
70
70
|
"typescript": "^7.0.2",
|
|
71
71
|
"yaml": "^2.9.0"
|