@phnx-labs/agents-cli 1.22.84 → 1.22.86

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 (259) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +80 -53
  3. package/dist/bootstrap.d.ts +7 -6
  4. package/dist/bootstrap.js +20 -27
  5. package/dist/cli/command-registry.js +5 -1
  6. package/dist/commands/accounts.d.ts +6 -13
  7. package/dist/commands/accounts.js +330 -143
  8. package/dist/commands/alias.js +7 -3
  9. package/dist/commands/apply.js +1 -1
  10. package/dist/commands/auth-mint.d.ts +7 -3
  11. package/dist/commands/auth-mint.js +21 -9
  12. package/dist/commands/auth.js +2 -3
  13. package/dist/commands/browser.js +10 -10
  14. package/dist/commands/daemon.d.ts +7 -3
  15. package/dist/commands/daemon.js +40 -25
  16. package/dist/commands/doctor.js +28 -2
  17. package/dist/commands/exec.js +87 -39
  18. package/dist/commands/fleet-capture.js +21 -2
  19. package/dist/commands/harness-wizard.js +2 -2
  20. package/dist/commands/lease.js +7 -12
  21. package/dist/commands/profiles.d.ts +2 -2
  22. package/dist/commands/profiles.js +20 -13
  23. package/dist/commands/repo.js +3 -3
  24. package/dist/commands/run-account-picker.d.ts +3 -3
  25. package/dist/commands/run-account-picker.js +29 -30
  26. package/dist/commands/secrets-passthrough.d.ts +20 -0
  27. package/dist/commands/secrets-passthrough.js +43 -0
  28. package/dist/commands/setup-accounts.d.ts +3 -2
  29. package/dist/commands/setup-accounts.js +4 -4
  30. package/dist/commands/setup-secrets.d.ts +16 -21
  31. package/dist/commands/setup-secrets.js +43 -224
  32. package/dist/commands/ssh.js +2 -2
  33. package/dist/commands/sync.js +1 -1
  34. package/dist/commands/update.d.ts +10 -0
  35. package/dist/commands/update.js +43 -40
  36. package/dist/commands/versions.d.ts +11 -11
  37. package/dist/commands/versions.js +131 -83
  38. package/dist/commands/view.d.ts +1 -9
  39. package/dist/commands/view.js +41 -55
  40. package/dist/commands/webhook.js +5 -5
  41. package/dist/commands/workflows.js +2 -1
  42. package/dist/index.d.ts +12 -12
  43. package/dist/index.js +13 -42
  44. package/dist/lib/account-capabilities.d.ts +1 -1
  45. package/dist/lib/account-capabilities.js +1 -1
  46. package/dist/lib/account-catalog.d.ts +121 -6
  47. package/dist/lib/account-catalog.js +421 -7
  48. package/dist/lib/account-registry.d.ts +8 -30
  49. package/dist/lib/account-registry.js +36 -79
  50. package/dist/lib/account-schema.d.ts +1 -1
  51. package/dist/lib/account-schema.js +1 -1
  52. package/dist/lib/accounting/account-pool-collect.js +16 -4
  53. package/dist/lib/accounting/rotate.d.ts +20 -7
  54. package/dist/lib/accounting/rotate.js +89 -13
  55. package/dist/lib/accounting/usage.js +11 -16
  56. package/dist/lib/accounts/add.d.ts +138 -0
  57. package/dist/lib/accounts/add.js +651 -0
  58. package/dist/lib/accounts/migrate.d.ts +117 -0
  59. package/dist/lib/accounts/migrate.js +536 -0
  60. package/dist/lib/accounts/slots.d.ts +13 -0
  61. package/dist/lib/accounts/slots.js +100 -0
  62. package/dist/lib/agent-spec/agents.d.ts +16 -0
  63. package/dist/lib/agent-spec/agents.js +38 -4
  64. package/dist/lib/app-bundle-install.js +5 -4
  65. package/dist/lib/auth-health.d.ts +3 -0
  66. package/dist/lib/auth-health.js +11 -0
  67. package/dist/lib/auth-mint.d.ts +52 -16
  68. package/dist/lib/auth-mint.js +117 -39
  69. package/dist/lib/browser/chrome.d.ts +1 -1
  70. package/dist/lib/browser/chrome.js +5 -5
  71. package/dist/lib/byok-usage.js +3 -3
  72. package/dist/lib/claude-account-token.d.ts +47 -3
  73. package/dist/lib/claude-account-token.js +172 -50
  74. package/dist/lib/cloud/antigravity.js +4 -4
  75. package/dist/lib/cloud/cursor.js +4 -4
  76. package/dist/lib/crabbox/cli.d.ts +1 -1
  77. package/dist/lib/crabbox/cli.js +6 -6
  78. package/dist/lib/crabbox/runtimes.d.ts +3 -3
  79. package/dist/lib/crabbox/runtimes.js +5 -5
  80. package/dist/lib/daemon/account-state-daemon-service.d.ts +37 -1
  81. package/dist/lib/daemon/account-state-daemon-service.js +199 -3
  82. package/dist/lib/daemon/auth-sync-service.js +32 -1
  83. package/dist/lib/daemon/daemon.d.ts +6 -16
  84. package/dist/lib/daemon/daemon.js +52 -97
  85. package/dist/lib/daemon/daemon.test-fixture.d.ts +7 -9
  86. package/dist/lib/daemon/daemon.test-fixture.js +22 -40
  87. package/dist/lib/daemon/harness-update-service.d.ts +1 -1
  88. package/dist/lib/daemon/harness-update-service.js +1 -1
  89. package/dist/lib/daemon/runner.d.ts +15 -3
  90. package/dist/lib/daemon/runner.js +49 -24
  91. package/dist/lib/daemon-health.d.ts +1 -2
  92. package/dist/lib/daemon-health.js +7 -6
  93. package/dist/lib/daemon-services.d.ts +1 -1
  94. package/dist/lib/daemon-services.js +1 -11
  95. package/dist/lib/daemon-webhooks.d.ts +8 -7
  96. package/dist/lib/daemon-webhooks.js +10 -9
  97. package/dist/lib/device-config.js +1 -1
  98. package/dist/lib/devices/doctor-findings.d.ts +1 -1
  99. package/dist/lib/devices/harness-inventory.d.ts +39 -0
  100. package/dist/lib/devices/harness-inventory.js +126 -4
  101. package/dist/lib/doctor-diff.js +2 -1
  102. package/dist/lib/exec-account-home.d.ts +38 -0
  103. package/dist/lib/exec-account-home.js +164 -0
  104. package/dist/lib/exec.d.ts +30 -0
  105. package/dist/lib/exec.js +101 -31
  106. package/dist/lib/fleet/apply.d.ts +2 -2
  107. package/dist/lib/fleet/apply.js +4 -4
  108. package/dist/lib/fleet/auth-sync.js +4 -3
  109. package/dist/lib/fleet-shared-repo-sync.js +6 -9
  110. package/dist/lib/harness/adapter.d.ts +7 -7
  111. package/dist/lib/harness/adapter.js +10 -6
  112. package/dist/lib/harness/adapters/grok.js +8 -3
  113. package/dist/lib/harness/adapters/muse.js +1 -1
  114. package/dist/lib/harness/adapters/opencode.js +12 -3
  115. package/dist/lib/harness-auth-capabilities.d.ts +61 -0
  116. package/dist/lib/harness-auth-capabilities.js +52 -0
  117. package/dist/lib/helper-versions.d.ts +6 -4
  118. package/dist/lib/helper-versions.js +5 -4
  119. package/dist/lib/hosts/credential-transport.d.ts +10 -0
  120. package/dist/lib/hosts/credential-transport.js +37 -0
  121. package/dist/lib/hosts/dispatch.d.ts +7 -0
  122. package/dist/lib/hosts/dispatch.js +13 -6
  123. package/dist/lib/identity/client.d.ts +3 -3
  124. package/dist/lib/identity/client.js +3 -3
  125. package/dist/lib/installations/index.d.ts +1 -1
  126. package/dist/lib/installations/index.js +1 -1
  127. package/dist/lib/installations/migrate.js +9 -0
  128. package/dist/lib/installations/resolve.js +1 -1
  129. package/dist/lib/installations/shims.d.ts +21 -4
  130. package/dist/lib/installations/shims.js +86 -5
  131. package/dist/lib/installations/store.d.ts +43 -0
  132. package/dist/lib/installations/store.js +75 -7
  133. package/dist/lib/installations/versions.js +1 -1
  134. package/dist/lib/menubar/install-menubar.d.ts +3 -3
  135. package/dist/lib/menubar/install-menubar.js +3 -3
  136. package/dist/lib/native-accounts.d.ts +35 -0
  137. package/dist/lib/native-accounts.js +41 -0
  138. package/dist/lib/net-close.d.ts +11 -0
  139. package/dist/lib/net-close.js +25 -0
  140. package/dist/lib/openclaw-keychain.js +27 -1
  141. package/dist/lib/profiles.js +22 -9
  142. package/dist/lib/project-resources.js +1 -1
  143. package/dist/lib/reserved-stores.d.ts +53 -0
  144. package/dist/lib/reserved-stores.js +120 -0
  145. package/dist/lib/secrets-client.d.ts +199 -0
  146. package/dist/lib/secrets-client.js +718 -0
  147. package/dist/lib/secrets-policy.d.ts +235 -0
  148. package/dist/lib/secrets-policy.js +505 -0
  149. package/dist/lib/secrets-types.d.ts +188 -0
  150. package/dist/lib/secrets-types.js +24 -0
  151. package/dist/lib/self-heal/checks/shims.js +5 -3
  152. package/dist/lib/service-manifest.js +3 -4
  153. package/dist/lib/session/db.d.ts +18 -0
  154. package/dist/lib/session/db.js +47 -14
  155. package/dist/lib/session/sync/config.js +2 -2
  156. package/dist/lib/sha256-asset.d.ts +11 -16
  157. package/dist/lib/sha256-asset.js +11 -16
  158. package/dist/lib/share/config.js +14 -5
  159. package/dist/lib/signin-badge.d.ts +26 -0
  160. package/dist/lib/signin-badge.js +42 -0
  161. package/dist/lib/staleness/detectors/workflows.js +3 -105
  162. package/dist/lib/staleness/writers/workflows.js +2 -1
  163. package/dist/lib/state.d.ts +7 -4
  164. package/dist/lib/state.js +18 -7
  165. package/dist/lib/sync-umbrella.js +2 -2
  166. package/dist/lib/teams/agents.js +1 -1
  167. package/dist/lib/types.d.ts +74 -33
  168. package/dist/lib/view-types.d.ts +6 -3
  169. package/dist/lib/workflows-registry.d.ts +71 -0
  170. package/dist/lib/workflows-registry.js +280 -0
  171. package/dist/lib/workflows.d.ts +21 -21
  172. package/dist/lib/workflows.js +12 -327
  173. package/package.json +2 -3
  174. package/scripts/postinstall.js +35 -30
  175. package/dist/commands/secrets-import.d.ts +0 -18
  176. package/dist/commands/secrets-import.js +0 -74
  177. package/dist/commands/secrets-migrate.d.ts +0 -25
  178. package/dist/commands/secrets-migrate.js +0 -334
  179. package/dist/commands/secrets-rotate-passphrase.d.ts +0 -17
  180. package/dist/commands/secrets-rotate-passphrase.js +0 -96
  181. package/dist/commands/secrets-sync.d.ts +0 -11
  182. package/dist/commands/secrets-sync.js +0 -153
  183. package/dist/commands/secrets-vault.d.ts +0 -10
  184. package/dist/commands/secrets-vault.js +0 -130
  185. package/dist/commands/secrets.d.ts +0 -212
  186. package/dist/commands/secrets.js +0 -3030
  187. package/dist/lib/accounts/connect.d.ts +0 -176
  188. package/dist/lib/accounts/connect.js +0 -453
  189. package/dist/lib/daemon/keychain-reap-service.d.ts +0 -17
  190. package/dist/lib/daemon/keychain-reap-service.js +0 -32
  191. package/dist/lib/daemon/secrets-broker-service.d.ts +0 -21
  192. package/dist/lib/daemon/secrets-broker-service.js +0 -51
  193. package/dist/lib/secrets/agent.d.ts +0 -358
  194. package/dist/lib/secrets/agent.js +0 -1291
  195. package/dist/lib/secrets/audit.d.ts +0 -46
  196. package/dist/lib/secrets/audit.js +0 -101
  197. package/dist/lib/secrets/bundles.d.ts +0 -290
  198. package/dist/lib/secrets/bundles.js +0 -1547
  199. package/dist/lib/secrets/download-keychain.d.ts +0 -47
  200. package/dist/lib/secrets/download-keychain.js +0 -70
  201. package/dist/lib/secrets/drivers/rush.d.ts +0 -14
  202. package/dist/lib/secrets/drivers/rush.js +0 -90
  203. package/dist/lib/secrets/fallback.d.ts +0 -48
  204. package/dist/lib/secrets/fallback.js +0 -48
  205. package/dist/lib/secrets/filestore.d.ts +0 -222
  206. package/dist/lib/secrets/filestore.js +0 -1099
  207. package/dist/lib/secrets/headless.d.ts +0 -43
  208. package/dist/lib/secrets/headless.js +0 -56
  209. package/dist/lib/secrets/icloud-import.d.ts +0 -79
  210. package/dist/lib/secrets/icloud-import.js +0 -206
  211. package/dist/lib/secrets/index.d.ts +0 -451
  212. package/dist/lib/secrets/index.js +0 -1568
  213. package/dist/lib/secrets/install-helper.d.ts +0 -72
  214. package/dist/lib/secrets/install-helper.js +0 -245
  215. package/dist/lib/secrets/lease.d.ts +0 -25
  216. package/dist/lib/secrets/lease.js +0 -44
  217. package/dist/lib/secrets/linux.d.ts +0 -77
  218. package/dist/lib/secrets/linux.js +0 -393
  219. package/dist/lib/secrets/list-filter.d.ts +0 -109
  220. package/dist/lib/secrets/list-filter.js +0 -261
  221. package/dist/lib/secrets/mcp.d.ts +0 -93
  222. package/dist/lib/secrets/mcp.js +0 -211
  223. package/dist/lib/secrets/profiles.d.ts +0 -10
  224. package/dist/lib/secrets/profiles.js +0 -13
  225. package/dist/lib/secrets/push.d.ts +0 -133
  226. package/dist/lib/secrets/push.js +0 -273
  227. package/dist/lib/secrets/rc-hygiene.d.ts +0 -63
  228. package/dist/lib/secrets/rc-hygiene.js +0 -143
  229. package/dist/lib/secrets/read-backoff.d.ts +0 -27
  230. package/dist/lib/secrets/read-backoff.js +0 -64
  231. package/dist/lib/secrets/reaper.d.ts +0 -90
  232. package/dist/lib/secrets/reaper.js +0 -243
  233. package/dist/lib/secrets/remote.d.ts +0 -152
  234. package/dist/lib/secrets/remote.js +0 -344
  235. package/dist/lib/secrets/reserved-sync.d.ts +0 -66
  236. package/dist/lib/secrets/reserved-sync.js +0 -147
  237. package/dist/lib/secrets/scope.d.ts +0 -26
  238. package/dist/lib/secrets/scope.js +0 -29
  239. package/dist/lib/secrets/session-store.d.ts +0 -107
  240. package/dist/lib/secrets/session-store.js +0 -342
  241. package/dist/lib/secrets/sync-backend.d.ts +0 -48
  242. package/dist/lib/secrets/sync-backend.js +0 -13
  243. package/dist/lib/secrets/sync-commands.d.ts +0 -21
  244. package/dist/lib/secrets/sync-commands.js +0 -21
  245. package/dist/lib/secrets/sync.d.ts +0 -48
  246. package/dist/lib/secrets/sync.js +0 -237
  247. package/dist/lib/secrets/unlock-hints.d.ts +0 -27
  248. package/dist/lib/secrets/unlock-hints.js +0 -36
  249. package/dist/lib/secrets/usage-db.d.ts +0 -46
  250. package/dist/lib/secrets/usage-db.js +0 -96
  251. package/dist/lib/secrets/vault-age-helper.d.ts +0 -1
  252. package/dist/lib/secrets/vault-age-helper.js +0 -34
  253. package/dist/lib/secrets/vault.d.ts +0 -49
  254. package/dist/lib/secrets/vault.js +0 -399
  255. package/dist/lib/secrets/windows.d.ts +0 -81
  256. package/dist/lib/secrets/windows.js +0 -556
  257. package/scripts/install-helper.js +0 -97
  258. /package/dist/lib/{secrets/sync-passphrase.d.ts → sync-passphrase.d.ts} +0 -0
  259. /package/dist/lib/{secrets/sync-passphrase.js → sync-passphrase.js} +0 -0
@@ -0,0 +1,235 @@
1
+ import { type SecretsContext } from './secrets-client.js';
2
+ import type { PushBundleResult } from './secrets-types.js';
3
+ import type { AgentId, Meta, NativeAccountRecord } from './types.js';
4
+ import { type DeviceProfile } from './devices/registry.js';
5
+ import { type SharedAuthStatus } from './fleet-shared-state.js';
6
+ import { selfConfiguredDeviceRole } from './device-config.js';
7
+ import { AUTH_STORE_ALIAS, AUTH_BUNDLE_NAME, AUTH_BUNDLE_BACKEND, RESERVED_BUNDLE_NAMES, isReservedBundleName, ReservedBundleWrongBackendError, assertReservedAuthBackend, isReservedBundleBackendError, RESERVED_STORES, reservedStoreName, isReservedStoreName, assertStorableCredentialKind, inspectReservedAuthBundle, type StorableCredentialKind } from './reserved-stores.js';
8
+ export { AUTH_STORE_ALIAS, AUTH_BUNDLE_NAME, AUTH_BUNDLE_BACKEND, RESERVED_BUNDLE_NAMES, isReservedBundleName, ReservedBundleWrongBackendError, assertReservedAuthBackend, isReservedBundleBackendError, RESERVED_STORES, reservedStoreName, isReservedStoreName, assertStorableCredentialKind, inspectReservedAuthBundle, type StorableCredentialKind, };
9
+ /** Filter `names` down to the ones the active resource profile allows for `secrets`. */
10
+ export declare function filterBundleNamesForActiveProfile(names: string[]): string[];
11
+ /**
12
+ * `SecretsContext.allowedBundles` for the active resource profile, or
13
+ * `undefined` when no profile is active (full trust — the client's default).
14
+ * `allNames` is the caller's already-fetched full bundle listing (e.g. from
15
+ * `listBundlesSync()`), so this stays a pure filter with no extra round trip.
16
+ */
17
+ export declare function resolveAllowedBundlesForActiveProfile(allNames: string[]): string[] | undefined;
18
+ /**
19
+ * The `SecretsContext` a run should pass to every bundle resolution it makes:
20
+ * the run's harness as the opaque `scope`, plus `allowedBundles` computed from
21
+ * a fresh full bundle listing when a resource profile is active (a stale
22
+ * listing could exclude a bundle created after the profile was set). No
23
+ * profile active means full trust and no extra round trip.
24
+ */
25
+ export declare function resolveSecretsContextForRun(scope?: string): Promise<SecretsContext | undefined>;
26
+ /** Parse a `--secrets` flag value into its bundle name and optional `@host`. */
27
+ export declare function splitBundleRef(ref: string): {
28
+ bundle: string;
29
+ host?: string;
30
+ };
31
+ /** A remote (bundle@host) reference does not yet support key-subset or expiry overrides. */
32
+ export declare function assertRemoteBundleFlagsUnsupported(bundleName: string, host: string, opts: {
33
+ keys?: string[];
34
+ allowExpired?: boolean;
35
+ }, flagLabels: {
36
+ keysFlag: string;
37
+ allowExpiredFlag: string;
38
+ }): void;
39
+ /** Each import/read-back SSH operation gets this deadline plus the SSH hard-kill grace. */
40
+ export declare const AUTH_SYNC_PUSH_DEADLINE_MS = 20000;
41
+ export interface AuthSyncDevice {
42
+ name: string;
43
+ reachable: boolean;
44
+ pinned: boolean;
45
+ remoteAuth: SharedAuthStatus | 'unknown';
46
+ }
47
+ export type AuthSyncPlanItem = {
48
+ action: 'push';
49
+ device: string;
50
+ } | {
51
+ action: 'skip';
52
+ device: string;
53
+ reason: string;
54
+ };
55
+ export declare function planAuthBundlePush(localAuthOk: boolean, localIsPublisher: boolean, devices: AuthSyncDevice[]): AuthSyncPlanItem[];
56
+ export interface AuthSyncResult {
57
+ publisher: string | null;
58
+ stateChanged: boolean;
59
+ pushed: string[];
60
+ skipped: Array<{
61
+ device: string;
62
+ reason: string;
63
+ }>;
64
+ errors: Array<{
65
+ device: string;
66
+ message: string;
67
+ }>;
68
+ }
69
+ export interface AuthSyncDeps {
70
+ inspectLocal?: () => {
71
+ exists: boolean;
72
+ ok: boolean;
73
+ };
74
+ listDevices?: () => DeviceProfile[];
75
+ localName?: string;
76
+ userAgentsDir?: string;
77
+ isPinned?: (name: string) => boolean;
78
+ peerRole?: (name: string) => ReturnType<typeof selfConfiguredDeviceRole>;
79
+ selfRole?: () => ReturnType<typeof selfConfiguredDeviceRole>;
80
+ push?: (bundle: string, host: string) => Promise<PushBundleResult>;
81
+ sshTarget?: (device: DeviceProfile) => string;
82
+ }
83
+ /**
84
+ * The one device that pushes credentials this tick. A ready HEADED device
85
+ * (`personal`/`desktop`) wins over any ready worker: the headed box is where
86
+ * tokens are minted (invariant 7), so it is the copy of record; a worker holds
87
+ * only what was once pushed to it. Name order breaks ties so every box elects
88
+ * the same publisher from the same shared verdicts. Before this rule the sort
89
+ * was by name alone, which elected `mac-mini` (a worker with a 6-day-old copy)
90
+ * over `zion`, and zion then skipped every peer as a non-publisher.
91
+ */
92
+ export declare function electPublisher(ready: readonly string[], roleOf: (name: string) => ReturnType<typeof selfConfiguredDeviceRole>): string | null;
93
+ export interface PublishAuthVerdictOptions {
94
+ inspectLocal?: () => {
95
+ exists: boolean;
96
+ ok: boolean;
97
+ };
98
+ localName?: string;
99
+ userAgentsDir?: string;
100
+ }
101
+ export interface PublishAuthVerdictResult {
102
+ device: string;
103
+ status: SharedAuthStatus;
104
+ changed: boolean;
105
+ error: string | null;
106
+ }
107
+ /** Publish only safe readiness metadata; useful immediately before a repo push. */
108
+ export declare function publishReservedAuthVerdict(options?: PublishAuthVerdictOptions): Promise<PublishAuthVerdictResult>;
109
+ /**
110
+ * Publish local readiness, elect one ready source, then asynchronously provision
111
+ * only peers whose shared verdict says the bundle is missing.
112
+ */
113
+ export declare function syncReservedAuthBundle(deps?: AuthSyncDeps): Promise<AuthSyncResult>;
114
+ /** One account's durable worker credential, resolved to (bundle, key). */
115
+ export interface ReservedSyncAccount {
116
+ accountId: string;
117
+ harness: AgentId;
118
+ /** Reserved store `__<harness>__`, or the legacy `auth` alias for a pre-T1 claude row. */
119
+ bundle: string;
120
+ /** Storage key `<ENV>_<accountId>` (or the legacy email-keyed claude key). */
121
+ key: string;
122
+ /**
123
+ * `workerCredential.mintedAt` -- a re-mint bumps it, so a delivered-memo hit on
124
+ * the old value re-pushes. `'legacy'` for a pre-T1 claude row with no field.
125
+ */
126
+ fingerprint: string;
127
+ }
128
+ /** A peer as the plan sees it: its role, reachability, and the keys it is KNOWN to hold. */
129
+ export interface ReservedSyncPeer {
130
+ name: string;
131
+ /** `personal`/`desktop` -- receives the account row, never a durable key. */
132
+ headed: boolean;
133
+ reachable: boolean;
134
+ pinned: boolean;
135
+ /** bundle -> keys the peer already holds at the current fingerprint. Absent ⇒ none known. */
136
+ presentKeys: Record<string, ReadonlySet<string>>;
137
+ }
138
+ export type ReservedSyncPlanItem = {
139
+ action: 'push';
140
+ device: string;
141
+ bundle: string;
142
+ keys: string[];
143
+ } | {
144
+ action: 'skip';
145
+ device: string;
146
+ reason: string;
147
+ };
148
+ /**
149
+ * Pure plan: for each worker peer, push each bundle it is missing at least one
150
+ * key of. Deterministic (peers and bundles sorted) so it pins exactly in tests.
151
+ * A headed peer is skipped BEFORE any key comparison -- it never receives a key.
152
+ */
153
+ export declare function planReservedStoreSync(accounts: ReservedSyncAccount[], peers: ReservedSyncPeer[]): ReservedSyncPlanItem[];
154
+ /**
155
+ * Every portable account's durable worker credential, resolved to (bundle, key).
156
+ * A T1 row carries `workerCredential`; a claude row predating T1 has none, so it
157
+ * falls back to the legacy `auth` bundle keyed by the account email -- the
158
+ * legacy fallback for claude rows that predate T1. An account with no derivable
159
+ * durable credential (per-device harness, or a non-claude row with no
160
+ * `workerCredential`) is not a sync target.
161
+ */
162
+ export declare function reservedSyncTargets(meta: Pick<Meta, 'accounts' | 'deviceAccounts'>): ReservedSyncAccount[];
163
+ export declare function readDeliveryMemo(root?: string): Record<string, string>;
164
+ /**
165
+ * The keys a peer is KNOWN to hold, per bundle, from what we have delivered to it
166
+ * (memo, matched by fingerprint) plus the coarse legacy-`auth` verdict: a peer
167
+ * reporting `auth.status === 'ready'` is known to hold every legacy `auth` key.
168
+ * Reserved `__<harness>__` bundles have no coarse verdict, so their presence comes
169
+ * from the memo alone -- which is what makes a newly-added reserved account push.
170
+ */
171
+ export declare function peerPresentKeys(peer: string, accounts: ReservedSyncAccount[], memo: Record<string, string>, legacyAuthReady: boolean): Record<string, ReadonlySet<string>>;
172
+ export interface ReservedStoreSyncResult {
173
+ publisher: string | null;
174
+ pushed: Array<{
175
+ device: string;
176
+ bundle: string;
177
+ keys: string[];
178
+ }>;
179
+ skipped: Array<{
180
+ device: string;
181
+ reason: string;
182
+ }>;
183
+ errors: Array<{
184
+ device: string;
185
+ message: string;
186
+ }>;
187
+ }
188
+ export interface ReservedStoreSyncDeps {
189
+ listDevices?: () => DeviceProfile[];
190
+ localName?: string;
191
+ userAgentsDir?: string;
192
+ cacheDir?: string;
193
+ readMetaFn?: () => Pick<Meta, 'accounts' | 'deviceAccounts'>;
194
+ isPinned?: (name: string) => boolean;
195
+ peerRole?: (name: string) => ReturnType<typeof selfConfiguredDeviceRole>;
196
+ selfRole?: () => ReturnType<typeof selfConfiguredDeviceRole>;
197
+ localReady?: boolean;
198
+ /** Does THIS publisher hold (bundle, key) to push? Defaults to a local bundle read. */
199
+ hasLocalKey?: (bundle: string, key: string) => boolean;
200
+ push?: (bundle: string, host: string) => Promise<PushBundleResult>;
201
+ sshTarget?: (device: DeviceProfile) => string;
202
+ }
203
+ /**
204
+ * Push every portable account's reserved store to the worker peers that are
205
+ * missing it, per key and per role. Reuses the same election as
206
+ * {@link syncReservedAuthBundle} (one deterministic ready publisher pushes) so
207
+ * there is no second scheduler. The daemon runs this each tick.
208
+ */
209
+ export declare function syncReservedStores(deps?: ReservedStoreSyncDeps): Promise<ReservedStoreSyncResult>;
210
+ export interface ReconcileWorkerSlotsResult {
211
+ provisioned: string[];
212
+ skipped: Array<{
213
+ accountId: string;
214
+ reason: string;
215
+ }>;
216
+ errors: Array<{
217
+ accountId: string;
218
+ message: string;
219
+ }>;
220
+ }
221
+ export interface ReconcileWorkerSlotsDeps {
222
+ selfRole?: ReturnType<typeof selfConfiguredDeviceRole>;
223
+ readMetaFn?: () => Pick<Meta, 'accounts' | 'deviceAccounts'>;
224
+ hasLocalKey?: (bundle: string, key: string) => boolean;
225
+ provision?: (account: NativeAccountRecord) => void;
226
+ }
227
+ /**
228
+ * Worker-side: after a durable key lands, materialize a slot for each portable
229
+ * account whose credential is now present locally. Runs only on a NON-headed
230
+ * (worker or unmarked) device -- a headed device provisions its slots from an
231
+ * interactive native login (`accounts add`), never from an injected durable key
232
+ * (invariant 7). Idempotent: an account already backed by a `durable` slot is
233
+ * skipped.
234
+ */
235
+ export declare function reconcileLocalWorkerSlots(deps?: ReconcileWorkerSlotsDeps): ReconcileWorkerSlotsResult;