@platless/axom-cli 0.6.36 → 0.6.52

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 (159) hide show
  1. package/README.md +7 -1
  2. package/dist/axom-patch/cli/README.md +31 -2
  3. package/dist/axom-patch/cli/account-limits/generate.py +2 -2
  4. package/dist/axom-patch/cli/claude-replay-lifecycle.json +16 -0
  5. package/dist/axom-patch/cli/codex-terminal-output.json +2 -2
  6. package/dist/axom-patch/cli/probes/claude-replay-lifecycle.mjs +31 -0
  7. package/dist/axom-patch/cli/probes/codex-terminal-output.mjs +1 -1
  8. package/dist/axom-patch/cli/probes/zcode-env-account.mjs +81 -0
  9. package/dist/axom-patch/cli/probes/zcode-subagent-subwork.mjs +7 -0
  10. package/dist/axom-patch/cli/qoder/dist/axom-acp-compat.mjs +137 -41
  11. package/dist/axom-patch/cli/qoder/releases/1.1.75.json +5 -88
  12. package/dist/axom-patch/cli/qoder-native-acp.json +23 -23
  13. package/dist/axom-patch/cli/runtime.json +3 -1
  14. package/dist/axom-patch/cli/zcode/env-account.mjs +13 -0
  15. package/dist/axom-patch/cli/zcode/generate-env-account.py +52 -0
  16. package/dist/axom-patch/cli/zcode-account-limits.json +7 -7
  17. package/dist/axom-patch/cli/zcode-env-account.json +58 -0
  18. package/dist/axom-patch/cli/zcode-models.json +9 -9
  19. package/dist/axom-patch/cli/zcode-subagent-subwork.json +10 -10
  20. package/dist/cli.js +9 -11
  21. package/dist/commands/auth.js +4 -1
  22. package/dist/commands/update.js +68 -7
  23. package/dist/commands/workstation.js +94 -223
  24. package/dist/commands/workstationRegistrations.js +116 -0
  25. package/dist/credentialBroker.js +13 -2
  26. package/dist/credentials.js +16 -0
  27. package/dist/install/claude/commands.js +2 -2
  28. package/dist/keepers/terminal/keeper.mjs +1089 -673
  29. package/dist/keepers/terminal/manifest.json +4 -4
  30. package/dist/native/darwin-x64/axom-quic +0 -0
  31. package/dist/workstation/acp/acpAgents.js +11 -4
  32. package/dist/workstation/acp/outbox.js +12 -5
  33. package/dist/workstation/acp/permission.js +2 -2
  34. package/dist/workstation/acp/processor/checkpoint.js +4 -3
  35. package/dist/workstation/acp/processor/control.js +2 -2
  36. package/dist/workstation/acp/processor/jsonrpc.js +8 -0
  37. package/dist/workstation/acp/processor/session.js +3 -2
  38. package/dist/workstation/acp/processor/state.js +1 -0
  39. package/dist/workstation/acp/processor/transport/local.js +19 -3
  40. package/dist/workstation/acp/processor/updates.js +25 -0
  41. package/dist/workstation/acp/processorSession.js +12 -1
  42. package/dist/workstation/acp/registry/catalog.js +6 -6
  43. package/dist/workstation/acp/test/keeperWorld.js +4 -3
  44. package/dist/workstation/agentSessions.js +76 -23
  45. package/dist/workstation/channels/agent.js +9 -1
  46. package/dist/workstation/channels/computer.js +27 -4
  47. package/dist/workstation/channels/management.js +36 -5
  48. package/dist/workstation/config.js +18 -6
  49. package/dist/workstation/control/bindingStore.js +4 -0
  50. package/dist/workstation/control/commands.js +1 -0
  51. package/dist/workstation/control/daemonIdentity.js +90 -0
  52. package/dist/workstation/control/deviceCommands.js +191 -0
  53. package/dist/workstation/control/deviceProtocol.js +68 -0
  54. package/dist/workstation/control/locks.js +51 -4
  55. package/dist/workstation/control/rootFormat.js +16 -0
  56. package/dist/workstation/control/runtimeClient.js +60 -5
  57. package/dist/workstation/control/runtimeHost.js +96 -9
  58. package/dist/workstation/control/serverIdentity.js +2 -2
  59. package/dist/workstation/control/updateTransition.js +91 -0
  60. package/dist/workstation/daemon.js +262 -360
  61. package/dist/workstation/daemonctl.js +150 -12
  62. package/dist/workstation/desktopControl/automationDevice.js +219 -0
  63. package/dist/workstation/desktopControl/automationJson.js +74 -0
  64. package/dist/workstation/desktopControl/automationLocalState.js +23 -0
  65. package/dist/workstation/desktopControl/automationPreparation.js +1 -0
  66. package/dist/workstation/desktopControl/automationProtocol.js +253 -0
  67. package/dist/workstation/desktopControl/automationSchema.generated.js +1 -0
  68. package/dist/workstation/desktopControl/automationSession.js +81 -0
  69. package/dist/workstation/desktopControl/automationTransport.js +138 -0
  70. package/dist/workstation/desktopControl/capabilities.js +2 -1
  71. package/dist/workstation/desktopControl/deviceAdmission.js +229 -0
  72. package/dist/workstation/desktopControl/deviceOwnership.js +130 -0
  73. package/dist/workstation/desktopControl/deviceSockets.js +2 -2
  74. package/dist/workstation/desktopControl/helperProcess.js +250 -1
  75. package/dist/workstation/desktopControl/hostGrant.js +65 -0
  76. package/dist/workstation/desktopControl/lobby.js +4 -2
  77. package/dist/workstation/desktopControl/macProvider.js +41 -40
  78. package/dist/workstation/desktopControl/nativeDeviceAdmission.js +207 -0
  79. package/dist/workstation/desktopControl/nativeProvider.js +31 -5
  80. package/dist/workstation/desktopControl/ownershipProtocol.js +31 -0
  81. package/dist/workstation/desktopControl/protocol.js +15 -6
  82. package/dist/workstation/desktopControl/supervisor.js +110 -17
  83. package/dist/workstation/desktopControl/wallpaper.js +26 -6
  84. package/dist/workstation/exec/policy.js +5 -0
  85. package/dist/workstation/files/client.js +10 -1
  86. package/dist/workstation/files/host.js +9 -2
  87. package/dist/workstation/journal.js +5 -2
  88. package/dist/workstation/keepers/acp/client.js +38 -2
  89. package/dist/workstation/keepers/kit/buildVersion.js +35 -11
  90. package/dist/workstation/keepers/kit/client.js +2 -2
  91. package/dist/workstation/keepers/kit/launcher.js +80 -4
  92. package/dist/workstation/keepers/legacy.js +16 -2
  93. package/dist/workstation/keepers/policy.js +5 -34
  94. package/dist/workstation/keepers/terminal/client.js +115 -23
  95. package/dist/workstation/keepers/terminal/exec.js +6 -3
  96. package/dist/workstation/keepers/terminal/frames.js +73 -0
  97. package/dist/workstation/keepers/terminal/generations.js +5 -8
  98. package/dist/workstation/keepers/terminal/gridProtocol.js +16 -0
  99. package/dist/workstation/keepers/terminal/input.js +146 -0
  100. package/dist/workstation/keepers/terminal/keeper.js +22 -8
  101. package/dist/workstation/keepers/terminal/main.js +1 -1
  102. package/dist/workstation/keepers/terminal/metadata.js +138 -0
  103. package/dist/workstation/keepers/terminal/protocol.js +4 -28
  104. package/dist/workstation/keepers/terminal/pty.js +1 -330
  105. package/dist/workstation/keepers/terminal/screen.js +246 -0
  106. package/dist/workstation/keepers/terminal/sessions.js +526 -0
  107. package/dist/workstation/oauth/deviceAuthorization.js +31 -17
  108. package/dist/workstation/protocol/management.js +23 -4
  109. package/dist/workstation/rd/artifact.js +4 -3
  110. package/dist/workstation/rd/control.js +3 -5
  111. package/dist/workstation/rd/host.js +213 -0
  112. package/dist/workstation/rd/migrationReadiness.js +46 -0
  113. package/dist/workstation/rd/provider.js +44 -10
  114. package/dist/workstation/rd/state.js +14 -2
  115. package/dist/workstation/rd/update.js +5 -8
  116. package/dist/workstation/rd/upkeep.js +44 -2
  117. package/dist/workstation/registrations/enrollment.js +250 -0
  118. package/dist/workstation/registrations/enrollmentPending.js +361 -0
  119. package/dist/workstation/registrations/migration.js +356 -0
  120. package/dist/workstation/registrations/model.js +34 -0
  121. package/dist/workstation/registrations/removal.js +222 -0
  122. package/dist/workstation/registrations/store.js +737 -0
  123. package/dist/workstation/runtime/desktopBinding.js +20 -0
  124. package/dist/workstation/runtime/deviceDesktop.js +193 -0
  125. package/dist/workstation/runtime/deviceRuntime.js +568 -0
  126. package/dist/workstation/runtime/deviceServices.js +117 -0
  127. package/dist/workstation/runtime/events.js +20 -0
  128. package/dist/workstation/runtime/ownership.js +100 -0
  129. package/dist/workstation/runtime/registrationRuntime.js +575 -0
  130. package/dist/workstation/runtime/remoteDesktopAdapter.js +186 -0
  131. package/dist/workstation/runtime/removalActivity.js +184 -0
  132. package/dist/workstation/service/installer.js +93 -1
  133. package/dist/workstation/service/launchd.js +1 -0
  134. package/dist/workstation/service/systemd.js +1 -0
  135. package/dist/workstation/systemMetrics.js +3 -0
  136. package/dist/workstation/tools/client.js +8 -27
  137. package/dist/workstation/tools/info.js +6 -13
  138. package/dist/workstation/tools/terminalRouter.js +17 -172
  139. package/dist/workstation/tools/validation.js +55 -1
  140. package/dist/workstation/update/archiveEvidence.js +206 -0
  141. package/dist/workstation/update/coordinator.js +34 -13
  142. package/dist/workstation/update/deviceCompatibility.js +119 -0
  143. package/dist/workstation/update/deviceCoordinator.js +369 -0
  144. package/dist/workstation/update/deviceHealth.js +104 -0
  145. package/dist/workstation/update/deviceHealthProtocol.js +26 -0
  146. package/dist/workstation/update/deviceRecoveryLifecycle.js +46 -0
  147. package/dist/workstation/update/deviceRollback.js +78 -0
  148. package/dist/workstation/update/globalInstall.js +80 -10
  149. package/dist/workstation/update/legacyBridge.js +414 -0
  150. package/dist/workstation/update/legacyOwner.js +39 -0
  151. package/dist/workstation/update/npmInstaller.js +2 -2
  152. package/dist/workstation/update/privateDurability.js +61 -0
  153. package/dist/workstation/update/recoveryPlan.js +124 -0
  154. package/dist/workstation/update/runUpdate.js +7 -1
  155. package/dist/workstation/update/taskRegistry.js +161 -3
  156. package/dist/workstation/update/watchdog.js +27427 -14410
  157. package/dist/workstation/update/watchdogProcess.js +72 -0
  158. package/package.json +7 -3
  159. package/dist/native/darwin-arm64/axom-quic +0 -0
@@ -0,0 +1,20 @@
1
+ export async function holdDesktopForTargetProbe(adapter) { await adapter?.holdNewAdmission(); }
2
+ export async function replaceDesktopBinding(options) {
3
+ await options.original?.closeAdmission();
4
+ await options.original?.isolateOriginal();
5
+ options.original?.admission.dispose();
6
+ if (options.final())
7
+ return;
8
+ const next = options.create();
9
+ if (next && !options.allowed())
10
+ await next.closeAdmission();
11
+ if (next && options.held?.())
12
+ await next.holdNewAdmission();
13
+ if (options.final()) {
14
+ await next?.closeAdmission();
15
+ await next?.isolateOriginal();
16
+ next?.admission.dispose();
17
+ return;
18
+ }
19
+ return next;
20
+ }
@@ -0,0 +1,193 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ export async function resolveDeviceDesktop(root) {
5
+ if (process.platform === 'linux') {
6
+ const { LinuxDeviceHost } = await import('../rd/host.js');
7
+ const pending = await LinuxDeviceHost.recoverPending(root);
8
+ if (pending)
9
+ return { cleanupOnly: true, provider: { deviceAdmission: pending.admission, probe: async () => null,
10
+ prepare: async () => { throw Error('cleanup_only'); }, recoverDisplay: async () => { throw Error('cleanup_only'); } },
11
+ stopOriginal: () => pending.stopOriginal(), finalizeOriginal: () => pending.finalizeOriginal() };
12
+ }
13
+ if (process.platform === 'darwin' || process.platform === 'linux') {
14
+ const cleanup = path.join(root, 'desktop-cleanup');
15
+ let files = [];
16
+ try {
17
+ const stat = await fs.lstat(cleanup);
18
+ if (!stat.isDirectory() || stat.uid !== process.getuid?.() || stat.mode & 0o077)
19
+ throw new Error('unsafe_desktop_cleanup');
20
+ files = (await fs.readdir(cleanup)).sort();
21
+ }
22
+ catch (error) {
23
+ if (error.code !== 'ENOENT')
24
+ throw error;
25
+ }
26
+ if (files.length) {
27
+ const first = files[0];
28
+ if (!/^[a-f0-9]{32}\.json$/.test(first))
29
+ throw new Error('unsafe_desktop_cleanup');
30
+ if (process.platform === 'darwin') {
31
+ const { MacProvider } = await import('../desktopControl/macProvider.js');
32
+ return { provider: await MacProvider.connect(root, path.join(cleanup, first)), cleanupOnly: true };
33
+ }
34
+ const { readDeviceHostGrant } = await import('../desktopControl/hostGrant.js');
35
+ const { NativeDeviceAdmission } = await import('../desktopControl/nativeDeviceAdmission.js');
36
+ const grant = await readDeviceHostGrant(path.join(cleanup, first), true);
37
+ const admission = await NativeDeviceAdmission.connect(grant);
38
+ if (admission.hostLifetimeId !== grant.hostGeneration)
39
+ throw Error('original_native_host_unconfirmed');
40
+ return { cleanupOnly: true, provider: { deviceAdmission: admission, probe: async () => null,
41
+ prepare: async () => { throw Error('cleanup_only'); }, recoverDisplay: async () => { throw Error('cleanup_only'); } } };
42
+ }
43
+ }
44
+ if (process.platform === 'darwin') {
45
+ const { MacProvider } = await import('../desktopControl/macProvider.js');
46
+ try {
47
+ await fs.lstat(path.join(root, 'desktop-provider.json'));
48
+ }
49
+ catch (error) {
50
+ if (error.code === 'ENOENT')
51
+ return;
52
+ throw error;
53
+ }
54
+ return { provider: await MacProvider.connect(root), cleanupOnly: false };
55
+ }
56
+ if (process.platform === 'linux') {
57
+ const { LinuxDesktopProvider } = await import('../rd/provider.js');
58
+ const provider = await LinuxDesktopProvider.connect(root);
59
+ return provider ? { provider, cleanupOnly: false, stopOriginal: () => provider.stopOriginal(), finalizeOriginal: () => provider.finalizeOriginal(), retirementRequired: () => provider.retirementRequired() } : undefined;
60
+ }
61
+ return undefined;
62
+ }
63
+ export class DeviceDesktopRuntime {
64
+ root;
65
+ owner;
66
+ resolve;
67
+ original;
68
+ published;
69
+ retired = false;
70
+ unknown = false;
71
+ nativeConsumers = 0;
72
+ busy;
73
+ consumers = new Map();
74
+ timer;
75
+ stopped = false;
76
+ finalAcknowledgements = new Set();
77
+ pendingFinalizer;
78
+ constructor(root, owner, resolve = resolveDeviceDesktop) {
79
+ this.root = root;
80
+ this.owner = owner;
81
+ this.resolve = resolve;
82
+ }
83
+ get provider() { return this.published; }
84
+ facts() { return { deviceEpoch: this.owner.snapshot().deviceEpoch, hostLifetimeId: this.original?.provider.deviceAdmission?.hostLifetimeId ?? null, hostRetired: this.retired }; }
85
+ activity() {
86
+ const activity = [...this.consumers.values()].map(consumer => consumer.activity());
87
+ return { known: !this.unknown && activity.every(value => value.known),
88
+ consumers: Math.max(this.unknown ? 1 : 0, this.nativeConsumers, ...activity.map(value => value.consumers), 0) };
89
+ }
90
+ async watch(id, consumer) {
91
+ this.consumers.set(id, consumer);
92
+ await consumer.bind(this.published);
93
+ return () => { if (this.consumers.get(id) === consumer)
94
+ this.consumers.delete(id); };
95
+ }
96
+ async start() {
97
+ await this.refresh();
98
+ if (!this.stopped) {
99
+ this.timer = setInterval(() => { void this.refresh(); }, 1000);
100
+ this.timer.unref();
101
+ }
102
+ }
103
+ refresh() {
104
+ if (this.busy)
105
+ return this.busy;
106
+ const current = this.tick().catch(() => { this.unknown = true; }).finally(() => { if (this.busy === current)
107
+ this.busy = undefined; });
108
+ this.busy = current;
109
+ return current;
110
+ }
111
+ async tick() {
112
+ for (const original of [...this.finalAcknowledgements])
113
+ try {
114
+ await original.acknowledgeHostRetirement(randomUUID());
115
+ this.finalAcknowledgements.delete(original);
116
+ }
117
+ catch { }
118
+ if (this.pendingFinalizer) {
119
+ await this.pendingFinalizer();
120
+ this.pendingFinalizer = undefined;
121
+ this.unknown = false;
122
+ }
123
+ if (!this.original || this.retired) {
124
+ const next = this.stopped ? undefined : await this.resolve(this.root);
125
+ if (!next)
126
+ return;
127
+ if (next.provider.deviceAdmission?.hostLifetimeId === this.original?.provider.deviceAdmission?.hostLifetimeId) {
128
+ if (this.retired && next.finalizeOriginal) {
129
+ this.pendingFinalizer = next.finalizeOriginal;
130
+ await this.pendingFinalizer();
131
+ this.pendingFinalizer = undefined;
132
+ this.unknown = false;
133
+ }
134
+ return;
135
+ }
136
+ this.original = next;
137
+ this.retired = false;
138
+ }
139
+ const candidate = this.original;
140
+ if (!candidate)
141
+ return;
142
+ const original = candidate.provider.deviceAdmission;
143
+ if (!original?.status || !original.retireHost)
144
+ throw new Error('unqualified_native_host');
145
+ const status = await original.status();
146
+ this.nativeConsumers = Math.max(status.workers, status.operations, Number(status.active));
147
+ const epoch = this.owner.snapshot().deviceEpoch;
148
+ const retiring = this.stopped || candidate.cleanupOnly || await candidate.retirementRequired?.() === true || !status.connected || status.deviceEpoch !== null && status.deviceEpoch !== epoch ||
149
+ status.deviceEpoch === null && !status.quiescent ||
150
+ status.rotationRequired && status.quiescent && this.owner.snapshot().state === 'free' && [...this.consumers.values()].every(value => { const activity = value.activity(); return activity.known && activity.consumers === 0; });
151
+ if (retiring) {
152
+ this.published = undefined;
153
+ original.retire();
154
+ const results = await Promise.allSettled([...this.consumers.values()].map(consumer => consumer.bind(undefined)));
155
+ if (candidate.stopOriginal)
156
+ try {
157
+ await candidate.stopOriginal();
158
+ }
159
+ catch { }
160
+ if (results.some(result => result.status === 'rejected'))
161
+ throw new Error('original_desktop_cleanup_unconfirmed');
162
+ await original.retireHost(randomUUID());
163
+ if (this.finalAcknowledgements.size >= 32)
164
+ this.finalAcknowledgements.delete(this.finalAcknowledgements.values().next().value);
165
+ this.retired = true;
166
+ this.unknown = false;
167
+ this.nativeConsumers = 0;
168
+ this.finalAcknowledgements.add(original);
169
+ try {
170
+ await original.acknowledgeHostRetirement(randomUUID());
171
+ this.finalAcknowledgements.delete(original);
172
+ }
173
+ catch { }
174
+ if (candidate.finalizeOriginal) {
175
+ this.pendingFinalizer = candidate.finalizeOriginal;
176
+ await this.pendingFinalizer();
177
+ this.pendingFinalizer = undefined;
178
+ }
179
+ return;
180
+ }
181
+ if (!original.current())
182
+ throw new Error('original_desktop_cleanup_unconfirmed');
183
+ if (this.published !== candidate.provider) {
184
+ await original.bindDeviceEpoch(randomUUID(), epoch);
185
+ const results = await Promise.allSettled([...this.consumers.values()].map(consumer => consumer.bind(candidate.provider)));
186
+ if (results.some(result => result.status === 'rejected'))
187
+ throw new Error('desktop_rebind_unconfirmed');
188
+ this.published = candidate.provider;
189
+ }
190
+ this.unknown = false;
191
+ }
192
+ async stop() { this.stopped = true; clearInterval(this.timer); await this.busy; await this.refresh(); }
193
+ }