@serfab/cadre-host 0.7.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.
- package/README.md +296 -101
- package/dist/auth/trust-circle.d.ts +45 -7
- package/dist/auth/trust-circle.js +116 -59
- package/dist/auth/trust-circle.js.map +1 -1
- package/dist/auth/types.d.ts +4 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/bin/host.js +426 -112
- package/dist/bin/host.js.map +1 -1
- package/dist/donation/donation-service.d.ts +136 -0
- package/dist/donation/donation-service.js +306 -0
- package/dist/donation/donation-service.js.map +1 -0
- package/dist/donation/donation-store.d.ts +42 -0
- package/dist/donation/donation-store.js +141 -0
- package/dist/donation/donation-store.js.map +1 -0
- package/dist/donation/grant-service.d.ts +71 -0
- package/dist/donation/grant-service.js +163 -0
- package/dist/donation/grant-service.js.map +1 -0
- package/dist/donation/grant-store.d.ts +38 -0
- package/dist/donation/grant-store.js +135 -0
- package/dist/donation/grant-store.js.map +1 -0
- package/dist/donation/index.d.ts +18 -0
- package/dist/donation/index.js +16 -0
- package/dist/donation/index.js.map +1 -0
- package/dist/donation/types.d.ts +175 -0
- package/dist/donation/types.js +40 -0
- package/dist/donation/types.js.map +1 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/installer/browser.js +16 -17
- package/dist/installer/browser.js.map +1 -1
- package/dist/installer/config.d.ts +51 -0
- package/dist/installer/config.js +14 -1
- package/dist/installer/config.js.map +1 -1
- package/dist/installer/index.d.ts +7 -2
- package/dist/installer/index.js +17 -10
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/service-host/launchd.js +1 -1
- package/dist/installer/service-host/launchd.js.map +1 -1
- package/dist/installer/service-host/systemd.js +1 -1
- package/dist/installer/service-host/systemd.js.map +1 -1
- package/dist/installer/wizard.d.ts +4 -0
- package/dist/installer/wizard.js +5 -1
- package/dist/installer/wizard.js.map +1 -1
- package/dist/nat/index.d.ts +1 -1
- package/dist/nat/nat-service.d.ts +45 -3
- package/dist/nat/nat-service.js +116 -3
- package/dist/nat/nat-service.js.map +1 -1
- package/dist/nat/secrets/index.d.ts +7 -0
- package/dist/nat/secrets/index.js +28 -2
- package/dist/nat/secrets/index.js.map +1 -1
- package/dist/nat/types.d.ts +3 -1
- package/dist/nat/types.js.map +1 -1
- package/dist/orchestrator/host-process-orchestrator.d.ts +68 -1
- package/dist/orchestrator/host-process-orchestrator.js +272 -39
- package/dist/orchestrator/host-process-orchestrator.js.map +1 -1
- package/dist/orchestrator/index.d.ts +3 -2
- package/dist/orchestrator/index.js +1 -1
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/state-store.d.ts +6 -5
- package/dist/orchestrator/state-store.js +10 -2
- package/dist/orchestrator/state-store.js.map +1 -1
- package/dist/orchestrator/types.d.ts +45 -10
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/owner/index.d.ts +11 -0
- package/dist/owner/index.js +11 -0
- package/dist/owner/index.js.map +1 -0
- package/dist/owner/owner-node-client.d.ts +95 -0
- package/dist/owner/owner-node-client.js +167 -0
- package/dist/owner/owner-node-client.js.map +1 -0
- package/dist/push/index.d.ts +67 -0
- package/dist/push/index.js +101 -0
- package/dist/push/index.js.map +1 -0
- package/dist/server/error-handler.d.ts +17 -0
- package/dist/server/error-handler.js +45 -0
- package/dist/server/error-handler.js.map +1 -1
- package/dist/server/index.d.ts +26 -2
- package/dist/server/index.js +37 -16
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/grants-admin.d.ts +17 -0
- package/dist/server/routes/grants-admin.js +32 -0
- package/dist/server/routes/grants-admin.js.map +1 -0
- package/dist/server/routes/grants.d.ts +28 -0
- package/dist/server/routes/grants.js +163 -0
- package/dist/server/routes/grants.js.map +1 -0
- package/dist/server/routes/nodes.d.ts +5 -3
- package/dist/server/routes/nodes.js +39 -24
- package/dist/server/routes/nodes.js.map +1 -1
- package/dist/server/routes/settings.d.ts +6 -1
- package/dist/server/routes/settings.js +5 -2
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/status.d.ts +8 -4
- package/dist/server/routes/status.js +9 -4
- package/dist/server/routes/status.js.map +1 -1
- package/dist/server/static.d.ts +12 -0
- package/dist/server/static.js +24 -7
- package/dist/server/static.js.map +1 -1
- package/dist/ui/assets/index-BlMXQPSw.js +14 -0
- package/dist/ui/assets/{index-C9uChk2P.js.map → index-BlMXQPSw.js.map} +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/update/apply.d.ts +23 -1
- package/dist/update/apply.js +46 -4
- package/dist/update/apply.js.map +1 -1
- package/dist/update/index.d.ts +14 -3
- package/dist/update/index.js +35 -2
- package/dist/update/index.js.map +1 -1
- package/dist/update/manifest.d.ts +28 -9
- package/dist/update/manifest.js +56 -29
- package/dist/update/manifest.js.map +1 -1
- package/dist/update/release-key.d.ts +18 -7
- package/dist/update/release-key.js +29 -14
- package/dist/update/release-key.js.map +1 -1
- package/dist/update/sign.d.ts +46 -0
- package/dist/update/sign.js +53 -0
- package/dist/update/sign.js.map +1 -0
- package/package.json +9 -4
- package/service/README.md +95 -86
- package/src/__tests__/cli-invite.smoke.test.ts +6 -1
- package/src/__tests__/cli-nat.smoke.test.ts +6 -1
- package/src/__tests__/cli.smoke.test.ts +6 -1
- package/src/__tests__/host-owner.smoke.test.ts +123 -0
- package/src/__tests__/orchestrator-owner.test.ts +198 -0
- package/src/__tests__/orchestrator-pin-keys.test.ts +153 -0
- package/src/__tests__/orchestrator-push.test.ts +145 -0
- package/src/auth/__tests__/trust-circle-integration.test.ts +44 -25
- package/src/auth/__tests__/trust-circle.test.ts +91 -24
- package/src/auth/trust-circle.ts +363 -304
- package/src/auth/types.ts +4 -1
- package/src/bin/host.ts +1258 -905
- package/src/donation/__tests__/donation-service.test.ts +290 -0
- package/src/donation/__tests__/grant-service.test.ts +213 -0
- package/src/donation/__tests__/grant-store.test.ts +113 -0
- package/src/donation/donation-service.ts +392 -0
- package/src/donation/donation-store.ts +164 -0
- package/src/donation/grant-service.ts +200 -0
- package/src/donation/grant-store.ts +152 -0
- package/src/donation/index.ts +49 -0
- package/src/donation/types.ts +220 -0
- package/src/index.ts +66 -3
- package/src/installer/__tests__/config.test.ts +27 -1
- package/src/installer/__tests__/installer.smoke.test.ts +94 -0
- package/src/installer/__tests__/wizard.test.ts +5 -1
- package/src/installer/browser.ts +40 -42
- package/src/installer/config.ts +61 -1
- package/src/installer/index.ts +23 -12
- package/src/installer/service-host/launchd.ts +1 -1
- package/src/installer/service-host/systemd.ts +1 -1
- package/src/installer/wizard.ts +12 -1
- package/src/nat/__tests__/ddns-updater.test.ts +1 -1
- package/src/nat/__tests__/nat-service.test.ts +192 -0
- package/src/nat/__tests__/port-mapper.test.ts +1 -1
- package/src/nat/__tests__/secrets.test.ts +23 -1
- package/src/nat/index.ts +1 -1
- package/src/nat/nat-service.ts +131 -5
- package/src/nat/secrets/index.ts +32 -2
- package/src/nat/types.ts +3 -1
- package/src/orchestrator/host-process-orchestrator.ts +322 -54
- package/src/orchestrator/index.ts +9 -2
- package/src/orchestrator/state-store.ts +21 -3
- package/src/orchestrator/types.ts +48 -2
- package/src/owner/__tests__/owner-node-client.test.ts +194 -0
- package/src/owner/index.ts +12 -0
- package/src/owner/owner-node-client.ts +233 -0
- package/src/push/__tests__/push.test.ts +90 -0
- package/src/push/index.ts +146 -0
- package/src/server/__tests__/error-handler.test.ts +26 -4
- package/src/server/__tests__/grants-admin-route.test.ts +73 -0
- package/src/server/__tests__/grants-route.test.ts +189 -0
- package/src/server/__tests__/nodes-route.test.ts +90 -10
- package/src/server/__tests__/publishers.test.ts +1 -1
- package/src/server/__tests__/server.smoke.test.ts +75 -0
- package/src/server/__tests__/settings-route.test.ts +17 -0
- package/src/server/__tests__/static.test.ts +145 -0
- package/src/server/__tests__/status-route.test.ts +23 -2
- package/src/server/error-handler.ts +47 -0
- package/src/server/index.ts +62 -17
- package/src/server/routes/grants-admin.ts +41 -0
- package/src/server/routes/grants.ts +186 -0
- package/src/server/routes/nodes.ts +49 -26
- package/src/server/routes/settings.ts +11 -3
- package/src/server/routes/status.ts +18 -8
- package/src/server/static.ts +24 -8
- package/src/update/__tests__/apply.test.ts +58 -1
- package/src/update/__tests__/manifest.test.ts +41 -6
- package/src/update/__tests__/release-key.test.ts +42 -0
- package/src/update/__tests__/sign.test.ts +78 -0
- package/src/update/__tests__/update-service.integration.test.ts +44 -9
- package/src/update/apply.ts +46 -4
- package/src/update/index.ts +41 -3
- package/src/update/manifest.ts +214 -172
- package/src/update/release-key.ts +31 -15
- package/src/update/sign.ts +74 -0
- package/dist/ui/assets/index-C9uChk2P.js +0 -14
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Donation grant-token types for cadre-host.
|
|
3
|
+
*
|
|
4
|
+
* A **grant token** is a high-entropy base64url secret the host admin issues,
|
|
5
|
+
* out-of-band (QR / copy-paste), to one *grantee* — a friend or family member
|
|
6
|
+
* whose cadre authority (their phone) may then ask this host to spawn donated
|
|
7
|
+
* nodes. The grantee presents the token as `Authorization: Bearer <grant-token>`
|
|
8
|
+
* on every donation request (the grantee-facing surface lands in the
|
|
9
|
+
* `2-donation-service` ticket).
|
|
10
|
+
*
|
|
11
|
+
* This module owns the grant's identity, expiry, and per-grantee quota. The
|
|
12
|
+
* *live-node tally* it checks the quota against is owned by the donation
|
|
13
|
+
* service, not by the grant layer — see `GrantValidator.validateForProvision`.
|
|
14
|
+
*
|
|
15
|
+
* **Grant ≠ trust-circle membership.** A trust-circle invite (`auth/`)
|
|
16
|
+
* authorises a device to join *the host's own* cadre. A donation grant
|
|
17
|
+
* authorises an external cadre authority to ask the host to spawn a node that
|
|
18
|
+
* joins *the grantee's* cadre. The two token flows are deliberately separate
|
|
19
|
+
* modules; this one reuses the *shape* of the trust-circle store (atomic
|
|
20
|
+
* write-then-rename JSON, token-keyed rows) but with grant — not invite —
|
|
21
|
+
* semantics: a grant is long-lived and reusable up to a quota, never
|
|
22
|
+
* one-time-redeemed.
|
|
23
|
+
*/
|
|
24
|
+
/** A grant the host admin issued to one grantee (friend/family). */
|
|
25
|
+
export interface Grant {
|
|
26
|
+
/** base64url secret; also the bearer credential. The store key. */
|
|
27
|
+
token: string;
|
|
28
|
+
/** Human label chosen by the admin, e.g. "Alice's cadre". Display-only. */
|
|
29
|
+
label: string;
|
|
30
|
+
/** Max concurrently-live donated nodes this grant may hold. */
|
|
31
|
+
maxNodes: number;
|
|
32
|
+
/** ISO timestamp when the grant was issued. */
|
|
33
|
+
createdAt: string;
|
|
34
|
+
/** ISO expiry; absent = no expiry. */
|
|
35
|
+
expiresAt?: string;
|
|
36
|
+
/** Set when the admin revokes; a revoked grant validates as denied. */
|
|
37
|
+
revokedAt?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Why a presented grant token was denied. */
|
|
40
|
+
export type GrantDenyReason = 'unknown_token' | 'expired' | 'revoked' | 'quota_exceeded';
|
|
41
|
+
/** Result of validating a presented bearer token. */
|
|
42
|
+
export interface GrantValidation {
|
|
43
|
+
ok: boolean;
|
|
44
|
+
/** The matched grant, when the token names one (present even on some denials). */
|
|
45
|
+
grant?: Grant;
|
|
46
|
+
/** Set when `ok` is false. */
|
|
47
|
+
reason?: GrantDenyReason;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The slice `2-donation-service` depends on. Keeps that ticket decoupled from
|
|
51
|
+
* the store implementation: it holds a `GrantValidator`, not a `GrantStore`.
|
|
52
|
+
*
|
|
53
|
+
* Both methods are pure functions of the store state (and, for provision, the
|
|
54
|
+
* caller-supplied count) — they never throw for a bad token, they return a
|
|
55
|
+
* denial. Issuance/revocation (which mutate) live on `GrantService`.
|
|
56
|
+
*/
|
|
57
|
+
export interface GrantValidator {
|
|
58
|
+
/**
|
|
59
|
+
* Validate a presented bearer token for a *new* provision request.
|
|
60
|
+
*
|
|
61
|
+
* `liveNodeCount(token)` is supplied by the donation service — the grant
|
|
62
|
+
* layer owns identity/expiry/revocation; the donation service owns the
|
|
63
|
+
* authoritative live-node tally (it holds the grant→node records). The count
|
|
64
|
+
* is only consulted once identity/expiry/revocation have passed, so an
|
|
65
|
+
* unknown or dead token never invokes it.
|
|
66
|
+
*/
|
|
67
|
+
validateForProvision(token: string, liveNodeCount: (token: string) => number): GrantValidation;
|
|
68
|
+
/**
|
|
69
|
+
* Validate for a non-provisioning op (peer/seed/terminate): identity + not
|
|
70
|
+
* expired/revoked. No quota check.
|
|
71
|
+
*/
|
|
72
|
+
validate(token: string): GrantValidation;
|
|
73
|
+
}
|
|
74
|
+
/** On-disk shape of `grants.json`. */
|
|
75
|
+
export interface GrantFile {
|
|
76
|
+
version: 1;
|
|
77
|
+
/** keyed by token. */
|
|
78
|
+
grants: Record<string, Omit<Grant, 'token'>>;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Typed handlers exposed to the loopback management server for the **admin**
|
|
82
|
+
* grant surface (`/grants-admin`). Distinct from the grantee-facing `/grants`
|
|
83
|
+
* provisioning surface (`2-donation-service`): the admin surface is loopback,
|
|
84
|
+
* no bearer — same-machine admin, matching cadre-host's local-UI "no login"
|
|
85
|
+
* posture.
|
|
86
|
+
*
|
|
87
|
+
* Handlers throw a `GrantError` whose `.code` the server maps to an HTTP
|
|
88
|
+
* status (see `server/error-handler.ts`).
|
|
89
|
+
*/
|
|
90
|
+
export interface GrantAdminHandlers {
|
|
91
|
+
postGrant(body: {
|
|
92
|
+
label: string;
|
|
93
|
+
maxNodes?: number;
|
|
94
|
+
ttlMs?: number;
|
|
95
|
+
}): Promise<{
|
|
96
|
+
grant: Grant;
|
|
97
|
+
}>;
|
|
98
|
+
listGrants(): Promise<{
|
|
99
|
+
grants: Grant[];
|
|
100
|
+
}>;
|
|
101
|
+
deleteGrant(token: string): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Lifecycle of one donated node:
|
|
105
|
+
* provisioning → the child process is being spawned.
|
|
106
|
+
* awaiting_seed → spawned + reachable; waiting for the requester to present
|
|
107
|
+
* its phone-signed seed (`PUT /grants/:id/seed`).
|
|
108
|
+
* seeded → the seed was applied; the node has joined the requester's cadre.
|
|
109
|
+
* error → provisioning failed (orchestrator resources reclaimed).
|
|
110
|
+
* terminated → stopped + removed (kept in the store for audit).
|
|
111
|
+
*
|
|
112
|
+
* A donation is "live" (counts against a grant's `maxNodes` quota) while it is
|
|
113
|
+
* `provisioning`, `awaiting_seed`, or `seeded` — see `DonationStore.liveNodeCount`.
|
|
114
|
+
*/
|
|
115
|
+
export type DonationStatus = 'provisioning' | 'awaiting_seed' | 'seeded' | 'error' | 'terminated';
|
|
116
|
+
/**
|
|
117
|
+
* One donated node, tracked host-side and persisted to `donations.json`.
|
|
118
|
+
*
|
|
119
|
+
* The host contributes capacity only: `partyId` is the REQUESTER's cadre (a
|
|
120
|
+
* foreign party), and `seedToken` gates the node's own `POST /seed` — it is
|
|
121
|
+
* minted host-side, persisted here (so a host restart in the request→seed gap
|
|
122
|
+
* can still present the seed), and NEVER returned to the grantee.
|
|
123
|
+
*/
|
|
124
|
+
export interface Donation {
|
|
125
|
+
/** "grn_<nanoid>" — also the donated node's orchestrator containerId. */
|
|
126
|
+
id: string;
|
|
127
|
+
/** The grant token that authorized this donation (the quota key). */
|
|
128
|
+
grantToken: string;
|
|
129
|
+
/** The REQUESTER's cadre (a foreign party this host merely hosts a node for). */
|
|
130
|
+
partyId: string;
|
|
131
|
+
/** Node profile. Defaults to `storage` so the node participates and is dialable. */
|
|
132
|
+
profile: 'storage' | 'transaction';
|
|
133
|
+
status: DonationStatus;
|
|
134
|
+
/** Orchestrator handle (opaque `pid:token`), set once the child is spawned. */
|
|
135
|
+
dockerId?: string;
|
|
136
|
+
/**
|
|
137
|
+
* Reserved: a donation's live peer identity is read fresh from the node's
|
|
138
|
+
* `/status` on each `getPeer` call and is NOT persisted here — this field is
|
|
139
|
+
* currently never written. Kept for a future cache if `/status` fan-out ever
|
|
140
|
+
* shows up as hot.
|
|
141
|
+
*/
|
|
142
|
+
peerId?: string;
|
|
143
|
+
/** The node's loopback `POST /seed` URL. Host-internal — stripped from the wire view. */
|
|
144
|
+
seedEndpoint?: string;
|
|
145
|
+
/** Host↔node bearer gating `POST /seed`. Persisted; NEVER leaves the host. */
|
|
146
|
+
seedToken?: string;
|
|
147
|
+
createdAt: string;
|
|
148
|
+
updatedAt: string;
|
|
149
|
+
/** Failure detail when `status === 'error'`. */
|
|
150
|
+
error?: string;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Redacted wire shape returned to the grantee: the host-only secrets
|
|
154
|
+
* (`seedToken`) and host-internal loopback URL (`seedEndpoint`) are stripped.
|
|
155
|
+
*/
|
|
156
|
+
export type DonationView = Omit<Donation, 'seedToken' | 'seedEndpoint'>;
|
|
157
|
+
/** On-disk shape of `donations.json`. Keyed by donation id. */
|
|
158
|
+
export interface DonationFile {
|
|
159
|
+
version: 1;
|
|
160
|
+
donations: Record<string, Omit<Donation, 'id'>>;
|
|
161
|
+
}
|
|
162
|
+
/** Error codes thrown by the donation service / grantee-facing routes. */
|
|
163
|
+
export type DonationErrorCode = 'unauthorized' | 'forbidden' | 'quota_exceeded' | 'invalid_request' | 'not_found' | 'invalid_state' | 'seed_failed' | 'peer_unavailable' | 'orchestrator_error' | 'storage_error';
|
|
164
|
+
/** Typed donation error carrying a stable `code` for HTTP mapping. */
|
|
165
|
+
export declare class DonationError extends Error {
|
|
166
|
+
readonly code: DonationErrorCode;
|
|
167
|
+
constructor(code: DonationErrorCode, message: string);
|
|
168
|
+
}
|
|
169
|
+
/** Error codes thrown by GrantStore / GrantService. */
|
|
170
|
+
export type GrantErrorCode = 'not_found' | 'invalid_label' | 'invalid_max_nodes' | 'invalid_ttl' | 'storage_error';
|
|
171
|
+
/** Typed error carrying a stable `code` for HTTP mapping. */
|
|
172
|
+
export declare class GrantError extends Error {
|
|
173
|
+
readonly code: GrantErrorCode;
|
|
174
|
+
constructor(code: GrantErrorCode, message: string);
|
|
175
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Donation grant-token types for cadre-host.
|
|
3
|
+
*
|
|
4
|
+
* A **grant token** is a high-entropy base64url secret the host admin issues,
|
|
5
|
+
* out-of-band (QR / copy-paste), to one *grantee* — a friend or family member
|
|
6
|
+
* whose cadre authority (their phone) may then ask this host to spawn donated
|
|
7
|
+
* nodes. The grantee presents the token as `Authorization: Bearer <grant-token>`
|
|
8
|
+
* on every donation request (the grantee-facing surface lands in the
|
|
9
|
+
* `2-donation-service` ticket).
|
|
10
|
+
*
|
|
11
|
+
* This module owns the grant's identity, expiry, and per-grantee quota. The
|
|
12
|
+
* *live-node tally* it checks the quota against is owned by the donation
|
|
13
|
+
* service, not by the grant layer — see `GrantValidator.validateForProvision`.
|
|
14
|
+
*
|
|
15
|
+
* **Grant ≠ trust-circle membership.** A trust-circle invite (`auth/`)
|
|
16
|
+
* authorises a device to join *the host's own* cadre. A donation grant
|
|
17
|
+
* authorises an external cadre authority to ask the host to spawn a node that
|
|
18
|
+
* joins *the grantee's* cadre. The two token flows are deliberately separate
|
|
19
|
+
* modules; this one reuses the *shape* of the trust-circle store (atomic
|
|
20
|
+
* write-then-rename JSON, token-keyed rows) but with grant — not invite —
|
|
21
|
+
* semantics: a grant is long-lived and reusable up to a quota, never
|
|
22
|
+
* one-time-redeemed.
|
|
23
|
+
*/
|
|
24
|
+
/** Typed donation error carrying a stable `code` for HTTP mapping. */
|
|
25
|
+
export class DonationError extends Error {
|
|
26
|
+
constructor(code, message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'DonationError';
|
|
29
|
+
this.code = code;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Typed error carrying a stable `code` for HTTP mapping. */
|
|
33
|
+
export class GrantError extends Error {
|
|
34
|
+
constructor(code, message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = 'GrantError';
|
|
37
|
+
this.code = code;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/donation/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAyKH,sEAAsE;AACtE,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGtC,YAAY,IAAuB,EAAE,OAAe;QAClD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAUD,6DAA6D;AAC7D,MAAM,OAAO,UAAW,SAAQ,KAAK;IAGnC,YAAY,IAAoB,EAAE,OAAe;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,14 +18,20 @@
|
|
|
18
18
|
* - cadre-host-local-ui
|
|
19
19
|
*/
|
|
20
20
|
export type { Orchestrator, OrchestratorCreateRequest, OrchestratorCreateResult, OrchestratorStats, ContainerStatus, ContainerResources, } from '@serfab/cadre-provider';
|
|
21
|
-
export { HostProcessOrchestrator } from './orchestrator/index.js';
|
|
22
|
-
export type { HostProcessConfig, PersistedHandle, ManagedNodeInfo, NodeStateListener, } from './orchestrator/index.js';
|
|
21
|
+
export { HostProcessOrchestrator, OWNER_CONTAINER_ID } from './orchestrator/index.js';
|
|
22
|
+
export type { HostProcessConfig, PersistedHandle, ManagedNodeInfo, NodeStateListener, NodePorts, OwnerAdminEndpoint, OwnerSpawnConfig, } from './orchestrator/index.js';
|
|
23
|
+
export { OwnerNodeClient, OwnerNodeUnavailableError } from './owner/index.js';
|
|
24
|
+
export type { OwnerNodeClientOptions } from './owner/index.js';
|
|
23
25
|
export { TrustCircleService, TrustCircleStore, TrustCircleError, createTrustCircleHandlers, parseDuration, DEFAULT_INVITE_TTL_MS, } from './auth/index.js';
|
|
24
26
|
export type { TrustCircleServiceOptions, CadreNodeLike, TrustCircleMember, PendingInvite, TrustCircleFile, TrustCircleSnapshot, TrustCircleHandlers, TrustCircleErrorCode, } from './auth/index.js';
|
|
25
|
-
export {
|
|
26
|
-
export type {
|
|
27
|
-
export {
|
|
28
|
-
export type {
|
|
27
|
+
export { GrantStore, GrantService, createGrantAdminHandlers, GrantError, DEFAULT_MAX_NODES, DonationStore, DonationService, DonationError, } from './donation/index.js';
|
|
28
|
+
export type { Grant, GrantDenyReason, GrantValidation, GrantValidator, GrantFile, GrantAdminHandlers, GrantErrorCode, GrantServiceOptions, Donation, DonationView, DonationStatus, DonationFile, DonationErrorCode, DonationProvisionRequest, DonationSeedResult, DonationPeerInfo, DonationServiceOptions, } from './donation/index.js';
|
|
29
|
+
export { Installer, readHostConfig, updateHostConfig, writeHostConfig } from './installer/index.js';
|
|
30
|
+
export type { InstallOptions, InstallResult, UninstallOptions, InstallerOptions, HostConfigFile, PushSettings, WizardAnswers, WizardDefaults, ServiceHost, ServiceHostContext, ServiceHostStatus, } from './installer/index.js';
|
|
31
|
+
export { resolvePushCredentials, setFcmSecret, setApnsSecret, clearPushSecret, pushAccount, pushStatus, } from './push/index.js';
|
|
32
|
+
export type { FcmSecret, ApnsSecret, PushSecretPlatform, PushStatus, } from './push/index.js';
|
|
33
|
+
export { UpdateService, createUpdateHandlers, UpdateStateStore, UpdateErrorException, applyUpdate, defaultNpmExecutor, fetchManifest, verifyManifest, canonicalJson, signManifest, validateManifestFields, buildManifest, derivePublicKeyBase64, signAndSelfVerify, compareVersions, parseVersion, getReleasePublicKey, getReleasePublicKeyBase64, ed25519FromRaw, isPlaceholderReleaseKey, } from './update/index.js';
|
|
34
|
+
export type { UpdateServiceOptions, UpdateHandlers, UpdateState, SignedManifest, UpdateApplyResult, UpdateSettings, UpdateManifest, UpdateErrorCode, ManifestFields, NpmExecutor, ServiceRestarter, } from './update/index.js';
|
|
29
35
|
export { NatService, NatStore, NatError, createNatHandlers, ExternalIpDetector, PortMapperService, createDefaultPortMapper, evaluateReachability, buildInviteAddresses, BUILTIN_PROVIDERS, getProvider, listProviders, duckDnsProvider, DdnsUpdater, KeytarSecretsStore, FileSecretsStore, createSecretsStore, ddnsAccount, KEYTAR_SERVICE, DEFAULT_LEASE_TTL_MS, DEFAULT_REFRESH_MS, isPlausibleIp, } from './nat/index.js';
|
|
30
36
|
export type { NatServiceOptions, CadreNodeLike as NatCadreNodeLike, NatStatusSnapshot, NatDdnsStatus, NatSettingsFile, NatDdnsSettings, NatHandlers, NatErrorCode, PortForwardMode, DirectReachability, DdnsProviderInfo, DdnsConfigField, ExternalIpResult, RouterIpProbe, ExternalIpDetectorOptions, PortMapper, PortMappingResult, PortMapOptions, PortMapperState, PortMapperServiceOptions, BuildInviteAddressesInput, DdnsProvider, DdnsProviderDeps, DdnsUpdaterOptions, DdnsUpdateOutcome, SecretsStore, KeytarLike, } from './nat/index.js';
|
|
31
37
|
export { createLocalUiServer, EventBus, HostSettingsStore, } from './server/index.js';
|
package/dist/index.js
CHANGED
|
@@ -17,10 +17,15 @@
|
|
|
17
17
|
* - cadre-host-installer
|
|
18
18
|
* - cadre-host-local-ui
|
|
19
19
|
*/
|
|
20
|
-
export { HostProcessOrchestrator } from './orchestrator/index.js';
|
|
20
|
+
export { HostProcessOrchestrator, OWNER_CONTAINER_ID } from './orchestrator/index.js';
|
|
21
|
+
export { OwnerNodeClient, OwnerNodeUnavailableError } from './owner/index.js';
|
|
21
22
|
export { TrustCircleService, TrustCircleStore, TrustCircleError, createTrustCircleHandlers, parseDuration, DEFAULT_INVITE_TTL_MS, } from './auth/index.js';
|
|
22
|
-
|
|
23
|
-
export {
|
|
23
|
+
/* ──────────────── donation grant tokens ──────────────── */
|
|
24
|
+
export { GrantStore, GrantService, createGrantAdminHandlers, GrantError, DEFAULT_MAX_NODES, DonationStore, DonationService, DonationError, } from './donation/index.js';
|
|
25
|
+
export { Installer, readHostConfig, updateHostConfig, writeHostConfig } from './installer/index.js';
|
|
26
|
+
/* ──────────────── push credentials (FCM/APNs) ──────────────── */
|
|
27
|
+
export { resolvePushCredentials, setFcmSecret, setApnsSecret, clearPushSecret, pushAccount, pushStatus, } from './push/index.js';
|
|
28
|
+
export { UpdateService, createUpdateHandlers, UpdateStateStore, UpdateErrorException, applyUpdate, defaultNpmExecutor, fetchManifest, verifyManifest, canonicalJson, signManifest, validateManifestFields, buildManifest, derivePublicKeyBase64, signAndSelfVerify, compareVersions, parseVersion, getReleasePublicKey, getReleasePublicKeyBase64, ed25519FromRaw, isPlaceholderReleaseKey, } from './update/index.js';
|
|
24
29
|
export { NatService, NatStore, NatError, createNatHandlers, ExternalIpDetector, PortMapperService, createDefaultPortMapper, evaluateReachability, buildInviteAddresses, BUILTIN_PROVIDERS, getProvider, listProviders, duckDnsProvider, DdnsUpdater, KeytarSecretsStore, FileSecretsStore, createSecretsStore, ddnsAccount, KEYTAR_SERVICE, DEFAULT_LEASE_TTL_MS, DEFAULT_REFRESH_MS, isPlausibleIp, } from './nat/index.js';
|
|
25
30
|
/* ──────────────── local UI server (6.5.1) ──────────────── */
|
|
26
31
|
export { createLocalUiServer, EventBus, HostSettingsStore, } from './server/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAWtF,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAG9E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,aAAa,EACb,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAYzB,6DAA6D;AAE7D,OAAO,EACL,UAAU,EACV,YAAY,EACZ,wBAAwB,EACxB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,aAAa,GACd,MAAM,qBAAqB,CAAC;AAqB7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAepG,mEAAmE;AAEnE,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,GACX,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,qBAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,cAAc,EACd,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAe3B,OAAO,EACL,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC;AA+BxB,+DAA+D;AAE/D,OAAO,EACL,mBAAmB,EACnB,QAAQ,EACR,iBAAiB,GAClB,MAAM,mBAAmB,CAAC"}
|
|
@@ -7,24 +7,23 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { spawn } from 'node:child_process';
|
|
9
9
|
export function openBrowser(url, platform = process.platform) {
|
|
10
|
+
if (platform === 'darwin')
|
|
11
|
+
return spawnOpener('open', [url]);
|
|
12
|
+
if (platform === 'win32')
|
|
13
|
+
return spawnOpener('rundll32', ['url.dll,FileProtocolHandler', url]);
|
|
14
|
+
// linux + everything else POSIX-ish
|
|
15
|
+
return spawnOpener('xdg-open', [url]);
|
|
16
|
+
}
|
|
17
|
+
function spawnOpener(cmd, args) {
|
|
10
18
|
try {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const child = spawn('rundll32', ['url.dll,FileProtocolHandler', url], {
|
|
20
|
-
detached: true,
|
|
21
|
-
stdio: 'ignore',
|
|
22
|
-
});
|
|
23
|
-
child.unref();
|
|
24
|
-
return { attempted: true, spawned: true };
|
|
25
|
-
}
|
|
26
|
-
// linux + everything else POSIX-ish
|
|
27
|
-
const child = spawn('xdg-open', [url], { detached: true, stdio: 'ignore' });
|
|
19
|
+
const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
|
|
20
|
+
// The launcher's absence (ENOENT on a headless box without xdg-utils,
|
|
21
|
+
// etc.) is reported asynchronously via the child's `error` event, not
|
|
22
|
+
// by `spawn()` throwing. Without a listener, Node escalates to an
|
|
23
|
+
// unhandled-error crash and kills the install. Swallow it: this is a
|
|
24
|
+
// best-effort convenience, the install / UI commands have already
|
|
25
|
+
// printed the URL.
|
|
26
|
+
child.on('error', () => { });
|
|
28
27
|
child.unref();
|
|
29
28
|
return { attempted: true, spawned: true };
|
|
30
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/installer/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACnF,IAAI,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/installer/browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACnF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC,UAAU,EAAE,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/F,oCAAoC;IACpC,OAAO,WAAW,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,IAAc;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACpE,sEAAsE;QACtE,sEAAsE;QACtE,kEAAkE;QAClE,qEAAqE;QACrE,kEAAkE;QAClE,mBAAmB;QACnB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC;AACH,CAAC"}
|
|
@@ -16,6 +16,39 @@ export interface UpdatesConfig {
|
|
|
16
16
|
/** Optional override for the manifest URL (env var still wins). */
|
|
17
17
|
manifestUrl?: string;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Whether this host also runs its own personal cadre (the opt-in "founder"
|
|
21
|
+
* persona), on top of the always-on node-donor role.
|
|
22
|
+
*
|
|
23
|
+
* Default (absent or `enabled: false`) is donor-only: `cadre-host start` brings
|
|
24
|
+
* up the donation surface but spawns **no** owner node, so the trust-circle and
|
|
25
|
+
* NAT surfaces stay inactive. Set `enabled: true` (install-time choice) to also
|
|
26
|
+
* spawn the host's own owner node and enable `/auth` + `/nat`. See
|
|
27
|
+
* docs/cadre-host.md § Two roles: donor and founder.
|
|
28
|
+
*/
|
|
29
|
+
export interface OwnCadreConfig {
|
|
30
|
+
/** When true, `start` spawns the host-owned owner node + trust-circle + NAT. */
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Non-secret push (FCM/APNs) settings. The actual private keys (and the FCM
|
|
35
|
+
* service-account / APNs key identifiers) live in the secret store — see
|
|
36
|
+
* `src/push/`. Only these app-config bits, which are safe to keep in plaintext
|
|
37
|
+
* `host.config.json`, are stored here. Absent ⇒ push is not configured.
|
|
38
|
+
*/
|
|
39
|
+
export interface PushSettings {
|
|
40
|
+
/** APNs app-config (the `.p8` private key + key/team ids stay in the secret store). */
|
|
41
|
+
apns?: {
|
|
42
|
+
/** App bundle id → APNs `apns-topic` header. */
|
|
43
|
+
bundleId: string;
|
|
44
|
+
/** `true` → production APNs host; false/undefined → sandbox (dev/TestFlight). */
|
|
45
|
+
production?: boolean;
|
|
46
|
+
};
|
|
47
|
+
/** Per-(peer,strand) anti-spam cooldown (ms) forwarded into the node's push block. */
|
|
48
|
+
cooldownMs?: number;
|
|
49
|
+
/** Per-strand burst-coalescing window (ms) forwarded into the node's push block. */
|
|
50
|
+
debounceMs?: number;
|
|
51
|
+
}
|
|
19
52
|
export interface HostConfigFile {
|
|
20
53
|
version: 2;
|
|
21
54
|
/** A stable per-install id; useful for log correlation and the control-network partyId. */
|
|
@@ -36,7 +69,25 @@ export interface HostConfigFile {
|
|
|
36
69
|
installerVersion: string;
|
|
37
70
|
/** Update-flow settings; defaults: { autoApply: false }. */
|
|
38
71
|
updates: UpdatesConfig;
|
|
72
|
+
/**
|
|
73
|
+
* Host-own-cadre (founder persona) opt-in. Optional — absent is treated as
|
|
74
|
+
* `{ enabled: false }` (donor-only). Written by the installer; read via
|
|
75
|
+
* `hostOwnsCadre()`. Not editable through /api/settings (install-time only).
|
|
76
|
+
*/
|
|
77
|
+
ownCadre?: OwnCadreConfig;
|
|
78
|
+
/**
|
|
79
|
+
* Non-secret push settings (bundle id, sandbox/prod toggle, cooldown/debounce).
|
|
80
|
+
* Optional — absent when push is not configured. Private keys never live here;
|
|
81
|
+
* they are read from the secret store at node-spawn time (`src/push/`).
|
|
82
|
+
*/
|
|
83
|
+
push?: PushSettings;
|
|
39
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Whether this host runs its own personal cadre (founder persona). Absent
|
|
87
|
+
* `ownCadre` ⇒ donor-only (false). The single source of truth for the
|
|
88
|
+
* founder/donor gate in `bin/host.ts start`.
|
|
89
|
+
*/
|
|
90
|
+
export declare function hostOwnsCadre(cfg: HostConfigFile): boolean;
|
|
40
91
|
export declare function writeHostConfig(filePath: string, cfg: HostConfigFile): void;
|
|
41
92
|
/** Apply a partial patch to the persisted config (read-modify-write). */
|
|
42
93
|
export declare function updateHostConfig(filePath: string, patch: Partial<Omit<HostConfigFile, 'version'>>): HostConfigFile;
|
package/dist/installer/config.js
CHANGED
|
@@ -12,6 +12,14 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
14
14
|
import { dirname } from 'node:path';
|
|
15
|
+
/**
|
|
16
|
+
* Whether this host runs its own personal cadre (founder persona). Absent
|
|
17
|
+
* `ownCadre` ⇒ donor-only (false). The single source of truth for the
|
|
18
|
+
* founder/donor gate in `bin/host.ts start`.
|
|
19
|
+
*/
|
|
20
|
+
export function hostOwnsCadre(cfg) {
|
|
21
|
+
return cfg.ownCadre?.enabled === true;
|
|
22
|
+
}
|
|
15
23
|
const CURRENT_VERSION = 2;
|
|
16
24
|
export function writeHostConfig(filePath, cfg) {
|
|
17
25
|
if (cfg.version !== CURRENT_VERSION) {
|
|
@@ -39,7 +47,7 @@ export function readHostConfig(filePath) {
|
|
|
39
47
|
parsed = JSON.parse(raw);
|
|
40
48
|
}
|
|
41
49
|
catch (err) {
|
|
42
|
-
throw new Error(`Failed to parse host.config.json at ${filePath}: ${err.message}
|
|
50
|
+
throw new Error(`Failed to parse host.config.json at ${filePath}: ${err.message}`, { cause: err });
|
|
43
51
|
}
|
|
44
52
|
if (!parsed || typeof parsed !== 'object') {
|
|
45
53
|
throw new Error(`host.config.json at ${filePath} is not a JSON object`);
|
|
@@ -108,6 +116,11 @@ function isHostConfigShape(v) {
|
|
|
108
116
|
return false;
|
|
109
117
|
if (updates.manifestUrl !== undefined && typeof updates.manifestUrl !== 'string')
|
|
110
118
|
return false;
|
|
119
|
+
if (o.ownCadre !== undefined) {
|
|
120
|
+
const own = o.ownCadre;
|
|
121
|
+
if (!own || typeof own !== 'object' || typeof own.enabled !== 'boolean')
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
111
124
|
return true;
|
|
112
125
|
}
|
|
113
126
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/installer/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/installer/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,9 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { type SupportedPlatform } from './platform.js';
|
|
12
12
|
import { type ServiceHost } from './service-host/index.js';
|
|
13
|
-
import { defaultsForPlatform, runWizard, runWizardWith, DEFAULT_UI_PORT, DEFAULT_LIBP2P_PORT, type WizardAnswers } from './wizard.js';
|
|
14
|
-
export type { HostConfigFile } from './config.js';
|
|
13
|
+
import { defaultsForPlatform, runWizard, runWizardWith, DEFAULT_UI_PORT, DEFAULT_LIBP2P_PORT, type WizardAnswers, type WizardDefaults } from './wizard.js';
|
|
14
|
+
export type { HostConfigFile, PushSettings } from './config.js';
|
|
15
|
+
export { readHostConfig, updateHostConfig, writeHostConfig } from './config.js';
|
|
15
16
|
export type { WizardAnswers, WizardDefaults } from './wizard.js';
|
|
16
17
|
export type { ServiceHost, ServiceHostContext, ServiceHostStatus } from './service-host/index.js';
|
|
17
18
|
export interface InstallOptions {
|
|
@@ -25,6 +26,8 @@ export interface InstallOptions {
|
|
|
25
26
|
libp2pPort?: number;
|
|
26
27
|
/** Disable UPnP probing on first run. */
|
|
27
28
|
noUpnp?: boolean;
|
|
29
|
+
/** Also run the host's own personal cadre here (founder persona). Default false. */
|
|
30
|
+
ownCadre?: boolean;
|
|
28
31
|
/** Open browser at end (default true; suppressed by --no-browser or non-TTY). */
|
|
29
32
|
openBrowser?: boolean;
|
|
30
33
|
/** Skip the enrollment-invite step (no QR printed). */
|
|
@@ -35,6 +38,8 @@ export interface InstallOptions {
|
|
|
35
38
|
nodePath?: string;
|
|
36
39
|
/** Test-only: stub the service-host registration. */
|
|
37
40
|
serviceHost?: ServiceHost;
|
|
41
|
+
/** Test-only: stub the interactive wizard. Production callers leave unset. */
|
|
42
|
+
wizard?: (defaults: WizardDefaults) => Promise<WizardAnswers>;
|
|
38
43
|
}
|
|
39
44
|
export interface InstallResult {
|
|
40
45
|
dataDir: string;
|
package/dist/installer/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { configPath, defaultHostJs, defaultServiceDir, identityPath, logsDir, }
|
|
|
19
19
|
import { detectPlatform, } from './platform.js';
|
|
20
20
|
import { createServiceHost } from './service-host/index.js';
|
|
21
21
|
import { defaultsForPlatform, runWizard, runWizardWith, DEFAULT_UI_PORT, DEFAULT_LIBP2P_PORT, } from './wizard.js';
|
|
22
|
+
export { readHostConfig, updateHostConfig, writeHostConfig } from './config.js';
|
|
22
23
|
const log = debug('cadre:host:installer');
|
|
23
24
|
export class Installer {
|
|
24
25
|
constructor(opts = {}) {
|
|
@@ -55,6 +56,7 @@ export class Installer {
|
|
|
55
56
|
installedAt: new Date().toISOString(),
|
|
56
57
|
installerVersion: this.installerVersion,
|
|
57
58
|
updates: { autoApply: false },
|
|
59
|
+
ownCadre: { enabled: answers.ownCadre },
|
|
58
60
|
};
|
|
59
61
|
const cfgPath = configPath(answers.dataDir);
|
|
60
62
|
writeHostConfig(cfgPath, cfg);
|
|
@@ -128,23 +130,28 @@ export class Installer {
|
|
|
128
130
|
libp2pPort: opts.libp2pPort ?? defaults.libp2pPort,
|
|
129
131
|
upnpEnabled: opts.noUpnp ? false : defaults.upnpEnabled,
|
|
130
132
|
configureDdns: false,
|
|
133
|
+
ownCadre: opts.ownCadre ?? defaults.ownCadre,
|
|
131
134
|
};
|
|
132
135
|
}
|
|
133
136
|
async resolveAnswers(opts) {
|
|
134
137
|
if (opts.nonInteractive) {
|
|
135
138
|
return this.resolveAnswersFromOptions(opts);
|
|
136
139
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
140
|
+
// CLI flags overlay the platform defaults so the wizard's `[...]` hint
|
|
141
|
+
// shows the user's chosen value. Pressing Enter accepts it; typing a new
|
|
142
|
+
// value also works (and now actually has an effect — the previous
|
|
143
|
+
// implementation showed the platform default in the prompt and silently
|
|
144
|
+
// discarded user input because the CLI flag won post-hoc).
|
|
145
|
+
const platformDefaults = defaultsForPlatform(this.platform);
|
|
146
|
+
const defaults = {
|
|
147
|
+
dataDir: opts.dataDir ?? platformDefaults.dataDir,
|
|
148
|
+
uiPort: opts.uiPort ?? platformDefaults.uiPort,
|
|
149
|
+
libp2pPort: opts.libp2pPort ?? platformDefaults.libp2pPort,
|
|
150
|
+
upnpEnabled: opts.noUpnp ? false : platformDefaults.upnpEnabled,
|
|
151
|
+
ownCadre: opts.ownCadre ?? platformDefaults.ownCadre,
|
|
147
152
|
};
|
|
153
|
+
const wizard = opts.wizard ?? runWizard;
|
|
154
|
+
return await wizard(defaults);
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
export { runWizardWith, defaultsForPlatform, DEFAULT_UI_PORT, DEFAULT_LIBP2P_PORT };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,7 +73,7 @@ function run(cmd, args) {
|
|
|
73
73
|
execFileSync(cmd, args, { stdio: 'inherit' });
|
|
74
74
|
}
|
|
75
75
|
catch (err) {
|
|
76
|
-
throw new Error(`${cmd} ${args.join(' ')} failed: ${err.message}
|
|
76
|
+
throw new Error(`${cmd} ${args.join(' ')} failed: ${err.message}`, { cause: err });
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
//# sourceMappingURL=launchd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../src/installer/service-host/launchd.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,GAAG,GAAG,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAElD,MAAM,YAAY,GAAG,YAAY,CAAC;AAClC,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,MAAM,OAAO,kBAAkB;IAA/B;QACW,SAAI,GAAG,YAAY,CAAC;IAsD/B,CAAC;IApDC,UAAU,CAAC,GAAuB;QAChC,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,UAAU,mCAAmC,EAAE,MAAM,CAAC,CAAC;QACxF,OAAO,cAAc,CAAC,IAAI,EAAE;YAC1B,SAAS,EAAE,GAAG,CAAC,QAAQ;YACvB,OAAO,EAAE,GAAG,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAuB;QACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAElC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAE1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,kEAAkE;QAClE,wBAAwB;QACxB,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3E,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClD,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAuB;QACrC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,SAAS,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC5E,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,KAAK,GAAG,CAAC;IACX,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAuB;QACnC,KAAK,GAAG,CAAC;QACT,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAuB;QAClC,KAAK,GAAG,CAAC;QACT,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClF,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IAChC,CAAC;CACF;AAED,SAAS,SAAS;IAChB,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,GAAG,CAAC,GAAW,EAAE,IAAc;IACtC,IAAI,CAAC;QACH,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../src/installer/service-host/launchd.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,7 +72,7 @@ function run(cmd, args) {
|
|
|
72
72
|
execFileSync(cmd, args, { stdio: 'inherit' });
|
|
73
73
|
}
|
|
74
74
|
catch (err) {
|
|
75
|
-
throw new Error(`${cmd} ${args.join(' ')} failed: ${err.message}
|
|
75
|
+
throw new Error(`${cmd} ${args.join(' ')} failed: ${err.message}`, { cause: err });
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
//# sourceMappingURL=systemd.js.map
|