@openparachute/hub 0.7.6 → 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.
Files changed (78) hide show
  1. package/README.md +7 -7
  2. package/package.json +8 -13
  3. package/src/__tests__/account-api.test.ts +798 -0
  4. package/src/__tests__/account-session.test.ts +252 -0
  5. package/src/__tests__/account-token.test.ts +316 -0
  6. package/src/__tests__/admin-connections-credentials.test.ts +41 -0
  7. package/src/__tests__/admin-handlers.test.ts +25 -0
  8. package/src/__tests__/admin-lock.test.ts +3 -14
  9. package/src/__tests__/admin-module-token.test.ts +10 -30
  10. package/src/__tests__/admin-surfaces.test.ts +21 -0
  11. package/src/__tests__/api-hub-upgrade.test.ts +11 -0
  12. package/src/__tests__/api-mint-token.test.ts +25 -0
  13. package/src/__tests__/api-modules-ops.test.ts +34 -29
  14. package/src/__tests__/api-modules.test.ts +50 -58
  15. package/src/__tests__/api-revoke-token.test.ts +23 -0
  16. package/src/__tests__/api-settings-hub-origin.test.ts +12 -0
  17. package/src/__tests__/api-settings-root-redirect.test.ts +12 -0
  18. package/src/__tests__/api-tokens.test.ts +44 -0
  19. package/src/__tests__/audience-gate.test.ts +24 -0
  20. package/src/__tests__/bearer-scheme-casing.test.ts +110 -0
  21. package/src/__tests__/chrome-strip.test.ts +18 -1
  22. package/src/__tests__/doctor.test.ts +10 -17
  23. package/src/__tests__/door-contract-parity.test.ts +46 -0
  24. package/src/__tests__/hub-server.test.ts +37 -0
  25. package/src/__tests__/hub.test.ts +29 -0
  26. package/src/__tests__/install.test.ts +279 -5
  27. package/src/__tests__/migrate.test.ts +3 -1
  28. package/src/__tests__/notes-serve.test.ts +216 -0
  29. package/src/__tests__/oauth-handlers.test.ts +19 -8
  30. package/src/__tests__/operator-token.test.ts +1 -2
  31. package/src/__tests__/port-assign.test.ts +37 -17
  32. package/src/__tests__/scope-explanations.test.ts +22 -2
  33. package/src/__tests__/serve-boot.test.ts +25 -36
  34. package/src/__tests__/service-spec-discovery.test.ts +30 -35
  35. package/src/__tests__/services-manifest.test.ts +372 -132
  36. package/src/__tests__/sessions.test.ts +75 -28
  37. package/src/__tests__/setup-wizard.test.ts +7 -10
  38. package/src/__tests__/setup.test.ts +13 -14
  39. package/src/__tests__/status.test.ts +0 -5
  40. package/src/__tests__/surface-notes-alias.test.ts +296 -0
  41. package/src/account-api.ts +677 -0
  42. package/src/account-session.ts +132 -0
  43. package/src/account-token.ts +200 -0
  44. package/src/admin-connections.ts +4 -2
  45. package/src/admin-lock.ts +1 -2
  46. package/src/admin-module-token.ts +13 -8
  47. package/src/admin-surfaces.ts +2 -1
  48. package/src/api-hub-upgrade.ts +2 -1
  49. package/src/api-invites.ts +19 -0
  50. package/src/api-mint-token.ts +2 -1
  51. package/src/api-modules-ops.ts +2 -1
  52. package/src/api-modules.ts +10 -8
  53. package/src/api-revoke-token.ts +2 -1
  54. package/src/api-settings-hub-origin.ts +2 -1
  55. package/src/api-settings-root-redirect.ts +2 -1
  56. package/src/api-tokens.ts +2 -1
  57. package/src/audience-gate.ts +2 -1
  58. package/src/chrome-strip.ts +16 -4
  59. package/src/commands/install.ts +86 -8
  60. package/src/commands/migrate.ts +5 -1
  61. package/src/commands/setup.ts +9 -6
  62. package/src/help.ts +6 -6
  63. package/src/hub-server.ts +247 -52
  64. package/src/hub-settings.ts +25 -1
  65. package/src/hub.ts +64 -31
  66. package/src/invites.ts +42 -0
  67. package/src/module-ops-client.ts +2 -1
  68. package/src/notes-serve.ts +73 -31
  69. package/src/oauth-handlers.ts +1 -11
  70. package/src/operator-token.ts +0 -1
  71. package/src/origin-check.ts +2 -2
  72. package/src/scope-explanations.ts +35 -5
  73. package/src/service-spec.ts +128 -74
  74. package/src/services-manifest.ts +112 -52
  75. package/src/sessions.ts +66 -30
  76. package/src/surface-notes-alias.ts +126 -0
  77. package/src/__tests__/admin-agent-token.test.ts +0 -173
  78. 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 agent (the module the whitelist used to hide) + the core set", () => {
30
+ test("includes the supported module set and excludes retired Agent", () => {
29
31
  const shorts = discoverableShorts();
30
- for (const s of ["vault", "scribe", "surface", "agent", "notes"]) {
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 (the remaining FALLBACK agent moved to KNOWN_MODULES in
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", "agent", "notes"]) {
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("matches a row by its manifest name via the short↔manifest map", () => {
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
  });