shennian 0.4.37 → 0.4.39
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/publish-build-manifest.json +4 -4
- package/dist/src/personal-sync/machine-authority.d.ts +1 -0
- package/dist/src/personal-sync/machine-authority.js +1 -1
- package/dist/src/upgrade/scheduler.d.ts +3 -2
- package/dist/src/upgrade/scheduler.js +1 -1
- package/node_modules/@shennian/wire/dist/session.d.ts +2 -0
- package/package.json +1 -1
|
@@ -556,8 +556,8 @@
|
|
|
556
556
|
},
|
|
557
557
|
{
|
|
558
558
|
"file": "src/personal-sync/machine-authority.js",
|
|
559
|
-
"beforeBytes":
|
|
560
|
-
"afterBytes":
|
|
559
|
+
"beforeBytes": 2742,
|
|
560
|
+
"afterBytes": 1456
|
|
561
561
|
},
|
|
562
562
|
{
|
|
563
563
|
"file": "src/personal-sync/metrics.js",
|
|
@@ -891,8 +891,8 @@
|
|
|
891
891
|
},
|
|
892
892
|
{
|
|
893
893
|
"file": "src/upgrade/scheduler.js",
|
|
894
|
-
"beforeBytes":
|
|
895
|
-
"afterBytes":
|
|
894
|
+
"beforeBytes": 7315,
|
|
895
|
+
"afterBytes": 4167
|
|
896
896
|
},
|
|
897
897
|
{
|
|
898
898
|
"file": "src/upgrade/updater-bootstrap.js",
|
|
@@ -9,3 +9,4 @@ export declare function synchronizeMachinePersonalAuthority(input: {
|
|
|
9
9
|
machineId?: string | null;
|
|
10
10
|
fetchImpl?: typeof fetch;
|
|
11
11
|
}): Promise<MachinePersonalAuthority>;
|
|
12
|
+
export declare function fetchMachineAuthorityResponse(url: string, machineToken: string, request?: typeof fetch): Promise<Response>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SESSION_SYNC_DATA_EPOCH as
|
|
1
|
+
import{setTimeout as h}from"node:timers/promises";import{SESSION_SYNC_DATA_EPOCH as s}from"@shennian/wire";import{loadConfig as m,saveConfig as d}from"../config/index.js";import{getDaemonInstallationId as l}from"./identity.js";async function y(a){const t=await f(`${a.serverUrl.replace(/\/+$/,"")}/api/machines/identity`,a.machineToken,a.fetchImpl);if(!t.ok)throw new Error(`machine_personal_authority_unavailable:${t.status}`);const e=await t.json();if(typeof e.machineId!="string"||!e.machineId||typeof e.daemonInstallationId!="string"||!e.daemonInstallationId||typeof e.dataEpoch!="number"||!Number.isSafeInteger(e.dataEpoch))throw new Error("machine_personal_authority_invalid_response");if(a.machineId&&e.machineId!==a.machineId)throw new Error("machine_personal_authority_machine_mismatch");if(e.daemonInstallationId!==l())throw new Error("machine_personal_authority_daemon_mismatch");if(e.dataEpoch!==s)throw new Error("machine_personal_authority_epoch_mismatch");const o=m();return o.machineId!==e.machineId&&d({...o,machineId:e.machineId}),e}async function f(a,t,e=fetch){const o=AbortSignal.timeout(1e4);for(let n=0;;n+=1)try{return await e(a,{headers:{Authorization:`Bearer ${t}`},signal:o})}catch(r){const i=r,c=i?.cause?.code??i?.code;if(o.aborted||n>=2||!["ECONNRESET","EPIPE","UND_ERR_SOCKET"].includes(c??""))throw r;await h(250*(n+1),void 0,{signal:o})}}export{f as fetchMachineAuthorityResponse,y as synchronizeMachinePersonalAuthority};
|
|
@@ -12,6 +12,7 @@ export type CliReleasePolicy = {
|
|
|
12
12
|
blockedCurrentVersions: string[];
|
|
13
13
|
killSwitch: boolean;
|
|
14
14
|
releaseLevel: 'normal' | 'required' | 'blocked';
|
|
15
|
+
/** Legacy wire field; normal updates now wait for idle without a deadline. */
|
|
15
16
|
maxIdleWaitMs: number;
|
|
16
17
|
minimumSessionSyncProtocolVersion?: number;
|
|
17
18
|
minimumDataEpoch?: number;
|
|
@@ -32,7 +33,7 @@ type AutoUpgradeSchedulerDeps = {
|
|
|
32
33
|
intervalMs?: number;
|
|
33
34
|
setTimeout?: (handler: () => void, delayMs: number) => ReturnType<typeof setTimeout>;
|
|
34
35
|
clearTimeout?: (timer: ReturnType<typeof setTimeout>) => void;
|
|
35
|
-
|
|
36
|
+
random?: () => number;
|
|
36
37
|
sessionSyncProtocolVersion?: number;
|
|
37
38
|
dataEpoch?: number;
|
|
38
39
|
advertisedCapabilities?: readonly string[];
|
|
@@ -47,13 +48,13 @@ export declare class AutoUpgradeScheduler {
|
|
|
47
48
|
private timer;
|
|
48
49
|
private started;
|
|
49
50
|
private upgradeInFlight;
|
|
50
|
-
private eligibleSince;
|
|
51
51
|
constructor(deps: AutoUpgradeSchedulerDeps);
|
|
52
52
|
start(): void;
|
|
53
53
|
stop(): void;
|
|
54
54
|
setPolicy(policy: RuntimeAutoUpgradePolicy): void;
|
|
55
55
|
getPolicy(): RuntimeAutoUpgradePolicy;
|
|
56
56
|
runOnce(): Promise<void>;
|
|
57
|
+
private nextIntervalMs;
|
|
57
58
|
private arm;
|
|
58
59
|
}
|
|
59
60
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{checkForUpdate as
|
|
1
|
+
import{checkForUpdate as l,isUpgradeVersionInCooldown as c}from"./engine.js";const u={automaticPatchEnabled:!1,rolloutPercentage:0,pausedVersions:[],blockedVersions:[],blockedCurrentVersions:[],killSwitch:!0,releaseLevel:"normal",maxIdleWaitMs:30*6e4,requiredCapabilities:[],externalUpdaterEnabled:!1};function d(r){let i=2166136261;for(let t=0;t<r.length;t++)i^=r.charCodeAt(t),i=Math.imul(i,16777619);return(i>>>0)%100}function m(r,i,t,e){if(r.killSwitch||!r.automaticPatchEnabled||r.blockedVersions.includes(e)||r.pausedVersions.includes(e)||r.pausedVersions.includes(t))return!1;const s=Math.max(0,Math.min(100,Math.floor(r.rolloutPercentage)));return d(i)<s}async function h(r){const i=new URL("/api/releases/cli-policy",r),t=await fetch(i,{headers:{Accept:"application/json"},signal:AbortSignal.timeout(1e4)});if(!t.ok)throw new Error(`release policy returned ${t.status}`);const e=await t.json();return{automaticPatchEnabled:e.automaticPatchEnabled===!0,rolloutPercentage:typeof e.rolloutPercentage=="number"?e.rolloutPercentage:0,pausedVersions:Array.isArray(e.pausedVersions)?e.pausedVersions.filter(s=>typeof s=="string"):[],blockedVersions:Array.isArray(e.blockedVersions)?e.blockedVersions.filter(s=>typeof s=="string"):[],blockedCurrentVersions:Array.isArray(e.blockedCurrentVersions)?e.blockedCurrentVersions.filter(s=>typeof s=="string"):[],killSwitch:e.killSwitch!==!1,releaseLevel:e.releaseLevel==="required"||e.releaseLevel==="blocked"?e.releaseLevel:"normal",maxIdleWaitMs:typeof e.maxIdleWaitMs=="number"&&Number.isFinite(e.maxIdleWaitMs)?Math.max(0,Math.min(1440*6e4,Math.floor(e.maxIdleWaitMs))):30*6e4,...typeof e.minimumSessionSyncProtocolVersion=="number"?{minimumSessionSyncProtocolVersion:e.minimumSessionSyncProtocolVersion}:{},...typeof e.minimumDataEpoch=="number"?{minimumDataEpoch:e.minimumDataEpoch}:{},requiredCapabilities:Array.isArray(e.requiredCapabilities)?e.requiredCapabilities.filter(s=>typeof s=="string"):[],externalUpdaterEnabled:e.externalUpdaterEnabled===!0,...typeof e.minimumUpdaterProtocolVersion=="number"?{minimumUpdaterProtocolVersion:e.minimumUpdaterProtocolVersion}:{}}}class f{deps;policy="none";timer=null;started=!1;upgradeInFlight=!1;constructor(i){this.deps=i}start(){this.started||(this.started=!0,this.arm(this.deps.initialDelayMs??3e4))}stop(){this.started=!1,this.timer&&(this.deps.clearTimeout??clearTimeout)(this.timer),this.timer=null}setPolicy(i){this.policy=i,this.started&&(this.timer||this.arm(0))}getPolicy(){return this.policy}async runOnce(){if(this.upgradeInFlight)return;const i=await(this.deps.checkForUpdate??l)(this.deps.currentVersion);if(!i.hasUpdate||(this.deps.inCooldown??c)(i.latest))return;let t=u;try{t=await(this.deps.fetchReleasePolicy??(()=>h(this.deps.serverUrl)))()}catch{return}if(t.killSwitch||!t.externalUpdaterEnabled||t.blockedVersions.includes(i.latest)||t.pausedVersions.includes(i.latest)||t.pausedVersions.includes(i.current))return;const e=t.blockedCurrentVersions.includes(i.current)?"blocked":t.releaseLevel,s=t.minimumSessionSyncProtocolVersion!==void 0&&(this.deps.sessionSyncProtocolVersion??0)<t.minimumSessionSyncProtocolVersion||t.minimumDataEpoch!==void 0&&(this.deps.dataEpoch??0)<t.minimumDataEpoch||t.requiredCapabilities.some(o=>!(this.deps.advertisedCapabilities??[]).includes(o))||t.minimumUpdaterProtocolVersion!==void 0&&(this.deps.updaterProtocolVersion??0)<t.minimumUpdaterProtocolVersion,a=e==="required"||e==="blocked"||s;if(!a&&(this.policy!=="patch"||i.changeType!=="patch"||!m(t,this.deps.machineId,i.current,i.latest)))return;const n=this.deps.getIdleState();if(!(!a&&!n.idle)){this.upgradeInFlight=!0;try{await this.deps.startUpgrade(i.latest)}finally{this.upgradeInFlight=!1}}}nextIntervalMs(){return this.deps.intervalMs??5*6e4+Math.floor((this.deps.random??Math.random)()*10*6e4)}arm(i){if(!this.started||this.timer)return;const t=this.deps.setTimeout??setTimeout;this.timer=t(()=>{this.timer=null,this.runOnce().catch(()=>{}).finally(()=>{this.started&&this.arm(this.nextIntervalMs())})},i),this.timer.unref?.()}}export{f as AutoUpgradeScheduler,d as deterministicRolloutBucket,h as fetchCliReleasePolicy,m as isAutomaticPatchAllowed};
|
|
@@ -271,6 +271,8 @@ export type NianSession = {
|
|
|
271
271
|
id: string;
|
|
272
272
|
/** Device-local lifecycle only; never sent as canonical session metadata. */
|
|
273
273
|
localCreationState?: 'draft' | 'created';
|
|
274
|
+
/** Client-local user-message sort watermark; not canonical server metadata. */
|
|
275
|
+
lastUserMessageAt?: string | null;
|
|
274
276
|
agentIdentityId?: string | null;
|
|
275
277
|
machineId: string;
|
|
276
278
|
userId: string;
|