@serfab/cadre-host 0.8.1 → 0.9.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.
Files changed (136) hide show
  1. package/dist/auth/trust-circle.d.ts +5 -5
  2. package/dist/auth/trust-circle.js +10 -10
  3. package/dist/auth/trust-circle.js.map +1 -1
  4. package/dist/auth/types.d.ts +2 -2
  5. package/dist/bin/host.js +255 -54
  6. package/dist/bin/host.js.map +1 -1
  7. package/dist/donation/donation-service.d.ts +136 -0
  8. package/dist/donation/donation-service.js +306 -0
  9. package/dist/donation/donation-service.js.map +1 -0
  10. package/dist/donation/donation-store.d.ts +42 -0
  11. package/dist/donation/donation-store.js +141 -0
  12. package/dist/donation/donation-store.js.map +1 -0
  13. package/dist/donation/grant-service.d.ts +71 -0
  14. package/dist/donation/grant-service.js +163 -0
  15. package/dist/donation/grant-service.js.map +1 -0
  16. package/dist/donation/grant-store.d.ts +38 -0
  17. package/dist/donation/grant-store.js +135 -0
  18. package/dist/donation/grant-store.js.map +1 -0
  19. package/dist/donation/index.d.ts +18 -0
  20. package/dist/donation/index.js +16 -0
  21. package/dist/donation/index.js.map +1 -0
  22. package/dist/donation/types.d.ts +175 -0
  23. package/dist/donation/types.js +40 -0
  24. package/dist/donation/types.js.map +1 -0
  25. package/dist/index.d.ts +6 -4
  26. package/dist/index.js +4 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/installer/config.d.ts +26 -0
  29. package/dist/installer/config.js +13 -0
  30. package/dist/installer/config.js.map +1 -1
  31. package/dist/installer/index.d.ts +2 -0
  32. package/dist/installer/index.js +3 -0
  33. package/dist/installer/index.js.map +1 -1
  34. package/dist/installer/wizard.d.ts +4 -0
  35. package/dist/installer/wizard.js +5 -1
  36. package/dist/installer/wizard.js.map +1 -1
  37. package/dist/nat/nat-service.d.ts +5 -5
  38. package/dist/nat/nat-service.js +9 -9
  39. package/dist/nat/nat-service.js.map +1 -1
  40. package/dist/nat/types.d.ts +1 -1
  41. package/dist/orchestrator/host-process-orchestrator.d.ts +35 -27
  42. package/dist/orchestrator/host-process-orchestrator.js +79 -53
  43. package/dist/orchestrator/host-process-orchestrator.js.map +1 -1
  44. package/dist/orchestrator/index.d.ts +3 -3
  45. package/dist/orchestrator/index.js +1 -1
  46. package/dist/orchestrator/index.js.map +1 -1
  47. package/dist/orchestrator/state-store.d.ts +5 -5
  48. package/dist/orchestrator/state-store.js +2 -2
  49. package/dist/orchestrator/state-store.js.map +1 -1
  50. package/dist/orchestrator/types.d.ts +8 -8
  51. package/dist/owner/index.d.ts +11 -0
  52. package/dist/owner/index.js +11 -0
  53. package/dist/owner/index.js.map +1 -0
  54. package/dist/{authority/authority-node-client.d.ts → owner/owner-node-client.d.ts} +32 -14
  55. package/dist/{authority/authority-node-client.js → owner/owner-node-client.js} +39 -15
  56. package/dist/owner/owner-node-client.js.map +1 -0
  57. package/dist/server/error-handler.d.ts +15 -0
  58. package/dist/server/error-handler.js +41 -0
  59. package/dist/server/error-handler.js.map +1 -1
  60. package/dist/server/index.d.ts +26 -2
  61. package/dist/server/index.js +37 -16
  62. package/dist/server/index.js.map +1 -1
  63. package/dist/server/routes/grants-admin.d.ts +17 -0
  64. package/dist/server/routes/grants-admin.js +32 -0
  65. package/dist/server/routes/grants-admin.js.map +1 -0
  66. package/dist/server/routes/grants.d.ts +28 -0
  67. package/dist/server/routes/grants.js +163 -0
  68. package/dist/server/routes/grants.js.map +1 -0
  69. package/dist/server/routes/nodes.d.ts +5 -4
  70. package/dist/server/routes/nodes.js +19 -18
  71. package/dist/server/routes/nodes.js.map +1 -1
  72. package/dist/server/routes/settings.d.ts +6 -1
  73. package/dist/server/routes/settings.js +5 -2
  74. package/dist/server/routes/settings.js.map +1 -1
  75. package/dist/server/routes/status.d.ts +8 -4
  76. package/dist/server/routes/status.js +9 -4
  77. package/dist/server/routes/status.js.map +1 -1
  78. package/dist/update/release-key.js +7 -5
  79. package/dist/update/release-key.js.map +1 -1
  80. package/package.json +4 -4
  81. package/src/__tests__/{host-authority.smoke.test.ts → host-owner.smoke.test.ts} +7 -7
  82. package/src/__tests__/{orchestrator-authority.test.ts → orchestrator-owner.test.ts} +33 -33
  83. package/src/__tests__/orchestrator-pin-keys.test.ts +153 -0
  84. package/src/__tests__/orchestrator-push.test.ts +10 -10
  85. package/src/auth/__tests__/trust-circle-integration.test.ts +11 -11
  86. package/src/auth/__tests__/trust-circle.test.ts +10 -10
  87. package/src/auth/trust-circle.ts +10 -10
  88. package/src/auth/types.ts +2 -2
  89. package/src/bin/host.ts +273 -53
  90. package/src/donation/__tests__/donation-service.test.ts +290 -0
  91. package/src/donation/__tests__/grant-service.test.ts +213 -0
  92. package/src/donation/__tests__/grant-store.test.ts +113 -0
  93. package/src/donation/donation-service.ts +392 -0
  94. package/src/donation/donation-store.ts +164 -0
  95. package/src/donation/grant-service.ts +200 -0
  96. package/src/donation/grant-store.ts +152 -0
  97. package/src/donation/index.ts +49 -0
  98. package/src/donation/types.ts +220 -0
  99. package/src/index.ts +37 -5
  100. package/src/installer/__tests__/config.test.ts +27 -1
  101. package/src/installer/__tests__/installer.smoke.test.ts +31 -1
  102. package/src/installer/__tests__/wizard.test.ts +5 -1
  103. package/src/installer/config.ts +34 -0
  104. package/src/installer/index.ts +5 -0
  105. package/src/installer/wizard.ts +12 -1
  106. package/src/nat/__tests__/nat-service.test.ts +5 -5
  107. package/src/nat/nat-service.ts +10 -10
  108. package/src/nat/types.ts +1 -1
  109. package/src/orchestrator/host-process-orchestrator.ts +88 -60
  110. package/src/orchestrator/index.ts +3 -3
  111. package/src/orchestrator/state-store.ts +7 -7
  112. package/src/orchestrator/types.ts +8 -8
  113. package/src/{authority/__tests__/authority-node-client.test.ts → owner/__tests__/owner-node-client.test.ts} +45 -17
  114. package/src/owner/index.ts +12 -0
  115. package/src/{authority/authority-node-client.ts → owner/owner-node-client.ts} +55 -21
  116. package/src/server/__tests__/error-handler.test.ts +22 -0
  117. package/src/server/__tests__/grants-admin-route.test.ts +73 -0
  118. package/src/server/__tests__/grants-route.test.ts +189 -0
  119. package/src/server/__tests__/nodes-route.test.ts +25 -25
  120. package/src/server/__tests__/server.smoke.test.ts +75 -0
  121. package/src/server/__tests__/settings-route.test.ts +17 -0
  122. package/src/server/__tests__/status-route.test.ts +21 -0
  123. package/src/server/error-handler.ts +43 -0
  124. package/src/server/index.ts +62 -17
  125. package/src/server/routes/grants-admin.ts +41 -0
  126. package/src/server/routes/grants.ts +186 -0
  127. package/src/server/routes/nodes.ts +19 -18
  128. package/src/server/routes/settings.ts +11 -3
  129. package/src/server/routes/status.ts +18 -8
  130. package/src/update/__tests__/release-key.test.ts +16 -3
  131. package/src/update/release-key.ts +7 -5
  132. package/dist/authority/authority-node-client.js.map +0 -1
  133. package/dist/authority/index.d.ts +0 -11
  134. package/dist/authority/index.js +0 -11
  135. package/dist/authority/index.js.map +0 -1
  136. package/src/authority/index.ts +0 -12
@@ -23,7 +23,7 @@ export class StateStore {
23
23
  return {
24
24
  version: STATE_VERSION,
25
25
  handles: parsed.handles,
26
- ...(parsed.authorityConfig ? { authorityConfig: parsed.authorityConfig } : {}),
26
+ ...(parsed.ownerConfig ? { ownerConfig: parsed.ownerConfig } : {}),
27
27
  };
28
28
  }
29
29
  catch (err) {
@@ -39,7 +39,7 @@ export class StateStore {
39
39
  const payload = JSON.stringify({
40
40
  version: STATE_VERSION,
41
41
  handles: state.handles,
42
- ...(state.authorityConfig ? { authorityConfig: state.authorityConfig } : {}),
42
+ ...(state.ownerConfig ? { ownerConfig: state.ownerConfig } : {}),
43
43
  }, null, 2);
44
44
  const tmp = `${this.path}.tmp`;
45
45
  writeFileSync(tmp, payload, { encoding: 'utf8' });
@@ -1 +1 @@
1
- {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/orchestrator/state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,GAAG,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;AA4B5C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,qEAAqE;AACrE,MAAM,OAAO,UAAU;IAGrB,YAAY,OAAe;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;YACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5E,GAAG,CAAC,0DAA0D,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3E,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACjD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/E,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,oEAAoE;YACpE,wDAAwD;YACxD,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B;YACE,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;QAC/B,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/orchestrator/state-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,GAAG,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;AA4B5C,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,qEAAqE;AACrE,MAAM,OAAO,UAAU;IAGrB,YAAY,OAAe;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI;QACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;YACjD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5E,GAAG,CAAC,0DAA0D,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3E,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACjD,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,yEAAyE;YACzE,oEAAoE;YACpE,wDAAwD;YACxD,GAAG,CAAC,qCAAqC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACjD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAC5B;YACE,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;QAC/B,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAClD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -50,7 +50,7 @@ export interface NodePorts {
50
50
  health: number;
51
51
  metrics: number;
52
52
  p2p: number;
53
- /** Loopback admin-channel port. Bound only by the authority node. */
53
+ /** Loopback admin-channel port. Bound only by the owner node. */
54
54
  admin: number;
55
55
  }
56
56
  /** In-memory record per managed child. */
@@ -64,8 +64,8 @@ export interface Handle {
64
64
  spawnedAt: string;
65
65
  partyId: string;
66
66
  profile: 'storage' | 'transaction';
67
- /** True for the admin's authority node (binds the admin channel). */
68
- authority?: boolean;
67
+ /** True for the admin's owner node (binds the admin channel). */
68
+ owner?: boolean;
69
69
  /** Live ChildProcess reference; absent after re-attach via init(). */
70
70
  child?: ChildProcess;
71
71
  /** Marked false when init() finds the PID dead or token mismatched. */
@@ -84,15 +84,15 @@ export interface ManagedNodeInfo {
84
84
  spawnedAt: string;
85
85
  workdir: string;
86
86
  ports: NodePorts;
87
- /** True for the admin's authority node. */
88
- authority?: boolean;
87
+ /** True for the admin's owner node. */
88
+ owner?: boolean;
89
89
  }
90
90
  /**
91
- * Persisted spawn parameters for the admin's authority node. Stored alongside
92
- * the handles so an orchestrator restart can re-spawn the authority node from
91
+ * Persisted spawn parameters for the admin's owner node. Stored alongside
92
+ * the handles so an orchestrator restart can re-spawn the owner node from
93
93
  * `/api/nodes/:id/{start,restart}` without the caller re-supplying them.
94
94
  */
95
- export interface AuthoritySpawnConfig {
95
+ export interface OwnerSpawnConfig {
96
96
  /** Absolute path to the host's libp2p protobuf identity (`identity.key`). */
97
97
  identityPath: string;
98
98
  /** Control-network partyId (the host's installId). */
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Owner-node delegation surface for cadre-host.
3
+ *
4
+ * The manager process spawns the admin's owner cadre node (via
5
+ * `HostProcessOrchestrator`) and delegates owner/membership/identity
6
+ * operations to it over the loopback admin channel using
7
+ * {@link OwnerNodeClient}. See `docs/cadre-host.md` § Control-plane
8
+ * separation.
9
+ */
10
+ export { OwnerNodeClient, OwnerNodeUnavailableError } from './owner-node-client.js';
11
+ export type { OwnerNodeClientOptions } from './owner-node-client.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Owner-node delegation surface for cadre-host.
3
+ *
4
+ * The manager process spawns the admin's owner cadre node (via
5
+ * `HostProcessOrchestrator`) and delegates owner/membership/identity
6
+ * operations to it over the loopback admin channel using
7
+ * {@link OwnerNodeClient}. See `docs/cadre-host.md` § Control-plane
8
+ * separation.
9
+ */
10
+ export { OwnerNodeClient, OwnerNodeUnavailableError } from './owner-node-client.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/owner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -1,51 +1,52 @@
1
1
  /**
2
- * HTTP client for the authority node's loopback admin channel (the 6.6
2
+ * HTTP client for the owner node's loopback admin channel (the 6.6
3
3
  * `cadre-node-admin-channel` contract).
4
4
  *
5
5
  * cadre-host's manager process holds no in-process `CadreNode`; it spawns the
6
- * admin's authority node as a managed child (see `HostProcessOrchestrator`)
7
- * and delegates all authority/membership/identity operations to it over this
6
+ * admin's owner node as a managed child (see `HostProcessOrchestrator`)
7
+ * and delegates all owner/membership/identity operations to it over this
8
8
  * client. The client implements **both** trimmed `CadreNodeLike` interfaces —
9
9
  * the trust-circle one (`auth/trust-circle.ts`) and the NAT one
10
- * (`nat/nat-service.ts`) — plus `pushInviteAddresses`.
10
+ * (`nat/nat-service.ts`) — plus `pushInviteAddresses` and `addDrone` (the
11
+ * node-donation requester side).
11
12
  *
12
13
  * Transport: `Authorization: Bearer <token>` against
13
14
  * `http://127.0.0.1:<adminPort>`. Every response uses the cadre-provider
14
15
  * envelope `{ ok: true, data }` / `{ ok: false, error: { code, message } }`.
15
16
  * A refused connection, a transport error, or any non-2xx response surfaces
16
- * as {@link AuthorityNodeUnavailableError}; the trust-circle / NAT services
17
+ * as {@link OwnerNodeUnavailableError}; the trust-circle / NAT services
17
18
  * translate that into a `node_unavailable` domain error so the management API
18
19
  * returns a clear 503 rather than a raw 500.
19
20
  */
20
- import type { CadreInvite } from '@serfab/cadre-core';
21
- import type { AuthorityAdminEndpoint } from '../orchestrator/index.js';
21
+ import type { CadreInvite, DroneInitResult } from '@serfab/cadre-core';
22
+ import type { OwnerAdminEndpoint } from '../orchestrator/index.js';
22
23
  import type { CadreNodeLike as TrustCircleCadreNodeLike } from '../auth/trust-circle.js';
23
24
  import type { CadreNodeLike as NatCadreNodeLike } from '../nat/nat-service.js';
24
25
  /**
25
- * Raised when the authority node's admin channel can't be reached or returns
26
+ * Raised when the owner node's admin channel can't be reached or returns
26
27
  * a non-success response. Carries the node's stable error `code` when one was
27
28
  * present in the envelope (e.g. `not_ready`, `not_authorized`).
28
29
  */
29
- export declare class AuthorityNodeUnavailableError extends Error {
30
+ export declare class OwnerNodeUnavailableError extends Error {
30
31
  /** The admin-channel error code, when the node answered with an envelope. */
31
32
  readonly nodeCode?: string;
32
33
  constructor(message: string, nodeCode?: string);
33
34
  }
34
35
  /** Endpoint provided directly or via a getter (so it tracks re-spawns). */
35
- type EndpointSource = AuthorityAdminEndpoint | (() => AuthorityAdminEndpoint | undefined) | undefined;
36
- export interface AuthorityNodeClientOptions {
36
+ type EndpointSource = OwnerAdminEndpoint | (() => OwnerAdminEndpoint | undefined) | undefined;
37
+ export interface OwnerNodeClientOptions {
37
38
  /** Fetch override for tests. Defaults to the global `fetch`. */
38
39
  fetch?: typeof fetch;
39
40
  }
40
- export declare class AuthorityNodeClient implements TrustCircleCadreNodeLike, NatCadreNodeLike {
41
+ export declare class OwnerNodeClient implements TrustCircleCadreNodeLike, NatCadreNodeLike {
41
42
  private readonly endpointSource;
42
43
  private readonly fetchImpl;
43
44
  /**
44
45
  * @param endpoint Either a fixed `{ baseUrl, token }` or a getter returning
45
- * the current endpoint (pass `orchestrator.getAuthorityAdminEndpoint`
46
+ * the current endpoint (pass `orchestrator.getOwnerAdminEndpoint`
46
47
  * bound, so a restart's new bearer token is picked up automatically).
47
48
  */
48
- constructor(endpoint: EndpointSource, opts?: AuthorityNodeClientOptions);
49
+ constructor(endpoint: EndpointSource, opts?: OwnerNodeClientOptions);
49
50
  createInvite(token?: string, expiresInMs?: number): Promise<{
50
51
  invite: CadreInvite;
51
52
  encodedInvite: string;
@@ -66,8 +67,25 @@ export declare class AuthorityNodeClient implements TrustCircleCadreNodeLike, Na
66
67
  multiaddr: string | null;
67
68
  }>>;
68
69
  isMember(peerId: string): Promise<boolean>;
70
+ /** Authorized-membership surface (excludes self) — see {@link listMembers} for the addressable one. */
71
+ listAuthorizedMembers(): Promise<Array<{
72
+ peerId: string;
73
+ multiaddr: string | null;
74
+ }>>;
75
+ isAuthorizedMember(peerId: string): Promise<boolean>;
69
76
  getPeerId(): Promise<string>;
70
77
  getMultiaddrs(): Promise<string[]>;
78
+ /**
79
+ * Mint a seed authorizing a drone — a provider-hosted / donated node — to join
80
+ * this node's cadre. The node signs the seed with its own authority key; only
81
+ * the signed, public `encodedSeed` is returned (the private key never leaves
82
+ * the node). This is the requester ("phone") side of the node-donation flow:
83
+ * the donor host presents the returned seed to the donated node's `POST /seed`.
84
+ */
85
+ addDrone(options: {
86
+ dronePeerId: string;
87
+ droneMultiaddrs: string[];
88
+ }): Promise<DroneInitResult>;
71
89
  /** Push the NAT-resolved addresses the node should embed in future invites. */
72
90
  pushInviteAddresses(addresses: string[]): Promise<void>;
73
91
  private resolveEndpoint;
@@ -1,41 +1,42 @@
1
1
  /**
2
- * HTTP client for the authority node's loopback admin channel (the 6.6
2
+ * HTTP client for the owner node's loopback admin channel (the 6.6
3
3
  * `cadre-node-admin-channel` contract).
4
4
  *
5
5
  * cadre-host's manager process holds no in-process `CadreNode`; it spawns the
6
- * admin's authority node as a managed child (see `HostProcessOrchestrator`)
7
- * and delegates all authority/membership/identity operations to it over this
6
+ * admin's owner node as a managed child (see `HostProcessOrchestrator`)
7
+ * and delegates all owner/membership/identity operations to it over this
8
8
  * client. The client implements **both** trimmed `CadreNodeLike` interfaces —
9
9
  * the trust-circle one (`auth/trust-circle.ts`) and the NAT one
10
- * (`nat/nat-service.ts`) — plus `pushInviteAddresses`.
10
+ * (`nat/nat-service.ts`) — plus `pushInviteAddresses` and `addDrone` (the
11
+ * node-donation requester side).
11
12
  *
12
13
  * Transport: `Authorization: Bearer <token>` against
13
14
  * `http://127.0.0.1:<adminPort>`. Every response uses the cadre-provider
14
15
  * envelope `{ ok: true, data }` / `{ ok: false, error: { code, message } }`.
15
16
  * A refused connection, a transport error, or any non-2xx response surfaces
16
- * as {@link AuthorityNodeUnavailableError}; the trust-circle / NAT services
17
+ * as {@link OwnerNodeUnavailableError}; the trust-circle / NAT services
17
18
  * translate that into a `node_unavailable` domain error so the management API
18
19
  * returns a clear 503 rather than a raw 500.
19
20
  */
20
21
  import debug from 'debug';
21
- const log = debug('cadre:host:authority-client');
22
+ const log = debug('cadre:host:owner-client');
22
23
  /**
23
- * Raised when the authority node's admin channel can't be reached or returns
24
+ * Raised when the owner node's admin channel can't be reached or returns
24
25
  * a non-success response. Carries the node's stable error `code` when one was
25
26
  * present in the envelope (e.g. `not_ready`, `not_authorized`).
26
27
  */
27
- export class AuthorityNodeUnavailableError extends Error {
28
+ export class OwnerNodeUnavailableError extends Error {
28
29
  constructor(message, nodeCode) {
29
30
  super(message);
30
- this.name = 'AuthorityNodeUnavailableError';
31
+ this.name = 'OwnerNodeUnavailableError';
31
32
  if (nodeCode !== undefined)
32
33
  this.nodeCode = nodeCode;
33
34
  }
34
35
  }
35
- export class AuthorityNodeClient {
36
+ export class OwnerNodeClient {
36
37
  /**
37
38
  * @param endpoint Either a fixed `{ baseUrl, token }` or a getter returning
38
- * the current endpoint (pass `orchestrator.getAuthorityAdminEndpoint`
39
+ * the current endpoint (pass `orchestrator.getOwnerAdminEndpoint`
39
40
  * bound, so a restart's new bearer token is picked up automatically).
40
41
  */
41
42
  constructor(endpoint, opts = {}) {
@@ -78,6 +79,15 @@ export class AuthorityNodeClient {
78
79
  const data = await this.request('GET', `/admin/members/${encodeURIComponent(peerId)}`);
79
80
  return data.member;
80
81
  }
82
+ /** Authorized-membership surface (excludes self) — see {@link listMembers} for the addressable one. */
83
+ async listAuthorizedMembers() {
84
+ const data = await this.request('GET', '/admin/authorized-members');
85
+ return data.members;
86
+ }
87
+ async isAuthorizedMember(peerId) {
88
+ const data = await this.request('GET', `/admin/authorized-members/${encodeURIComponent(peerId)}`);
89
+ return data.member;
90
+ }
81
91
  // --- NAT CadreNodeLike ---
82
92
  async getPeerId() {
83
93
  const data = await this.request('GET', '/admin/identity');
@@ -87,6 +97,20 @@ export class AuthorityNodeClient {
87
97
  const data = await this.request('GET', '/admin/multiaddrs');
88
98
  return data.multiaddrs;
89
99
  }
100
+ // --- drone seeding (node-donation requester side) ---
101
+ /**
102
+ * Mint a seed authorizing a drone — a provider-hosted / donated node — to join
103
+ * this node's cadre. The node signs the seed with its own authority key; only
104
+ * the signed, public `encodedSeed` is returned (the private key never leaves
105
+ * the node). This is the requester ("phone") side of the node-donation flow:
106
+ * the donor host presents the returned seed to the donated node's `POST /seed`.
107
+ */
108
+ async addDrone(options) {
109
+ return await this.request('POST', '/admin/add-drone', {
110
+ dronePeerId: options.dronePeerId,
111
+ droneMultiaddrs: options.droneMultiaddrs,
112
+ });
113
+ }
90
114
  // --- push-model invite addresses ---
91
115
  /** Push the NAT-resolved addresses the node should embed in future invites. */
92
116
  async pushInviteAddresses(addresses) {
@@ -96,7 +120,7 @@ export class AuthorityNodeClient {
96
120
  resolveEndpoint() {
97
121
  const ep = typeof this.endpointSource === 'function' ? this.endpointSource() : this.endpointSource;
98
122
  if (!ep) {
99
- throw new AuthorityNodeUnavailableError('Authority node admin endpoint is not available');
123
+ throw new OwnerNodeUnavailableError('Owner node admin endpoint is not available');
100
124
  }
101
125
  return ep;
102
126
  }
@@ -115,14 +139,14 @@ export class AuthorityNodeClient {
115
139
  catch (err) {
116
140
  const message = err instanceof Error ? err.message : String(err);
117
141
  log('admin %s %s transport error: %s', method, path, message);
118
- throw new AuthorityNodeUnavailableError(`Authority node unreachable: ${message}`);
142
+ throw new OwnerNodeUnavailableError(`Owner node unreachable: ${message}`);
119
143
  }
120
144
  const envelope = await this.parseEnvelope(res);
121
145
  if (!res.ok || !envelope.ok) {
122
146
  const code = envelope.error?.code;
123
147
  const message = envelope.error?.message ?? `admin ${method} ${path} → HTTP ${res.status}`;
124
148
  log('admin %s %s failed: [%s] %s', method, path, code ?? res.status, message);
125
- throw new AuthorityNodeUnavailableError(message, code);
149
+ throw new OwnerNodeUnavailableError(message, code);
126
150
  }
127
151
  return envelope.data;
128
152
  }
@@ -140,4 +164,4 @@ export class AuthorityNodeClient {
140
164
  return {};
141
165
  }
142
166
  }
143
- //# sourceMappingURL=authority-node-client.js.map
167
+ //# sourceMappingURL=owner-node-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-node-client.js","sourceRoot":"","sources":["../../src/owner/owner-node-client.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,21 @@
22
22
  * apply_in_progress → 409
23
23
  * signature_invalid, unsupported_state_version,
24
24
  * apply_failed, rollback_failed, storage_error → 500
25
+ * - GrantError
26
+ * invalid_label, invalid_max_nodes,
27
+ * invalid_ttl → 400
28
+ * not_found → 404
29
+ * storage_error → 500
30
+ * - DonationError
31
+ * invalid_request → 400
32
+ * unauthorized → 401
33
+ * forbidden → 403
34
+ * not_found → 404
35
+ * invalid_state → 409
36
+ * quota_exceeded → 429
37
+ * orchestrator_error, storage_error → 500
38
+ * seed_failed → 502
39
+ * peer_unavailable → 503
25
40
  * - everything else → 500 (code "internal")
26
41
  */
27
42
  import type { FastifyInstance } from 'fastify';
@@ -22,12 +22,28 @@
22
22
  * apply_in_progress → 409
23
23
  * signature_invalid, unsupported_state_version,
24
24
  * apply_failed, rollback_failed, storage_error → 500
25
+ * - GrantError
26
+ * invalid_label, invalid_max_nodes,
27
+ * invalid_ttl → 400
28
+ * not_found → 404
29
+ * storage_error → 500
30
+ * - DonationError
31
+ * invalid_request → 400
32
+ * unauthorized → 401
33
+ * forbidden → 403
34
+ * not_found → 404
35
+ * invalid_state → 409
36
+ * quota_exceeded → 429
37
+ * orchestrator_error, storage_error → 500
38
+ * seed_failed → 502
39
+ * peer_unavailable → 503
25
40
  * - everything else → 500 (code "internal")
26
41
  */
27
42
  import debug from 'debug';
28
43
  import { TrustCircleError } from '../auth/types.js';
29
44
  import { NatError } from '../nat/types.js';
30
45
  import { UpdateErrorException } from '../update/types.js';
46
+ import { GrantError, DonationError } from '../donation/types.js';
31
47
  const log = debug('cadre:host:error-handler');
32
48
  const TRUST_STATUS = {
33
49
  invalid_label: 400,
@@ -50,6 +66,25 @@ const NAT_STATUS = {
50
66
  ddns_update_failed: 500,
51
67
  node_unavailable: 503,
52
68
  };
69
+ const GRANT_STATUS = {
70
+ invalid_label: 400,
71
+ invalid_max_nodes: 400,
72
+ invalid_ttl: 400,
73
+ not_found: 404,
74
+ storage_error: 500,
75
+ };
76
+ const DONATION_STATUS = {
77
+ unauthorized: 401,
78
+ forbidden: 403,
79
+ quota_exceeded: 429,
80
+ invalid_request: 400,
81
+ not_found: 404,
82
+ invalid_state: 409,
83
+ seed_failed: 502,
84
+ peer_unavailable: 503,
85
+ orchestrator_error: 500,
86
+ storage_error: 500,
87
+ };
53
88
  const UPDATE_STATUS = {
54
89
  manifest_invalid: 400,
55
90
  no_update_available: 400,
@@ -86,6 +121,12 @@ function classify(err) {
86
121
  if (err instanceof UpdateErrorException) {
87
122
  return { status: UPDATE_STATUS[err.code] ?? 500, code: err.code, message: err.message };
88
123
  }
124
+ if (err instanceof GrantError) {
125
+ return { status: GRANT_STATUS[err.code] ?? 500, code: err.code, message: err.message };
126
+ }
127
+ if (err instanceof DonationError) {
128
+ return { status: DONATION_STATUS[err.code] ?? 500, code: err.code, message: err.message };
129
+ }
89
130
  // Fastify body-parsing / validation errors have a statusCode we should honour.
90
131
  if (typeof err.statusCode === 'number' && err.statusCode >= 400 && err.statusCode < 600) {
91
132
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/server/error-handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/server/error-handler.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ import type { HostProcessOrchestrator } from '../orchestrator/index.js';
17
17
  import type { TrustCircleService } from '../auth/index.js';
18
18
  import type { NatService } from '../nat/index.js';
19
19
  import type { UpdateService } from '../update/index.js';
20
+ import type { GrantService, DonationService } from '../donation/index.js';
20
21
  import { EventBus } from './events/bus.js';
21
22
  import { HostSettingsStore } from './settings-store.js';
22
23
  export interface LocalUiServerOptions {
@@ -26,10 +27,33 @@ export interface LocalUiServerOptions {
26
27
  dataDir: string;
27
28
  /** Wired dependencies — all owned by the caller. */
28
29
  orchestrator: HostProcessOrchestrator;
29
- trustCircle: TrustCircleService;
30
- nat: NatService;
30
+ /**
31
+ * Trust-circle service — present only when the host runs its own personal
32
+ * cadre (`ownCadre.enabled`). Absent in donor-only mode, where `/auth/*`
33
+ * stays unmounted and 404s.
34
+ */
35
+ trustCircle?: TrustCircleService;
36
+ /**
37
+ * NAT service — present only when the host runs its own personal cadre.
38
+ * Absent in donor-only mode (loopback-only in v1), where `/nat/*` stays
39
+ * unmounted and 404s.
40
+ */
41
+ nat?: NatService;
31
42
  /** Optional — 6.4.2 lands this; nullable while still iterating. */
32
43
  update?: UpdateService;
44
+ /**
45
+ * Donation grant layer. When present, mounts the loopback admin surface at
46
+ * `/grants-admin` (issue/list/revoke). Optional so existing callers/tests
47
+ * that don't exercise donations need not wire it.
48
+ */
49
+ grants?: GrantService;
50
+ /**
51
+ * Donation lifecycle service. When present (alongside `grants`), mounts the
52
+ * bearer-gated grantee-facing provisioning surface at `/grants`
53
+ * (provision / peer / seed / terminate). Optional so callers/tests that don't
54
+ * exercise the donor path need not wire it.
55
+ */
56
+ donations?: DonationService;
33
57
  /** Settings I/O facade. Defaults to a new one rooted at `dataDir`. */
34
58
  settingsStore?: HostSettingsStore;
35
59
  /** Bus instance — pass the same one to subsystems that publish events. */
@@ -15,6 +15,7 @@
15
15
  import { createTrustCircleHandlers } from '../auth/index.js';
16
16
  import { createNatHandlers } from '../nat/index.js';
17
17
  import { createUpdateHandlers } from '../update/index.js';
18
+ import { createGrantAdminHandlers } from '../donation/index.js';
18
19
  import { EventBus } from './events/bus.js';
19
20
  import { registerSseRoute } from './events/sse-route.js';
20
21
  import { registerErrorHandler } from './error-handler.js';
@@ -27,6 +28,8 @@ import { registerUpdateRoutes } from './routes/update.js';
27
28
  import { registerStatusRoute } from './routes/status.js';
28
29
  import { registerNodesRoutes } from './routes/nodes.js';
29
30
  import { registerSettingsRoutes } from './routes/settings.js';
31
+ import { registerGrantsAdminRoutes } from './routes/grants-admin.js';
32
+ import { registerGrantsRoutes } from './routes/grants.js';
30
33
  import { HostSettingsStore } from './settings-store.js';
31
34
  /** How often to poll UpdateService.getState() looking for new versions. */
32
35
  const UPDATE_OBSERVER_INTERVAL_MS = 60000;
@@ -44,17 +47,32 @@ export function createLocalUiServer(opts) {
44
47
  });
45
48
  registerStatusRoute(app, {
46
49
  orchestrator: opts.orchestrator,
47
- trustCircle: opts.trustCircle,
48
- nat: opts.nat,
50
+ ...(opts.trustCircle ? { trustCircle: opts.trustCircle } : {}),
51
+ ...(opts.nat ? { nat: opts.nat } : {}),
49
52
  ...(opts.update ? { update: opts.update } : {}),
50
53
  });
51
54
  registerNodesRoutes(app, { orchestrator: opts.orchestrator });
52
- registerSettingsRoutes(app, { settingsStore, nat: opts.nat, ...(opts.update ? { update: opts.update } : {}) });
53
- registerTrustCircleRoutes(app, { handlers: createTrustCircleHandlers(opts.trustCircle), events });
54
- registerNatRoutes(app, { handlers: createNatHandlers(opts.nat), events });
55
+ registerSettingsRoutes(app, { settingsStore, ...(opts.nat ? { nat: opts.nat } : {}), ...(opts.update ? { update: opts.update } : {}) });
56
+ // Trust-circle + NAT surfaces exist only when the host runs its own personal
57
+ // cadre. In donor-only mode they're left unmounted, so `/auth/*` and `/nat/*`
58
+ // fall through to the static not-found handler and 404 (see static.ts).
59
+ if (opts.trustCircle) {
60
+ registerTrustCircleRoutes(app, { handlers: createTrustCircleHandlers(opts.trustCircle), events });
61
+ }
62
+ if (opts.nat) {
63
+ registerNatRoutes(app, { handlers: createNatHandlers(opts.nat), events });
64
+ }
55
65
  if (opts.update) {
56
66
  registerUpdateRoutes(app, { handlers: createUpdateHandlers(opts.update), events });
57
67
  }
68
+ if (opts.grants) {
69
+ registerGrantsAdminRoutes(app, { handlers: createGrantAdminHandlers(opts.grants) });
70
+ // Grantee-facing provisioning surface needs both the donation service and a
71
+ // grant validator (the GrantService doubles as the validator).
72
+ if (opts.donations) {
73
+ registerGrantsRoutes(app, { donations: opts.donations, grants: opts.grants });
74
+ }
75
+ }
58
76
  // Static mount registers as the not-found handler — declared last so the
59
77
  // API paths above win.
60
78
  registerStaticMount(app, { ...(opts.staticRoot !== undefined ? { rootDir: opts.staticRoot } : {}) });
@@ -85,17 +103,20 @@ export function createLocalUiServer(opts) {
85
103
  });
86
104
  }));
87
105
  // One-shot connectivity publish — the SPA will get a sane initial
88
- // signal even if no settings have changed yet this session.
89
- try {
90
- const snap = opts.nat.getStatus();
91
- events.publish({
92
- type: 'connectivity-changed',
93
- portMode: snap.portMode,
94
- directReachability: snap.directReachability,
95
- });
96
- }
97
- catch {
98
- // NatService.start may not have completed; harmless to skip.
106
+ // signal even if no settings have changed yet this session. Skipped in
107
+ // donor-only mode, where there is no NatService.
108
+ if (opts.nat) {
109
+ try {
110
+ const snap = opts.nat.getStatus();
111
+ events.publish({
112
+ type: 'connectivity-changed',
113
+ portMode: snap.portMode,
114
+ directReachability: snap.directReachability,
115
+ });
116
+ }
117
+ catch {
118
+ // NatService.start may not have completed; harmless to skip.
119
+ }
99
120
  }
100
121
  // Update observer: poll UpdateService.getState() every 60 s and emit
101
122
  // `update-available` when `available.version` changes. Cheap, avoids
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Donation grant **admin** HTTP routes — thin adapters around
3
+ * `GrantAdminHandlers` (`createGrantAdminHandlers(service)`).
4
+ *
5
+ * Mount path: `/grants-admin` — the admin surface the `cadre-host grant` CLI
6
+ * targets. It is **loopback, no bearer**: same-machine admin, matching
7
+ * cadre-host's local-UI "no login" posture (see docs/cadre-host.md §
8
+ * Security posture). This is distinct from the grantee-facing `/grants`
9
+ * provisioning surface that carries the bearer gate — that arrives in the
10
+ * `2-donation-service` ticket.
11
+ */
12
+ import type { FastifyInstance } from 'fastify';
13
+ import type { GrantAdminHandlers } from '../../donation/types.js';
14
+ export interface GrantsAdminRoutesOptions {
15
+ handlers: GrantAdminHandlers;
16
+ }
17
+ export declare function registerGrantsAdminRoutes(app: FastifyInstance, opts: GrantsAdminRoutesOptions): void;