@claudexor/cli 3.4.2 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/accounts-projection.d.ts +18 -12
  2. package/dist/accounts-projection.d.ts.map +1 -1
  3. package/dist/accounts-projection.js +63 -58
  4. package/dist/accounts-projection.js.map +1 -1
  5. package/dist/accounts-services.d.ts +134 -127
  6. package/dist/accounts-services.d.ts.map +1 -1
  7. package/dist/accounts-services.js +15 -7
  8. package/dist/accounts-services.js.map +1 -1
  9. package/dist/accounts-unified-migration.d.ts +110 -0
  10. package/dist/accounts-unified-migration.d.ts.map +1 -0
  11. package/dist/accounts-unified-migration.js +422 -0
  12. package/dist/accounts-unified-migration.js.map +1 -0
  13. package/dist/agy-quota-source.d.ts +36 -0
  14. package/dist/agy-quota-source.d.ts.map +1 -0
  15. package/dist/agy-quota-source.js +334 -0
  16. package/dist/agy-quota-source.js.map +1 -0
  17. package/dist/auth-login-harnesses.d.ts +13 -0
  18. package/dist/auth-login-harnesses.d.ts.map +1 -0
  19. package/dist/auth-login-harnesses.js +18 -0
  20. package/dist/auth-login-harnesses.js.map +1 -0
  21. package/dist/claude-oauth-usage.d.ts.map +1 -1
  22. package/dist/claude-oauth-usage.js +9 -3
  23. package/dist/claude-oauth-usage.js.map +1 -1
  24. package/dist/claude-statusline.d.ts.map +1 -1
  25. package/dist/claude-statusline.js +14 -1
  26. package/dist/claude-statusline.js.map +1 -1
  27. package/dist/claudexord.d.ts.map +1 -1
  28. package/dist/claudexord.js +25 -37
  29. package/dist/claudexord.js.map +1 -1
  30. package/dist/codex-quota-source.d.ts.map +1 -1
  31. package/dist/codex-quota-source.js +8 -3
  32. package/dist/codex-quota-source.js.map +1 -1
  33. package/dist/command-registry.d.ts.map +1 -1
  34. package/dist/command-registry.js +2 -13
  35. package/dist/command-registry.js.map +1 -1
  36. package/dist/config-dir-login-harnesses.d.ts +7 -0
  37. package/dist/config-dir-login-harnesses.d.ts.map +1 -0
  38. package/dist/config-dir-login-harnesses.js +46 -0
  39. package/dist/config-dir-login-harnesses.js.map +1 -0
  40. package/dist/control-services.d.ts +203 -185
  41. package/dist/control-services.d.ts.map +1 -1
  42. package/dist/control-services.js +39 -118
  43. package/dist/control-services.js.map +1 -1
  44. package/dist/credential-commands.d.ts.map +1 -1
  45. package/dist/credential-commands.js +51 -34
  46. package/dist/credential-commands.js.map +1 -1
  47. package/dist/credential-profile-mutations.d.ts +63 -0
  48. package/dist/credential-profile-mutations.d.ts.map +1 -0
  49. package/dist/credential-profile-mutations.js +187 -0
  50. package/dist/credential-profile-mutations.js.map +1 -0
  51. package/dist/credential-status-invalidation.d.ts +11 -0
  52. package/dist/credential-status-invalidation.d.ts.map +1 -0
  53. package/dist/credential-status-invalidation.js +36 -0
  54. package/dist/credential-status-invalidation.js.map +1 -0
  55. package/dist/daemon-admission-runtime.d.ts +5 -0
  56. package/dist/daemon-admission-runtime.d.ts.map +1 -1
  57. package/dist/daemon-admission-runtime.js +1 -0
  58. package/dist/daemon-admission-runtime.js.map +1 -1
  59. package/dist/harness-command-specs.d.ts +17 -0
  60. package/dist/harness-command-specs.d.ts.map +1 -0
  61. package/dist/harness-command-specs.js +22 -0
  62. package/dist/harness-command-specs.js.map +1 -0
  63. package/dist/harness-command.d.ts +4 -4
  64. package/dist/harness-command.d.ts.map +1 -1
  65. package/dist/harness-command.js +6 -5
  66. package/dist/harness-command.js.map +1 -1
  67. package/dist/harness-installer.d.ts +23 -10
  68. package/dist/harness-installer.d.ts.map +1 -1
  69. package/dist/harness-installer.js +93 -33
  70. package/dist/harness-installer.js.map +1 -1
  71. package/dist/mcp-run-projections.d.ts +1 -1
  72. package/dist/native-login.d.ts +10 -1
  73. package/dist/native-login.d.ts.map +1 -1
  74. package/dist/native-login.js +61 -5
  75. package/dist/native-login.js.map +1 -1
  76. package/dist/ops-commands.d.ts +1 -2
  77. package/dist/ops-commands.d.ts.map +1 -1
  78. package/dist/ops-commands.js +6 -5
  79. package/dist/ops-commands.js.map +1 -1
  80. package/dist/profile-registration.d.ts +13 -1
  81. package/dist/profile-registration.d.ts.map +1 -1
  82. package/dist/profile-registration.js +79 -4
  83. package/dist/profile-registration.js.map +1 -1
  84. package/dist/quota-refreshers.d.ts +3 -0
  85. package/dist/quota-refreshers.d.ts.map +1 -1
  86. package/dist/quota-refreshers.js +2 -0
  87. package/dist/quota-refreshers.js.map +1 -1
  88. package/dist/quota-services.d.ts +4 -2
  89. package/dist/quota-services.d.ts.map +1 -1
  90. package/dist/quota-subject-universe.d.ts.map +1 -1
  91. package/dist/quota-subject-universe.js +11 -2
  92. package/dist/quota-subject-universe.js.map +1 -1
  93. package/dist/registry.d.ts +1 -1
  94. package/dist/registry.d.ts.map +1 -1
  95. package/dist/registry.js +3 -1
  96. package/dist/registry.js.map +1 -1
  97. package/dist/run-orchestrator.d.ts +28 -0
  98. package/dist/run-orchestrator.d.ts.map +1 -0
  99. package/dist/run-orchestrator.js +43 -0
  100. package/dist/run-orchestrator.js.map +1 -0
  101. package/dist/settings-service.d.ts +1 -1
  102. package/dist/settings-service.js +3 -3
  103. package/dist/settings-service.js.map +1 -1
  104. package/dist/setup-job-store.d.ts +4 -2
  105. package/dist/setup-job-store.d.ts.map +1 -1
  106. package/dist/setup-job-support.d.ts +50 -1
  107. package/dist/setup-job-support.d.ts.map +1 -1
  108. package/dist/setup-job-support.js +93 -11
  109. package/dist/setup-job-support.js.map +1 -1
  110. package/dist/setup-jobs.d.ts +8 -4
  111. package/dist/setup-jobs.d.ts.map +1 -1
  112. package/dist/setup-jobs.js +17 -18
  113. package/dist/setup-jobs.js.map +1 -1
  114. package/dist/setup-login-completion.d.ts.map +1 -1
  115. package/dist/setup-login-completion.js +16 -0
  116. package/dist/setup-login-completion.js.map +1 -1
  117. package/dist/setup-login-io.d.ts +7 -1
  118. package/dist/setup-login-io.d.ts.map +1 -1
  119. package/dist/setup-login-io.js +43 -3
  120. package/dist/setup-login-io.js.map +1 -1
  121. package/dist/setup-login-pty.d.ts +27 -0
  122. package/dist/setup-login-pty.d.ts.map +1 -0
  123. package/dist/setup-login-pty.js +58 -0
  124. package/dist/setup-login-pty.js.map +1 -0
  125. package/dist/setup-login-runner.d.ts +1 -9
  126. package/dist/setup-login-runner.d.ts.map +1 -1
  127. package/dist/setup-login-runner.js +17 -49
  128. package/dist/setup-login-runner.js.map +1 -1
  129. package/dist/setup-login-url.d.ts +10 -0
  130. package/dist/setup-login-url.d.ts.map +1 -0
  131. package/dist/setup-login-url.js +48 -0
  132. package/dist/setup-login-url.js.map +1 -0
  133. package/dist/thread-continuity-context.d.ts +24 -0
  134. package/dist/thread-continuity-context.d.ts.map +1 -1
  135. package/dist/thread-continuity-context.js +17 -0
  136. package/dist/thread-continuity-context.js.map +1 -1
  137. package/package.json +24 -23
@@ -0,0 +1,187 @@
1
+ /**
2
+ * PATCH/DELETE credential-profile services (INV-135 unified account model),
3
+ * extracted from control-services.ts (INV-124). One mutation owner each:
4
+ * the Enabled toggle (with the deprecated `native_credentials_enabled`
5
+ * downgrade-window mirror for the migrated row) and the PROVABLE removal
6
+ * (D-U4: material cleanup BEFORE registry removal; a cleanup failure is a
7
+ * typed retryable error, never a removed-with-warning receipt).
8
+ */
9
+ import { existsSync, rmSync } from "node:fs";
10
+ import { join, sep } from "node:path";
11
+ import { loadConfig, updateGlobalConfig } from "@claudexor/config";
12
+ import { canonicalIsolationLocator, normalizeThroughExistingAncestor } from "@claudexor/core";
13
+ import { claudexorOwnedRoot, noProjectRepoRoot } from "@claudexor/util";
14
+ import { purgeProfileLanes } from "@claudexor/workspace";
15
+ import { vendorVerifiedProfileStatus } from "@claudexor/orchestrator";
16
+ import { locatorIsDefaultNativeStore, readAccountsMigrationFile, removeAccountsMigrationRecord, } from "./accounts-unified-migration.js";
17
+ import { profileDoctorStatus } from "./accounts-projection.js";
18
+ import { canonicalProfileLoginDir, isConfigDirLoginHarness } from "./config-dir-login-harnesses.js";
19
+ import { assertCredentialProfileRegistered } from "./profile-compatibility.js";
20
+ import { removeProfileFromRegistry } from "./profile-registration.js";
21
+ const NO_PROJECT_ROOT = noProjectRepoRoot();
22
+ export function credentialProfileMutations(deps) {
23
+ return {
24
+ // PATCH /credential-profiles/:harness/:id — the Enabled toggle of the
25
+ // accounts symmetry (INV-135): one locked registry write, plus the
26
+ // deprecated `native_credentials_enabled` downgrade-window mirror when the
27
+ // row is the migrated one (a silent divergence would re-enable the
28
+ // account after a downgrade).
29
+ updateCredentialProfile: async (input) => {
30
+ const p = (input ?? {});
31
+ const harnessId = typeof p["harnessId"] === "string" ? p["harnessId"] : "";
32
+ const profileId = typeof p["profileId"] === "string" ? p["profileId"] : "";
33
+ const enabled = typeof p["enabled"] === "boolean" ? p["enabled"] : undefined;
34
+ if (!harnessId || !profileId || enabled === undefined) {
35
+ throw Object.assign(new Error("harnessId, profileId and enabled are required"), {
36
+ status: 400,
37
+ });
38
+ }
39
+ const registry = loadConfig(NO_PROJECT_ROOT).global.credential_profiles;
40
+ assertCredentialProfileRegistered(registry, harnessId, profileId);
41
+ // The downgrade-window mirror keys on the STRUCTURAL rule (the row's
42
+ // locator IS the harness default store), not on migration-record
43
+ // presence alone: a bootstrap row (ensureBootstrapProfile) sits at the
44
+ // native dir before any record exists, and a silent mirror divergence
45
+ // would re-enable that account after a downgrade — or let the legacy
46
+ // default-subject ladder route back into a disabled row's store.
47
+ const registryRow = registry.find((row) => row.harness_id === harnessId && row.profile_id === profileId);
48
+ const mirrorsNativeKey = readAccountsMigrationFile()[harnessId]?.row_id === profileId ||
49
+ locatorIsDefaultNativeStore(harnessId, registryRow?.isolation_locator ?? null);
50
+ let updated;
51
+ updateGlobalConfig((config) => ({
52
+ ...config,
53
+ ...(mirrorsNativeKey
54
+ ? {
55
+ harnesses: {
56
+ ...config.harnesses,
57
+ [harnessId]: {
58
+ ...config.harnesses[harnessId],
59
+ native_credentials_enabled: enabled,
60
+ },
61
+ },
62
+ }
63
+ : {}),
64
+ credential_profiles: config.credential_profiles.map((profile) => {
65
+ if (profile.harness_id !== harnessId || profile.profile_id !== profileId)
66
+ return profile;
67
+ updated = { ...profile, enabled };
68
+ return updated;
69
+ }),
70
+ }));
71
+ if (!updated) {
72
+ throw Object.assign(new Error("profile update did not persist"), { status: 500 });
73
+ }
74
+ deps.bustStatusCaches({ harnessId, profileId });
75
+ return {
76
+ profile: updated,
77
+ // Same vendor overlay the listing applies: a single-profile response
78
+ // must not re-declare a revoked credential `passed` (INV-135 honesty).
79
+ status: vendorVerifiedProfileStatus(await profileDoctorStatus(updated), deps.quotaRegistry().read()),
80
+ };
81
+ },
82
+ // DELETE /credential-profiles/:harness/:id — provable removal (D-U4).
83
+ deleteCredentialProfile: async (input) => {
84
+ const p = (input ?? {});
85
+ const harnessId = typeof p["harnessId"] === "string" ? p["harnessId"] : "";
86
+ const profileId = typeof p["profileId"] === "string" ? p["profileId"] : "";
87
+ if (!harnessId || !profileId) {
88
+ throw Object.assign(new Error("harnessId and profileId are required"), { status: 400 });
89
+ }
90
+ const activeLogin = deps.activeLoginJob(harnessId, profileId);
91
+ if (activeLogin) {
92
+ throw Object.assign(new Error(`a login for this account is in progress (${activeLogin.jobId}); cancel it before removing the account`), { status: 409 });
93
+ }
94
+ assertCredentialProfileRegistered(loadConfig(NO_PROJECT_ROOT).global.credential_profiles, harnessId, profileId);
95
+ deps.threads.invalidateCredentialProfile(harnessId, profileId);
96
+ // INV-034 lifecycle owner (b): the deleted account's durable per-lane
97
+ // read-only homes must not survive to be resumed. Sweep them across every
98
+ // project a live thread anchors to (plus the no-project partition).
99
+ const laneRoots = new Set([NO_PROJECT_ROOT]);
100
+ for (const thread of deps.threads.listThreads()) {
101
+ if (thread.repo?.root)
102
+ laneRoots.add(thread.repo.root);
103
+ }
104
+ for (const root of laneRoots)
105
+ purgeProfileLanes(root, harnessId, profileId);
106
+ deps.quotaRegistry().removeSubject(harnessId, profileId);
107
+ // Unified account model: deleting a MIGRATED row retires the canonical
108
+ // id PLUS its legacy aliases (the null engine-default subject and its
109
+ // `<harness>-default` lane homes) in the SAME lifecycle operation — a
110
+ // dangling alias could resume the deleted credential's session or keep
111
+ // charging its quota subject.
112
+ const migrationRecord = readAccountsMigrationFile()[harnessId];
113
+ const registryEntry = loadConfig(NO_PROJECT_ROOT).global.credential_profiles.find((row) => row.harness_id === harnessId && row.profile_id === profileId);
114
+ const migratedRow = migrationRecord?.row_id === profileId;
115
+ if (migrationRecord && migratedRow) {
116
+ // The record's OWN alias list drives the retirement — the schema's
117
+ // "deletion retires these aliases" claim stays true by construction
118
+ // (the null alias is the engine-default subject and its
119
+ // `<harness>-default` lane homes).
120
+ for (const alias of migrationRecord.legacy_aliases) {
121
+ deps.quotaRegistry().removeSubject(harnessId, alias);
122
+ for (const root of laneRoots)
123
+ purgeProfileLanes(root, harnessId, alias ?? "default");
124
+ }
125
+ }
126
+ // D-U4 failure contract: `removed: true` ONLY when the row AND its
127
+ // credential material are provably gone. Material cleanup therefore runs
128
+ // BEFORE registry removal: a cleanup failure is a typed RETRYABLE error
129
+ // that leaves the row registered (a retry finishes the job) — never a
130
+ // `removed: true` with a warning, which the startup auto-registration
131
+ // would resurrect from the surviving material on the next start.
132
+ let credentialCleanup = "none";
133
+ try {
134
+ if (registryEntry?.credential_kind === "config_dir_login" &&
135
+ registryEntry.isolation_locator) {
136
+ // Each member resolves through its OWN canonicalizer (the ladder
137
+ // this used to hand-write let cursor and agy fall through to the
138
+ // generic one, so a member whose canonicalizer adds a rule would
139
+ // silently delete against a different path than its login wrote to).
140
+ const dir = isConfigDirLoginHarness(harnessId)
141
+ ? canonicalProfileLoginDir(harnessId, registryEntry.isolation_locator)
142
+ : canonicalIsolationLocator(registryEntry.isolation_locator, "credential profile dir");
143
+ // Recursive deletion is fenced to a strict descendant of the
144
+ // profiles tree — PLUS exactly the harness's own default native
145
+ // store dir (an exact-path allowlist, never a general "anything
146
+ // under native/" deletion class — K.3). The structural rule covers
147
+ // both the migrated row (whose record holds that locator) and a
148
+ // bootstrap row registered at the native dir BEFORE any migration
149
+ // record exists (a cancelled login must stay removable — K.4).
150
+ const profilesRoot = normalizeThroughExistingAncestor(join(claudexorOwnedRoot(), "profiles"));
151
+ const legacyAllowlisted = (migratedRow &&
152
+ migrationRecord !== undefined &&
153
+ dir === normalizeThroughExistingAncestor(migrationRecord.locator)) ||
154
+ locatorIsDefaultNativeStore(harnessId, dir);
155
+ if (!dir.startsWith(profilesRoot + sep) && !legacyAllowlisted) {
156
+ throw new Error(`refusing to delete "${dir}": not inside the profiles tree ${profilesRoot} and not the migrated row's recorded legacy locator`);
157
+ }
158
+ if (existsSync(dir)) {
159
+ rmSync(dir, { recursive: true, force: true });
160
+ credentialCleanup = "config_dir_removed";
161
+ }
162
+ }
163
+ else if (registryEntry?.secret_ref) {
164
+ deps.secretStore.delete(registryEntry.secret_ref);
165
+ credentialCleanup = "secret_deleted";
166
+ }
167
+ }
168
+ catch (err) {
169
+ deps.bustStatusCaches();
170
+ throw Object.assign(new Error(`credential cleanup failed; the account is still registered — retry the removal: ${err instanceof Error ? err.message : String(err)}`), { status: 503, code: "credential_cleanup_failed", retryable: true });
171
+ }
172
+ const entry = removeProfileFromRegistry(harnessId, profileId);
173
+ if (migratedRow) {
174
+ // The migration record dies with its row: the material is gone, so a
175
+ // later start detects no legacy login and fabricates nothing.
176
+ removeAccountsMigrationRecord(harnessId);
177
+ }
178
+ deps.bustStatusCaches({ harnessId, profileId });
179
+ return {
180
+ profile: entry,
181
+ removed: true,
182
+ credentialCleanup,
183
+ };
184
+ },
185
+ };
186
+ }
187
+ //# sourceMappingURL=credential-profile-mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-profile-mutations.js","sourceRoot":"","sources":["../src/credential-profile-mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { QuotaRegistry } from "@claudexor/daemon";
2
+ /** The credential a control-API mutation touched: one registered profile, or
3
+ * a secret name whose subjects are resolved through the registry. */
4
+ export type CredentialMutationSubject = {
5
+ harnessId: string;
6
+ profileId: string;
7
+ } | {
8
+ secretName: string;
9
+ };
10
+ export declare function bustCredentialStatusCaches(quotaRegistry: () => QuotaRegistry, subject?: CredentialMutationSubject): void;
11
+ //# sourceMappingURL=credential-status-invalidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-status-invalidation.d.ts","sourceRoot":"","sources":["../src/credential-status-invalidation.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKvD;qEACqE;AACrE,MAAM,MAAM,yBAAyB,GACnC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,aAAa,EAClC,OAAO,CAAC,EAAE,yBAAyB,GAClC,IAAI,CAiBN"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ONE owner for what a control-API credential mutation invalidates: the
3
+ * doctor/status projections, the quota registry's absence pacing, and — per
4
+ * subject — the A7 unusable-credential ledger. The per-subject half of the
5
+ * ledger's clearing contract lives HERE (profile enable/disable/create/remove
6
+ * and secret set/delete each void exactly the verdicts about the credential
7
+ * they touched), while the whole-ledger clear stays with claudexord's
8
+ * login/logout lifecycle. Clearing is fail-open by contract: over-clearing
9
+ * costs at most one attempt rediscovering a refusal.
10
+ */
11
+ import { loadConfig } from "@claudexor/config";
12
+ import { invalidateDoctorCache } from "@claudexor/core";
13
+ import { noProjectRepoRoot } from "@claudexor/util";
14
+ import { invalidateStatusProjections } from "./status-projection-cache.js";
15
+ import { credentialUnusableLedger } from "./run-orchestrator.js";
16
+ export function bustCredentialStatusCaches(quotaRegistry, subject) {
17
+ invalidateDoctorCache();
18
+ invalidateStatusProjections();
19
+ quotaRegistry().noteCredentialChange();
20
+ if (!subject)
21
+ return;
22
+ if ("harnessId" in subject) {
23
+ credentialUnusableLedger.clearSubject(subject.harnessId, subject.profileId);
24
+ return;
25
+ }
26
+ // A secret names its subjects indirectly: profiles whose secret_ref IS this
27
+ // name, and — for a bare managed name — the engine-default slot of whichever
28
+ // harness reads it (adapter knowledge the daemon does not duplicate).
29
+ for (const profile of loadConfig(noProjectRepoRoot()).global.credential_profiles) {
30
+ if (profile.secret_ref === subject.secretName)
31
+ credentialUnusableLedger.clearSubject(profile.harness_id, profile.profile_id);
32
+ }
33
+ if (!subject.secretName.includes(":"))
34
+ credentialUnusableLedger.clearDefaultSubjects();
35
+ }
36
+ //# sourceMappingURL=credential-status-invalidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-status-invalidation.js","sourceRoot":"","sources":["../src/credential-status-invalidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAOjE,MAAM,UAAU,0BAA0B,CACxC,aAAkC,EAClC,OAAmC;IAEnC,qBAAqB,EAAE,CAAC;IACxB,2BAA2B,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,oBAAoB,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;QAC3B,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IACD,4EAA4E;IAC5E,6EAA6E;IAC7E,sEAAsE;IACtE,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjF,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;YAC3C,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,wBAAwB,CAAC,oBAAoB,EAAE,CAAC;AACzF,CAAC"}
@@ -42,6 +42,11 @@ export interface NormalPlaneDuties {
42
42
  requested(): boolean;
43
43
  armQuotaPolling(): void;
44
44
  beginPidSnapshots(): void;
45
+ /** Unified-accounts startup migration (INV-135): runs FIRST on the normal
46
+ * plane — before setup jobs, so a login job can never race the registry
47
+ * write — and is crash-recoverable via its own phase file (an incomplete
48
+ * harness refuses runs typed until the next start finishes it). */
49
+ migrateAccounts(): void;
45
50
  startSetup(): Promise<void>;
46
51
  quarantineGhosts(): void;
47
52
  scheduleRetention(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-admission-runtime.d.ts","sourceRoot":"","sources":["../src/daemon-admission-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;oEAEoE;AACpE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,wBAAwB,CAoC3B;AAED;;;uEAGuE;AACvE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG;IAAE,GAAG,IAAI,IAAI,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE,CAcvF;AAED;;;yBAGyB;AACzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,IAAI,OAAO,CAAC;IACrB,eAAe,IAAI,IAAI,CAAC;IACxB,iBAAiB,IAAI,IAAI,CAAC;IAC1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gBAAgB,IAAI,IAAI,CAAC;IACzB,iBAAiB,IAAI,IAAI,CAAC;CAC3B;AAED;;uDAEuD;AACvD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,wBAAwB,CAAC;IACtC,WAAW,EAAE,iBAAiB,CAAC;CAChC,GAAG;IACF,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACtF,wBAAwB,CAAC,CAAC,EACxB,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3D,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACxD,CA4GA"}
1
+ {"version":3,"file":"daemon-admission-runtime.d.ts","sourceRoot":"","sources":["../src/daemon-admission-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC7C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;oEAEoE;AACpE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,wBAAwB,CAoC3B;AAED;;;uEAGuE;AACvE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG;IAAE,GAAG,IAAI,IAAI,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE,CAcvF;AAED;;;yBAGyB;AACzB,MAAM,WAAW,iBAAiB;IAChC,SAAS,IAAI,OAAO,CAAC;IACrB,eAAe,IAAI,IAAI,CAAC;IACxB,iBAAiB,IAAI,IAAI,CAAC;IAC1B;;;uEAGmE;IACnE,eAAe,IAAI,IAAI,CAAC;IACxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,gBAAgB,IAAI,IAAI,CAAC;IACzB,iBAAiB,IAAI,IAAI,CAAC;CAC3B;AAED;;uDAEuD;AACvD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,SAAS,EAAE,sBAAsB,CAAC;IAClC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAChD,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,WAAW,EAAE,wBAAwB,CAAC;IACtC,WAAW,EAAE,iBAAiB,CAAC;CAChC,GAAG;IACF,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,MAAM,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACtF,wBAAwB,CAAC,CAAC,EACxB,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3D,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;CACxD,CA6GA"}
@@ -96,6 +96,7 @@ export function createStartupAdmissionRuntime(input) {
96
96
  for (const sweep of sweepRetiredConfigKeysAtStartup()) {
97
97
  logLine(logPath(), `swept retired config keys from ${sweep.path}: ${sweep.removed.join(", ")}`);
98
98
  }
99
+ input.normalPlane.migrateAccounts();
99
100
  await input.normalPlane.startSetup();
100
101
  input.normalPlane.quarantineGhosts();
101
102
  input.normalPlane.scheduleRetention();
@@ -1 +1 @@
1
- {"version":3,"file":"daemon-admission-runtime.js","sourceRoot":"","sources":["../src/daemon-admission-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon-admission-runtime.js","sourceRoot":"","sources":["../src/daemon-admission-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The `harness` command's surface, kept beside its installable set so ONE
3
+ * array spells that set everywhere it is printed: the registry usage line,
4
+ * the dispatcher's usage error (harness-command.ts) and the installer's own
5
+ * refusal (harness-installer.ts). This module stays value-import-free on
6
+ * purpose — harness-installer.ts reaches command-registry.ts through args.ts,
7
+ * so owning the array there would close a runtime import cycle.
8
+ */
9
+ import type { CliCommandSpec } from "./command-registry.js";
10
+ /** Vendor CLIs `claudexor harness install` can fetch. harness-installer.ts
11
+ * owns each one's install recipe and its test asserts this list is exhaustive. */
12
+ export declare const INSTALLABLE_HARNESSES: readonly ["agy", "claude", "codex", "cursor", "opencode"];
13
+ /** The `harness` argument shape: rendered by `claudexor help` and reprinted by
14
+ * the dispatcher when a verb is unknown. */
15
+ export declare const HARNESS_USAGE_ARGS: string;
16
+ export declare const HARNESS_COMMAND_SPECS: readonly CliCommandSpec[];
17
+ //# sourceMappingURL=harness-command-specs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-command-specs.d.ts","sourceRoot":"","sources":["../src/harness-command-specs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;kFACkF;AAClF,eAAO,MAAM,qBAAqB,YAAI,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAE/F;4CAC4C;AAC5C,eAAO,MAAM,kBAAkB,QAAoF,CAAC;AAEpH,eAAO,MAAM,qBAAqB,EAAE,SAAS,cAAc,EAc1D,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** Vendor CLIs `claudexor harness install` can fetch. harness-installer.ts
2
+ * owns each one's install recipe and its test asserts this list is exhaustive. */
3
+ export const INSTALLABLE_HARNESSES = ["agy", "claude", "codex", "cursor", "opencode"];
4
+ /** The `harness` argument shape: rendered by `claudexor help` and reprinted by
5
+ * the dispatcher when a verb is unknown. */
6
+ export const HARNESS_USAGE_ARGS = `list [--all] | install <${INSTALLABLE_HARNESSES.join("|")}> [--dry-run] [--yes]`;
7
+ export const HARNESS_COMMAND_SPECS = [
8
+ {
9
+ id: "harness",
10
+ positionalPatterns: [
11
+ { prefix: ["list"], min: 1, max: 1 },
12
+ { prefix: ["install"], min: 2, max: 2 },
13
+ ],
14
+ usageArgs: HARNESS_USAGE_ARGS,
15
+ summary: "List harnesses, or install one vendor CLI after disclosure",
16
+ flags: ["all", "dry-run", "yes", "json"],
17
+ subcommandFlags: { list: ["all"], install: ["dry-run", "yes"] },
18
+ mutability: "ops",
19
+ stability: "stable",
20
+ },
21
+ ];
22
+ //# sourceMappingURL=harness-command-specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness-command-specs.js","sourceRoot":"","sources":["../src/harness-command-specs.ts"],"names":[],"mappings":"AAUA;kFACkF;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AAE/F;4CAC4C;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,2BAA2B,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAEpH,MAAM,CAAC,MAAM,qBAAqB,GAA8B;IAC9D;QACE,EAAE,EAAE,SAAS;QACb,kBAAkB,EAAE;YAClB,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;YACpC,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE;SACxC;QACD,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,4DAA4D;QACrE,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC;QACxC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE;QAC/D,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,QAAQ;KACpB;CACF,CAAC"}
@@ -2,10 +2,10 @@ import { type ParsedArgs } from "./args.js";
2
2
  /**
3
3
  * `claudexor harness list [--all]` and `claudexor harness install <id>`.
4
4
  * Fakes are test fixtures, not real harnesses; `--all` reveals them. The
5
- * install verb is the disclosed pinned installer (harness-installer.ts,
6
- * issue #89): exact npm pins for claude/codex/opencode, the human-verified
7
- * PTY path for cursor, and nothing executes without disclosure. Flags are
8
- * verb-owned (registry `subcommandFlags`): `harness list --yes` or
5
+ * install verb is the disclosed installer (harness-installer.ts, issue #89):
6
+ * exact npm pins for claude/codex/opencode, the human-verified PTY path for
7
+ * the script vendors (cursor, agy), and nothing executes without disclosure.
8
+ * Flags are verb-owned (registry `subcommandFlags`): `harness list --yes` or
9
9
  * `harness install --all` is a loud exit-2 usage error, never a silently
10
10
  * ignored flag (INV-021).
11
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"harness-command.d.ts","sourceRoot":"","sources":["../src/harness-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAMtD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAkBtE"}
1
+ {"version":3,"file":"harness-command.d.ts","sourceRoot":"","sources":["../src/harness-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAOtD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAetE"}
@@ -1,15 +1,16 @@
1
1
  import { flagBool } from "./args.js";
2
2
  import { print, printJson, printUsageError } from "./cli-io.js";
3
3
  import { subcommandFlagScopeError } from "./command-scope.js";
4
+ import { HARNESS_USAGE_ARGS } from "./harness-command-specs.js";
4
5
  import { harnessInstallCommand } from "./harness-installer.js";
5
6
  import { buildRegistry } from "./registry.js";
6
7
  /**
7
8
  * `claudexor harness list [--all]` and `claudexor harness install <id>`.
8
9
  * Fakes are test fixtures, not real harnesses; `--all` reveals them. The
9
- * install verb is the disclosed pinned installer (harness-installer.ts,
10
- * issue #89): exact npm pins for claude/codex/opencode, the human-verified
11
- * PTY path for cursor, and nothing executes without disclosure. Flags are
12
- * verb-owned (registry `subcommandFlags`): `harness list --yes` or
10
+ * install verb is the disclosed installer (harness-installer.ts, issue #89):
11
+ * exact npm pins for claude/codex/opencode, the human-verified PTY path for
12
+ * the script vendors (cursor, agy), and nothing executes without disclosure.
13
+ * Flags are verb-owned (registry `subcommandFlags`): `harness list --yes` or
13
14
  * `harness install --all` is a loud exit-2 usage error, never a silently
14
15
  * ignored flag (INV-021).
15
16
  */
@@ -30,6 +31,6 @@ export function harnessCommand(args, json) {
30
31
  if (args._[1] === "install") {
31
32
  return harnessInstallCommand(args, json);
32
33
  }
33
- return printUsageError(json, "usage: claudexor harness list [--all] | install <claude|codex|cursor|opencode> [--dry-run] [--yes]");
34
+ return printUsageError(json, `usage: claudexor harness ${HARNESS_USAGE_ARGS}`);
34
35
  }
35
36
  //# sourceMappingURL=harness-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"harness-command.js","sourceRoot":"","sources":["../src/harness-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAa;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,IAAI,UAAU;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;;YACnC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,eAAe,CACpB,IAAI,EACJ,oGAAoG,CACrG,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"harness-command.js","sourceRoot":"","sources":["../src/harness-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,IAAa;IAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrF,IAAI,UAAU;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,CAAC,GAAG,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,IAAI;YAAE,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;;YACnC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,EAAE,4BAA4B,kBAAkB,EAAE,CAAC,CAAC;AACjF,CAAC"}
@@ -11,11 +11,11 @@
11
11
  * model/effort freshness gates verified; the opencode pin is a
12
12
  * deterministic install target, NOT a verification claim (no recorded
13
13
  * fixture yet — see packages/harness-opencode vendor-cli-version.ts).
14
- * - cursor has no npm artifact and CANNOT be pinned. Instead of pretending,
15
- * the HUMAN is the verifier: the complete vendor script is downloaded first
16
- * (never piped to a shell), its size and sha256 are printed, and it runs in
17
- * the visible PTY the operator is watching — the same principle as
18
- * interactive SSH auth.
14
+ * - cursor and agy have no npm artifact and CANNOT be pinned. Instead of
15
+ * pretending, the HUMAN is the verifier: the complete vendor script is
16
+ * downloaded first (never piped to a shell), its size and sha256 are
17
+ * printed, and it runs in the visible PTY the operator is watching — the
18
+ * same principle as interactive SSH auth.
19
19
  * - NOTHING executes without disclosure: the exact command and install
20
20
  * destination print first, and execution needs a TTY confirmation or an
21
21
  * explicit `--yes` (the macOS flow confirms against this module's own
@@ -31,24 +31,37 @@
31
31
  import { spawnSync } from "node:child_process";
32
32
  import { existsSync, mkdirSync } from "node:fs";
33
33
  import { type ParsedArgs } from "./args.js";
34
- export declare const INSTALLABLE_HARNESSES: readonly ["claude", "codex", "cursor", "opencode"];
34
+ import { INSTALLABLE_HARNESSES } from "./harness-command-specs.js";
35
35
  export type InstallableHarness = (typeof INSTALLABLE_HARNESSES)[number];
36
36
  export declare function isInstallableHarness(value: string): value is InstallableHarness;
37
37
  /** Exact npm pins. Each version ALIASES the harness package's vendor-version
38
38
  * SSOT (vendor-cli-version.ts there). For claude/codex that is the version
39
39
  * this release's freshness gates verified; the opencode pin is a
40
40
  * deterministic install target only — no recorded verification fixture
41
- * vouches for it (its vendor-cli-version.ts discloses this). Cursor is
42
- * absent deliberately: it ships no npm artifact (see the cursor branch
41
+ * vouches for it (its vendor-cli-version.ts discloses this). Cursor and agy
42
+ * are absent deliberately: they ship no npm artifact (see SCRIPT_INSTALLERS
43
43
  * below). */
44
44
  export type HarnessInstallVerification = "release_verified" | "deterministic_only" | "human_observed";
45
45
  export declare const CURSOR_INSTALL_URL = "https://cursor.com/install";
46
+ /**
47
+ * Google's official Antigravity CLI installer, as published on
48
+ * antigravity.google/docs/cli/install (`curl -fsSL <this url> | bash`, which
49
+ * Claudexor deliberately does NOT do — see the header). Verified end to end on
50
+ * 2026-08-16: the script fetched from this URL installed agy 1.1.13 to
51
+ * `~/.local/bin/agy`, which is the destination disclosed below. The vendor
52
+ * ships one signed Go binary and no npm package, so it takes the same
53
+ * human-observed path as cursor.
54
+ */
55
+ export declare const AGY_INSTALL_URL = "https://antigravity.google/cli/install.sh";
56
+ /** The vendor's Windows installer, from the same documentation page. */
57
+ export declare const AGY_INSTALL_URL_WINDOWS = "https://antigravity.google/cli/install.ps1";
46
58
  export interface HarnessInstallerDisclosure {
47
59
  harness: InstallableHarness;
48
60
  command: string;
49
61
  installLocation: string;
50
- /** Exact vendor version the command installs; null ONLY for cursor, which
51
- * has no pinnable artifact (disclosed, never faked). */
62
+ /** Exact vendor version the command installs; null exactly for the script
63
+ * vendors (cursor, agy), which have no pinnable artifact disclosed, never
64
+ * faked. */
52
65
  pinnedVersion: string | null;
53
66
  /** Evidence behind the install target. Package-registry integrity verifies
54
67
  * downloaded bytes for every npm pin, but only release_verified means the
@@ -1 +1 @@
1
- {"version":3,"file":"harness-installer.d.ts","sourceRoot":"","sources":["../src/harness-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAA+C,MAAM,SAAS,CAAC;AAQ7F,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAGtD,eAAO,MAAM,qBAAqB,YAAI,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AACxF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAED;;;;;;aAMa;AACb,MAAM,MAAM,0BAA0B,GACpC,kBAAkB,GAAG,oBAAoB,GAAG,gBAAgB,CAAC;AA6B/D,eAAO,MAAM,kBAAkB,+BAA+B,CAAC;AAE/D,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB;4DACwD;IACxD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;+EAE2E;IAC3E,YAAY,EAAE,0BAA0B,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,kBAAkB,GAC1B,0BAA0B,CAoB5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB;+EAC2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,UAAU,CAAC;IAC3B;;2EAEuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;CACX,GACL,uBAAuB,CAwFzB;AAyCD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO;AACb,4EAA4E;AAC5E,aAAa,GAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAM,GACvF,MAAM,CAoDR"}
1
+ {"version":3,"file":"harness-installer.d.ts","sourceRoot":"","sources":["../src/harness-installer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAA+C,MAAM,SAAS,CAAC;AAQ7F,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAExE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAED;;;;;;aAMa;AACb,MAAM,MAAM,0BAA0B,GACpC,kBAAkB,GAAG,oBAAoB,GAAG,gBAAgB,CAAC;AA6B/D,eAAO,MAAM,kBAAkB,+BAA+B,CAAC;AAC/D;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,8CAA8C,CAAC;AAC3E,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,+CAA+C,CAAC;AAoCpF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB;;gBAEY;IACZ,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;+EAE2E;IAC3E,YAAY,EAAE,0BAA0B,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,kBAAkB,GAC1B,0BAA0B,CAgC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB;+EAC2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,OAAO,GAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,UAAU,CAAC;IAC3B;;2EAEuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;CACX,GACL,uBAAuB,CAkGzB;AAwCD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,OAAO;AACb,4EAA4E;AAC5E,aAAa,GAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAM,GACvF,MAAM,CAoDR"}