@cleocode/core 2026.9.25 → 2026.10.1

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 (236) hide show
  1. package/dist/admin/import-tasks.d.ts.map +1 -1
  2. package/dist/admin/import-tasks.js +5 -2
  3. package/dist/admin/import-tasks.js.map +1 -1
  4. package/dist/admin/import.d.ts.map +1 -1
  5. package/dist/admin/import.js +7 -2
  6. package/dist/admin/import.js.map +1 -1
  7. package/dist/build-provenance.json +2 -2
  8. package/dist/cloud/index.d.ts +1 -0
  9. package/dist/cloud/index.d.ts.map +1 -1
  10. package/dist/cloud/index.js +1 -0
  11. package/dist/cloud/index.js.map +1 -1
  12. package/dist/cloud/nexus-attach.d.ts +94 -0
  13. package/dist/cloud/nexus-attach.d.ts.map +1 -0
  14. package/dist/cloud/nexus-attach.js +192 -0
  15. package/dist/cloud/nexus-attach.js.map +1 -0
  16. package/dist/cloud/nexus-auth.d.ts +41 -4
  17. package/dist/cloud/nexus-auth.d.ts.map +1 -1
  18. package/dist/cloud/nexus-auth.js +151 -38
  19. package/dist/cloud/nexus-auth.js.map +1 -1
  20. package/dist/cloud/nexus-cloud-status.d.ts +132 -0
  21. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -0
  22. package/dist/cloud/nexus-cloud-status.js +440 -0
  23. package/dist/cloud/nexus-cloud-status.js.map +1 -0
  24. package/dist/cloud/nexus-cloud.d.ts +179 -0
  25. package/dist/cloud/nexus-cloud.d.ts.map +1 -0
  26. package/dist/cloud/nexus-cloud.js +296 -0
  27. package/dist/cloud/nexus-cloud.js.map +1 -0
  28. package/dist/cloud/nexus-credentials.js +2 -2
  29. package/dist/cloud/nexus-credentials.js.map +1 -1
  30. package/dist/cloud/nexus-device.d.ts +834 -0
  31. package/dist/cloud/nexus-device.d.ts.map +1 -0
  32. package/dist/cloud/nexus-device.js +1727 -0
  33. package/dist/cloud/nexus-device.js.map +1 -0
  34. package/dist/cloud/nexus-enrol.d.ts +241 -0
  35. package/dist/cloud/nexus-enrol.d.ts.map +1 -0
  36. package/dist/cloud/nexus-enrol.js +1163 -0
  37. package/dist/cloud/nexus-enrol.js.map +1 -0
  38. package/dist/cloud/nexus-link.d.ts +10 -0
  39. package/dist/cloud/nexus-link.d.ts.map +1 -1
  40. package/dist/cloud/nexus-link.js +172 -11
  41. package/dist/cloud/nexus-link.js.map +1 -1
  42. package/dist/cloud/nexus-logout.d.ts +114 -0
  43. package/dist/cloud/nexus-logout.d.ts.map +1 -0
  44. package/dist/cloud/nexus-logout.js +429 -0
  45. package/dist/cloud/nexus-logout.js.map +1 -0
  46. package/dist/cloud/signing.d.ts +20 -0
  47. package/dist/cloud/signing.d.ts.map +1 -1
  48. package/dist/cloud/signing.js +14 -0
  49. package/dist/cloud/signing.js.map +1 -1
  50. package/dist/crypto/credentials.d.ts +61 -0
  51. package/dist/crypto/credentials.d.ts.map +1 -1
  52. package/dist/crypto/credentials.js +154 -58
  53. package/dist/crypto/credentials.js.map +1 -1
  54. package/dist/docs/export-document.js +1072 -227
  55. package/dist/docs/export-document.js.map +3 -3
  56. package/dist/doctor/dependency-cycles.d.ts +41 -0
  57. package/dist/doctor/dependency-cycles.d.ts.map +1 -0
  58. package/dist/doctor/dependency-cycles.js +39 -0
  59. package/dist/doctor/dependency-cycles.js.map +1 -0
  60. package/dist/doctor/index.d.ts +2 -0
  61. package/dist/doctor/index.d.ts.map +1 -1
  62. package/dist/doctor/index.js +1 -0
  63. package/dist/doctor/index.js.map +1 -1
  64. package/dist/doctor/row-identity.d.ts +11 -0
  65. package/dist/doctor/row-identity.d.ts.map +1 -1
  66. package/dist/doctor/row-identity.js +67 -9
  67. package/dist/doctor/row-identity.js.map +1 -1
  68. package/dist/error-catalog.d.ts.map +1 -1
  69. package/dist/error-catalog.js +4 -0
  70. package/dist/error-catalog.js.map +1 -1
  71. package/dist/error-registry.d.ts.map +1 -1
  72. package/dist/error-registry.js +8 -0
  73. package/dist/error-registry.js.map +1 -1
  74. package/dist/llm/plugin-facade.js +1200 -355
  75. package/dist/llm/plugin-facade.js.map +3 -3
  76. package/dist/nexus/workspace.d.ts.map +1 -1
  77. package/dist/nexus/workspace.js +54 -4
  78. package/dist/nexus/workspace.js.map +1 -1
  79. package/dist/orchestrate/lifecycle-ops.js +1 -1
  80. package/dist/orchestrate/lifecycle-ops.js.map +1 -1
  81. package/dist/orchestrate/pivot.d.ts.map +1 -1
  82. package/dist/orchestrate/pivot.js +4 -2
  83. package/dist/orchestrate/pivot.js.map +1 -1
  84. package/dist/orchestrate/query-ops.d.ts.map +1 -1
  85. package/dist/orchestrate/query-ops.js +3 -3
  86. package/dist/orchestrate/query-ops.js.map +1 -1
  87. package/dist/orchestrate/spawn-ops.js +1 -1
  88. package/dist/orchestrate/spawn-ops.js.map +1 -1
  89. package/dist/orchestration/index.js +1 -1
  90. package/dist/orchestration/index.js.map +1 -1
  91. package/dist/orchestration/lead-rollup.d.ts.map +1 -1
  92. package/dist/orchestration/lead-rollup.js +3 -3
  93. package/dist/orchestration/lead-rollup.js.map +1 -1
  94. package/dist/orchestration/parallel.js +1 -1
  95. package/dist/orchestration/parallel.js.map +1 -1
  96. package/dist/orchestration/wave-topic.d.ts +4 -2
  97. package/dist/orchestration/wave-topic.d.ts.map +1 -1
  98. package/dist/orchestration/wave-topic.js +6 -4
  99. package/dist/orchestration/wave-topic.js.map +1 -1
  100. package/dist/orchestration/waves.d.ts +2 -1
  101. package/dist/orchestration/waves.d.ts.map +1 -1
  102. package/dist/orchestration/waves.js +4 -3
  103. package/dist/orchestration/waves.js.map +1 -1
  104. package/dist/phases/index.d.ts.map +1 -1
  105. package/dist/phases/index.js +4 -2
  106. package/dist/phases/index.js.map +1 -1
  107. package/dist/selfimprove/fix-gen.js +1203 -358
  108. package/dist/selfimprove/fix-gen.js.map +3 -3
  109. package/dist/session/engine-ops.d.ts.map +1 -1
  110. package/dist/session/engine-ops.js +77 -49
  111. package/dist/session/engine-ops.js.map +1 -1
  112. package/dist/sessions/focus-state-store.d.ts +69 -23
  113. package/dist/sessions/focus-state-store.d.ts.map +1 -1
  114. package/dist/sessions/focus-state-store.js +113 -27
  115. package/dist/sessions/focus-state-store.js.map +1 -1
  116. package/dist/sessions/handoff.js +1 -1
  117. package/dist/sessions/handoff.js.map +1 -1
  118. package/dist/sessions/index.d.ts.map +1 -1
  119. package/dist/sessions/index.js +24 -13
  120. package/dist/sessions/index.js.map +1 -1
  121. package/dist/sessions/terminal-identity.d.ts +165 -17
  122. package/dist/sessions/terminal-identity.d.ts.map +1 -1
  123. package/dist/sessions/terminal-identity.js +341 -32
  124. package/dist/sessions/terminal-identity.js.map +1 -1
  125. package/dist/setup/sections/nexus-account.d.ts +8 -6
  126. package/dist/setup/sections/nexus-account.d.ts.map +1 -1
  127. package/dist/setup/sections/nexus-account.js +53 -9
  128. package/dist/setup/sections/nexus-account.js.map +1 -1
  129. package/dist/skills/orchestrator/startup.js +2 -2
  130. package/dist/skills/orchestrator/startup.js.map +1 -1
  131. package/dist/snapshot/index.d.ts +4 -0
  132. package/dist/snapshot/index.d.ts.map +1 -1
  133. package/dist/snapshot/index.js +50 -3
  134. package/dist/snapshot/index.js.map +1 -1
  135. package/dist/store/db-helpers.d.ts +15 -2
  136. package/dist/store/db-helpers.d.ts.map +1 -1
  137. package/dist/store/db-helpers.js +84 -3
  138. package/dist/store/db-helpers.js.map +1 -1
  139. package/dist/store/dependency-cycles.d.ts +164 -0
  140. package/dist/store/dependency-cycles.d.ts.map +1 -0
  141. package/dist/store/dependency-cycles.js +360 -0
  142. package/dist/store/dependency-cycles.js.map +1 -0
  143. package/dist/store/display-id-alias.d.ts +93 -37
  144. package/dist/store/display-id-alias.d.ts.map +1 -1
  145. package/dist/store/display-id-alias.js +590 -115
  146. package/dist/store/display-id-alias.js.map +1 -1
  147. package/dist/store/dual-scope-db.d.ts.map +1 -1
  148. package/dist/store/dual-scope-db.js +34 -7
  149. package/dist/store/dual-scope-db.js.map +1 -1
  150. package/dist/store/exodus/migrate.d.ts.map +1 -1
  151. package/dist/store/exodus/migrate.js +8 -1
  152. package/dist/store/exodus/migrate.js.map +1 -1
  153. package/dist/store/global-salt.d.ts +35 -0
  154. package/dist/store/global-salt.d.ts.map +1 -1
  155. package/dist/store/global-salt.js +136 -16
  156. package/dist/store/global-salt.js.map +1 -1
  157. package/dist/store/migration-sqlite.d.ts.map +1 -1
  158. package/dist/store/migration-sqlite.js +19 -11
  159. package/dist/store/migration-sqlite.js.map +1 -1
  160. package/dist/store/portable-bundle-scan.d.ts.map +1 -1
  161. package/dist/store/portable-bundle-scan.js +6 -0
  162. package/dist/store/portable-bundle-scan.js.map +1 -1
  163. package/dist/store/row-identity-registry.d.ts.map +1 -1
  164. package/dist/store/row-identity-registry.js +11 -3
  165. package/dist/store/row-identity-registry.js.map +1 -1
  166. package/dist/store/row-identity.d.ts +91 -1
  167. package/dist/store/row-identity.d.ts.map +1 -1
  168. package/dist/store/row-identity.js +276 -7
  169. package/dist/store/row-identity.js.map +1 -1
  170. package/dist/store/safety-data-accessor.d.ts +3 -2
  171. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  172. package/dist/store/safety-data-accessor.js +5 -2
  173. package/dist/store/safety-data-accessor.js.map +1 -1
  174. package/dist/store/session-store.d.ts +63 -3
  175. package/dist/store/session-store.d.ts.map +1 -1
  176. package/dist/store/session-store.js +121 -8
  177. package/dist/store/session-store.js.map +1 -1
  178. package/dist/store/split-brain-import.d.ts.map +1 -1
  179. package/dist/store/split-brain-import.js +36 -0
  180. package/dist/store/split-brain-import.js.map +1 -1
  181. package/dist/store/sqlite-data-accessor.d.ts +50 -3
  182. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  183. package/dist/store/sqlite-data-accessor.js +246 -13
  184. package/dist/store/sqlite-data-accessor.js.map +1 -1
  185. package/dist/store/sync/replica.d.ts +34 -3
  186. package/dist/store/sync/replica.d.ts.map +1 -1
  187. package/dist/store/sync/replica.js +39 -2
  188. package/dist/store/sync/replica.js.map +1 -1
  189. package/dist/store/sync/schema.d.ts +6 -3
  190. package/dist/store/sync/schema.d.ts.map +1 -1
  191. package/dist/store/sync/schema.js +6 -3
  192. package/dist/store/sync/schema.js.map +1 -1
  193. package/dist/store/tasks-sqlite.d.ts.map +1 -1
  194. package/dist/store/tasks-sqlite.js +14 -2
  195. package/dist/store/tasks-sqlite.js.map +1 -1
  196. package/dist/store/umbrella-data-accessor.d.ts +3 -2
  197. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  198. package/dist/store/umbrella-data-accessor.js +5 -2
  199. package/dist/store/umbrella-data-accessor.js.map +1 -1
  200. package/dist/system/health.d.ts +2 -0
  201. package/dist/system/health.d.ts.map +1 -1
  202. package/dist/system/health.js +54 -0
  203. package/dist/system/health.js.map +1 -1
  204. package/dist/task-work/index.d.ts.map +1 -1
  205. package/dist/task-work/index.js +9 -6
  206. package/dist/task-work/index.js.map +1 -1
  207. package/dist/tasks/analyze.d.ts.map +1 -1
  208. package/dist/tasks/analyze.js +3 -2
  209. package/dist/tasks/analyze.js.map +1 -1
  210. package/dist/tasks/evidence.d.ts +19 -1
  211. package/dist/tasks/evidence.d.ts.map +1 -1
  212. package/dist/tasks/evidence.js +79 -18
  213. package/dist/tasks/evidence.js.map +1 -1
  214. package/dist/tasks/infer-add-params.js +1 -1
  215. package/dist/tasks/infer-add-params.js.map +1 -1
  216. package/dist/tasks/task-context.d.ts.map +1 -1
  217. package/dist/tasks/task-context.js +3 -1
  218. package/dist/tasks/task-context.js.map +1 -1
  219. package/dist/tasks/task-import.d.ts.map +1 -1
  220. package/dist/tasks/task-import.js +11 -3
  221. package/dist/tasks/task-import.js.map +1 -1
  222. package/dist/tasks/task-next.d.ts +5 -1
  223. package/dist/tasks/task-next.d.ts.map +1 -1
  224. package/dist/tasks/task-next.js +7 -2
  225. package/dist/tasks/task-next.js.map +1 -1
  226. package/dist/validation/engine-ops.d.ts.map +1 -1
  227. package/dist/validation/engine-ops.js +3 -2
  228. package/dist/validation/engine-ops.js.map +1 -1
  229. package/dist/workgraph/scaffold-apply.d.ts.map +1 -1
  230. package/dist/workgraph/scaffold-apply.js +14 -5
  231. package/dist/workgraph/scaffold-apply.js.map +1 -1
  232. package/migrations/drizzle-cleo-project/20260930160000_t12886-dependency-cycle-guard/migration.sql +76 -0
  233. package/migrations/drizzle-cleo-project/20260930160000_t12886-dependency-cycle-guard/revert.sql +7 -0
  234. package/package.json +13 -13
  235. package/templates/CLEO-INJECTION.md +2 -2
  236. package/templates/CLEO-REFERENCE.md +1 -1
@@ -0,0 +1,429 @@
1
+ /**
2
+ * Cleo Nexus device logout: `cleo logout nexus [--revoke]` with device
3
+ * credentials (cleo-nexus device contract §3.5, review M3, T12844).
4
+ *
5
+ * A logout never reports success while a credential may still be live:
6
+ *
7
+ * 1. Under the lock, the live credentials move into `pendingSignOut`
8
+ * (`--revoke`: `pendingRevoke`), newest first: `pending`, then `current`
9
+ * ({@link applyBeginSignOut}, {@link applyBeginRevoke}). From then on they
10
+ * are used for nothing but that request. The lock is released.
11
+ * 2. E9 (`POST /v1/devices/self/sign-out`) or E10 (`DELETE /v1/devices/self`)
12
+ * is sent with each credential in turn, newest first, with one attempt and
13
+ * a {@link NEXUS_REVOKE_TIMEOUT_MS} timeout.
14
+ * 3. Done means proved: 200, or a 401 whose reason proves the device state
15
+ * (`device-signed-out`, `device-revoked`, or `credential-revoked` with
16
+ * `revokedReason` `signed-out` / `revoked`). A revoke needs proof of a
17
+ * revoke; a signed-out device is not a revoked one. Any other 401 means
18
+ * that credential is dead, so the next one is tried. A network error,
19
+ * timeout, 429, 5xx or a route the server does not have yet stops the run:
20
+ * the slot is kept and every remaining request is left for the next run
21
+ * without another call.
22
+ * 4. The lock is re-taken and the slot is changed only if it still holds the
23
+ * credential that was answered (compare-and-swap):
24
+ * - a sign-out (confirmed, or every credential dead) clears
25
+ * `pendingSignOut` and keeps the device keys for the next login;
26
+ * - a revoke that ended (confirmed, found the device signed out, or every
27
+ * credential dead) forgets the device locally ({@link applyForgetDevice}),
28
+ * so no later login re-activates the id the user asked to burn. The
29
+ * entry is deleted, or kept stripped while `retired` requests of other
30
+ * devices remain; the store keeps the file while other entries remain.
31
+ * Only a confirmed request is reported `confirmed`; the others name the
32
+ * web remedy.
33
+ *
34
+ * Unsettled slots, and the `retired` requests of replaced devices, are
35
+ * retried by every later logout and, best effort with a shorter timeout, by
36
+ * `cleo login nexus` and `cleo project link` ({@link retryNexusDeviceEnds}).
37
+ * Retired requests are sent before the entry's own request.
38
+ *
39
+ * No function here logs, and no result or error carries a token.
40
+ *
41
+ * @task T12870
42
+ * @epic T12323
43
+ */
44
+ import { z } from 'zod';
45
+ import { Http, NexusError } from './http.js';
46
+ import { logoutFromNexus, NEXUS_REVOKE_TIMEOUT_MS, resolveNexusApiUrl } from './nexus-auth.js';
47
+ import { FileNexusTokenStore, nexusOriginKey } from './nexus-credentials.js';
48
+ import { applyBeginRevoke, applyBeginSignOut, applyForgetDevice, applyRetiredSettled, applySignOutConfirmed, isForgottenDevice, NexusDeviceStore, UnreadableNexusDevice, } from './nexus-device.js';
49
+ /**
50
+ * Timeout of each E9/E10 call when a login or a link only retries on the way
51
+ * ({@link retryNexusDeviceEnds}); an explicit logout uses {@link NEXUS_REVOKE_TIMEOUT_MS}.
52
+ */
53
+ export const NEXUS_END_RETRY_TIMEOUT_MS = 2_000;
54
+ function context(opts) {
55
+ const apiUrl = resolveNexusApiUrl(opts.apiUrl);
56
+ return {
57
+ apiUrl,
58
+ origin: nexusOriginKey(apiUrl),
59
+ fetch: opts.fetch ?? ((input, init) => globalThis.fetch(input, init)),
60
+ devices: opts.deviceStore ?? new NexusDeviceStore(),
61
+ now: opts.now ?? (() => new Date()),
62
+ timeoutMs: opts.timeoutMs ?? NEXUS_REVOKE_TIMEOUT_MS,
63
+ };
64
+ }
65
+ /** E9 answers `{ deviceId, state }`; E10 answers `{ revoked }`. Only the status matters. */
66
+ const endAnswerSchema = z.looseObject({});
67
+ /**
68
+ * What a 401 proves about the device (§4.0.4): `revoked`, `signed-out`, or
69
+ * nothing (`null`: only this credential is dead).
70
+ */
71
+ function provenState(details) {
72
+ const reason = details?.['reason'];
73
+ const revokedReason = details?.['revokedReason'];
74
+ if (reason === 'device-revoked')
75
+ return 'revoked';
76
+ if (reason === 'device-signed-out')
77
+ return 'signed-out';
78
+ if (reason === 'credential-revoked' && revokedReason === 'revoked')
79
+ return 'revoked';
80
+ if (reason === 'credential-revoked' && revokedReason === 'signed-out')
81
+ return 'signed-out';
82
+ return null;
83
+ }
84
+ /**
85
+ * Send E9 or E10 with one credential: one attempt, a plain timeout, no lock held.
86
+ *
87
+ * @returns `done` for 200 or a 401 that proves the requested state,
88
+ * `signed-out` for a revoke that proves only a sign-out, `stale` for any
89
+ * other 401, `unanswered` for everything else, with the reason in `detail`.
90
+ */
91
+ async function callEnd(ctx, action, token) {
92
+ const timed = (input, init) => ctx.fetch(input, { ...init, signal: AbortSignal.timeout(ctx.timeoutMs) });
93
+ const http = new Http({ baseUrl: ctx.apiUrl, token, fetch: timed, maxAttempts: 1 });
94
+ try {
95
+ if (action === 'sign-out') {
96
+ await http.request('POST', '/v1/devices/self/sign-out', endAnswerSchema, {});
97
+ }
98
+ else {
99
+ await http.request('DELETE', '/v1/devices/self', endAnswerSchema);
100
+ }
101
+ return { answer: 'done', detail: 'HTTP 200' };
102
+ }
103
+ catch (err) {
104
+ if (!(err instanceof NexusError)) {
105
+ return {
106
+ answer: 'unanswered',
107
+ detail: err instanceof Error ? err.message : String(err),
108
+ transport: true,
109
+ };
110
+ }
111
+ if (err.status === 401) {
112
+ const reason = err.details?.['reason'];
113
+ const detail = `HTTP 401 ${typeof reason === 'string' ? reason : err.code}`;
114
+ const state = provenState(err.details);
115
+ if (state === 'revoked' || (state === 'signed-out' && action === 'sign-out')) {
116
+ return { answer: 'done', detail };
117
+ }
118
+ if (state === 'signed-out')
119
+ return { answer: 'signed-out', detail };
120
+ // Only the Nexus API's own verdict on this credential counts as dead. A
121
+ // 401 without its envelope (a proxy or SSO gateway) or with reason
122
+ // `missing` (an Authorization header stripped on the way) proves
123
+ // nothing about the credential, so it is treated as no answer.
124
+ const dead = err.code === 'E_UNAUTHENTICATED' &&
125
+ (reason === 'invalid' ||
126
+ reason === 'credential-expired' ||
127
+ reason === 'credential-revoked');
128
+ return { answer: dead ? 'stale' : 'unanswered', detail };
129
+ }
130
+ return {
131
+ answer: 'unanswered',
132
+ detail: err.code === 'E_NETWORK' ? 'no answer' : `HTTP ${err.status} ${err.code}`,
133
+ transport: err.code === 'E_NETWORK',
134
+ };
135
+ }
136
+ }
137
+ /** Every unsettled request of one entry: its `retired` items first, then its own slot. */
138
+ function requestsOf(userId, entry) {
139
+ const out = [];
140
+ for (const r of entry.retired ?? []) {
141
+ out.push({
142
+ userId,
143
+ deviceId: r.deviceId,
144
+ action: r.kind,
145
+ retired: true,
146
+ credentials: r.credentials,
147
+ });
148
+ }
149
+ const own = entry.pendingRevoke ?? entry.pendingSignOut;
150
+ if (own) {
151
+ out.push({
152
+ userId,
153
+ deviceId: entry.deviceId,
154
+ action: entry.pendingRevoke ? 'revoke' : 'sign-out',
155
+ retired: false,
156
+ credentials: own.credentials,
157
+ });
158
+ }
159
+ return out;
160
+ }
161
+ /** The credentials a request's slot holds now, or `null` when the slot is gone. */
162
+ function slotNow(entry, req) {
163
+ if (entry === null)
164
+ return null;
165
+ if (req.retired) {
166
+ const item = (entry.retired ?? []).find((r) => r.deviceId === req.deviceId && r.kind === req.action);
167
+ return item ? item.credentials : null;
168
+ }
169
+ if (entry.deviceId !== req.deviceId)
170
+ return null;
171
+ const slot = req.action === 'revoke' ? entry.pendingRevoke : entry.pendingSignOut;
172
+ return slot ? slot.credentials : null;
173
+ }
174
+ /**
175
+ * End a request under the lock, only if its slot still holds `token` (CAS):
176
+ * clear a sign-out slot, settle a retired item, or forget the device after a
177
+ * revoke. An entry left with nothing to keep is deleted.
178
+ */
179
+ async function settleEnded(ctx, req, token) {
180
+ return ctx.devices.update((tx) => {
181
+ const entry = tx.get(ctx.apiUrl, req.userId);
182
+ const creds = slotNow(entry, req);
183
+ if (entry === null || creds === null || !creds.some((c) => c.token === token)) {
184
+ return { applied: false, removed: false };
185
+ }
186
+ const next = req.retired
187
+ ? applyRetiredSettled(entry, req.deviceId, req.action)
188
+ : req.action === 'sign-out'
189
+ ? applySignOutConfirmed(entry)
190
+ : applyForgetDevice(entry);
191
+ if (isForgottenDevice(next)) {
192
+ const removed = tx.delete(ctx.apiUrl, req.userId, {
193
+ deviceId: entry.deviceId,
194
+ credentialId: entry.current?.credentialId ?? null,
195
+ });
196
+ return { applied: true, removed };
197
+ }
198
+ tx.set(ctx.apiUrl, req.userId, next);
199
+ return { applied: true, removed: false };
200
+ });
201
+ }
202
+ /** Try each credential of one request, newest first, and end it when it can be ended. */
203
+ async function settleRequest(ctx, req, warnings) {
204
+ const row = (outcome, removedLocally = false) => ({
205
+ userId: req.userId,
206
+ deviceId: req.deviceId,
207
+ action: req.action,
208
+ retired: req.retired,
209
+ outcome,
210
+ removedLocally,
211
+ });
212
+ const what = `${req.action === 'revoke' ? 'revoke' : 'sign-out'} of device ${req.deviceId}`;
213
+ const web = req.action === 'revoke'
214
+ ? `revoke device ${req.deviceId} on cleocode.dev (Devices)`
215
+ : `sign out or revoke device ${req.deviceId} on cleocode.dev (Devices)`;
216
+ const end = async (token, outcome, note) => {
217
+ const settled = await settleEnded(ctx, req, token);
218
+ if (!settled.applied) {
219
+ warnings.push(`${what}: the local entry changed while the request was in flight (a login or another logout?); this machine may hold a newer credential. Run \`cleo logout nexus${req.action === 'revoke' ? ' --revoke' : ''}\` again`);
220
+ }
221
+ else if (note !== null) {
222
+ warnings.push(note);
223
+ }
224
+ return row(outcome, settled.removed);
225
+ };
226
+ for (const c of req.credentials) {
227
+ const { answer, detail, transport } = await callEnd(ctx, req.action, c.token);
228
+ if (answer === 'done')
229
+ return { row: await end(c.token, 'confirmed', null), unreachable: false };
230
+ if (answer === 'signed-out') {
231
+ const signedOut = await end(c.token, 'signed-out', `device ${req.deviceId} is signed out but not revoked, and a signed-out device's credentials cannot revoke it; this machine forgot the device, so the next login enrols a new one. To burn the old id, ${web}`);
232
+ return { row: signedOut, unreachable: false };
233
+ }
234
+ if (answer === 'unanswered') {
235
+ warnings.push(`${what} not confirmed (${detail}); it was kept and is retried by the next \`cleo logout nexus\`, \`cleo login nexus\` or \`cleo project link\``);
236
+ return { row: row('pending'), unreachable: transport === true };
237
+ }
238
+ }
239
+ // Every credential is dead: retrying can never succeed, so the request ends here.
240
+ const first = req.credentials[0];
241
+ if (first === undefined)
242
+ return { row: row('unconfirmed'), unreachable: false };
243
+ const ended = await end(first.token, 'unconfirmed', `${what} not confirmed: the server refused every credential this machine held for it as no longer valid, so none is live and none was kept${req.action === 'revoke' && !req.retired ? '; this machine forgot the device' : ''}. To make sure, ${web}`);
244
+ return { row: ended, unreachable: false };
245
+ }
246
+ /** Every unsettled request on the origin, plus a warning per entry this machine cannot open. */
247
+ async function unsettled(ctx, warnings, warnUnreadable) {
248
+ const out = [];
249
+ for (const d of await ctx.devices.list()) {
250
+ if (d.origin !== ctx.origin)
251
+ continue;
252
+ if (d instanceof UnreadableNexusDevice) {
253
+ if (!warnUnreadable)
254
+ continue;
255
+ warnings.push(`the device entry for user ${d.userId}${d.deviceId ? ` (device ${d.deviceId})` : ''} cannot be opened on this machine (${d.reason}); sign it out or revoke it on cleocode.dev`);
256
+ continue;
257
+ }
258
+ out.push(...requestsOf(d.userId, d.unseal()));
259
+ }
260
+ return out;
261
+ }
262
+ /** Sort rows by user, then device, for a stable envelope. */
263
+ function byUserThenDevice(a, b) {
264
+ return a.userId.localeCompare(b.userId) || a.deviceId.localeCompare(b.deviceId);
265
+ }
266
+ /**
267
+ * Retry every unsettled sign-out and revoke on the origin (contract §3.5,
268
+ * L2): each entry's `pendingSignOut` or `pendingRevoke`, and the `retired`
269
+ * requests of devices it replaced. Never throws for a server that cannot be
270
+ * reached; the rows and warnings say what is still open.
271
+ *
272
+ * @param opts - API URL, stores and test overrides.
273
+ * @returns One row per request tried, and the warnings.
274
+ */
275
+ export async function settleNexusDeviceEnds(opts = {}) {
276
+ const ctx = context(opts);
277
+ const warnings = [];
278
+ const devices = [];
279
+ let unreachable = false;
280
+ let skipped = 0;
281
+ for (const req of await unsettled(ctx, warnings, opts.warnUnreadable ?? true)) {
282
+ if (unreachable) {
283
+ skipped += 1;
284
+ // The server already failed to answer in this run: leave the rest for
285
+ // the next run rather than wait out one timeout per request.
286
+ devices.push({
287
+ userId: req.userId,
288
+ deviceId: req.deviceId,
289
+ action: req.action,
290
+ retired: req.retired,
291
+ outcome: 'pending',
292
+ removedLocally: false,
293
+ });
294
+ continue;
295
+ }
296
+ try {
297
+ const r = await settleRequest(ctx, req, warnings);
298
+ // Only a transport failure (no answer at all) stops the run: an HTTP
299
+ // error on one request (a 404, 5xx or 429 for an old device) never
300
+ // keeps the entry's own sign-out or revoke from being sent.
301
+ if (r.unreachable)
302
+ unreachable = true;
303
+ devices.push(r.row);
304
+ }
305
+ catch (err) {
306
+ // A store failure on one request keeps every row collected so far.
307
+ warnings.push(`${req.action} of device ${req.deviceId} could not be settled locally (${err instanceof Error ? err.message : String(err)}); it is retried next time`);
308
+ devices.push({
309
+ userId: req.userId,
310
+ deviceId: req.deviceId,
311
+ action: req.action,
312
+ retired: req.retired,
313
+ outcome: 'pending',
314
+ removedLocally: false,
315
+ });
316
+ }
317
+ }
318
+ if (skipped > 0) {
319
+ warnings.push(`${skipped} more unsettled sign-out or revoke request(s) were not sent because Cleo Nexus did not answer; they are retried next time`);
320
+ }
321
+ return { devices: devices.sort(byUserThenDevice), warnings };
322
+ }
323
+ /**
324
+ * Best-effort {@link settleNexusDeviceEnds} for flows that only retry on the
325
+ * way (login, commands that need a credential): a store or network failure
326
+ * becomes a warning and never fails the caller.
327
+ *
328
+ * @param opts - API URL, stores and test overrides.
329
+ * @param warnings - Receives the warnings.
330
+ */
331
+ export async function retryNexusDeviceEnds(opts, warnings) {
332
+ try {
333
+ const settled = await settleNexusDeviceEnds({
334
+ timeoutMs: NEXUS_END_RETRY_TIMEOUT_MS,
335
+ ...opts,
336
+ warnUnreadable: false,
337
+ });
338
+ warnings.push(...settled.warnings);
339
+ }
340
+ catch (err) {
341
+ warnings.push(`could not retry an unsettled Cleo Nexus sign-out (${err instanceof Error ? err.message : String(err)}); \`cleo logout nexus\` retries it`);
342
+ }
343
+ }
344
+ /**
345
+ * Under the lock, move every readable entry on the origin into its
346
+ * sign-out or revoke slot. A revoke of an entry with no credential left
347
+ * (already signed out) cannot be sent, so the device is forgotten locally
348
+ * and the web remedy is returned.
349
+ *
350
+ * @returns Warnings for the result envelope.
351
+ */
352
+ async function beginEnds(ctx, action) {
353
+ const begin = action === 'revoke' ? applyBeginRevoke : applyBeginSignOut;
354
+ return ctx.devices.update((tx) => {
355
+ const notes = [];
356
+ for (const k of tx.keys()) {
357
+ if (k.origin !== ctx.origin || !k.readable)
358
+ continue;
359
+ const entry = tx.get(ctx.apiUrl, k.userId);
360
+ if (entry === null)
361
+ continue;
362
+ const next = begin(entry, ctx.now());
363
+ if (action === 'revoke' && next.pendingRevoke === null && next.keys !== null) {
364
+ const forgotten = applyForgetDevice(next);
365
+ if (isForgottenDevice(forgotten)) {
366
+ tx.delete(ctx.apiUrl, k.userId, { deviceId: entry.deviceId, credentialId: null });
367
+ }
368
+ else {
369
+ tx.set(ctx.apiUrl, k.userId, forgotten);
370
+ }
371
+ notes.push(`device ${next.deviceId} holds no credential (it is signed out), so it cannot be revoked from here; this machine forgot it, so the next login enrols a new device. To burn the old id, revoke device ${next.deviceId} on cleocode.dev (Devices)`);
372
+ continue;
373
+ }
374
+ tx.set(ctx.apiUrl, k.userId, next);
375
+ }
376
+ return [...tx.warnings, ...notes];
377
+ });
378
+ }
379
+ /**
380
+ * `cleo logout nexus [--revoke]` with device credentials (contract §3.5, M3).
381
+ *
382
+ * Every readable entry on the origin is moved to `pendingSignOut` (or
383
+ * `pendingRevoke`), then every unsettled request on the origin is sent,
384
+ * including ones left by earlier runs. A leftover 9.24 session for the origin
385
+ * is signed out too. The device keys stay after a sign-out, so a later login
386
+ * reuses the device id; a confirmed revoke removes the entry.
387
+ *
388
+ * @param opts - API URL, `revoke`, stores and test overrides.
389
+ * @returns The per-device outcomes. A row that is not `confirmed` is also
390
+ * named in `warnings`; the result never claims a sign-out the server did
391
+ * not confirm.
392
+ * A device file that cannot be read or locked is reported as a warning, and
393
+ * the 9.24 session is still signed out.
394
+ */
395
+ export async function logoutNexusDevice(opts = {}) {
396
+ const ctx = context(opts);
397
+ const action = opts.revoke === true ? 'revoke' : 'sign-out';
398
+ const warnings = [];
399
+ let devices = [];
400
+ try {
401
+ warnings.push(...(await beginEnds(ctx, action)));
402
+ const settled = await settleNexusDeviceEnds({
403
+ ...opts,
404
+ apiUrl: ctx.apiUrl,
405
+ deviceStore: ctx.devices,
406
+ });
407
+ devices = settled.devices;
408
+ warnings.push(...settled.warnings);
409
+ }
410
+ catch (err) {
411
+ // A broken device file must not stop the 9.24 session sign-out below.
412
+ warnings.push(`the device credentials could not be signed out (${err instanceof Error ? err.message : String(err)}); fix the device file and run \`cleo logout nexus\` again`);
413
+ }
414
+ let session = null;
415
+ const sessions = opts.store ?? new FileNexusTokenStore();
416
+ if ((await sessions.get(ctx.apiUrl)) !== null) {
417
+ session = await logoutFromNexus({
418
+ apiUrl: ctx.apiUrl,
419
+ store: sessions,
420
+ ...(opts.fetch ? { fetch: opts.fetch } : {}),
421
+ });
422
+ warnings.push(...session.warnings);
423
+ }
424
+ if (action === 'revoke' && devices.length === 0 && session !== null) {
425
+ warnings.push(`no device credential is stored for ${ctx.apiUrl}, so nothing was revoked; the 9.24 session was signed out`);
426
+ }
427
+ return { apiUrl: ctx.apiUrl, action, devices, session, warnings };
428
+ }
429
+ //# sourceMappingURL=nexus-logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nexus-logout.js","sourceRoot":"","sources":["../../src/cloud/nexus-logout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAQH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EAAE,mBAAmB,EAAwB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EAGjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AAkDhD,SAAS,OAAO,CAAC,IAA8B;IAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO;QACL,MAAM;QACN,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAa,EAAE,IAAkB,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3F,OAAO,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,gBAAgB,EAAE;QACnD,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,uBAAuB;KACrD,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAE1C;;;GAGG;AACH,SAAS,WAAW,CAClB,OAA4C;IAE5C,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,aAAa,GAAG,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,gBAAgB;QAAE,OAAO,SAAS,CAAC;IAClD,IAAI,MAAM,KAAK,mBAAmB;QAAE,OAAO,YAAY,CAAC;IACxD,IAAI,MAAM,KAAK,oBAAoB,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACrF,IAAI,MAAM,KAAK,oBAAoB,IAAI,aAAa,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAC3F,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,OAAO,CACpB,GAAQ,EACR,MAA4B,EAC5B,KAAa;IAEb,MAAM,KAAK,GAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CACvC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC;QACH,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACxD,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,YAAY,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,MAAM,KAAK,UAAU,CAAC,EAAE,CAAC;gBAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACpC,CAAC;YACD,IAAI,KAAK,KAAK,YAAY;gBAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;YACpE,wEAAwE;YACxE,mEAAmE;YACnE,iEAAiE;YACjE,+DAA+D;YAC/D,MAAM,IAAI,GACR,GAAG,CAAC,IAAI,KAAK,mBAAmB;gBAChC,CAAC,MAAM,KAAK,SAAS;oBACnB,MAAM,KAAK,oBAAoB;oBAC/B,MAAM,KAAK,oBAAoB,CAAC,CAAC;YACrC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE;YACjF,SAAS,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW;SACpC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,SAAS,UAAU,CAAC,MAAc,EAAE,KAAuB;IACzD,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC;YACP,MAAM;YACN,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,cAAc,CAAC;IACxD,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,IAAI,CAAC;YACP,MAAM;YACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;YACnD,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mFAAmF;AACnF,SAAS,OAAO,CACd,KAA8B,EAC9B,GAAe;IAEf,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAC5D,CAAC;QACF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;IAClF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAUD;;;;GAIG;AACH,KAAK,UAAU,WAAW,CAAC,GAAQ,EAAE,GAAe,EAAE,KAAa;IACjE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5C,CAAC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO;YACtB,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC;YACtD,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU;gBACzB,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC;gBAC9B,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;gBAChD,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,IAAI,IAAI;aAClD,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACpC,CAAC;QACD,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,aAAa,CAC1B,GAAQ,EACR,GAAe,EACf,QAAkB;IAElB,MAAM,GAAG,GAAG,CAAC,OAA8B,EAAE,cAAc,GAAG,KAAK,EAAwB,EAAE,CAAC,CAAC;QAC7F,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,OAAO;QACP,cAAc;KACf,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,cAAc,GAAG,CAAC,QAAQ,EAAE,CAAC;IAC5F,MAAM,GAAG,GACP,GAAG,CAAC,MAAM,KAAK,QAAQ;QACrB,CAAC,CAAC,iBAAiB,GAAG,CAAC,QAAQ,4BAA4B;QAC3D,CAAC,CAAC,6BAA6B,GAAG,CAAC,QAAQ,4BAA4B,CAAC;IAC5E,MAAM,GAAG,GAAG,KAAK,EAAE,KAAa,EAAE,OAA8B,EAAE,IAAmB,EAAE,EAAE;QACvF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,4JAA4J,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,UAAU,CACxN,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9E,IAAI,MAAM,KAAK,MAAM;YACnB,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAC5E,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,MAAM,GAAG,CACzB,CAAC,CAAC,KAAK,EACP,YAAY,EACZ,UAAU,GAAG,CAAC,QAAQ,mLAAmL,GAAG,EAAE,CAC/M,CAAC;YACF,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,mBAAmB,MAAM,gHAAgH,CACjJ,CAAC;YACF,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC;QAClE,CAAC;IACH,CAAC;IACD,kFAAkF;IAClF,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChF,MAAM,KAAK,GAAG,MAAM,GAAG,CACrB,KAAK,CAAC,KAAK,EACX,aAAa,EACb,GAAG,IAAI,qIAAqI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,mBAAmB,GAAG,EAAE,CACtP,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,SAAS,CACtB,GAAQ,EACR,QAAkB,EAClB,cAAuB;IAEvB,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM;YAAE,SAAS;QACtC,IAAI,CAAC,YAAY,qBAAqB,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc;gBAAE,SAAS;YAC9B,QAAQ,CAAC,IAAI,CACX,6BAA6B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC,MAAM,6CAA6C,CAC/K,CAAC;YACF,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6DAA6D;AAC7D,SAAS,gBAAgB,CAAC,CAAuB,EAAE,CAAuB;IACxE,OAAO,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAgE,EAAE;IAElE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,MAAM,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,EAAE,CAAC;QAC9E,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,CAAC;YACb,sEAAsE;YACtE,6DAA6D;YAC7D,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,SAAS;gBAClB,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;YAClD,qEAAqE;YACrE,mEAAmE;YACnE,4DAA4D;YAC5D,IAAI,CAAC,CAAC,WAAW;gBAAE,WAAW,GAAG,IAAI,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mEAAmE;YACnE,QAAQ,CAAC,IAAI,CACX,GAAG,GAAG,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,kCAAkC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CACtJ,CAAC;YACF,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,SAAS;gBAClB,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CACX,GAAG,OAAO,2HAA2H,CACtI,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA8B,EAC9B,QAAkB;IAElB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC;YAC1C,SAAS,EAAE,0BAA0B;YACrC,GAAG,IAAI;YACP,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CACX,qDAAqD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAC3I,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,MAA6B;IAC9D,MAAM,KAAK,GAAG,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACzE,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ;gBAAE,SAAS;YACrD,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3C,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC7E,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpF,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC1C,CAAC;gBACD,KAAK,CAAC,IAAI,CACR,UAAU,IAAI,CAAC,QAAQ,gLAAgL,IAAI,CAAC,QAAQ,4BAA4B,CACjP,CAAC;gBACF,SAAS;YACX,CAAC;YACD,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAoC,EAAE;IAEtC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IAC5D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAA2B,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC;YAC1C,GAAG,IAAI;YACP,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sEAAsE;QACtE,QAAQ,CAAC,IAAI,CACX,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,4DAA4D,CAChK,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,GAA6B,IAAI,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,mBAAmB,EAAE,CAAC;IACzD,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,GAAG,MAAM,eAAe,CAAC;YAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,KAAK,EAAE,QAAQ;YACf,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7C,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpE,QAAQ,CAAC,IAAI,CACX,sCAAsC,GAAG,CAAC,MAAM,2DAA2D,CAC5G,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpE,CAAC"}
@@ -102,4 +102,24 @@ export declare function deviceGrantMessage(parts: {
102
102
  certificateHex: string;
103
103
  signerDeviceId: string;
104
104
  }): Uint8Array;
105
+ /**
106
+ * The bytes a device signs (Ed25519, with its signing key) to enrol through E1
107
+ * (cleo-nexus device contract §2.4, §4.1): the proof of possession of the
108
+ * signing private key. It binds the user, the device, both public keys and the
109
+ * profile, so a proof cannot be moved to another account, device or profile.
110
+ * Mirrors cleo-nexus `packages/shared/src/signing.ts`.
111
+ *
112
+ * @param parts - The enrolment fields; public keys as lowercase hex of the raw 32 bytes.
113
+ * @returns `cleo-nexus/device-enroll/v1\nuserId\ndeviceId\nencHex\nsigHex\nprofile` as UTF-8.
114
+ * @task T12868
115
+ */
116
+ export declare function deviceEnrollmentMessage(parts: {
117
+ userId: string;
118
+ deviceId: string;
119
+ /** Hex of the raw 32-byte X25519 public key. */
120
+ encryptionPublicKeyHex: string;
121
+ /** Hex of the raw 32-byte Ed25519 public key. */
122
+ signingPublicKeyHex: string;
123
+ profile: 'device' | 'read-only';
124
+ }): Uint8Array;
105
125
  //# sourceMappingURL=signing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../src/cloud/signing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAenC,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;CACrB;AAYD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAQjE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,UAAU,CAUb;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAYrD;AASD,2GAA2G;AAC3G,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAIzD;AAED,+FAA+F;AAC/F,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAKjE;AAED,kEAAkE;AAClE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAeD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,GAAG,UAAU,CAElF;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,sBAAsB,GAC5B,UAAU,CAMZ;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,0BAA0B,EAAE,MAAM,CAAC;IACnC,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,UAAU,CASb;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,UAAU,CASb;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+BAA+B,EAAE,MAAM,CAAC;IACxC,4BAA4B,EAAE,MAAM,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,UAAU,CAYb"}
1
+ {"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../src/cloud/signing.ts"],"names":[],"mappings":"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"}
@@ -114,4 +114,18 @@ export function deviceCertificateMessage(parts) {
114
114
  export function deviceGrantMessage(parts) {
115
115
  return lines('cleo-nexus/device-grant/v1', parts.userId, parts.recipientDeviceId, parts.recipientEncryptionPublicKeyHex, parts.recipientSigningPublicKeyHex, parts.keyVersion, parts.sealedMasterKeyHash, parts.certificateHex, parts.signerDeviceId);
116
116
  }
117
+ /**
118
+ * The bytes a device signs (Ed25519, with its signing key) to enrol through E1
119
+ * (cleo-nexus device contract §2.4, §4.1): the proof of possession of the
120
+ * signing private key. It binds the user, the device, both public keys and the
121
+ * profile, so a proof cannot be moved to another account, device or profile.
122
+ * Mirrors cleo-nexus `packages/shared/src/signing.ts`.
123
+ *
124
+ * @param parts - The enrolment fields; public keys as lowercase hex of the raw 32 bytes.
125
+ * @returns `cleo-nexus/device-enroll/v1\nuserId\ndeviceId\nencHex\nsigHex\nprofile` as UTF-8.
126
+ * @task T12868
127
+ */
128
+ export function deviceEnrollmentMessage(parts) {
129
+ return lines('cleo-nexus/device-enroll/v1', parts.userId, parts.deviceId, parts.encryptionPublicKeyHex, parts.signingPublicKeyHex, parts.profile);
130
+ }
117
131
  //# sourceMappingURL=signing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/cloud/signing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/cloud/signing.ts"],"names":[],"mappings":"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"}
@@ -147,6 +147,67 @@ export declare function encryptProjectSecret(plaintext: string, projectId: strin
147
147
  * @task T12326
148
148
  */
149
149
  export declare function decryptProjectSecret(ciphertext: string, context: ProjectSecretContext): Promise<ProjectSecretReadResult>;
150
+ /**
151
+ * The machine key and global salt of one CLEO home: the inputs of the global
152
+ * KDF. Held only in memory, only as long as one operation needs it.
153
+ *
154
+ * @task T12867
155
+ */
156
+ export interface GlobalKeyMaterial {
157
+ /** The 32-byte `machine-key`. */
158
+ readonly machineKey: Buffer;
159
+ /** The 32-byte `global-salt`. */
160
+ readonly globalSalt: Buffer;
161
+ }
162
+ /**
163
+ * Load the global KDF inputs of a CLEO home.
164
+ *
165
+ * With `create: false` nothing is ever written: a missing `machine-key` or
166
+ * `global-salt` returns `null`, so a read path never mints key material
167
+ * (T12867 review N1). With `create: true` both are created on first use,
168
+ * exclusively (N2).
169
+ *
170
+ * @param options - The CLEO home, and whether missing material may be created.
171
+ * @returns The material, or `null` when it is missing and `create` is false.
172
+ * @throws {Error} When a key file exists but is unsafe (permissions, length) or unreadable.
173
+ * @task T12867
174
+ */
175
+ export declare function loadGlobalKeyMaterial(options: CredentialKeyOptions & {
176
+ readonly create: boolean;
177
+ }): Promise<GlobalKeyMaterial | null>;
178
+ /**
179
+ * Derive the global KDF key for `id`: `HMAC-SHA256(machine-key || global-salt, id)`
180
+ * (ADR-037 §5), the same key {@link encryptGlobal} uses.
181
+ *
182
+ * @param material - The home's key material.
183
+ * @param id - The identity binding the ciphertext.
184
+ * @returns A 32-byte AES-256 key.
185
+ * @task T12867
186
+ */
187
+ export declare function deriveGlobalKeyFromMaterial(material: GlobalKeyMaterial, id: string): Buffer;
188
+ /**
189
+ * Encrypt with an already-derived global key, binding `associatedData`
190
+ * (authenticated, not encrypted) into the GCM tag. Same framing as
191
+ * {@link encryptGlobal}.
192
+ *
193
+ * @param plaintext - The secret.
194
+ * @param key - From {@link deriveGlobalKeyFromMaterial}.
195
+ * @param associatedData - Context the ciphertext is bound to (for example a field path).
196
+ * @returns Base64 ciphertext.
197
+ * @task T12867
198
+ */
199
+ export declare function sealWithGlobalKey(plaintext: string, key: Buffer, associatedData: string): string;
200
+ /**
201
+ * Decrypt a {@link sealWithGlobalKey} ciphertext.
202
+ *
203
+ * @param ciphertext - Base64 ciphertext.
204
+ * @param key - From {@link deriveGlobalKeyFromMaterial}.
205
+ * @param associatedData - The same context it was sealed with.
206
+ * @returns The plaintext, or `null` when the ciphertext is malformed, of an
207
+ * unknown version, or fails authentication (wrong key, id or context).
208
+ * @task T12867
209
+ */
210
+ export declare function openWithGlobalKey(ciphertext: string, key: Buffer, associatedData: string): string | null;
150
211
  /**
151
212
  * Encrypt a plaintext string using AES-256-GCM with a global, machine-bound key.
152
213
  *
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/crypto/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAqBH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAuID;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,IAAO,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,qCAAqC,IAAO,CAAC;AAK1D;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AA2BD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAqDlC;AAyCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/crypto/credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA2BH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,CAE1E;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAuKD;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,IAAO,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,qCAAqC,IAAO,CAAC;AAK1D;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,aAAa,CAAC;AAEhE;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AA2BD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAqDlC;AAuCD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,oBAAoB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3D,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAUnC;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAI3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAEhG;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,GACrB,MAAM,GAAG,IAAI,CASf;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAiBjB"}