instar 1.3.466 → 1.3.467
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.
- package/dist/core/EnrollmentWizard.d.ts +18 -1
- package/dist/core/EnrollmentWizard.d.ts.map +1 -1
- package/dist/core/EnrollmentWizard.js +22 -2
- package/dist/core/EnrollmentWizard.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +20 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +53 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/ProactiveSwapMonitor.d.ts.map +1 -1
- package/dist/core/ProactiveSwapMonitor.js +7 -0
- package/dist/core/ProactiveSwapMonitor.js.map +1 -1
- package/dist/core/SessionManager.d.ts +10 -0
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +28 -0
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/SessionRefresh.d.ts.map +1 -1
- package/dist/core/SessionRefresh.js +13 -0
- package/dist/core/SessionRefresh.js.map +1 -1
- package/dist/core/ensureInteractiveReady.d.ts +58 -0
- package/dist/core/ensureInteractiveReady.d.ts.map +1 -0
- package/dist/core/ensureInteractiveReady.js +114 -0
- package/dist/core/ensureInteractiveReady.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +20 -20
- package/upgrades/1.3.467.md +80 -0
- package/upgrades/side-effects/onboarding-safe-pinswap.md +49 -0
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
* public code/URL the operator types into the provider's own page.
|
|
21
21
|
*/
|
|
22
22
|
import { PendingLoginStore, type PendingLogin, type LoginFlowKind, type LoginProvider } from './PendingLoginStore.js';
|
|
23
|
+
import { type EnsureInteractiveReadyResult } from './ensureInteractiveReady.js';
|
|
23
24
|
/** The public artifact a framework login yields (no secret). */
|
|
24
25
|
export interface LoginArtifact {
|
|
25
26
|
verificationUrl: string;
|
|
@@ -43,6 +44,14 @@ export interface EnrollmentWizardConfig {
|
|
|
43
44
|
log: (m: string) => void;
|
|
44
45
|
warn: (m: string) => void;
|
|
45
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* Onboarding-readiness seeder run when a claude-code enrollment completes
|
|
49
|
+
* (2026-06-09 incident: `claude auth login` is headless-only — it stores
|
|
50
|
+
* tokens but never sets the interactive first-launch flags, so the new
|
|
51
|
+
* home wedges the first interactive session pinned/swapped onto it).
|
|
52
|
+
* Injectable for hermetic tests; production uses the real util.
|
|
53
|
+
*/
|
|
54
|
+
ensureReady?: (configHome: string) => EnsureInteractiveReadyResult;
|
|
46
55
|
}
|
|
47
56
|
export interface StartEnrollmentInput {
|
|
48
57
|
id: string;
|
|
@@ -58,6 +67,7 @@ export declare class EnrollmentWizard {
|
|
|
58
67
|
private readonly store;
|
|
59
68
|
private readonly driveLogin;
|
|
60
69
|
private readonly logger;
|
|
70
|
+
private readonly ensureReady;
|
|
61
71
|
constructor(cfg: EnrollmentWizardConfig);
|
|
62
72
|
/** Default flow kind per provider: Codex/OpenAI = device-code (its endorsed
|
|
63
73
|
* flow); everyone else = url-code-paste (the phone-friendly Claude path). */
|
|
@@ -87,7 +97,14 @@ export declare class EnrollmentWizard {
|
|
|
87
97
|
* abort the sweep.
|
|
88
98
|
*/
|
|
89
99
|
reissueExpired(): Promise<PendingLogin[]>;
|
|
90
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Mark a login completed once the operator approved + the account enrolled.
|
|
102
|
+
* For a claude-code enrollment with a per-account config home, also seed the
|
|
103
|
+
* interactive onboarding flags — the login itself was headless, so without
|
|
104
|
+
* this the freshly-enrolled home wedges the first interactive session that
|
|
105
|
+
* pins/swaps onto it (2026-06-09 incident). Fail-safe: a seeding failure is
|
|
106
|
+
* logged, never blocks completion (the launch paths re-ensure defensively).
|
|
107
|
+
*/
|
|
91
108
|
complete(id: string): PendingLogin | null;
|
|
92
109
|
/** The phone surface: still-valid logins awaiting approval. */
|
|
93
110
|
pending(): PendingLogin[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnrollmentWizard.d.ts","sourceRoot":"","sources":["../../src/core/EnrollmentWizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"EnrollmentWizard.d.ts","sourceRoot":"","sources":["../../src/core/EnrollmentWizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,6BAA6B,CAAC;AAErC,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,EAAE,aAAa,CAAC;IACpB;6DACyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAE7B,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,iBAAiB,CAAC;IACzB,UAAU,EAAE,WAAW,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;IACjE;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,4BAA4B,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;IACrC,6EAA6E;IAC7E,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0D;IACjF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuD;gBAEvE,GAAG,EAAE,sBAAsB;IAOvC;kFAC8E;IAC9E,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa;IAI1D;;;;;;;;;OASG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS;IAW1D;;;;OAIG;IACG,KAAK,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;IAwB/D;;;;;;OAMG;IACG,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IA4B/C;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAazC,+DAA+D;IAC/D,OAAO,IAAI,YAAY,EAAE;CAG1B"}
|
|
@@ -19,14 +19,17 @@
|
|
|
19
19
|
* URL + TTL; here tests pass a stub. NEVER handles a credential — only the
|
|
20
20
|
* public code/URL the operator types into the provider's own page.
|
|
21
21
|
*/
|
|
22
|
+
import { ensureInteractiveReady, } from './ensureInteractiveReady.js';
|
|
22
23
|
export class EnrollmentWizard {
|
|
23
24
|
store;
|
|
24
25
|
driveLogin;
|
|
25
26
|
logger;
|
|
27
|
+
ensureReady;
|
|
26
28
|
constructor(cfg) {
|
|
27
29
|
this.store = cfg.store;
|
|
28
30
|
this.driveLogin = cfg.driveLogin;
|
|
29
31
|
this.logger = cfg.logger ?? { log: () => { }, warn: () => { } };
|
|
32
|
+
this.ensureReady = cfg.ensureReady ?? ensureInteractiveReady;
|
|
30
33
|
}
|
|
31
34
|
/** Default flow kind per provider: Codex/OpenAI = device-code (its endorsed
|
|
32
35
|
* flow); everyone else = url-code-paste (the phone-friendly Claude path). */
|
|
@@ -114,9 +117,26 @@ export class EnrollmentWizard {
|
|
|
114
117
|
}
|
|
115
118
|
return reissued;
|
|
116
119
|
}
|
|
117
|
-
/**
|
|
120
|
+
/**
|
|
121
|
+
* Mark a login completed once the operator approved + the account enrolled.
|
|
122
|
+
* For a claude-code enrollment with a per-account config home, also seed the
|
|
123
|
+
* interactive onboarding flags — the login itself was headless, so without
|
|
124
|
+
* this the freshly-enrolled home wedges the first interactive session that
|
|
125
|
+
* pins/swaps onto it (2026-06-09 incident). Fail-safe: a seeding failure is
|
|
126
|
+
* logged, never blocks completion (the launch paths re-ensure defensively).
|
|
127
|
+
*/
|
|
118
128
|
complete(id) {
|
|
119
|
-
|
|
129
|
+
const login = this.store.complete(id);
|
|
130
|
+
if (login && login.framework === 'claude-code' && login.configHome) {
|
|
131
|
+
const ready = this.ensureReady(login.configHome);
|
|
132
|
+
if (ready.patched) {
|
|
133
|
+
this.logger.log(`[EnrollmentWizard] made ${login.configHome} interactive-ready (${ready.reason})`);
|
|
134
|
+
}
|
|
135
|
+
else if (ready.reason !== 'already interactive-ready') {
|
|
136
|
+
this.logger.warn(`[EnrollmentWizard] could not verify ${login.configHome} interactive-ready — ${ready.reason}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return login;
|
|
120
140
|
}
|
|
121
141
|
/** The phone surface: still-valid logins awaiting approval. */
|
|
122
142
|
pending() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnrollmentWizard.js","sourceRoot":"","sources":["../../src/core/EnrollmentWizard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"EnrollmentWizard.js","sourceRoot":"","sources":["../../src/core/EnrollmentWizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -95,6 +95,26 @@ export declare class PostUpdateMigrator {
|
|
|
95
95
|
* each migration is idempotent.
|
|
96
96
|
*/
|
|
97
97
|
migrate(): MigrationResult;
|
|
98
|
+
/**
|
|
99
|
+
* Seed the interactive first-launch onboarding flags into every EXISTING
|
|
100
|
+
* claude-code subscription-pool config home (2026-06-09 incident, topic
|
|
101
|
+
* 20905). Pool homes are enrolled via headless `claude auth login`, which
|
|
102
|
+
* stores OAuth tokens but never sets `hasCompletedOnboarding` /
|
|
103
|
+
* `bypassPermissionsModeAccepted` / `hasTrustDialogAccepted` — so the first
|
|
104
|
+
* interactive session pinned or quota-swapped onto such a home wedged on the
|
|
105
|
+
* first-launch onboarding screens (~8 live sessions at once). New
|
|
106
|
+
* enrollments are seeded by EnrollmentWizard.complete() and every pinned/
|
|
107
|
+
* swapped launch re-ensures defensively; this migration is the one-time
|
|
108
|
+
* sweep that makes homes enrolled BEFORE the fix safe.
|
|
109
|
+
*
|
|
110
|
+
* Idempotent (ensureInteractiveReady only writes missing flags) and
|
|
111
|
+
* fail-safe (the util never throws; per-home failures are reported, never
|
|
112
|
+
* abort the sweep). Only flags are ever written — oauthAccount/tokens are
|
|
113
|
+
* untouched by construction, and an unparseable `.claude.json` is refused,
|
|
114
|
+
* not rewritten. `requireExistingHome` keeps a stale registry entry from
|
|
115
|
+
* littering $HOME with empty credential-less homes.
|
|
116
|
+
*/
|
|
117
|
+
private migrateSubscriptionPoolInteractiveReady;
|
|
98
118
|
/**
|
|
99
119
|
* Regenerate the boot wrapper when it predates the ABI-aware node
|
|
100
120
|
* self-heal (recurring-SQLite-bane fix).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@ import { appendMigrationEvent, normalizePerEntryAction } from '../scheduler/Migr
|
|
|
41
41
|
import { randomUUID } from 'node:crypto';
|
|
42
42
|
import { ELIGIBILITY_SCHEMA_SQL, ELIGIBILITY_SCHEMA_SQL_SHA256, PUSH_GATE_SH, PUSH_GATE_SH_SHA256, INSTAR_PR_GATE_WORKFLOW_YML, INSTAR_PR_GATE_WORKFLOW_YML_SHA256, PR_GATE_SETUP_MD, PR_GATE_SETUP_MD_SHA256, } from '../data/pr-gate-artifacts.js';
|
|
43
43
|
import { SafeFsExecutor } from './SafeFsExecutor.js';
|
|
44
|
+
import { SubscriptionPool } from './SubscriptionPool.js';
|
|
45
|
+
import { ensureInteractiveReady } from './ensureInteractiveReady.js';
|
|
44
46
|
import { installCodexHooks } from './installCodexHooks.js';
|
|
45
47
|
import { armCodexHooks, makeTmuxTrustDriver } from './codexHookArm.js';
|
|
46
48
|
import { detectCodexPath, detectTmuxPath } from './Config.js';
|
|
@@ -217,8 +219,59 @@ export class PostUpdateMigrator {
|
|
|
217
219
|
this.migrateThreadlineConversationStore(result);
|
|
218
220
|
this.migrateThreadlineAgentInfoIdentity(result);
|
|
219
221
|
this.migrateWorktreeMisplacedFloodItems(result);
|
|
222
|
+
this.migrateSubscriptionPoolInteractiveReady(result);
|
|
220
223
|
return result;
|
|
221
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Seed the interactive first-launch onboarding flags into every EXISTING
|
|
227
|
+
* claude-code subscription-pool config home (2026-06-09 incident, topic
|
|
228
|
+
* 20905). Pool homes are enrolled via headless `claude auth login`, which
|
|
229
|
+
* stores OAuth tokens but never sets `hasCompletedOnboarding` /
|
|
230
|
+
* `bypassPermissionsModeAccepted` / `hasTrustDialogAccepted` — so the first
|
|
231
|
+
* interactive session pinned or quota-swapped onto such a home wedged on the
|
|
232
|
+
* first-launch onboarding screens (~8 live sessions at once). New
|
|
233
|
+
* enrollments are seeded by EnrollmentWizard.complete() and every pinned/
|
|
234
|
+
* swapped launch re-ensures defensively; this migration is the one-time
|
|
235
|
+
* sweep that makes homes enrolled BEFORE the fix safe.
|
|
236
|
+
*
|
|
237
|
+
* Idempotent (ensureInteractiveReady only writes missing flags) and
|
|
238
|
+
* fail-safe (the util never throws; per-home failures are reported, never
|
|
239
|
+
* abort the sweep). Only flags are ever written — oauthAccount/tokens are
|
|
240
|
+
* untouched by construction, and an unparseable `.claude.json` is refused,
|
|
241
|
+
* not rewritten. `requireExistingHome` keeps a stale registry entry from
|
|
242
|
+
* littering $HOME with empty credential-less homes.
|
|
243
|
+
*/
|
|
244
|
+
migrateSubscriptionPoolInteractiveReady(result) {
|
|
245
|
+
const poolPath = path.join(this.config.stateDir, 'subscription-pool.json');
|
|
246
|
+
if (!fs.existsSync(poolPath)) {
|
|
247
|
+
result.skipped.push('subscription-pool interactive-ready: no pool store');
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
const pool = new SubscriptionPool({ stateDir: this.config.stateDir });
|
|
252
|
+
const claudeAccounts = pool.list().filter((a) => a.framework === 'claude-code');
|
|
253
|
+
if (claudeAccounts.length === 0) {
|
|
254
|
+
result.skipped.push('subscription-pool interactive-ready: no claude-code accounts');
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
for (const acct of claudeAccounts) {
|
|
258
|
+
const ready = ensureInteractiveReady(acct.configHome, { requireExistingHome: true });
|
|
259
|
+
if (ready.patched) {
|
|
260
|
+
result.upgraded.push(`subscription-pool interactive-ready: ${acct.id} (${acct.configHome}) — ${ready.reason}`);
|
|
261
|
+
}
|
|
262
|
+
else if (ready.reason === 'already interactive-ready' ||
|
|
263
|
+
ready.reason.includes('does not exist')) {
|
|
264
|
+
result.skipped.push(`subscription-pool interactive-ready: ${acct.id} — ${ready.reason}`);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
result.errors.push(`subscription-pool interactive-ready: ${acct.id} (${acct.configHome}) — ${ready.reason}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (err) {
|
|
272
|
+
result.errors.push(`subscription-pool interactive-ready: ${err instanceof Error ? err.message : String(err)}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
222
275
|
/**
|
|
223
276
|
* Regenerate the boot wrapper when it predates the ABI-aware node
|
|
224
277
|
* self-heal (recurring-SQLite-bane fix).
|