instar 1.3.1238 → 1.3.1240
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/dashboard/subscriptions.js +41 -4
- package/dist/core/PostUpdateMigrator.js +4 -4
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/messaging/telegram-origin/OriginAwareness.d.ts +2 -0
- package/dist/messaging/telegram-origin/OriginAwareness.d.ts.map +1 -1
- package/dist/messaging/telegram-origin/OriginAwareness.js +6 -1
- package/dist/messaging/telegram-origin/OriginAwareness.js.map +1 -1
- package/dist/messaging/telegram-origin/OriginConfigReader.d.ts.map +1 -1
- package/dist/messaging/telegram-origin/OriginConfigReader.js +9 -28
- package/dist/messaging/telegram-origin/OriginConfigReader.js.map +1 -1
- package/dist/messaging/telegram-origin/OriginDetectorCanary.d.ts +1 -0
- package/dist/messaging/telegram-origin/OriginDetectorCanary.d.ts.map +1 -1
- package/dist/messaging/telegram-origin/OriginDetectorCanary.js +155 -16
- package/dist/messaging/telegram-origin/OriginDetectorCanary.js.map +1 -1
- package/dist/messaging/telegram-origin/OriginDetectorCanary.worker.d.ts.map +1 -1
- package/dist/messaging/telegram-origin/OriginDetectorCanary.worker.js +69 -41
- package/dist/messaging/telegram-origin/OriginDetectorCanary.worker.js.map +1 -1
- package/dist/messaging/telegram-origin/OriginNoticePolicyObserver.d.ts +1 -1
- package/dist/messaging/telegram-origin/OriginNoticePolicyObserver.d.ts.map +1 -1
- package/dist/messaging/telegram-origin/OriginNoticePolicyObserver.js +9 -29
- package/dist/messaging/telegram-origin/OriginNoticePolicyObserver.js.map +1 -1
- package/dist/messaging/telegram-origin/OriginSourcePoller.d.ts +20 -0
- package/dist/messaging/telegram-origin/OriginSourcePoller.d.ts.map +1 -0
- package/dist/messaging/telegram-origin/OriginSourcePoller.js +74 -0
- package/dist/messaging/telegram-origin/OriginSourcePoller.js.map +1 -0
- package/dist/messaging/telegram-origin/OriginStore.d.ts.map +1 -1
- package/dist/messaging/telegram-origin/OriginStore.js +7 -1
- package/dist/messaging/telegram-origin/OriginStore.js.map +1 -1
- package/dist/server/routes.js +2 -2
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +23 -1
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +63 -63
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/upgrades/1.3.1239.md +19 -0
- package/upgrades/1.3.1240.md +26 -0
- package/upgrades/side-effects/subscription-relogin-stale-retry.md +100 -0
- package/upgrades/side-effects/telegram-canary-cleanup-phase.md +444 -0
- package/upgrades/telegram-canary-cleanup-phase.eli16.md +19 -0
|
@@ -79,6 +79,31 @@ export function effectiveAccountStatus(account) {
|
|
|
79
79
|
return account && account.status;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
+
const KNOWN_REPAIR_STATES = new Set([
|
|
83
|
+
'suggested', 'approved', 'cli-starting', 'artifact-ready', 'browser-driving',
|
|
84
|
+
'cli-finishing', 'identity-verifying', 'auth-verifying', 'waiting-operator-only',
|
|
85
|
+
'succeeded', 'refused', 'cancelled', 'failed',
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
/** A suggested/failed repair is actionable only while current pool truth still says
|
|
89
|
+
* the account cell needs authentication. Terminal repair rows remain durable audit
|
|
90
|
+
* history, but must never shadow a newer Active observation or offer a retry that
|
|
91
|
+
* the server's admission policy is required to refuse. In-flight states remain
|
|
92
|
+
* visible because pool activation can precede the controller's final ledger close. */
|
|
93
|
+
export function repairAppliesToCurrentState(repair, currentState) {
|
|
94
|
+
if (!repair || !KNOWN_REPAIR_STATES.has(repair.state)) return false;
|
|
95
|
+
if (repair.state === 'suggested' || repair.state === 'failed') {
|
|
96
|
+
return currentState === 'needs-reauth';
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function repairConflictMessage(error) {
|
|
102
|
+
return /^(?:retry|approval)-revalidation-refused:account-not-needs-reauth$/.test(
|
|
103
|
+
typeof error === 'string' ? error : '',
|
|
104
|
+
) ? 'This account is already active. Refreshing its status…' : null;
|
|
105
|
+
}
|
|
106
|
+
|
|
82
107
|
const PROVIDER_WORDS = { anthropic: 'Claude', openai: 'Codex', 'github-copilot': 'Copilot', google: 'Gemini' };
|
|
83
108
|
export function friendlyProvider(provider) {
|
|
84
109
|
return PROVIDER_WORDS[typeof provider === 'string' ? provider : ''] || sanitizeForDisplay(provider, 'label');
|
|
@@ -294,9 +319,12 @@ export function renderAccounts(doc, target, accounts, now = Date.now(), inUseAcc
|
|
|
294
319
|
if (refAge) {
|
|
295
320
|
card.appendChild(el(doc, 'div', 'sub-account-refresh', `Token auto-refreshed ${refAge}`));
|
|
296
321
|
}
|
|
297
|
-
const
|
|
322
|
+
const repairCandidate = Array.isArray(reloginEpisodes)
|
|
298
323
|
? reloginEpisodes.find((episode) => episode && a && episode.accountId === a.id)
|
|
299
324
|
: null;
|
|
325
|
+
const repair = repairAppliesToCurrentState(repairCandidate, effectiveAccountStatus(a))
|
|
326
|
+
? repairCandidate
|
|
327
|
+
: null;
|
|
300
328
|
if (repair) {
|
|
301
329
|
const repairBox = el(doc, 'div', 'sub-account-repair');
|
|
302
330
|
const terminal = ['succeeded', 'refused', 'cancelled', 'failed'].includes(repair.state);
|
|
@@ -855,9 +883,12 @@ export function renderAccountMatrix(doc, target, poolScope, pendingScope, transi
|
|
|
855
883
|
const tr = doc.createElement('tr');
|
|
856
884
|
tr.appendChild(el(doc, 'th', 'sub-matrix-acct', sanitizeForDisplay(row.account.email, 'label')));
|
|
857
885
|
for (const c of row.cells) {
|
|
858
|
-
const
|
|
886
|
+
const repairCandidate = Array.isArray(reloginEpisodes)
|
|
859
887
|
? reloginEpisodes.find((episode) => episode && episode.accountId === c.accountId && episode.machineId === c.machineId)
|
|
860
888
|
: null;
|
|
889
|
+
const repair = repairAppliesToCurrentState(repairCandidate, c.state)
|
|
890
|
+
? repairCandidate
|
|
891
|
+
: null;
|
|
861
892
|
const repairUnavailable = Array.isArray(reloginFailures)
|
|
862
893
|
&& reloginFailures.some((failure) => failure && failure.machineId === c.machineId);
|
|
863
894
|
// just-verified rides a transient highlight on an otherwise-active cell (D4 ceremony).
|
|
@@ -1360,8 +1391,12 @@ export function createController(opts) {
|
|
|
1360
1391
|
});
|
|
1361
1392
|
if (!response.ok) {
|
|
1362
1393
|
if (response.status === 401) requestUnlock();
|
|
1363
|
-
|
|
1394
|
+
const body = await response.json().catch(() => ({}));
|
|
1395
|
+
const resolvedConflict = repairConflictMessage(body.error);
|
|
1396
|
+
button.textContent = response.status === 401 ? 'Enter PIN, then try again'
|
|
1397
|
+
: resolvedConflict || 'Couldn’t start — try again';
|
|
1364
1398
|
button.removeAttribute('disabled');
|
|
1399
|
+
if (resolvedConflict) await tick();
|
|
1365
1400
|
return;
|
|
1366
1401
|
}
|
|
1367
1402
|
await tick();
|
|
@@ -1564,10 +1599,12 @@ export function createController(opts) {
|
|
|
1564
1599
|
const body = await response.json().catch(() => ({}));
|
|
1565
1600
|
if (!response.ok) {
|
|
1566
1601
|
if (response.status === 401) requestUnlock();
|
|
1602
|
+
const resolvedConflict = repairConflictMessage(body.error);
|
|
1567
1603
|
setCellStatus(cell, response.status === 401
|
|
1568
1604
|
? 'Enter your dashboard PIN, then tap Repair sign-in once.'
|
|
1569
|
-
: body.error || 'Couldn’t start the repair — try again.');
|
|
1605
|
+
: resolvedConflict || body.error || 'Couldn’t start the repair — try again.');
|
|
1570
1606
|
btn.removeAttribute('disabled');
|
|
1607
|
+
if (resolvedConflict) await tick();
|
|
1571
1608
|
return;
|
|
1572
1609
|
}
|
|
1573
1610
|
setCellStatus(cell, 'Repair started — Instar is handling the sign-in.');
|
|
@@ -21,7 +21,7 @@ import { originToolGuardHook } from '../messaging/telegram-origin/OriginToolGuar
|
|
|
21
21
|
* - Scripts are installed only if missing (never overwrite user modifications)
|
|
22
22
|
*/
|
|
23
23
|
import fs from 'node:fs';
|
|
24
|
-
import { telegramOriginAwareness, telegramOriginNoticeAwareness, telegramOriginCertificationAwareness, telegramOriginLeaseAwareness, telegramOriginDashboardAwareness, telegramOriginDetectorAwareness, telegramOriginRecoveryAwareness, telegramOriginTransportAwareness, telegramOriginCapacityAwareness, telegramDashboardEditAwareness, refreshOriginCanaryStartupAwareness } from '../messaging/telegram-origin/OriginAwareness.js';
|
|
24
|
+
import { telegramOriginAwareness, telegramOriginNoticeAwareness, telegramOriginCertificationAwareness, telegramOriginLeaseAwareness, telegramOriginDashboardAwareness, telegramOriginDetectorAwareness, telegramOriginRecoveryAwareness, telegramOriginTransportAwareness, telegramOriginCapacityAwareness, telegramDashboardEditAwareness, refreshOriginCanaryStartupAwareness, refreshOriginCanaryCleanupAwareness } from '../messaging/telegram-origin/OriginAwareness.js';
|
|
25
25
|
import { migrateTelegramOriginDisplay } from '../messaging/telegram-origin/OriginConfig.js';
|
|
26
26
|
import path from 'node:path';
|
|
27
27
|
import os from 'node:os';
|
|
@@ -6109,11 +6109,11 @@ setTimeout(() => process.exit(0), 2000);
|
|
|
6109
6109
|
patched = true;
|
|
6110
6110
|
result.upgraded.push('CLAUDE.md: added dashboard edit rejection awareness');
|
|
6111
6111
|
}
|
|
6112
|
-
const refreshedOriginCanary = refreshOriginCanaryStartupAwareness(content);
|
|
6112
|
+
const refreshedOriginCanary = refreshOriginCanaryCleanupAwareness(refreshOriginCanaryStartupAwareness(content));
|
|
6113
6113
|
if (refreshedOriginCanary !== content) {
|
|
6114
6114
|
content = refreshedOriginCanary;
|
|
6115
6115
|
patched = true;
|
|
6116
|
-
result.upgraded.push('CLAUDE.md: refreshed origin canary startup
|
|
6116
|
+
result.upgraded.push('CLAUDE.md: refreshed origin canary startup and cleanup awareness');
|
|
6117
6117
|
}
|
|
6118
6118
|
if (!content.includes('Origin lease renewal dependency:')) {
|
|
6119
6119
|
content += '\n' + telegramOriginLeaseAwareness();
|
|
@@ -10223,7 +10223,7 @@ Two layers keep my machine-to-machine \"ropes\" (Tailscale / LAN / Cloudflare) h
|
|
|
10223
10223
|
result.errors.push(`${shadowName} read: ${err instanceof Error ? err.message : String(err)}`);
|
|
10224
10224
|
continue;
|
|
10225
10225
|
}
|
|
10226
|
-
let appended = refreshOriginCanaryStartupAwareness(shadowContent);
|
|
10226
|
+
let appended = refreshOriginCanaryCleanupAwareness(refreshOriginCanaryStartupAwareness(shadowContent));
|
|
10227
10227
|
let mirrored = appended === shadowContent ? 0 : 1;
|
|
10228
10228
|
for (const marker of markers) {
|
|
10229
10229
|
if (appended.includes(marker))
|