@econ-v1/domain 6.7.0 → 6.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/dist/errors/index.d.ts +96 -25
  2. package/dist/errors/index.d.ts.map +1 -1
  3. package/dist/events/index.d.ts +127 -20
  4. package/dist/events/index.d.ts.map +1 -1
  5. package/dist/index.d.ts +250 -47
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/models/agent.d.ts +25 -4
  8. package/dist/models/agent.d.ts.map +1 -1
  9. package/dist/models/app-data.d.ts +84 -0
  10. package/dist/models/app-data.d.ts.map +1 -0
  11. package/dist/models/conversation.d.ts +12 -2
  12. package/dist/models/conversation.d.ts.map +1 -1
  13. package/dist/models/delegation.d.ts +12 -3
  14. package/dist/models/delegation.d.ts.map +1 -1
  15. package/dist/models/device-boot-state.d.ts +12 -0
  16. package/dist/models/device-boot-state.d.ts.map +1 -0
  17. package/dist/models/device-identity.d.ts +11 -3
  18. package/dist/models/device-identity.d.ts.map +1 -1
  19. package/dist/models/graph.d.ts +26 -3
  20. package/dist/models/graph.d.ts.map +1 -1
  21. package/dist/models/index.d.ts +82 -14
  22. package/dist/models/index.d.ts.map +1 -1
  23. package/dist/models/json.d.ts +5 -5
  24. package/dist/models/json.d.ts.map +1 -1
  25. package/dist/models/l402.d.ts +4 -5
  26. package/dist/models/l402.d.ts.map +1 -1
  27. package/dist/models/live-query-definition.d.ts +15 -16
  28. package/dist/models/live-query-definition.d.ts.map +1 -1
  29. package/dist/models/node-app-memory.d.ts +107 -0
  30. package/dist/models/node-app-memory.d.ts.map +1 -0
  31. package/dist/models/outbox-intent.d.ts +3 -3
  32. package/dist/models/outbox-intent.d.ts.map +1 -1
  33. package/dist/models/outbox.d.ts +67 -15
  34. package/dist/models/outbox.d.ts.map +1 -1
  35. package/dist/models/owner-views.d.ts +28 -28
  36. package/dist/models/owner-views.d.ts.map +1 -1
  37. package/dist/models/payment.d.ts +28 -9
  38. package/dist/models/payment.d.ts.map +1 -1
  39. package/dist/models/query-diff.d.ts +2 -2
  40. package/dist/models/query-diff.d.ts.map +1 -1
  41. package/dist/models/release-manifest.d.ts +32 -47
  42. package/dist/models/release-manifest.d.ts.map +1 -1
  43. package/dist/models/repository-write.d.ts +3 -3
  44. package/dist/models/repository-write.d.ts.map +1 -1
  45. package/dist/models/revisioned-commands.d.ts +66 -13
  46. package/dist/models/revisioned-commands.d.ts.map +1 -1
  47. package/dist/models/revisioned.d.ts +50 -10
  48. package/dist/models/revisioned.d.ts.map +1 -1
  49. package/dist/models/settings.d.ts +2 -2
  50. package/dist/models/settings.d.ts.map +1 -1
  51. package/dist/models/sync.d.ts +18 -18
  52. package/dist/models/sync.d.ts.map +1 -1
  53. package/dist/models/wallet.d.ts +16 -16
  54. package/dist/models/wallet.d.ts.map +1 -1
  55. package/dist/queries/certificate-trust.d.ts +13 -0
  56. package/dist/queries/certificate-trust.d.ts.map +1 -0
  57. package/dist/queries/conversations.d.ts +38 -7
  58. package/dist/queries/conversations.d.ts.map +1 -1
  59. package/dist/queries/discovery.d.ts +10 -10
  60. package/dist/queries/discovery.d.ts.map +1 -1
  61. package/dist/queries/notifications.d.ts +24 -4
  62. package/dist/queries/notifications.d.ts.map +1 -1
  63. package/dist/queries/onboarding-flow.d.ts +25 -0
  64. package/dist/queries/onboarding-flow.d.ts.map +1 -0
  65. package/dist/queries/onboarding-lcd-screen.d.ts +56 -0
  66. package/dist/queries/onboarding-lcd-screen.d.ts.map +1 -0
  67. package/dist/queries/onboarding-status.d.ts +10 -10
  68. package/dist/queries/onboarding-status.d.ts.map +1 -1
  69. package/dist/queries/revisioned.d.ts +47 -13
  70. package/dist/queries/revisioned.d.ts.map +1 -1
  71. package/dist/queries/wallet.d.ts +40 -10
  72. package/dist/queries/wallet.d.ts.map +1 -1
  73. package/dist/services/abort-signal.d.ts +54 -0
  74. package/dist/services/abort-signal.d.ts.map +1 -0
  75. package/dist/services/certificate-trust-service.d.ts +42 -0
  76. package/dist/services/certificate-trust-service.d.ts.map +1 -0
  77. package/dist/services/conversation-service.d.ts +103 -15
  78. package/dist/services/conversation-service.d.ts.map +1 -1
  79. package/dist/services/conversation-sync.d.ts +9 -5
  80. package/dist/services/conversation-sync.d.ts.map +1 -1
  81. package/dist/services/device-boot-state-service.d.ts +17 -0
  82. package/dist/services/device-boot-state-service.d.ts.map +1 -0
  83. package/dist/services/device-cleanup-service.d.ts +47 -0
  84. package/dist/services/device-cleanup-service.d.ts.map +1 -0
  85. package/dist/services/discovery-probe-service.d.ts +37 -46
  86. package/dist/services/discovery-probe-service.d.ts.map +1 -1
  87. package/dist/services/gossip-service.d.ts +28 -13
  88. package/dist/services/gossip-service.d.ts.map +1 -1
  89. package/dist/services/invite-redemption-service.d.ts +43 -0
  90. package/dist/services/invite-redemption-service.d.ts.map +1 -0
  91. package/dist/services/lan-candidate-refresh-service.d.ts +22 -7
  92. package/dist/services/lan-candidate-refresh-service.d.ts.map +1 -1
  93. package/dist/services/lcd-decision-service.d.ts +58 -0
  94. package/dist/services/lcd-decision-service.d.ts.map +1 -0
  95. package/dist/services/onboarding-checkpoint-store.d.ts +54 -0
  96. package/dist/services/onboarding-checkpoint-store.d.ts.map +1 -0
  97. package/dist/services/onboarding-flow-service.d.ts +180 -0
  98. package/dist/services/onboarding-flow-service.d.ts.map +1 -0
  99. package/dist/services/onboarding-status-service.d.ts +21 -38
  100. package/dist/services/onboarding-status-service.d.ts.map +1 -1
  101. package/dist/services/outbox-service.d.ts +105 -29
  102. package/dist/services/outbox-service.d.ts.map +1 -1
  103. package/dist/services/owner-claim-service.d.ts +187 -0
  104. package/dist/services/owner-claim-service.d.ts.map +1 -0
  105. package/dist/services/owner-view-refresh-service.d.ts +40 -0
  106. package/dist/services/owner-view-refresh-service.d.ts.map +1 -0
  107. package/dist/services/owner-view-service.d.ts +49 -4
  108. package/dist/services/owner-view-service.d.ts.map +1 -1
  109. package/dist/services/peer-directory-service.d.ts +53 -17
  110. package/dist/services/peer-directory-service.d.ts.map +1 -1
  111. package/dist/services/release-manifest-verifier.d.ts +18 -20
  112. package/dist/services/release-manifest-verifier.d.ts.map +1 -1
  113. package/dist/services/revisioned-domain-service.d.ts +50 -17
  114. package/dist/services/revisioned-domain-service.d.ts.map +1 -1
  115. package/dist/services/runtime-globals.d.ts +39 -0
  116. package/dist/services/runtime-globals.d.ts.map +1 -0
  117. package/dist/services/session-service.d.ts +23 -3
  118. package/dist/services/session-service.d.ts.map +1 -1
  119. package/dist/services/sync/authoritative-mirror.d.ts +88 -15
  120. package/dist/services/sync/authoritative-mirror.d.ts.map +1 -1
  121. package/dist/services/sync/index.d.ts +17 -5
  122. package/dist/services/sync/index.d.ts.map +1 -1
  123. package/dist/services/sync/log-sync.d.ts +42 -8
  124. package/dist/services/sync/log-sync.d.ts.map +1 -1
  125. package/dist/services/sync/revision-merge.d.ts +80 -13
  126. package/dist/services/sync/revision-merge.d.ts.map +1 -1
  127. package/dist/services/sync/strategy.d.ts +11 -1
  128. package/dist/services/sync/strategy.d.ts.map +1 -1
  129. package/dist/services/transport-manager.d.ts +84 -29
  130. package/dist/services/transport-manager.d.ts.map +1 -1
  131. package/dist/services/wallet-mirror-service.d.ts +81 -18
  132. package/dist/services/wallet-mirror-service.d.ts.map +1 -1
  133. package/dist/services/wifi-provisioning-service.d.ts +146 -0
  134. package/dist/services/wifi-provisioning-service.d.ts.map +1 -0
  135. package/package.json +18 -12
  136. package/src/errors/index.js +126 -0
  137. package/src/events/index.js +124 -0
  138. package/src/index.js +566 -0
  139. package/src/models/agent.js +43 -0
  140. package/src/models/app-data.js +122 -0
  141. package/src/models/conversation.js +36 -0
  142. package/{dist → src}/models/delegation.js +18 -1
  143. package/src/models/device-boot-state.js +3 -0
  144. package/{dist → src}/models/device-identity.js +18 -2
  145. package/{dist → src}/models/graph.js +30 -3
  146. package/src/models/index.js +175 -0
  147. package/src/models/json.js +18 -0
  148. package/src/models/l402.js +9 -0
  149. package/src/models/live-query-definition.js +30 -0
  150. package/src/models/node-app-memory.js +130 -0
  151. package/src/models/outbox-intent.js +12 -0
  152. package/{dist → src}/models/outbox.js +102 -3
  153. package/src/models/owner-views.js +59 -0
  154. package/src/models/payment.js +24 -0
  155. package/src/models/query-diff.js +7 -0
  156. package/src/models/release-manifest.js +160 -0
  157. package/src/models/repository-write.js +10 -0
  158. package/src/models/revisioned-commands.js +92 -0
  159. package/src/models/revisioned.js +41 -0
  160. package/src/models/settings.js +16 -0
  161. package/src/models/sync.js +44 -0
  162. package/src/models/wallet.js +40 -0
  163. package/src/queries/certificate-trust.js +31 -0
  164. package/{dist → src}/queries/conversations.js +54 -3
  165. package/src/queries/discovery.js +34 -0
  166. package/{dist → src}/queries/notifications.js +25 -2
  167. package/src/queries/onboarding-flow.js +48 -0
  168. package/src/queries/onboarding-lcd-screen.js +100 -0
  169. package/src/queries/onboarding-status.js +34 -0
  170. package/src/queries/revisioned.js +128 -0
  171. package/{dist → src}/queries/wallet.js +35 -1
  172. package/src/services/abort-signal.js +69 -0
  173. package/src/services/certificate-trust-service.js +119 -0
  174. package/{dist → src}/services/conversation-service.js +108 -1
  175. package/src/services/conversation-sync.js +28 -0
  176. package/src/services/device-boot-state-service.js +45 -0
  177. package/src/services/device-cleanup-service.js +112 -0
  178. package/src/services/discovery-probe-service.js +196 -0
  179. package/{dist → src}/services/gossip-service.js +54 -4
  180. package/src/services/invite-redemption-service.js +64 -0
  181. package/src/services/lan-candidate-refresh-service.js +164 -0
  182. package/src/services/lcd-decision-service.js +93 -0
  183. package/src/services/onboarding-checkpoint-store.js +155 -0
  184. package/src/services/onboarding-flow-service.js +1096 -0
  185. package/src/services/onboarding-status-service.js +64 -0
  186. package/{dist → src}/services/outbox-service.js +132 -1
  187. package/src/services/owner-claim-service.js +347 -0
  188. package/src/services/owner-view-refresh-service.js +208 -0
  189. package/src/services/owner-view-service.js +87 -0
  190. package/{dist → src}/services/peer-directory-service.js +72 -3
  191. package/src/services/release-manifest-verifier.js +108 -0
  192. package/{dist → src}/services/revisioned-domain-service.js +189 -9
  193. package/src/services/runtime-globals.js +174 -0
  194. package/src/services/session-service.js +50 -0
  195. package/{dist → src}/services/sync/authoritative-mirror.js +90 -1
  196. package/src/services/sync/index.js +67 -0
  197. package/src/services/sync/log-sync.js +60 -0
  198. package/src/services/sync/revision-merge.js +119 -0
  199. package/src/services/sync/strategy.js +44 -0
  200. package/src/services/transport-manager.js +478 -0
  201. package/{dist → src}/services/wallet-mirror-service.js +226 -6
  202. package/src/services/wifi-provisioning-service.js +278 -0
  203. package/dist/errors/index.js +0 -45
  204. package/dist/errors/index.js.map +0 -1
  205. package/dist/events/index.js +0 -17
  206. package/dist/events/index.js.map +0 -1
  207. package/dist/index.js +0 -31
  208. package/dist/index.js.map +0 -1
  209. package/dist/models/agent.js +0 -17
  210. package/dist/models/agent.js.map +0 -1
  211. package/dist/models/conversation.js +0 -2
  212. package/dist/models/conversation.js.map +0 -1
  213. package/dist/models/delegation.js.map +0 -1
  214. package/dist/models/device-identity.js.map +0 -1
  215. package/dist/models/graph.js.map +0 -1
  216. package/dist/models/index.js +0 -8
  217. package/dist/models/index.js.map +0 -1
  218. package/dist/models/json.js +0 -2
  219. package/dist/models/json.js.map +0 -1
  220. package/dist/models/l402.js +0 -2
  221. package/dist/models/l402.js.map +0 -1
  222. package/dist/models/live-query-definition.js +0 -2
  223. package/dist/models/live-query-definition.js.map +0 -1
  224. package/dist/models/outbox-intent.js +0 -2
  225. package/dist/models/outbox-intent.js.map +0 -1
  226. package/dist/models/outbox.js.map +0 -1
  227. package/dist/models/owner-views.js +0 -7
  228. package/dist/models/owner-views.js.map +0 -1
  229. package/dist/models/payment.js +0 -3
  230. package/dist/models/payment.js.map +0 -1
  231. package/dist/models/query-diff.js +0 -2
  232. package/dist/models/query-diff.js.map +0 -1
  233. package/dist/models/release-manifest.js +0 -147
  234. package/dist/models/release-manifest.js.map +0 -1
  235. package/dist/models/repository-write.js +0 -2
  236. package/dist/models/repository-write.js.map +0 -1
  237. package/dist/models/revisioned-commands.js +0 -35
  238. package/dist/models/revisioned-commands.js.map +0 -1
  239. package/dist/models/revisioned.js +0 -2
  240. package/dist/models/revisioned.js.map +0 -1
  241. package/dist/models/settings.js +0 -2
  242. package/dist/models/settings.js.map +0 -1
  243. package/dist/models/sync.js +0 -2
  244. package/dist/models/sync.js.map +0 -1
  245. package/dist/models/wallet.js +0 -2
  246. package/dist/models/wallet.js.map +0 -1
  247. package/dist/queries/conversations.js.map +0 -1
  248. package/dist/queries/discovery.js +0 -27
  249. package/dist/queries/discovery.js.map +0 -1
  250. package/dist/queries/notifications.js.map +0 -1
  251. package/dist/queries/onboarding-status.js +0 -27
  252. package/dist/queries/onboarding-status.js.map +0 -1
  253. package/dist/queries/revisioned.js +0 -58
  254. package/dist/queries/revisioned.js.map +0 -1
  255. package/dist/queries/wallet.js.map +0 -1
  256. package/dist/services/conversation-service.js.map +0 -1
  257. package/dist/services/conversation-sync.js +0 -9
  258. package/dist/services/conversation-sync.js.map +0 -1
  259. package/dist/services/discovery-probe-service.js +0 -129
  260. package/dist/services/discovery-probe-service.js.map +0 -1
  261. package/dist/services/gossip-service.js.map +0 -1
  262. package/dist/services/lan-candidate-refresh-service.js +0 -79
  263. package/dist/services/lan-candidate-refresh-service.js.map +0 -1
  264. package/dist/services/onboarding-status-service.js +0 -32
  265. package/dist/services/onboarding-status-service.js.map +0 -1
  266. package/dist/services/outbox-service.js.map +0 -1
  267. package/dist/services/owner-view-service.js +0 -21
  268. package/dist/services/owner-view-service.js.map +0 -1
  269. package/dist/services/peer-directory-service.js.map +0 -1
  270. package/dist/services/release-manifest-verifier.js +0 -84
  271. package/dist/services/release-manifest-verifier.js.map +0 -1
  272. package/dist/services/revisioned-domain-service.js.map +0 -1
  273. package/dist/services/session-service.js +0 -20
  274. package/dist/services/session-service.js.map +0 -1
  275. package/dist/services/sync/authoritative-mirror.js.map +0 -1
  276. package/dist/services/sync/index.js +0 -4
  277. package/dist/services/sync/index.js.map +0 -1
  278. package/dist/services/sync/log-sync.js +0 -20
  279. package/dist/services/sync/log-sync.js.map +0 -1
  280. package/dist/services/sync/revision-merge.js +0 -46
  281. package/dist/services/sync/revision-merge.js.map +0 -1
  282. package/dist/services/sync/strategy.js +0 -2
  283. package/dist/services/sync/strategy.js.map +0 -1
  284. package/dist/services/transport-manager.js +0 -234
  285. package/dist/services/transport-manager.js.map +0 -1
  286. 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
- import type { HomeNodeClient } from "@econ-v1/ports";
2
- /**
3
- * The #1815 onboarding-status coordinator (Tasks B+C). Derives which shell surface an
4
- * unclaimed/claimed/unreachable node should show, so onboarding can mount by default for a
5
- * fresh (unclaimed) node instead of only behind the `?onboarding=1` dev flag
6
- * (`docs/superpowers/plans/2026-07-26-client-node-onboarding-status-coordinator.md`).
7
- *
8
- * Derivation order (fail-safe: an unrecognized outcome never invents "ready" or
9
- * "needs-onboarding" — it falls back to `needs-pairing`, the pre-#1815 default path):
10
- * 1. The browser already holds a valid device session → `ready` (never calls the node).
11
- * 2. The node is reachable and reports `claimed: false` (no owner yet) → `needs-onboarding`,
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 interface OnboardingLifecycleStatusRow {
13
+ export type OnboardingLifecycleStatusRow = {
23
14
  readonly id: "onboarding-status";
24
- /** Present only when `state === "needs-onboarding"` — always `"new"` today (first-owner
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
- /** The subset of `GET /api/auth/onboarding-status`'s wire shape this service reads. */
30
- export interface OnboardingStatusWire {
18
+ };
19
+ export type OnboardingStatusWire = {
31
20
  readonly claimed?: unknown;
32
- }
33
- export interface OnboardingStatusServiceOptions {
34
- /** Synchronous read of whether the browser currently holds an established device session
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
- export declare class OnboardingStatusService {
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.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,kBAAkB,GAClB,eAAe,GACf,OAAO,CAAC;AAEZ,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,EAAE,mBAAmB,CAAC;IACjC;wFACoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC;CAC1C;AAED,uFAAuF;AACvF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;6EAGyE;IACzE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,OAAO,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;CAC/C;AAED,qBAAa,uBAAuB;;gBAItB,OAAO,EAAE,8BAA8B;IAK7C,MAAM,IAAI,OAAO,CAAC,4BAA4B,CAAC;CAoBtD"}
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
- import { type OutboxEntry, type OutboxIntentInput } from "../models/outbox.js";
2
- export interface OutboxPersistence {
3
- create(entry: OutboxEntry): Promise<void>;
4
- delete(id: string): Promise<void>;
5
- list(domain?: string): Promise<readonly OutboxEntry[]>;
6
- read(id: string): Promise<OutboxEntry | undefined>;
7
- update(entry: OutboxEntry): Promise<void>;
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
- export declare class OutboxTransitionError extends Error {
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
- export declare class OutboxRevalidationRequiredError extends OutboxTransitionError {
31
- constructor(id: string);
24
+ /**
25
+ * @extends {OutboxTransitionError}
26
+ */
27
+ export class OutboxRevalidationRequiredError extends OutboxTransitionError {
32
28
  }
33
- export declare class OutboxService {
34
- #private;
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.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAGvB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IACnD,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;gBAEpB,cAAc,EAAE,MAAM;CAKnC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,+BAAgC,SAAQ,qBAAqB;gBAC5D,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,aAAa;;gBAKZ,WAAW,EAAE,iBAAiB,EAAE,OAAO,GAAE,oBAAyB;IASxE,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;IAavD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IA2BtG,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAM/E,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAW/E,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAQ7F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpC,oBAAoB,CAAC,GAAG,SAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAUjE,YAAY;IAM1B,OAAO,CAAC,mBAAmB;YAMb,IAAI;CAWnB"}
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"}