@econ-v1/domain 6.7.0 → 6.11.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/dist/errors/index.d.ts +96 -25
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/events/index.d.ts +127 -20
- package/dist/events/index.d.ts.map +1 -1
- package/dist/index.d.ts +250 -47
- package/dist/index.d.ts.map +1 -1
- package/dist/models/agent.d.ts +25 -4
- package/dist/models/agent.d.ts.map +1 -1
- package/dist/models/app-data.d.ts +84 -0
- package/dist/models/app-data.d.ts.map +1 -0
- package/dist/models/conversation.d.ts +12 -2
- package/dist/models/conversation.d.ts.map +1 -1
- package/dist/models/delegation.d.ts +12 -3
- package/dist/models/delegation.d.ts.map +1 -1
- package/dist/models/device-boot-state.d.ts +12 -0
- package/dist/models/device-boot-state.d.ts.map +1 -0
- package/dist/models/device-identity.d.ts +11 -3
- package/dist/models/device-identity.d.ts.map +1 -1
- package/dist/models/graph.d.ts +26 -3
- package/dist/models/graph.d.ts.map +1 -1
- package/dist/models/index.d.ts +82 -14
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/json.d.ts +5 -5
- package/dist/models/json.d.ts.map +1 -1
- package/dist/models/l402.d.ts +4 -5
- package/dist/models/l402.d.ts.map +1 -1
- package/dist/models/live-query-definition.d.ts +15 -16
- package/dist/models/live-query-definition.d.ts.map +1 -1
- package/dist/models/node-app-memory.d.ts +107 -0
- package/dist/models/node-app-memory.d.ts.map +1 -0
- package/dist/models/outbox-intent.d.ts +3 -3
- package/dist/models/outbox-intent.d.ts.map +1 -1
- package/dist/models/outbox.d.ts +67 -15
- package/dist/models/outbox.d.ts.map +1 -1
- package/dist/models/owner-views.d.ts +28 -28
- package/dist/models/owner-views.d.ts.map +1 -1
- package/dist/models/payment.d.ts +28 -9
- package/dist/models/payment.d.ts.map +1 -1
- package/dist/models/query-diff.d.ts +2 -2
- package/dist/models/query-diff.d.ts.map +1 -1
- package/dist/models/release-manifest.d.ts +32 -47
- package/dist/models/release-manifest.d.ts.map +1 -1
- package/dist/models/repository-write.d.ts +3 -3
- package/dist/models/repository-write.d.ts.map +1 -1
- package/dist/models/revisioned-commands.d.ts +66 -13
- package/dist/models/revisioned-commands.d.ts.map +1 -1
- package/dist/models/revisioned.d.ts +50 -10
- package/dist/models/revisioned.d.ts.map +1 -1
- package/dist/models/settings.d.ts +2 -2
- package/dist/models/settings.d.ts.map +1 -1
- package/dist/models/sync.d.ts +18 -18
- package/dist/models/sync.d.ts.map +1 -1
- package/dist/models/wallet.d.ts +16 -16
- package/dist/models/wallet.d.ts.map +1 -1
- package/dist/queries/certificate-trust.d.ts +13 -0
- package/dist/queries/certificate-trust.d.ts.map +1 -0
- package/dist/queries/conversations.d.ts +38 -7
- package/dist/queries/conversations.d.ts.map +1 -1
- package/dist/queries/discovery.d.ts +10 -10
- package/dist/queries/discovery.d.ts.map +1 -1
- package/dist/queries/notifications.d.ts +24 -4
- package/dist/queries/notifications.d.ts.map +1 -1
- package/dist/queries/onboarding-flow.d.ts +25 -0
- package/dist/queries/onboarding-flow.d.ts.map +1 -0
- package/dist/queries/onboarding-lcd-screen.d.ts +56 -0
- package/dist/queries/onboarding-lcd-screen.d.ts.map +1 -0
- package/dist/queries/onboarding-status.d.ts +10 -10
- package/dist/queries/onboarding-status.d.ts.map +1 -1
- package/dist/queries/revisioned.d.ts +47 -13
- package/dist/queries/revisioned.d.ts.map +1 -1
- package/dist/queries/wallet.d.ts +40 -10
- package/dist/queries/wallet.d.ts.map +1 -1
- package/dist/services/abort-signal.d.ts +54 -0
- package/dist/services/abort-signal.d.ts.map +1 -0
- package/dist/services/certificate-trust-service.d.ts +42 -0
- package/dist/services/certificate-trust-service.d.ts.map +1 -0
- package/dist/services/conversation-service.d.ts +103 -15
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-sync.d.ts +9 -5
- package/dist/services/conversation-sync.d.ts.map +1 -1
- package/dist/services/device-boot-state-service.d.ts +17 -0
- package/dist/services/device-boot-state-service.d.ts.map +1 -0
- package/dist/services/device-cleanup-service.d.ts +47 -0
- package/dist/services/device-cleanup-service.d.ts.map +1 -0
- package/dist/services/discovery-probe-service.d.ts +37 -46
- package/dist/services/discovery-probe-service.d.ts.map +1 -1
- package/dist/services/gossip-service.d.ts +28 -13
- package/dist/services/gossip-service.d.ts.map +1 -1
- package/dist/services/invite-redemption-service.d.ts +43 -0
- package/dist/services/invite-redemption-service.d.ts.map +1 -0
- package/dist/services/lan-candidate-refresh-service.d.ts +22 -7
- package/dist/services/lan-candidate-refresh-service.d.ts.map +1 -1
- package/dist/services/lcd-decision-service.d.ts +58 -0
- package/dist/services/lcd-decision-service.d.ts.map +1 -0
- package/dist/services/onboarding-checkpoint-store.d.ts +54 -0
- package/dist/services/onboarding-checkpoint-store.d.ts.map +1 -0
- package/dist/services/onboarding-flow-service.d.ts +180 -0
- package/dist/services/onboarding-flow-service.d.ts.map +1 -0
- package/dist/services/onboarding-status-service.d.ts +21 -38
- package/dist/services/onboarding-status-service.d.ts.map +1 -1
- package/dist/services/outbox-service.d.ts +105 -29
- package/dist/services/outbox-service.d.ts.map +1 -1
- package/dist/services/owner-claim-service.d.ts +187 -0
- package/dist/services/owner-claim-service.d.ts.map +1 -0
- package/dist/services/owner-view-refresh-service.d.ts +40 -0
- package/dist/services/owner-view-refresh-service.d.ts.map +1 -0
- package/dist/services/owner-view-service.d.ts +49 -4
- package/dist/services/owner-view-service.d.ts.map +1 -1
- package/dist/services/peer-directory-service.d.ts +53 -17
- package/dist/services/peer-directory-service.d.ts.map +1 -1
- package/dist/services/release-manifest-verifier.d.ts +18 -20
- package/dist/services/release-manifest-verifier.d.ts.map +1 -1
- package/dist/services/revisioned-domain-service.d.ts +50 -17
- package/dist/services/revisioned-domain-service.d.ts.map +1 -1
- package/dist/services/runtime-globals.d.ts +39 -0
- package/dist/services/runtime-globals.d.ts.map +1 -0
- package/dist/services/session-service.d.ts +23 -3
- package/dist/services/session-service.d.ts.map +1 -1
- package/dist/services/sync/authoritative-mirror.d.ts +88 -15
- package/dist/services/sync/authoritative-mirror.d.ts.map +1 -1
- package/dist/services/sync/index.d.ts +17 -5
- package/dist/services/sync/index.d.ts.map +1 -1
- package/dist/services/sync/log-sync.d.ts +42 -8
- package/dist/services/sync/log-sync.d.ts.map +1 -1
- package/dist/services/sync/revision-merge.d.ts +80 -13
- package/dist/services/sync/revision-merge.d.ts.map +1 -1
- package/dist/services/sync/strategy.d.ts +11 -1
- package/dist/services/sync/strategy.d.ts.map +1 -1
- package/dist/services/transport-manager.d.ts +84 -29
- package/dist/services/transport-manager.d.ts.map +1 -1
- package/dist/services/wallet-mirror-service.d.ts +81 -18
- package/dist/services/wallet-mirror-service.d.ts.map +1 -1
- package/dist/services/wifi-provisioning-service.d.ts +146 -0
- package/dist/services/wifi-provisioning-service.d.ts.map +1 -0
- package/package.json +18 -12
- package/src/errors/index.js +126 -0
- package/src/events/index.js +124 -0
- package/src/index.js +566 -0
- package/src/models/agent.js +43 -0
- package/src/models/app-data.js +122 -0
- package/src/models/conversation.js +36 -0
- package/{dist → src}/models/delegation.js +18 -1
- package/src/models/device-boot-state.js +3 -0
- package/{dist → src}/models/device-identity.js +18 -2
- package/{dist → src}/models/graph.js +30 -3
- package/src/models/index.js +175 -0
- package/src/models/json.js +18 -0
- package/src/models/l402.js +9 -0
- package/src/models/live-query-definition.js +30 -0
- package/src/models/node-app-memory.js +130 -0
- package/src/models/outbox-intent.js +12 -0
- package/{dist → src}/models/outbox.js +102 -3
- package/src/models/owner-views.js +59 -0
- package/src/models/payment.js +24 -0
- package/src/models/query-diff.js +7 -0
- package/src/models/release-manifest.js +160 -0
- package/src/models/repository-write.js +10 -0
- package/src/models/revisioned-commands.js +92 -0
- package/src/models/revisioned.js +41 -0
- package/src/models/settings.js +16 -0
- package/src/models/sync.js +44 -0
- package/src/models/wallet.js +40 -0
- package/src/queries/certificate-trust.js +31 -0
- package/{dist → src}/queries/conversations.js +54 -3
- package/src/queries/discovery.js +34 -0
- package/{dist → src}/queries/notifications.js +25 -2
- package/src/queries/onboarding-flow.js +48 -0
- package/src/queries/onboarding-lcd-screen.js +100 -0
- package/src/queries/onboarding-status.js +34 -0
- package/src/queries/revisioned.js +128 -0
- package/{dist → src}/queries/wallet.js +35 -1
- package/src/services/abort-signal.js +69 -0
- package/src/services/certificate-trust-service.js +119 -0
- package/{dist → src}/services/conversation-service.js +108 -1
- package/src/services/conversation-sync.js +28 -0
- package/src/services/device-boot-state-service.js +45 -0
- package/src/services/device-cleanup-service.js +112 -0
- package/src/services/discovery-probe-service.js +196 -0
- package/{dist → src}/services/gossip-service.js +54 -4
- package/src/services/invite-redemption-service.js +64 -0
- package/src/services/lan-candidate-refresh-service.js +164 -0
- package/src/services/lcd-decision-service.js +93 -0
- package/src/services/onboarding-checkpoint-store.js +155 -0
- package/src/services/onboarding-flow-service.js +1096 -0
- package/src/services/onboarding-status-service.js +64 -0
- package/{dist → src}/services/outbox-service.js +132 -1
- package/src/services/owner-claim-service.js +347 -0
- package/src/services/owner-view-refresh-service.js +208 -0
- package/src/services/owner-view-service.js +87 -0
- package/{dist → src}/services/peer-directory-service.js +72 -3
- package/src/services/release-manifest-verifier.js +108 -0
- package/{dist → src}/services/revisioned-domain-service.js +189 -9
- package/src/services/runtime-globals.js +174 -0
- package/src/services/session-service.js +50 -0
- package/{dist → src}/services/sync/authoritative-mirror.js +90 -1
- package/src/services/sync/index.js +67 -0
- package/src/services/sync/log-sync.js +60 -0
- package/src/services/sync/revision-merge.js +119 -0
- package/src/services/sync/strategy.js +44 -0
- package/src/services/transport-manager.js +478 -0
- package/{dist → src}/services/wallet-mirror-service.js +226 -6
- package/src/services/wifi-provisioning-service.js +278 -0
- package/dist/errors/index.js +0 -45
- package/dist/errors/index.js.map +0 -1
- package/dist/events/index.js +0 -17
- package/dist/events/index.js.map +0 -1
- package/dist/index.js +0 -31
- package/dist/index.js.map +0 -1
- package/dist/models/agent.js +0 -17
- package/dist/models/agent.js.map +0 -1
- package/dist/models/conversation.js +0 -2
- package/dist/models/conversation.js.map +0 -1
- package/dist/models/delegation.js.map +0 -1
- package/dist/models/device-identity.js.map +0 -1
- package/dist/models/graph.js.map +0 -1
- package/dist/models/index.js +0 -8
- package/dist/models/index.js.map +0 -1
- package/dist/models/json.js +0 -2
- package/dist/models/json.js.map +0 -1
- package/dist/models/l402.js +0 -2
- package/dist/models/l402.js.map +0 -1
- package/dist/models/live-query-definition.js +0 -2
- package/dist/models/live-query-definition.js.map +0 -1
- package/dist/models/outbox-intent.js +0 -2
- package/dist/models/outbox-intent.js.map +0 -1
- package/dist/models/outbox.js.map +0 -1
- package/dist/models/owner-views.js +0 -7
- package/dist/models/owner-views.js.map +0 -1
- package/dist/models/payment.js +0 -3
- package/dist/models/payment.js.map +0 -1
- package/dist/models/query-diff.js +0 -2
- package/dist/models/query-diff.js.map +0 -1
- package/dist/models/release-manifest.js +0 -147
- package/dist/models/release-manifest.js.map +0 -1
- package/dist/models/repository-write.js +0 -2
- package/dist/models/repository-write.js.map +0 -1
- package/dist/models/revisioned-commands.js +0 -35
- package/dist/models/revisioned-commands.js.map +0 -1
- package/dist/models/revisioned.js +0 -2
- package/dist/models/revisioned.js.map +0 -1
- package/dist/models/settings.js +0 -2
- package/dist/models/settings.js.map +0 -1
- package/dist/models/sync.js +0 -2
- package/dist/models/sync.js.map +0 -1
- package/dist/models/wallet.js +0 -2
- package/dist/models/wallet.js.map +0 -1
- package/dist/queries/conversations.js.map +0 -1
- package/dist/queries/discovery.js +0 -27
- package/dist/queries/discovery.js.map +0 -1
- package/dist/queries/notifications.js.map +0 -1
- package/dist/queries/onboarding-status.js +0 -27
- package/dist/queries/onboarding-status.js.map +0 -1
- package/dist/queries/revisioned.js +0 -58
- package/dist/queries/revisioned.js.map +0 -1
- package/dist/queries/wallet.js.map +0 -1
- package/dist/services/conversation-service.js.map +0 -1
- package/dist/services/conversation-sync.js +0 -9
- package/dist/services/conversation-sync.js.map +0 -1
- package/dist/services/discovery-probe-service.js +0 -129
- package/dist/services/discovery-probe-service.js.map +0 -1
- package/dist/services/gossip-service.js.map +0 -1
- package/dist/services/lan-candidate-refresh-service.js +0 -79
- package/dist/services/lan-candidate-refresh-service.js.map +0 -1
- package/dist/services/onboarding-status-service.js +0 -32
- package/dist/services/onboarding-status-service.js.map +0 -1
- package/dist/services/outbox-service.js.map +0 -1
- package/dist/services/owner-view-service.js +0 -21
- package/dist/services/owner-view-service.js.map +0 -1
- package/dist/services/peer-directory-service.js.map +0 -1
- package/dist/services/release-manifest-verifier.js +0 -84
- package/dist/services/release-manifest-verifier.js.map +0 -1
- package/dist/services/revisioned-domain-service.js.map +0 -1
- package/dist/services/session-service.js +0 -20
- package/dist/services/session-service.js.map +0 -1
- package/dist/services/sync/authoritative-mirror.js.map +0 -1
- package/dist/services/sync/index.js +0 -4
- package/dist/services/sync/index.js.map +0 -1
- package/dist/services/sync/log-sync.js +0 -20
- package/dist/services/sync/log-sync.js.map +0 -1
- package/dist/services/sync/revision-merge.js +0 -46
- package/dist/services/sync/revision-merge.js.map +0 -1
- package/dist/services/sync/strategy.js +0 -2
- package/dist/services/sync/strategy.js.map +0 -1
- package/dist/services/transport-manager.js +0 -234
- package/dist/services/transport-manager.js.map +0 -1
- package/dist/services/wallet-mirror-service.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-checkpoint-store.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-checkpoint-store.js"],"names":[],"mappings":"AA8EA;;;GAGG;AACH,6DAFa,+BAA+B,CAe3C;AA9FD,0GAA0G;AAC1G;IASE;;OAEG;IACH,qBAFW,gCAAgC,EAK1C;IACD;;OAEG;IACH,SAFa,IAAI,CAIhB;IACD;;OAEG;IACH,QAFa,oBAAoB,GAAG,SAAS,CA4B5C;IACD;;;OAGG;IACH,kBAHW,oBAAoB,GAClB,IAAI,CAoBhB;;CACF;8CA5Ea,OAAO,gBAAgB,EAAE,+BAA+B;;;;;;;;;;;;;;;;;eA6IxD,MAAM;oBAEN,MAAM;YACN,MAAM;iBACN,MAAM;sBACN,MAAM;;;SAIN,MAAM,MAAM;aACZ,+BAA+B"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/** @type {readonly ["join-qr", "open-browser", "choose-network", "network-password", "handoff", "way-back", "install", "match-code", "invitation", "identity", "trusted"]} */
|
|
2
|
+
export const ONBOARDING_FLOW_STEP_IDS: readonly ["join-qr", "open-browser", "choose-network", "network-password", "handoff", "way-back", "install", "match-code", "invitation", "identity", "trusted"];
|
|
3
|
+
export class OnboardingFlowService {
|
|
4
|
+
/**
|
|
5
|
+
* @param {OnboardingFlowServiceOptions} options
|
|
6
|
+
*/
|
|
7
|
+
constructor(options: OnboardingFlowServiceOptions);
|
|
8
|
+
/**
|
|
9
|
+
* @returns {OnboardingFlowRow}
|
|
10
|
+
*/
|
|
11
|
+
view(): OnboardingFlowRow;
|
|
12
|
+
/**
|
|
13
|
+
* @returns {void}
|
|
14
|
+
*/
|
|
15
|
+
start(): void;
|
|
16
|
+
/**
|
|
17
|
+
* @returns {Promise<void>}
|
|
18
|
+
*/
|
|
19
|
+
advance(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* @param {"continue-in-browser" | "installed"} decision
|
|
22
|
+
* @returns {Promise<void>}
|
|
23
|
+
*/
|
|
24
|
+
installDecision(decision: "continue-in-browser" | "installed"): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* @returns {OnboardingFlowLcdScreen}
|
|
27
|
+
*/
|
|
28
|
+
lcdScreen(): OnboardingFlowLcdScreen;
|
|
29
|
+
/**
|
|
30
|
+
* @param {string} componentId
|
|
31
|
+
* @returns {Promise<void>}
|
|
32
|
+
*/
|
|
33
|
+
lcdTap(componentId: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* @returns {Promise<void>}
|
|
36
|
+
*/
|
|
37
|
+
rescanNetworks(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* @param {string} code
|
|
40
|
+
* @returns {Promise<void>}
|
|
41
|
+
*/
|
|
42
|
+
redeemInvitation(code: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} ssid
|
|
45
|
+
* @param {OnboardingFlowWifiSecurity} security
|
|
46
|
+
* @returns {Promise<void>}
|
|
47
|
+
*/
|
|
48
|
+
selectNetwork(ssid: string, security: OnboardingFlowWifiSecurity): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* @returns {Promise<void>}
|
|
51
|
+
*/
|
|
52
|
+
reselectNetwork(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* @returns {Promise<void>}
|
|
55
|
+
*/
|
|
56
|
+
skipInvitation(): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* @param {OwnerClaimIdentity} identity
|
|
59
|
+
* @returns {Promise<void>}
|
|
60
|
+
*/
|
|
61
|
+
submitIdentity(identity: OwnerClaimIdentity): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* @param {string} secret
|
|
64
|
+
* @returns {Promise<void>}
|
|
65
|
+
*/
|
|
66
|
+
submitNetworkPassword(secret: string): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* @returns {Promise<void>}
|
|
69
|
+
*/
|
|
70
|
+
retryApproval(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* @returns {void}
|
|
73
|
+
*/
|
|
74
|
+
cancel(): void;
|
|
75
|
+
/**
|
|
76
|
+
* @returns {void}
|
|
77
|
+
*/
|
|
78
|
+
tick(): void;
|
|
79
|
+
#private;
|
|
80
|
+
}
|
|
81
|
+
export type OnboardingAccessCodeStore = import("@econ-v1/ports").OnboardingAccessCodeStore;
|
|
82
|
+
export type OnboardingPresencePhase = import("@econ-v1/ports").OnboardingPresencePhase;
|
|
83
|
+
export type OnboardingPresencePort = import("@econ-v1/ports").OnboardingPresencePort;
|
|
84
|
+
export type InviteRedemptionService = import("./invite-redemption-service.js").InviteRedemptionService;
|
|
85
|
+
export type LcdDecisionService = import("./lcd-decision-service.js").LcdDecisionService;
|
|
86
|
+
export type OnboardingCheckpointStore = import("./onboarding-checkpoint-store.js").OnboardingCheckpointStore;
|
|
87
|
+
export type OwnerClaimIdentity = import("./owner-claim-service.js").OwnerClaimIdentity;
|
|
88
|
+
export type OwnerClaimService = import("./owner-claim-service.js").OwnerClaimService;
|
|
89
|
+
export type WifiProvisioningService = import("./wifi-provisioning-service.js").WifiProvisioningService;
|
|
90
|
+
export type OnboardingFlowStepId = (typeof ONBOARDING_FLOW_STEP_IDS)[number];
|
|
91
|
+
export type OnboardingFlowPhase = "connect" | "install" | "secure" | "identify" | "ready";
|
|
92
|
+
export type OnboardingFlowLcdScreenId = "onboard_qr" | "onboard_open_browser" | "onboard_home_qr" | "onboard_wifi_setup" | "onboard_wifi_joined" | "onboard_working" | "onboard_code" | "onboard_trusted" | "onboard_rejected";
|
|
93
|
+
export type OnboardingFlowWifiSecurity = "open" | "wep" | "wpa2" | "wpa3";
|
|
94
|
+
export type OnboardingFlowApprovalState = "waiting" | "approved" | "rejected" | "expired" | "cancelled";
|
|
95
|
+
/**
|
|
96
|
+
* Access-code rail (2026-08-10 design): `code-already-bound`/`access-code-invalid` are the
|
|
97
|
+
* node's outright refusal of this device's claim — the code is already bound to a different
|
|
98
|
+
* device, or the supplied/missing code did not match.
|
|
99
|
+
*/
|
|
100
|
+
export type OnboardingFlowReasonCode = "approval-expired" | "approval-rejected" | "wifi-credentials-rejected" | "wifi-scan-failed" | "wifi-unreachable" | "invitation-invalid" | "claim-failed" | "code-already-bound" | "access-code-invalid";
|
|
101
|
+
export type OnboardingFlowRow = OnboardingFlowRowBase & ({
|
|
102
|
+
readonly networks: readonly OnboardingFlowNetwork[];
|
|
103
|
+
readonly scanning: boolean;
|
|
104
|
+
readonly stepId: "choose-network";
|
|
105
|
+
} | {
|
|
106
|
+
readonly security: OnboardingFlowWifiSecurity;
|
|
107
|
+
readonly ssid: string;
|
|
108
|
+
readonly stepId: "network-password";
|
|
109
|
+
} | {
|
|
110
|
+
readonly approvalState: OnboardingFlowApprovalState;
|
|
111
|
+
readonly digits: readonly string[];
|
|
112
|
+
readonly remainingSeconds: number;
|
|
113
|
+
readonly stepId: "match-code";
|
|
114
|
+
} | {
|
|
115
|
+
readonly inviteRequired: boolean;
|
|
116
|
+
readonly stepId: "invitation";
|
|
117
|
+
} | {
|
|
118
|
+
readonly displayName: string;
|
|
119
|
+
readonly displayNameLocked: boolean;
|
|
120
|
+
readonly stepId: "identity";
|
|
121
|
+
readonly submitting: boolean;
|
|
122
|
+
} | {
|
|
123
|
+
readonly sessionEstablished: boolean;
|
|
124
|
+
readonly stepId: "trusted";
|
|
125
|
+
} | {
|
|
126
|
+
readonly ssid: string;
|
|
127
|
+
readonly stepId: "handoff";
|
|
128
|
+
} | {
|
|
129
|
+
readonly stepId: Exclude<OnboardingFlowStepId, "choose-network" | "handoff" | "identity" | "invitation" | "match-code" | "network-password" | "trusted">;
|
|
130
|
+
});
|
|
131
|
+
export type OnboardingFlowClaimPort = Pick<OwnerClaimService, "awaitConfirmation" | "cancel" | "completeClaim" | "prepareClaim">;
|
|
132
|
+
export type OnboardingFlowInvitePort = Pick<InviteRedemptionService, "redeem">;
|
|
133
|
+
export type OnboardingFlowWifiPort = Pick<WifiProvisioningService, "awaitHandoff" | "awaitReconnect" | "configure" | "scan" | "status">;
|
|
134
|
+
export type OnboardingFlowLcdPort = Pick<LcdDecisionService, "confirm" | "reject">;
|
|
135
|
+
export type OnboardingFlowNetwork = {
|
|
136
|
+
security: OnboardingFlowWifiSecurity;
|
|
137
|
+
signal: number;
|
|
138
|
+
ssid: string;
|
|
139
|
+
};
|
|
140
|
+
export type OnboardingFlowRowBase = {
|
|
141
|
+
lcdScreenId: OnboardingFlowLcdScreenId;
|
|
142
|
+
phase: OnboardingFlowPhase;
|
|
143
|
+
reasonCode?: OnboardingFlowReasonCode;
|
|
144
|
+
stepIndex: number;
|
|
145
|
+
totalSteps: number;
|
|
146
|
+
};
|
|
147
|
+
export type OnboardingFlowLcdScreen = {
|
|
148
|
+
awaitingNode: boolean;
|
|
149
|
+
physicalTapOnly: boolean;
|
|
150
|
+
screenId: OnboardingFlowLcdScreenId;
|
|
151
|
+
state: Readonly<Record<string, number | string>>;
|
|
152
|
+
};
|
|
153
|
+
export type OnboardingFlowServiceOptions = {
|
|
154
|
+
/**
|
|
155
|
+
* The onboarding access-code rail (2026-08-10 design): scanning the step-6 QR carries a short
|
|
156
|
+
* code that becomes this claim attempt's physical-presence proof, replacing the match-code
|
|
157
|
+
* screen entirely. A non-null `read()` at `start()` time LATCHES the flow into access-code
|
|
158
|
+
* mode for its whole lifetime — see `#accessCodeMode`'s own doc comment. Required, not
|
|
159
|
+
* optional: every composition must decide explicitly, even if that decision is "wire a store
|
|
160
|
+
* that never holds a code" (a headless or test composition).
|
|
161
|
+
*/
|
|
162
|
+
accessCodes: OnboardingAccessCodeStore;
|
|
163
|
+
checkpoints: Pick<OnboardingCheckpointStore, "clear" | "read" | "write">;
|
|
164
|
+
claim: OnboardingFlowClaimPort;
|
|
165
|
+
invitationRequired?: () => boolean;
|
|
166
|
+
invitationsEnabled: () => boolean;
|
|
167
|
+
invites: OnboardingFlowInvitePort;
|
|
168
|
+
lcd?: OnboardingFlowLcdPort;
|
|
169
|
+
now: () => string;
|
|
170
|
+
presence?: OnboardingPresencePort;
|
|
171
|
+
publish: (stepId: OnboardingFlowStepId) => void;
|
|
172
|
+
wifi: OnboardingFlowWifiPort;
|
|
173
|
+
};
|
|
174
|
+
export type OnboardingFlowStep = {
|
|
175
|
+
gate?: "invitations";
|
|
176
|
+
id: OnboardingFlowStepId;
|
|
177
|
+
lcdScreenId: OnboardingFlowLcdScreenId;
|
|
178
|
+
phase: OnboardingFlowPhase;
|
|
179
|
+
};
|
|
180
|
+
//# sourceMappingURL=onboarding-flow-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-flow-service.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-flow-service.js"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* scenario `new` (first-owner setup creates the owner).
|
|
13
|
-
* 3. The node is reachable and reports `claimed: true` (has an owner) → `needs-pairing`
|
|
14
|
-
* (additional-device pairing — the existing default behavior).
|
|
15
|
-
* 4. The node has not been reached at all (a `TransportError` from `node.invoke`, e.g. no
|
|
16
|
-
* route/candidate promoted yet) → `bootstrap-required` (drive discovery first).
|
|
17
|
-
* 5. Any other failure or an unrecognized response shape → `needs-pairing` (no regression
|
|
18
|
-
* from the pre-#1815 default — the shell still shows the pairing gate, which handles
|
|
19
|
-
* both "already paired" and "not yet paired" on its own).
|
|
20
|
-
*/
|
|
1
|
+
export class OnboardingStatusService {
|
|
2
|
+
/** @param {OnboardingStatusServiceOptions} options */
|
|
3
|
+
constructor(options: OnboardingStatusServiceOptions);
|
|
4
|
+
/** Synchronous read of the last flag the node reported. Injected into
|
|
5
|
+
* `OnboardingFlowService` as a getter so a value arriving after boot still takes effect. */
|
|
6
|
+
/** @returns {boolean} */
|
|
7
|
+
invitationsEnabled(): boolean;
|
|
8
|
+
/** @returns {Promise<OnboardingLifecycleStatusRow>} */
|
|
9
|
+
status(): Promise<OnboardingLifecycleStatusRow>;
|
|
10
|
+
#private;
|
|
11
|
+
}
|
|
21
12
|
export type OnboardingLifecycleState = "bootstrap-required" | "needs-onboarding" | "needs-pairing" | "ready";
|
|
22
|
-
export
|
|
13
|
+
export type OnboardingLifecycleStatusRow = {
|
|
23
14
|
readonly id: "onboarding-status";
|
|
24
|
-
|
|
25
|
-
* setup); a future scenario would be added here, not overloaded onto this field. */
|
|
15
|
+
readonly invitationsEnabled: boolean;
|
|
26
16
|
readonly scenario?: "new";
|
|
27
17
|
readonly state: OnboardingLifecycleState;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface OnboardingStatusWire {
|
|
18
|
+
};
|
|
19
|
+
export type OnboardingStatusWire = {
|
|
31
20
|
readonly claimed?: unknown;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
* (`DeviceSessionClient.currentSession() !== undefined` in the composition root). Kept as
|
|
36
|
-
* a plain predicate — rather than this service depending on `DeviceSessionClient` itself —
|
|
37
|
-
* so the service stays platform-free and trivially fakeable in tests. */
|
|
21
|
+
readonly invitations_enabled?: unknown;
|
|
22
|
+
};
|
|
23
|
+
export type OnboardingStatusServiceOptions = {
|
|
38
24
|
readonly hasActiveSession: () => boolean;
|
|
25
|
+
readonly locallyOnboarded?: () => Promise<boolean>;
|
|
39
26
|
readonly node: Pick<HomeNodeClient, "invoke">;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
#private;
|
|
43
|
-
constructor(options: OnboardingStatusServiceOptions);
|
|
44
|
-
status(): Promise<OnboardingLifecycleStatusRow>;
|
|
45
|
-
}
|
|
27
|
+
};
|
|
28
|
+
import type { HomeNodeClient } from "@econ-v1/ports";
|
|
46
29
|
//# sourceMappingURL=onboarding-status-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-status-service.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-status-service.
|
|
1
|
+
{"version":3,"file":"onboarding-status-service.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-status-service.js"],"names":[],"mappings":"AAOA;IAQI,sDAAsD;IACtD,qBADY,8BAA8B,EAKzC;IACD;gGAC4F;IAC5F,yBAAyB;IACzB,sBADc,OAAO,CAGpB;IACD,uDAAuD;IACvD,UADc,OAAO,CAAC,4BAA4B,CAAC,CAmClD;;CACJ;uCA7DgB,oBAAoB,GAAG,kBAAkB,GAAG,eAAe,GAAG,OAAO;2CACvE;IAAE,QAAQ,CAAC,EAAE,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;CAAE;mCAChJ;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAAE;6CACvE;IAAE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;CAAE;oCAJ3H,gBAAgB"}
|
|
@@ -1,47 +1,123 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
export interface OutboxServiceOptions {
|
|
10
|
-
readonly maxAttempts?: number;
|
|
11
|
-
readonly now?: () => string;
|
|
12
|
-
}
|
|
13
|
-
export interface ClaimOptions {
|
|
14
|
-
readonly leaseMs?: number;
|
|
15
|
-
readonly now?: string;
|
|
16
|
-
readonly revalidateAuthoritative?: () => Promise<boolean>;
|
|
17
|
-
}
|
|
18
|
-
export interface FailureOptions {
|
|
19
|
-
readonly now?: string;
|
|
20
|
-
readonly owner?: string;
|
|
21
|
-
readonly retryable: boolean;
|
|
22
|
-
}
|
|
23
|
-
export declare class OutboxIdempotencyConflictError extends Error {
|
|
24
|
-
readonly idempotencyKey: string;
|
|
1
|
+
/**
|
|
2
|
+
* @extends {Error}
|
|
3
|
+
*/
|
|
4
|
+
export class OutboxIdempotencyConflictError extends Error {
|
|
5
|
+
/**
|
|
6
|
+
* @param {string} idempotencyKey
|
|
7
|
+
*/
|
|
25
8
|
constructor(idempotencyKey: string);
|
|
9
|
+
/**
|
|
10
|
+
* @readonly
|
|
11
|
+
* @type {string}
|
|
12
|
+
*/
|
|
13
|
+
readonly idempotencyKey: string;
|
|
26
14
|
}
|
|
27
|
-
|
|
15
|
+
/**
|
|
16
|
+
* @extends {Error}
|
|
17
|
+
*/
|
|
18
|
+
export class OutboxTransitionError extends Error {
|
|
19
|
+
/**
|
|
20
|
+
* @param {string} message
|
|
21
|
+
*/
|
|
28
22
|
constructor(message: string);
|
|
29
23
|
}
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
/**
|
|
25
|
+
* @extends {OutboxTransitionError}
|
|
26
|
+
*/
|
|
27
|
+
export class OutboxRevalidationRequiredError extends OutboxTransitionError {
|
|
32
28
|
}
|
|
33
|
-
export
|
|
34
|
-
|
|
29
|
+
export class OutboxService {
|
|
30
|
+
/**
|
|
31
|
+
* @param {OutboxPersistence} persistence
|
|
32
|
+
* @param {OutboxServiceOptions} [options]
|
|
33
|
+
*/
|
|
35
34
|
constructor(persistence: OutboxPersistence, options?: OutboxServiceOptions);
|
|
35
|
+
/**
|
|
36
|
+
* @param {OutboxIntentInput} input
|
|
37
|
+
* @returns {Promise<OutboxEntry>}
|
|
38
|
+
*/
|
|
36
39
|
enqueue(input: OutboxIntentInput): Promise<OutboxEntry>;
|
|
40
|
+
/**
|
|
41
|
+
* @param {string} domain
|
|
42
|
+
* @param {string} owner
|
|
43
|
+
* @param {ClaimOptions} [options]
|
|
44
|
+
* @returns {Promise<OutboxEntry | undefined>}
|
|
45
|
+
*/
|
|
37
46
|
claimNext(domain: string, owner: string, options?: ClaimOptions): Promise<OutboxEntry | undefined>;
|
|
47
|
+
/**
|
|
48
|
+
* @param {string} id
|
|
49
|
+
* @param {string} owner
|
|
50
|
+
* @returns {Promise<OutboxEntry>}
|
|
51
|
+
*/
|
|
38
52
|
acknowledge(id: string, owner: string, now?: string): Promise<OutboxEntry>;
|
|
53
|
+
/**
|
|
54
|
+
* @param {string} id
|
|
55
|
+
* @param {string} reason
|
|
56
|
+
* @param {FailureOptions} options
|
|
57
|
+
* @returns {Promise<OutboxEntry>}
|
|
58
|
+
*/
|
|
39
59
|
fail(id: string, reason: string, options: FailureOptions): Promise<OutboxEntry>;
|
|
60
|
+
/**
|
|
61
|
+
* @param {string} id
|
|
62
|
+
* @param {string} reason
|
|
63
|
+
* @param {string} [owner]
|
|
64
|
+
* @returns {Promise<OutboxEntry>}
|
|
65
|
+
*/
|
|
40
66
|
conflict(id: string, reason: string, owner?: string, now?: string): Promise<OutboxEntry>;
|
|
67
|
+
/**
|
|
68
|
+
* @param {string} id
|
|
69
|
+
* @returns {Promise<boolean>}
|
|
70
|
+
*/
|
|
41
71
|
cancel(id: string): Promise<boolean>;
|
|
72
|
+
/**
|
|
73
|
+
* @param {string} [domain]
|
|
74
|
+
* @returns {Promise<number>}
|
|
75
|
+
*/
|
|
42
76
|
recoverExpiredLeases(now?: string, domain?: string): Promise<number>;
|
|
77
|
+
/**
|
|
78
|
+
* @private
|
|
79
|
+
* @param {string} id
|
|
80
|
+
* @returns {Promise<OutboxEntry>}
|
|
81
|
+
*/
|
|
43
82
|
private requireEntry;
|
|
83
|
+
/**
|
|
84
|
+
* @private
|
|
85
|
+
* @param {OutboxEntry} entry
|
|
86
|
+
* @param {string} owner
|
|
87
|
+
* @returns {void}
|
|
88
|
+
*/
|
|
44
89
|
private assertInflightOwner;
|
|
90
|
+
/**
|
|
91
|
+
* @private
|
|
92
|
+
* @param {OutboxEntry} current
|
|
93
|
+
* @param {Omit<Partial<OutboxEntry>, "lease"> & { readonly lease?: OutboxEntry["lease"]; readonly state: OutboxState; }} changes
|
|
94
|
+
* @returns {Promise<OutboxEntry>}
|
|
95
|
+
*/
|
|
45
96
|
private save;
|
|
97
|
+
#private;
|
|
46
98
|
}
|
|
99
|
+
export type OutboxEntry = import("../models/outbox.js").OutboxEntry;
|
|
100
|
+
export type OutboxIntentInput = import("../models/outbox.js").OutboxIntentInput;
|
|
101
|
+
export type OutboxState = import("../models/outbox.js").OutboxState;
|
|
102
|
+
export type OutboxPersistence = {
|
|
103
|
+
create(entry: OutboxEntry): Promise<void>;
|
|
104
|
+
delete(id: string): Promise<void>;
|
|
105
|
+
list(domain?: string): Promise<readonly OutboxEntry[]>;
|
|
106
|
+
read(id: string): Promise<OutboxEntry | undefined>;
|
|
107
|
+
update(entry: OutboxEntry): Promise<void>;
|
|
108
|
+
};
|
|
109
|
+
export type OutboxServiceOptions = {
|
|
110
|
+
readonly maxAttempts?: number;
|
|
111
|
+
readonly now?: () => string;
|
|
112
|
+
};
|
|
113
|
+
export type ClaimOptions = {
|
|
114
|
+
readonly leaseMs?: number;
|
|
115
|
+
readonly now?: string;
|
|
116
|
+
readonly revalidateAuthoritative?: () => Promise<boolean>;
|
|
117
|
+
};
|
|
118
|
+
export type FailureOptions = {
|
|
119
|
+
readonly now?: string;
|
|
120
|
+
readonly owner?: string;
|
|
121
|
+
readonly retryable: boolean;
|
|
122
|
+
};
|
|
47
123
|
//# sourceMappingURL=outbox-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox-service.d.ts","sourceRoot":"","sources":["../../src/services/outbox-service.
|
|
1
|
+
{"version":3,"file":"outbox-service.d.ts","sourceRoot":"","sources":["../../src/services/outbox-service.js"],"names":[],"mappings":"AAwBA;;GAEG;AACH;IAMI;;KAEC;IACD,4BAFS,MAAM,EAMd;IAZD;;;KAGC;IACD,yBAFQ,MAAM,CAEC;CASlB;AACD;;GAEG;AACH;IACI;;KAEC;IACD,qBAFS,MAAM,EAKd;CACJ;AACD;;GAEG;AACH;CAQC;AACD;IAgBI;;;KAGC;IACD,yBAHS,iBAAiB,YACjB,oBAAoB,EAS5B;IACD;;;KAGC;IACD,eAHS,iBAAiB,GACf,OAAO,CAAC,WAAW,CAAC,CAY9B;IACD;;;;;KAKC;IACD,kBALS,MAAM,SACN,MAAM,YACN,YAAY,GACV,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA8B1C;IACD;;;;KAIC;IACD,gBAJS,MAAM,SACN,MAAM,iBACJ,OAAO,CAAC,WAAW,CAAC,CAM9B;IACD;;;;;KAKC;IACD,SALS,MAAM,UACN,MAAM,WACN,cAAc,GACZ,OAAO,CAAC,WAAW,CAAC,CAa9B;IACD;;;;;KAKC;IACD,aALS,MAAM,UACN,MAAM,UACN,MAAM,iBACJ,OAAO,CAAC,WAAW,CAAC,CAU9B;IACD;;;KAGC;IACD,WAHS,MAAM,GACJ,OAAO,CAAC,OAAO,CAAC,CAU1B;IACD;;;KAGC;IACD,4CAHS,MAAM,GACJ,OAAO,CAAC,MAAM,CAAC,CAWzB;IACD;;;;KAIC;IACD,qBAKC;IACD;;;;;KAKC;IACD,4BAIC;IACD;;;;;KAKC;IACD,aAIC;;CACJ;0BApPY,OAAO,qBAAqB,EAAE,WAAW;gCAGzC,OAAO,qBAAqB,EAAE,iBAAiB;0BAG/C,OAAO,qBAAqB,EAAE,WAAW;gCAGzC;IAAE,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAAC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAAE;mCAGxO;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAAE;2BAG/D;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAAE;6BAGhH;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAAE"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
export class OwnerClaimService {
|
|
2
|
+
/**
|
|
3
|
+
* @param {OwnerClaimServiceOptions} options
|
|
4
|
+
*/
|
|
5
|
+
constructor(options: OwnerClaimServiceOptions);
|
|
6
|
+
/**
|
|
7
|
+
* Generates this attempt's ephemeral key and asks the node to start its
|
|
8
|
+
* physical-confirmation gate for it. Safe to call again after a failed `completeClaim()` or
|
|
9
|
+
* an expired code — each call replaces whatever claim was previously pending, which is
|
|
10
|
+
* exactly what step 10's "Request a new code" needs.
|
|
11
|
+
*
|
|
12
|
+
* `accessCode`, when supplied, is sent as `access_code` — the shared secret that lets the
|
|
13
|
+
* node bind and auto-confirm this operation without a physical LCD tap. It is omitted from
|
|
14
|
+
* the payload entirely (never sent as `undefined`/`null`) when not supplied, and it is never
|
|
15
|
+
* logged.
|
|
16
|
+
* @param {string} [accessCode]
|
|
17
|
+
* @returns {Promise<OwnerClaimPrepareOutcome>}
|
|
18
|
+
*/
|
|
19
|
+
prepareClaim(accessCode?: string): Promise<OwnerClaimPrepareOutcome>;
|
|
20
|
+
/**
|
|
21
|
+
* Waits for the node's physical confirmation. This is the ONLY thing that can put the
|
|
22
|
+
* pending claim into a completable state — no browser click, no timer, no LCD-pane tap
|
|
23
|
+
* substitutes for the node reporting `confirmed`.
|
|
24
|
+
*
|
|
25
|
+
* The poll cadence comes from the injected `DelayPort`, so this contains no timer of its
|
|
26
|
+
* own and stays testable with a zero-wait fake.
|
|
27
|
+
* @param {string} operationHash
|
|
28
|
+
* @returns {Promise<OwnerClaimConfirmation>}
|
|
29
|
+
*/
|
|
30
|
+
awaitConfirmation(operationHash: string): Promise<OwnerClaimConfirmation>;
|
|
31
|
+
/**
|
|
32
|
+
* Runs the legacy challenge -> sign -> `complete-onboarding` sequence to actually create the
|
|
33
|
+
* owner + DID, using the identity supplied HERE rather than one captured at prepare time.
|
|
34
|
+
* Resolves `"claimed"` only when the node's own completion call reported success.
|
|
35
|
+
*
|
|
36
|
+
* RETRY-SAFE BY DESIGN: neither `#pending` nor the ephemeral key is touched until the node's
|
|
37
|
+
* completion call is known to have SUCCEEDED. A thrown challenge/complete call, or an explicit
|
|
38
|
+
* `success: false`, leaves `#pending` (and the key) exactly as they were, so the caller can
|
|
39
|
+
* invoke `completeClaim()` again on this same instance — reaching the node a second time
|
|
40
|
+
* without a new `prepareClaim()` — for as long as the underlying failure might be transient
|
|
41
|
+
* (a dropped connection, a momentarily-busy node). Clearing state on failure, or in a
|
|
42
|
+
* `finally`, would turn every transient hiccup into a forced restart of the whole claim.
|
|
43
|
+
* @param {OwnerClaimIdentity} identity
|
|
44
|
+
* @returns {Promise<OwnerClaimOutcome>}
|
|
45
|
+
*/
|
|
46
|
+
completeClaim(identity: OwnerClaimIdentity): Promise<OwnerClaimOutcome>;
|
|
47
|
+
/** Drops any pending claim without contacting the node — used when the person abandons or
|
|
48
|
+
* restarts the flow before `completeClaim()` runs.
|
|
49
|
+
* @returns {void}
|
|
50
|
+
*/
|
|
51
|
+
cancel(): void;
|
|
52
|
+
#private;
|
|
53
|
+
}
|
|
54
|
+
export type DelayPort = import("@econ-v1/ports").DelayPort;
|
|
55
|
+
export type HomeNodeClient = import("@econ-v1/ports").HomeNodeClient;
|
|
56
|
+
export type OwnerClaimCryptoPort = import("@econ-v1/ports").OwnerClaimCryptoPort;
|
|
57
|
+
export type OwnerClaimSessionPort = import("@econ-v1/ports").OwnerClaimSessionPort;
|
|
58
|
+
export type OwnerClaimSessionTokens = import("@econ-v1/ports").OwnerClaimSessionTokens;
|
|
59
|
+
export type OwnerClaimConfirmation = "confirmed" | "rejected" | "timed-out";
|
|
60
|
+
/**
|
|
61
|
+
* `claimed-unpaired` is a SUCCESS, not a failure: the owner + DID now exist on the node. It
|
|
62
|
+
* says only that this browser did not end up holding a device session, so the shell must run
|
|
63
|
+
* its ordinary pairing flow. Collapsing it into `rejected` would tell a person their setup
|
|
64
|
+
* failed after it had already, irreversibly, succeeded.
|
|
65
|
+
*/
|
|
66
|
+
export type OwnerClaimOutcome = "claimed" | "claimed-unpaired" | "not-prepared" | "rejected" | "timed-out";
|
|
67
|
+
/**
|
|
68
|
+
* First-owner onboarding — "claim this unclaimed node" (#1815 DID-blocker fix).
|
|
69
|
+
*
|
|
70
|
+
* The PWA's onboarding-gate walks a person through identity + physical-confirmation
|
|
71
|
+
* screens, but until this service existed nothing behind them ever created an owner or
|
|
72
|
+
* a DID on the backend (`.superpowers/sdd/did-blocker-report.md`): `core.did.onboard` —
|
|
73
|
+
* the only code path that writes `did_documents` — is called exclusively from
|
|
74
|
+
* `AuthApplicationService::complete()`, which backs the legacy, JWT-shaped
|
|
75
|
+
* `POST /api/auth/complete-onboarding` (`system/ui`-only until now).
|
|
76
|
+
*
|
|
77
|
+
* This service drives that SAME legacy contract from the PWA, reusing the existing,
|
|
78
|
+
* already-reviewed backend surface rather than inventing a parallel owner-creation
|
|
79
|
+
* path (see the blocker report §5): an ephemeral secp256k1 keypair
|
|
80
|
+
* (`OwnerClaimCryptoPort` — deliberately distinct from the Ed25519 `IdentityPort` used
|
|
81
|
+
* for client-device pairing afterwards), `POST /api/v2/node/onboarding-prepare` to
|
|
82
|
+
* start the node's physical-confirmation gate, a poll of
|
|
83
|
+
* `GET /api/v2/node/operation-status/{hash}` for that confirmation, then
|
|
84
|
+
* `POST /api/auth/{onboarding-challenge,complete-onboarding}` to actually create the
|
|
85
|
+
* owner + DID.
|
|
86
|
+
*
|
|
87
|
+
* The claim now also carries the browser's OWN pairing identity: `completeClaim()` asks the
|
|
88
|
+
* session port for an optional signed `genesis_device` descriptor and forwards it verbatim to
|
|
89
|
+
* `complete-onboarding`, so the node's genesis DID device IS this browser (not a synthetic
|
|
90
|
+
* placeholder) and the client-device pairing that follows reconciles onto that same row instead
|
|
91
|
+
* of minting a duplicate. Building or forwarding it can never turn a successful claim into a
|
|
92
|
+
* rejected one — see the inner try/catch around it below.
|
|
93
|
+
*
|
|
94
|
+
* SECURITY: this service never decides whether the claim is authorized — the node
|
|
95
|
+
* does. `completeClaim()` only ever *attempts* the completion call; the host's
|
|
96
|
+
* `validate_physical_confirmation` gate (`core/domain/src/services/
|
|
97
|
+
* auth_application_service.rs`) is the sole authority on whether a real physical
|
|
98
|
+
* confirmation happened, and refuses the request otherwise
|
|
99
|
+
* (`enforce_physical_presence`, `core/adapters-network/src/http/server/
|
|
100
|
+
* device_management/proxy.rs`, refuses browser/remote confirmation of an "onboard"
|
|
101
|
+
* operation outright when the node has a screen — only a physical LCD tap counts).
|
|
102
|
+
* A caller of this service who never gets the node's screen tapped simply never
|
|
103
|
+
* reaches "claimed": `awaitConfirmation()` resolves `"rejected"`/`"timed-out"` and
|
|
104
|
+
* `completeClaim()` then refuses, rather than reporting success.
|
|
105
|
+
*
|
|
106
|
+
* Once a client's `prepareClaim()` succeeds, the service holds exactly one pending claim —
|
|
107
|
+
* matching the legacy flow's "ONE device keypair for the whole onboarding attempt"
|
|
108
|
+
* invariant (the node's confirmation is bound to the specific public key sent to
|
|
109
|
+
* `onboarding-prepare`, and the app-did miniapp allows only one pending "onboard"
|
|
110
|
+
* operation node-wide).
|
|
111
|
+
*
|
|
112
|
+
* SEQUENCING (design §6.1) — `prepare(identity)`/`complete()` were split into
|
|
113
|
+
* `prepareClaim()` / `awaitConfirmation()` / `completeClaim(identity)` because the flow puts
|
|
114
|
+
* the match code at step 10 and identity at step 12, deliberately: nothing is written until
|
|
115
|
+
* physical access has been proven. That split is possible with NO backend change because
|
|
116
|
+
* `onboarding-prepare`'s payload is only `{ public_key_multibase }` — the identity that used
|
|
117
|
+
* to be handed to `prepare()` was stashed purely client-side and read back at completion.
|
|
118
|
+
*
|
|
119
|
+
* The security property is preserved and strengthened: `completeClaim()` refuses outright
|
|
120
|
+
* (without contacting the node) unless `awaitConfirmation()` has already observed the node's
|
|
121
|
+
* own `confirmed` for THIS claim's operation hash, so no owner record can exist until physical
|
|
122
|
+
* confirmation AND identity submission have both happened, in that order. The node's
|
|
123
|
+
* `validate_physical_confirmation` gate remains the sole authority; this client-side guard
|
|
124
|
+
* only stops a pointless, misleading round trip.
|
|
125
|
+
*/
|
|
126
|
+
export type OwnerClaimIdentity = {
|
|
127
|
+
displayName: string;
|
|
128
|
+
username: string;
|
|
129
|
+
};
|
|
130
|
+
export type OwnerClaimPrepareOutcome = {
|
|
131
|
+
/**
|
|
132
|
+
* `true` when the node already bound and auto-confirmed this operation server-side (an
|
|
133
|
+
* access code was supplied and matched) — `awaitConfirmation()` is unnecessary and
|
|
134
|
+
* `completeClaim()` proceeds straight to the challenge/complete sequence, with no LCD
|
|
135
|
+
* match-code step in between.
|
|
136
|
+
*/
|
|
137
|
+
confirmed: boolean;
|
|
138
|
+
lcdHardware: boolean;
|
|
139
|
+
matchCode: string;
|
|
140
|
+
/**
|
|
141
|
+
* The handle `awaitConfirmation()` polls and `completeClaim()` echoes back as
|
|
142
|
+
* `onboarding_confirmation`. Absent when the node's confirmation gate is disabled.
|
|
143
|
+
*/
|
|
144
|
+
operationHash: string | undefined;
|
|
145
|
+
requiresConfirmation: boolean;
|
|
146
|
+
};
|
|
147
|
+
export type OwnerClaimServiceOptions = {
|
|
148
|
+
/**
|
|
149
|
+
* The ephemeral secp256k1 identity for this onboarding attempt (see `OwnerClaimCryptoPort`'s
|
|
150
|
+
* doc comment). Named `keys`, not `crypto`, so this stays a plain interface field rather
|
|
151
|
+
* than reading as a reference to the browser's `crypto` global.
|
|
152
|
+
*/
|
|
153
|
+
keys: OwnerClaimCryptoPort;
|
|
154
|
+
delay: Pick<DelayPort, "wait">;
|
|
155
|
+
node: Pick<HomeNodeClient, "invoke">;
|
|
156
|
+
/**
|
|
157
|
+
* Turns the completion response's tokens into a real device session. Required, not optional:
|
|
158
|
+
* defaulting it would make a wiring mistake look like a node that simply issued no tokens.
|
|
159
|
+
*/
|
|
160
|
+
session: OwnerClaimSessionPort;
|
|
161
|
+
};
|
|
162
|
+
export type OnboardingPrepareWire = {
|
|
163
|
+
/**
|
|
164
|
+
* Present (and `true`) only when the node auto-confirmed this operation from a supplied
|
|
165
|
+
* access code; omitted entirely otherwise — never sent as an explicit `false`.
|
|
166
|
+
*/
|
|
167
|
+
confirmed?: boolean;
|
|
168
|
+
lcd_hardware?: boolean;
|
|
169
|
+
operation_hash?: string;
|
|
170
|
+
match_code?: string;
|
|
171
|
+
requires_lcd: boolean;
|
|
172
|
+
};
|
|
173
|
+
export type OperationStatusWire = {
|
|
174
|
+
confirmed: boolean;
|
|
175
|
+
status?: string;
|
|
176
|
+
};
|
|
177
|
+
export type OnboardingChallengeWire = {
|
|
178
|
+
challenge: string;
|
|
179
|
+
challenge_id: string;
|
|
180
|
+
};
|
|
181
|
+
export type OnboardingCompleteWire = {
|
|
182
|
+
refresh_token?: unknown;
|
|
183
|
+
success: boolean;
|
|
184
|
+
token?: unknown;
|
|
185
|
+
token_expires_at?: unknown;
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=owner-claim-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-claim-service.d.ts","sourceRoot":"","sources":["../../src/services/owner-claim-service.js"],"names":[],"mappings":"AAQA;IAmBE;;OAEG;IACH,qBAFW,wBAAwB,EAOlC;IACD;;;;;;;;;;;;OAYG;IACH,0BAHW,MAAM,GACJ,OAAO,CAAC,wBAAwB,CAAC,CAyB7C;IACD;;;;;;;;;OASG;IACH,iCAHW,MAAM,GACJ,OAAO,CAAC,sBAAsB,CAAC,CAsB3C;IACD;;;;;;;;;;;;;;OAcG;IACH,wBAHW,kBAAkB,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAsEtC;IACD;;;OAGG;IACH,UAFa,IAAI,CAKhB;;CACF;wBAnMa,OAAO,gBAAgB,EAAE,SAAS;6BAClC,OAAO,gBAAgB,EAAE,cAAc;mCACvC,OAAO,gBAAgB,EAAE,oBAAoB;oCAC7C,OAAO,gBAAgB,EAAE,qBAAqB;sCAC9C,OAAO,gBAAgB,EAAE,uBAAuB;qCA2NhD,WAAW,GAAG,UAAU,GAAG,WAAW;;;;;;;gCAMrC,SAAS,GACjB,kBAAkB,GAClB,cAAc,GACd,UAAU,GACV,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6DJ,MAAM;cACN,MAAM;;;;;;;;;eAIN,OAAO;iBAIP,OAAO;eACP,MAAM;;;;;mBACN,MAAM,GAAG,SAAS;0BAElB,OAAO;;;;;;;;UAIP,oBAAoB;WAGpB,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;UACvB,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;;;;;aAC9B,qBAAqB;;;;;;;gBAKrB,OAAO;mBAEP,OAAO;qBACP,MAAM;iBACN,MAAM;kBACN,OAAO;;;eAIP,OAAO;aACP,MAAM;;;eAIN,MAAM;kBACN,MAAM;;;oBAIN,OAAO;aACP,OAAO;YACP,OAAO;uBACP,OAAO"}
|