@openparachute/hub 0.7.6-rc.4 → 0.7.7-rc.12
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/README.md +7 -7
- package/package.json +8 -13
- package/src/__tests__/account-api.test.ts +798 -0
- package/src/__tests__/account-session.test.ts +252 -0
- package/src/__tests__/account-token.test.ts +316 -0
- package/src/__tests__/admin-connections-credentials.test.ts +41 -0
- package/src/__tests__/admin-handlers.test.ts +25 -0
- package/src/__tests__/admin-lock.test.ts +3 -14
- package/src/__tests__/admin-module-token.test.ts +10 -30
- package/src/__tests__/admin-surfaces.test.ts +21 -0
- package/src/__tests__/api-hub-upgrade.test.ts +11 -0
- package/src/__tests__/api-mint-token.test.ts +25 -0
- package/src/__tests__/api-modules-ops.test.ts +34 -29
- package/src/__tests__/api-modules.test.ts +50 -58
- package/src/__tests__/api-revoke-token.test.ts +23 -0
- package/src/__tests__/api-settings-hub-origin.test.ts +12 -0
- package/src/__tests__/api-settings-root-redirect.test.ts +12 -0
- package/src/__tests__/api-tokens.test.ts +44 -0
- package/src/__tests__/audience-gate.test.ts +24 -0
- package/src/__tests__/bearer-scheme-casing.test.ts +110 -0
- package/src/__tests__/chrome-strip.test.ts +18 -1
- package/src/__tests__/doctor.test.ts +10 -17
- package/src/__tests__/door-contract-parity.test.ts +46 -0
- package/src/__tests__/hub-server.test.ts +37 -0
- package/src/__tests__/hub.test.ts +29 -0
- package/src/__tests__/install.test.ts +279 -5
- package/src/__tests__/migrate.test.ts +3 -1
- package/src/__tests__/notes-serve.test.ts +216 -0
- package/src/__tests__/oauth-handlers.test.ts +19 -8
- package/src/__tests__/operator-token.test.ts +1 -2
- package/src/__tests__/port-assign.test.ts +37 -17
- package/src/__tests__/scope-explanations.test.ts +22 -2
- package/src/__tests__/serve-boot.test.ts +25 -36
- package/src/__tests__/service-spec-discovery.test.ts +30 -35
- package/src/__tests__/services-manifest.test.ts +372 -132
- package/src/__tests__/sessions.test.ts +75 -28
- package/src/__tests__/setup-wizard.test.ts +7 -10
- package/src/__tests__/setup.test.ts +13 -14
- package/src/__tests__/status.test.ts +0 -5
- package/src/__tests__/surface-notes-alias.test.ts +296 -0
- package/src/account-api.ts +677 -0
- package/src/account-session.ts +132 -0
- package/src/account-token.ts +200 -0
- package/src/admin-connections.ts +4 -2
- package/src/admin-lock.ts +1 -2
- package/src/admin-module-token.ts +13 -8
- package/src/admin-surfaces.ts +2 -1
- package/src/api-hub-upgrade.ts +2 -1
- package/src/api-invites.ts +19 -0
- package/src/api-mint-token.ts +2 -1
- package/src/api-modules-ops.ts +2 -1
- package/src/api-modules.ts +10 -8
- package/src/api-revoke-token.ts +2 -1
- package/src/api-settings-hub-origin.ts +2 -1
- package/src/api-settings-root-redirect.ts +2 -1
- package/src/api-tokens.ts +2 -1
- package/src/audience-gate.ts +2 -1
- package/src/chrome-strip.ts +16 -4
- package/src/commands/install.ts +86 -8
- package/src/commands/migrate.ts +5 -1
- package/src/commands/setup.ts +9 -6
- package/src/help.ts +6 -6
- package/src/hub-server.ts +247 -52
- package/src/hub-settings.ts +25 -1
- package/src/hub.ts +64 -31
- package/src/invites.ts +42 -0
- package/src/module-ops-client.ts +2 -1
- package/src/notes-serve.ts +73 -31
- package/src/oauth-handlers.ts +1 -11
- package/src/operator-token.ts +0 -1
- package/src/origin-check.ts +2 -2
- package/src/scope-explanations.ts +35 -5
- package/src/service-spec.ts +128 -74
- package/src/services-manifest.ts +112 -52
- package/src/sessions.ts +66 -30
- package/src/surface-notes-alias.ts +126 -0
- package/src/__tests__/admin-agent-token.test.ts +0 -173
- package/src/admin-agent-token.ts +0 -147
|
@@ -2,6 +2,8 @@ import { describe, expect, test } from "bun:test";
|
|
|
2
2
|
import {
|
|
3
3
|
FIRST_PARTY_FALLBACKS,
|
|
4
4
|
KNOWN_MODULES,
|
|
5
|
+
PORT_RESERVATIONS,
|
|
6
|
+
RETIRED_MODULES,
|
|
5
7
|
discoverableShorts,
|
|
6
8
|
findServiceByShort,
|
|
7
9
|
focusForShort,
|
|
@@ -25,20 +27,18 @@ describe("discoverableShorts", () => {
|
|
|
25
27
|
expect(shorts.length).toBe(new Set(shorts).size);
|
|
26
28
|
});
|
|
27
29
|
|
|
28
|
-
test("includes
|
|
30
|
+
test("includes the supported module set and excludes retired Agent", () => {
|
|
29
31
|
const shorts = discoverableShorts();
|
|
30
|
-
for (const s of ["vault", "scribe", "surface", "
|
|
32
|
+
for (const s of ["vault", "scribe", "surface", "app", "notes"]) {
|
|
31
33
|
expect(shorts).toContain(s);
|
|
32
34
|
}
|
|
35
|
+
expect(shorts).not.toContain("agent");
|
|
33
36
|
});
|
|
34
37
|
|
|
35
38
|
test("FIRST_PARTY_FALLBACKS shorts lead KNOWN_MODULES shorts (registry order)", () => {
|
|
36
39
|
const shorts = discoverableShorts();
|
|
37
|
-
// notes (
|
|
38
|
-
// boundary D3) appears before vault (KNOWN_MODULES) in the union.
|
|
40
|
+
// notes (a FALLBACK) appears before vault (KNOWN_MODULES) in the union.
|
|
39
41
|
expect(shorts.indexOf("notes")).toBeLessThan(shorts.indexOf("vault"));
|
|
40
|
-
// agent rides in KNOWN_MODULES now but is still discoverable.
|
|
41
|
-
expect(shorts).toContain("agent");
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
44
|
|
|
@@ -106,9 +106,30 @@ describe("runner registry removal (2026-07-01)", () => {
|
|
|
106
106
|
});
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
+
describe("Agent module retirement (2026-07-15)", () => {
|
|
110
|
+
test("is no longer known, discoverable, or resolvable", () => {
|
|
111
|
+
expect(isKnownModuleShort("agent")).toBe(false);
|
|
112
|
+
expect(discoverableShorts()).not.toContain("agent");
|
|
113
|
+
expect("agent" in KNOWN_MODULES).toBe(false);
|
|
114
|
+
expect(shortNameForManifest("parachute-agent")).toBeUndefined();
|
|
115
|
+
expect(shortNameForManifest("parachute-channel")).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("retires every historical row name and releases port 1941", () => {
|
|
119
|
+
expect(RETIRED_MODULES.agent).toBeDefined();
|
|
120
|
+
expect(RETIRED_MODULES["parachute-agent"]).toBeDefined();
|
|
121
|
+
expect(RETIRED_MODULES["parachute-channel"]).toBeDefined();
|
|
122
|
+
expect(PORT_RESERVATIONS.find((entry) => entry.port === 1941)).toEqual({
|
|
123
|
+
port: 1941,
|
|
124
|
+
name: "unassigned",
|
|
125
|
+
status: "reserved",
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
109
130
|
describe("isKnownModuleShort", () => {
|
|
110
131
|
test("true for every known module (the install/config gate)", () => {
|
|
111
|
-
for (const s of ["vault", "scribe", "surface", "
|
|
132
|
+
for (const s of ["vault", "scribe", "surface", "app", "notes"]) {
|
|
112
133
|
expect(isKnownModuleShort(s)).toBe(true);
|
|
113
134
|
}
|
|
114
135
|
});
|
|
@@ -119,12 +140,6 @@ describe("isKnownModuleShort", () => {
|
|
|
119
140
|
});
|
|
120
141
|
});
|
|
121
142
|
|
|
122
|
-
// Regression: services.json rows carry the MANIFEST name (`parachute-agent`),
|
|
123
|
-
// not the bare short (`agent`). The connection/channels wiring used to do
|
|
124
|
-
// `services.find((s) => s.name === "agent")`, which never matched the on-disk
|
|
125
|
-
// row → agentOrigin null → a spurious "agent module is not installed" when
|
|
126
|
-
// linking a vault-backed channel. findServiceByShort resolves through the
|
|
127
|
-
// short↔manifest map so the lookup hits the real row.
|
|
128
143
|
describe("findServiceByShort", () => {
|
|
129
144
|
const services = [
|
|
130
145
|
{ name: "parachute-vault-default", port: 1940 },
|
|
@@ -132,29 +147,9 @@ describe("findServiceByShort", () => {
|
|
|
132
147
|
{ name: "parachute-scribe", port: 1943 },
|
|
133
148
|
];
|
|
134
149
|
|
|
135
|
-
test("
|
|
136
|
-
const found = findServiceByShort(services, "agent");
|
|
137
|
-
expect(found?.name).toBe("parachute-agent");
|
|
138
|
-
expect(found?.port).toBe(1941);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test("the naive `name === short` comparison would have missed it (the bug)", () => {
|
|
142
|
-
// The exact pre-fix predicate: a bare short never matches a manifest-named row.
|
|
143
|
-
expect(services.find((s) => s.name === "agent")).toBeUndefined();
|
|
144
|
-
// The fix finds it.
|
|
145
|
-
expect(findServiceByShort(services, "agent")).toBeDefined();
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
test("resolves a legacy parachute-channel row to short `agent` (rename back-compat)", () => {
|
|
149
|
-
// Un-upgraded operators carry a `parachute-channel` row; the
|
|
150
|
-
// LEGACY_MANIFEST_ALIASES fallback keeps it routing to the agent module
|
|
151
|
-
// until the daemon re-registers under `parachute-agent`.
|
|
152
|
-
const legacy = [{ name: "parachute-channel", port: 1941 }];
|
|
153
|
-
expect(findServiceByShort(legacy, "agent")?.port).toBe(1941);
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
test("resolves scribe too, and returns undefined for an absent module", () => {
|
|
150
|
+
test("resolves supported modules and not retired Agent rows", () => {
|
|
157
151
|
expect(findServiceByShort(services, "scribe")?.port).toBe(1943);
|
|
152
|
+
expect(findServiceByShort(services, "agent")).toBeUndefined();
|
|
158
153
|
expect(findServiceByShort(services, "runner")).toBeUndefined();
|
|
159
154
|
});
|
|
160
155
|
});
|