instar 1.3.607 → 1.3.609
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/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +298 -31
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +22 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/coordination/AccountFollowMeMandateBridge.d.ts +56 -0
- package/dist/coordination/AccountFollowMeMandateBridge.d.ts.map +1 -0
- package/dist/coordination/AccountFollowMeMandateBridge.js +56 -0
- package/dist/coordination/AccountFollowMeMandateBridge.js.map +1 -0
- package/dist/core/AccountFollowMeDetector.d.ts +53 -0
- package/dist/core/AccountFollowMeDetector.d.ts.map +1 -0
- package/dist/core/AccountFollowMeDetector.js +56 -0
- package/dist/core/AccountFollowMeDetector.js.map +1 -0
- package/dist/core/AccountFollowMeEmailGate.d.ts +51 -0
- package/dist/core/AccountFollowMeEmailGate.d.ts.map +1 -0
- package/dist/core/AccountFollowMeEmailGate.js +50 -0
- package/dist/core/AccountFollowMeEmailGate.js.map +1 -0
- package/dist/core/AccountFollowMeOrchestrator.d.ts +98 -0
- package/dist/core/AccountFollowMeOrchestrator.d.ts.map +1 -0
- package/dist/core/AccountFollowMeOrchestrator.js +76 -0
- package/dist/core/AccountFollowMeOrchestrator.js.map +1 -0
- package/dist/core/AccountFollowMeService.d.ts +84 -0
- package/dist/core/AccountFollowMeService.d.ts.map +1 -0
- package/dist/core/AccountFollowMeService.js +105 -0
- package/dist/core/AccountFollowMeService.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +18 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/accountFollowMeDepth.d.ts +40 -0
- package/dist/core/accountFollowMeDepth.d.ts.map +1 -0
- package/dist/core/accountFollowMeDepth.js +47 -0
- package/dist/core/accountFollowMeDepth.js.map +1 -0
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +6 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/fetchPeerSubscriptionViews.d.ts +46 -0
- package/dist/core/fetchPeerSubscriptionViews.d.ts.map +1 -0
- package/dist/core/fetchPeerSubscriptionViews.js +70 -0
- package/dist/core/fetchPeerSubscriptionViews.js.map +1 -0
- package/dist/core/types.d.ts +37 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/AutonomousLivenessReconciler.d.ts +278 -0
- package/dist/monitoring/AutonomousLivenessReconciler.d.ts.map +1 -0
- package/dist/monitoring/AutonomousLivenessReconciler.js +660 -0
- package/dist/monitoring/AutonomousLivenessReconciler.js.map +1 -0
- package/dist/monitoring/ResumeQueue.d.ts +10 -0
- package/dist/monitoring/ResumeQueue.d.ts.map +1 -1
- package/dist/monitoring/ResumeQueue.js +12 -0
- package/dist/monitoring/ResumeQueue.js.map +1 -1
- package/dist/monitoring/guardManifest.d.ts.map +1 -1
- package/dist/monitoring/guardManifest.js +1 -0
- package/dist/monitoring/guardManifest.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +4 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +2 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +7 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +7 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +59 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +4 -0
- package/upgrades/1.3.608.md +29 -0
- package/upgrades/1.3.609.md +24 -0
- package/upgrades/side-effects/autonomous-liveness-reconciler.md +39 -0
- package/upgrades/side-effects/ws52-account-follow-me-pr2.md +59 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WS5.2 §5.2 — Account Follow-Me: the agent's role is REQUEST, never self-authorize.
|
|
3
|
+
*
|
|
4
|
+
* When the agent detects a machine with no usable account for an operator's subscription
|
|
5
|
+
* (depth-zero; WS5.1 already detects this), it must NOT enroll that machine on its own. The
|
|
6
|
+
* ONLY authorizer is a PIN-gated operator mandate (`action: 'account-follow-me'`). This
|
|
7
|
+
* orchestrator runs the deny-by-default flow:
|
|
8
|
+
*
|
|
9
|
+
* - evaluate the mandate gate for (accountId, targetMachineId, mechanism);
|
|
10
|
+
* - DENY (no mandate yet, or bounds/expiry/revocation/forgery) → surface a PHONE-FIRST
|
|
11
|
+
* consent request (a deep-link to the pre-filled Mandates form) and DO NOT proceed;
|
|
12
|
+
* - ALLOW → return proceed:true so the caller drives Mechanism B (§5.3).
|
|
13
|
+
*
|
|
14
|
+
* Load-bearing safety (reach ≠ authority, L15): a peer mesh message claiming "the operator said
|
|
15
|
+
* enroll me" carries NO authority — with no operator-issued mandate the gate denies, and this
|
|
16
|
+
* orchestrator surfaces consent instead of proceeding. The consent surface is NEVER a CLI
|
|
17
|
+
* instruction ("run instar …") — it is a dashboard deep-link the operator taps (parent spec
|
|
18
|
+
* B2). Mechanism defaults to 're-mint' (ToS-safe); 'credential-transport' is only ever reached
|
|
19
|
+
* when an explicit mandate authorizes it AND the provider is allowlisted (refused for Anthropic).
|
|
20
|
+
*
|
|
21
|
+
* PR2 increment 1: this orchestrator + its tests. Later increments wire the depth-zero detector
|
|
22
|
+
* to it and drive the EnrollmentWizard on allow (§5.3, per-server transport per OQ6).
|
|
23
|
+
*/
|
|
24
|
+
export class AccountFollowMeOrchestrator {
|
|
25
|
+
deps;
|
|
26
|
+
constructor(deps) {
|
|
27
|
+
this.deps = deps;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* §5.2 request-never-self-authorize. Returns proceed:true ONLY when a real operator mandate
|
|
31
|
+
* authorizes this exact (account, target, mechanism); otherwise returns a phone-first consent
|
|
32
|
+
* request and DOES NOT proceed. Never self-authorizes.
|
|
33
|
+
*/
|
|
34
|
+
requestEnrollment(req) {
|
|
35
|
+
const mechanism = req.mechanism ?? 're-mint';
|
|
36
|
+
const consent = () => ({
|
|
37
|
+
kind: 'account-follow-me-consent',
|
|
38
|
+
accountId: req.accountId,
|
|
39
|
+
accountEmail: req.accountEmail,
|
|
40
|
+
targetMachineId: req.targetMachineId,
|
|
41
|
+
targetMachineNickname: req.targetMachineNickname,
|
|
42
|
+
mechanism,
|
|
43
|
+
dashboardDeepLink: this.deps.mandatesDeepLink({
|
|
44
|
+
accountId: req.accountId,
|
|
45
|
+
targetMachineId: req.targetMachineId,
|
|
46
|
+
mechanism,
|
|
47
|
+
}),
|
|
48
|
+
message: `Machine "${req.targetMachineNickname}" has no account for ${req.accountEmail} yet. ` +
|
|
49
|
+
`Want it to use that subscription? Authorize on the dashboard.`,
|
|
50
|
+
});
|
|
51
|
+
// No mandate id at all ⇒ deny-by-default: never self-authorize, surface consent.
|
|
52
|
+
if (!req.mandateId) {
|
|
53
|
+
this.deps.log?.(`[account-follow-me] no mandate for ${req.accountId}→${req.targetMachineId}; surfacing consent`);
|
|
54
|
+
return { proceed: false, outcome: 'consent-required', consent: consent(), reason: 'no-mandate' };
|
|
55
|
+
}
|
|
56
|
+
const result = this.deps.gate.evaluate({
|
|
57
|
+
action: 'account-follow-me',
|
|
58
|
+
params: { accountId: req.accountId, targetMachineId: req.targetMachineId, mechanism },
|
|
59
|
+
agentFp: this.deps.agentFp(),
|
|
60
|
+
mandateId: req.mandateId,
|
|
61
|
+
});
|
|
62
|
+
if (result.decision !== 'allow') {
|
|
63
|
+
this.deps.log?.(`[account-follow-me] gate denied (${result.reason}); surfacing consent`);
|
|
64
|
+
return { proceed: false, outcome: 'consent-required', consent: consent(), reason: `denied:${result.reason}` };
|
|
65
|
+
}
|
|
66
|
+
this.deps.log?.(`[account-follow-me] gate allowed ${req.accountId}→${req.targetMachineId} (${mechanism})`);
|
|
67
|
+
return {
|
|
68
|
+
proceed: true,
|
|
69
|
+
accountId: req.accountId,
|
|
70
|
+
targetMachineId: req.targetMachineId,
|
|
71
|
+
mechanism,
|
|
72
|
+
reason: result.reason,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=AccountFollowMeOrchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountFollowMeOrchestrator.js","sourceRoot":"","sources":["../../src/core/AccountFollowMeOrchestrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAwDH,MAAM,OAAO,2BAA2B;IACT;IAA7B,YAA6B,IAAqC;QAArC,SAAI,GAAJ,IAAI,CAAiC;IAAG,CAAC;IAEtE;;;;OAIG;IACH,iBAAiB,CAAC,GAAoB;QACpC,MAAM,SAAS,GAAsB,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;QAEhE,MAAM,OAAO,GAAG,GAA2B,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,2BAA2B;YACjC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,qBAAqB,EAAE,GAAG,CAAC,qBAAqB;YAChD,SAAS;YACT,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBAC5C,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,SAAS;aACV,CAAC;YACF,OAAO,EACL,YAAY,GAAG,CAAC,qBAAqB,wBAAwB,GAAG,CAAC,YAAY,QAAQ;gBACrF,+DAA+D;SAClE,CAAC,CAAC;QAEH,iFAAiF;QACjF,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,sCAAsC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,eAAe,qBAAqB,CAAC,CAAC;YACjH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QACnG,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YACrC,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,SAAS,EAAE;YACrF,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,oCAAoC,MAAM,CAAC,MAAM,sBAAsB,CAAC,CAAC;YACzF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAChH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,oCAAoC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,GAAG,CAAC,CAAC;QAC3G,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,SAAS;YACT,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WS5.2 §5.2 — Account Follow-Me service: composes the primitives into the depth-zero → consent
|
|
3
|
+
* flow, and the mandate-delivered → proceed flow. Pure orchestration over INJECTED deps (pool
|
|
4
|
+
* reader, consent emitter, enroll driver) so it is unit-testable WITHOUT spawning a server; the
|
|
5
|
+
* HTTP route / scheduler tick later just constructs it with real deps.
|
|
6
|
+
*
|
|
7
|
+
* Two entry points:
|
|
8
|
+
* - scanAndOffer(): detect depth-zero enrollment candidates (R7-bounded), run each through the
|
|
9
|
+
* orchestrator (no operator mandate yet → consent-required), and emit ONE AGGREGATED consent
|
|
10
|
+
* item (P17 Bounded Notification Surface) — never one per machine. Never enrolls anything.
|
|
11
|
+
* - onMandateDelivered(): a portable account-follow-me mandate arrived from the operator machine
|
|
12
|
+
* → verify it (R4a bridge) → run the orchestrator with it → on allow, return an enroll-drive
|
|
13
|
+
* instruction for the caller to execute (per-server, OQ6). Still never self-authorizes.
|
|
14
|
+
*
|
|
15
|
+
* The service decides; the side effects (raising the attention item, driving the EnrollmentWizard,
|
|
16
|
+
* SubscriptionPool.add) are injected so each is independently testable + swappable. PR2 increment 3b.
|
|
17
|
+
*/
|
|
18
|
+
import { type PoolMachineDepth, type OperatorAccount } from './AccountFollowMeDetector.js';
|
|
19
|
+
import { AccountFollowMeOrchestrator, type FollowMeConsentRequest, type FollowMeMechanism } from './AccountFollowMeOrchestrator.js';
|
|
20
|
+
import { type PortableMandate } from '../coordination/AccountFollowMeMandateBridge.js';
|
|
21
|
+
import type crypto from 'node:crypto';
|
|
22
|
+
export interface AggregatedConsent {
|
|
23
|
+
/** Stable id so the attention item dedups per scan-set (one running item, not a flood). */
|
|
24
|
+
id: string;
|
|
25
|
+
title: string;
|
|
26
|
+
body: string;
|
|
27
|
+
priority: 'medium';
|
|
28
|
+
source: 'agent';
|
|
29
|
+
offers: FollowMeConsentRequest[];
|
|
30
|
+
}
|
|
31
|
+
export interface EnrollDriveInstruction {
|
|
32
|
+
accountId: string;
|
|
33
|
+
targetMachineId: string;
|
|
34
|
+
mechanism: FollowMeMechanism;
|
|
35
|
+
/** The verified mandate id authorizing this drive (audit). */
|
|
36
|
+
mandateId: string;
|
|
37
|
+
}
|
|
38
|
+
export interface AccountFollowMeServiceDeps {
|
|
39
|
+
/** Read the pool's per-machine account depth + the operator's accounts (WS5.1 / SubscriptionPool). */
|
|
40
|
+
readPoolDepth: () => {
|
|
41
|
+
machines: PoolMachineDepth[];
|
|
42
|
+
accounts: OperatorAccount[];
|
|
43
|
+
};
|
|
44
|
+
/** Per-account max-follow-machines cap (R7). */
|
|
45
|
+
maxFollowMachines: () => number;
|
|
46
|
+
/** (account,target) pairs already offered/in-flight — never re-offered (`${accountId}::${targetMachineId}`). */
|
|
47
|
+
inFlight: () => ReadonlySet<string>;
|
|
48
|
+
/** The §5.2 orchestrator (request-never-self-authorize). */
|
|
49
|
+
orchestrator: AccountFollowMeOrchestrator;
|
|
50
|
+
/** Raise ONE aggregated consent attention item. */
|
|
51
|
+
emitAggregatedConsent: (consent: AggregatedConsent) => void;
|
|
52
|
+
log?: (msg: string) => void;
|
|
53
|
+
}
|
|
54
|
+
export declare class AccountFollowMeService {
|
|
55
|
+
private readonly deps;
|
|
56
|
+
constructor(deps: AccountFollowMeServiceDeps);
|
|
57
|
+
/**
|
|
58
|
+
* §5.2 scan: surface (never act on) the depth-zero enrollment offers. Runs each candidate through
|
|
59
|
+
* the orchestrator — with no mandate yet, each yields consent-required — and emits ONE aggregated
|
|
60
|
+
* consent item over all of them. Returns the consent requests surfaced (empty if none).
|
|
61
|
+
*/
|
|
62
|
+
scanAndOffer(): {
|
|
63
|
+
offered: FollowMeConsentRequest[];
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* A portable account-follow-me mandate was delivered from the operator machine. Verify it (R4a),
|
|
67
|
+
* then run the orchestrator with it. On allow, return an enroll-drive instruction; otherwise null
|
|
68
|
+
* (verification failed, or the gate denied — never proceed, never self-authorize).
|
|
69
|
+
*/
|
|
70
|
+
onMandateDelivered(args: {
|
|
71
|
+
portable: PortableMandate;
|
|
72
|
+
operatorEd25519PublicKey: crypto.KeyObject | string | Buffer;
|
|
73
|
+
expectedOperatorMachineFingerprint: string;
|
|
74
|
+
/** The (account,target,mechanism,email,nickname) this mandate is expected to authorize. */
|
|
75
|
+
request: {
|
|
76
|
+
accountId: string;
|
|
77
|
+
accountEmail: string;
|
|
78
|
+
targetMachineId: string;
|
|
79
|
+
targetMachineNickname: string;
|
|
80
|
+
mechanism?: FollowMeMechanism;
|
|
81
|
+
};
|
|
82
|
+
}): EnrollDriveInstruction | null;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=AccountFollowMeService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountFollowMeService.d.ts","sourceRoot":"","sources":["../../src/core/AccountFollowMeService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAA0B,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnH,OAAO,EACL,2BAA2B,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAA0B,KAAK,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAC/G,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,sBAAsB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,sGAAsG;IACtG,aAAa,EAAE,MAAM;QAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;KAAE,CAAC;IACnF,gDAAgD;IAChD,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,gHAAgH;IAChH,QAAQ,EAAE,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,4DAA4D;IAC5D,YAAY,EAAE,2BAA2B,CAAC;IAC1C,mDAAmD;IACnD,qBAAqB,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5D,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,0BAA0B;IAE7D;;;;OAIG;IACH,YAAY,IAAI;QAAE,OAAO,EAAE,sBAAsB,EAAE,CAAA;KAAE;IAyCrD;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE;QACvB,QAAQ,EAAE,eAAe,CAAC;QAC1B,wBAAwB,EAAE,MAAM,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;QAC7D,kCAAkC,EAAE,MAAM,CAAC;QAC3C,2FAA2F;QAC3F,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAC;YAAC,qBAAqB,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,iBAAiB,CAAA;SAAE,CAAC;KAC7I,GAAG,sBAAsB,GAAG,IAAI;CA6BlC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WS5.2 §5.2 — Account Follow-Me service: composes the primitives into the depth-zero → consent
|
|
3
|
+
* flow, and the mandate-delivered → proceed flow. Pure orchestration over INJECTED deps (pool
|
|
4
|
+
* reader, consent emitter, enroll driver) so it is unit-testable WITHOUT spawning a server; the
|
|
5
|
+
* HTTP route / scheduler tick later just constructs it with real deps.
|
|
6
|
+
*
|
|
7
|
+
* Two entry points:
|
|
8
|
+
* - scanAndOffer(): detect depth-zero enrollment candidates (R7-bounded), run each through the
|
|
9
|
+
* orchestrator (no operator mandate yet → consent-required), and emit ONE AGGREGATED consent
|
|
10
|
+
* item (P17 Bounded Notification Surface) — never one per machine. Never enrolls anything.
|
|
11
|
+
* - onMandateDelivered(): a portable account-follow-me mandate arrived from the operator machine
|
|
12
|
+
* → verify it (R4a bridge) → run the orchestrator with it → on allow, return an enroll-drive
|
|
13
|
+
* instruction for the caller to execute (per-server, OQ6). Still never self-authorizes.
|
|
14
|
+
*
|
|
15
|
+
* The service decides; the side effects (raising the attention item, driving the EnrollmentWizard,
|
|
16
|
+
* SubscriptionPool.add) are injected so each is independently testable + swappable. PR2 increment 3b.
|
|
17
|
+
*/
|
|
18
|
+
import { detectEnrollmentOffers } from './AccountFollowMeDetector.js';
|
|
19
|
+
import { acceptDeliveredMandate } from '../coordination/AccountFollowMeMandateBridge.js';
|
|
20
|
+
export class AccountFollowMeService {
|
|
21
|
+
deps;
|
|
22
|
+
constructor(deps) {
|
|
23
|
+
this.deps = deps;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* §5.2 scan: surface (never act on) the depth-zero enrollment offers. Runs each candidate through
|
|
27
|
+
* the orchestrator — with no mandate yet, each yields consent-required — and emits ONE aggregated
|
|
28
|
+
* consent item over all of them. Returns the consent requests surfaced (empty if none).
|
|
29
|
+
*/
|
|
30
|
+
scanAndOffer() {
|
|
31
|
+
const { machines, accounts } = this.deps.readPoolDepth();
|
|
32
|
+
const candidates = detectEnrollmentOffers({
|
|
33
|
+
machines,
|
|
34
|
+
accounts,
|
|
35
|
+
maxFollowMachines: this.deps.maxFollowMachines(),
|
|
36
|
+
inFlight: this.deps.inFlight(),
|
|
37
|
+
});
|
|
38
|
+
if (candidates.length === 0)
|
|
39
|
+
return { offered: [] };
|
|
40
|
+
const consents = [];
|
|
41
|
+
for (const c of candidates) {
|
|
42
|
+
const decision = this.deps.orchestrator.requestEnrollment({
|
|
43
|
+
accountId: c.accountId,
|
|
44
|
+
accountEmail: c.accountEmail,
|
|
45
|
+
targetMachineId: c.targetMachineId,
|
|
46
|
+
targetMachineNickname: c.targetMachineNickname,
|
|
47
|
+
// no mandateId on a scan → orchestrator returns consent-required (never proceeds)
|
|
48
|
+
});
|
|
49
|
+
if (!decision.proceed)
|
|
50
|
+
consents.push(decision.consent);
|
|
51
|
+
}
|
|
52
|
+
if (consents.length === 0)
|
|
53
|
+
return { offered: [] };
|
|
54
|
+
// ONE aggregated attention item over all offers (P17), id stable to the offered (account,target) set.
|
|
55
|
+
const key = consents.map((c) => `${c.accountId}:${c.targetMachineId}`).sort().join(',');
|
|
56
|
+
const targets = [...new Set(consents.map((c) => c.targetMachineNickname))].join(', ');
|
|
57
|
+
this.deps.emitAggregatedConsent({
|
|
58
|
+
id: `agent:account-follow-me-consent:${key}`,
|
|
59
|
+
title: `Authorize account access on ${consents.length} machine(s)?`,
|
|
60
|
+
body: `These machines have no account yet: ${targets}. ` +
|
|
61
|
+
`Authorize them to use your subscription on the dashboard (one tap each). ` +
|
|
62
|
+
`Nothing is enrolled until you approve.`,
|
|
63
|
+
priority: 'medium',
|
|
64
|
+
source: 'agent',
|
|
65
|
+
offers: consents,
|
|
66
|
+
});
|
|
67
|
+
this.deps.log?.(`[account-follow-me] surfaced ${consents.length} enrollment consent offer(s)`);
|
|
68
|
+
return { offered: consents };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A portable account-follow-me mandate was delivered from the operator machine. Verify it (R4a),
|
|
72
|
+
* then run the orchestrator with it. On allow, return an enroll-drive instruction; otherwise null
|
|
73
|
+
* (verification failed, or the gate denied — never proceed, never self-authorize).
|
|
74
|
+
*/
|
|
75
|
+
onMandateDelivered(args) {
|
|
76
|
+
const accept = acceptDeliveredMandate({
|
|
77
|
+
portable: args.portable,
|
|
78
|
+
operatorEd25519PublicKey: args.operatorEd25519PublicKey,
|
|
79
|
+
expectedOperatorMachineFingerprint: args.expectedOperatorMachineFingerprint,
|
|
80
|
+
});
|
|
81
|
+
if (!accept.accepted) {
|
|
82
|
+
this.deps.log?.(`[account-follow-me] delivered mandate rejected: ${accept.reason}`);
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const decision = this.deps.orchestrator.requestEnrollment({
|
|
86
|
+
accountId: args.request.accountId,
|
|
87
|
+
accountEmail: args.request.accountEmail,
|
|
88
|
+
targetMachineId: args.request.targetMachineId,
|
|
89
|
+
targetMachineNickname: args.request.targetMachineNickname,
|
|
90
|
+
mechanism: args.request.mechanism,
|
|
91
|
+
mandateId: accept.mandate.id,
|
|
92
|
+
});
|
|
93
|
+
if (!decision.proceed) {
|
|
94
|
+
this.deps.log?.(`[account-follow-me] gate denied a verified mandate: ${decision.reason}`);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
accountId: decision.accountId,
|
|
99
|
+
targetMachineId: decision.targetMachineId,
|
|
100
|
+
mechanism: decision.mechanism,
|
|
101
|
+
mandateId: accept.mandate.id,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=AccountFollowMeService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountFollowMeService.js","sourceRoot":"","sources":["../../src/core/AccountFollowMeService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AA0CH,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAIjC;;;;;;GAMG;AACH,wBAAgB,4CAA4C,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAcjF;AAuBD,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAYnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAUnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wCAAwC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAUjG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sCAAsC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAQ/F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wCAAwC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAgBjG;AAaD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAsB5F;AAgBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAwBzF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mCAAmC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAoB5F;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAiB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAAiC;gBAEvC,MAAM,EAAE,cAAc;IAIlC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAItC;;;;;;OAMG;IACG,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC;IAIjC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,kBAAkB;IAO1B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IASpB;;;OAGG;IACH,OAAO,IAAI,eAAe;IA8D1B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kCAAkC;IA4E1C,OAAO,CAAC,gCAAgC;IAwCxC,OAAO,CAAC,8BAA8B;IAkFtC,OAAO,CAAC,6BAA6B;IA4DrC,OAAO,CAAC,yCAAyC;IA8DjD,OAAO,CAAC,0BAA0B;IAsFlC,OAAO,CAAC,wBAAwB;IAiFhC,OAAO,CAAC,sCAAsC;IAmE9C;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,uCAAuC;IAqC/C;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,0BAA0B;IAmFlC,OAAO,CAAC,0BAA0B;IAmDlC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kCAAkC;IAwH1C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,kCAAkC;IA8C1C;;;;;;;;OAQG;IACH,OAAO,CAAC,kCAAkC;IA2B1C,OAAO,CAAC,uBAAuB;IAwE/B,OAAO,CAAC,4CAA4C;IA+CpD;;;;;;;OAOG;IACH,OAAO,CAAC,iCAAiC;IA0BzC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oCAAoC;IAmB5C;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,yCAAyC;IAWjD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kCAAkC;IAW1C,OAAO,CAAC,yBAAyB;IA6FjC;;;;;;;;;;OAUG;IACG,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;YA4BhC,uBAAuB;IAkGrC,OAAO,CAAC,0BAA0B;IAkGlC,OAAO,CAAC,0BAA0B;IAoElC,OAAO,CAAC,oBAAoB;IAuH5B,OAAO,CAAC,8BAA8B;IA2EtC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IA8BlC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,4BAA4B;IAwBpC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;;;;;;;;OASG;IACH,OAAO,CAAC,wCAAwC;IAuBhD;;;;;;;;OAQG;IACH,OAAO,CAAC,2CAA2C;IAuBnD;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kCAAkC;IAuB1C;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,mCAAmC;IAmK3C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,yBAAyB;IA4HjC;6EACyE;IACzE,OAAO,CAAC,wBAAwB;IAShC;sDACkD;IAClD,OAAO,CAAC,wBAAwB;IAQhC;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAgRpB;;;;;;;;OAQG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IA6CvE;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAkChC;;;;;;;;;OASG;IACH,OAAO,CAAC,wBAAwB;IAoEhC;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAiE5B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IA8BnC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAyIhC;;;;;;OAMG;IACH,OAAO,CAAC,8BAA8B;IAwDtC,OAAO,CAAC,0BAA0B;IAiElC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAg4FvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,kCAAkC;IAgP1C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmLtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,yCAAyC;IAyDjD;;;OAGG;IACH,OAAO,CAAC,eAAe;IA2XvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAoMrB;;;OAGG;IACH;;;OAGG;IACH;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,wBAAwB;IAmEhC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,6BAA6B;IAwDrC;;;;;;;;;OASG;IACH,OAAO,CAAC,yBAAyB;IAsDjC,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,gBAAgB;IAuBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,OAAO,CAAC,qBAAqB;IAsG7B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,0BAA0B;IAgDlC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,oBAAoB;IAgC5B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAyBrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,wBAAwB,GAAG,qBAAqB,GAAG,yBAAyB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,wBAAwB,GAAG,8BAA8B,GAAG,2BAA2B,GAAG,4BAA4B,GAAG,iBAAiB,GAAG,0BAA0B,GAAG,wBAAwB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,0BAA0B,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,wBAAwB,GAAG,uBAAuB,GAAG,MAAM;IA0BxiB,oFAAoF;IACpF,iCAAiC,IAAI,MAAM;IAI3C,6EAA6E;IAC7E,yBAAyB,IAAI,MAAM;IAInC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,2BAA2B;IAmFnC,OAAO,CAAC,mBAAmB;IAuhB3B,OAAO,CAAC,wBAAwB;IA6JhC,OAAO,CAAC,2BAA2B;IAwEnC,OAAO,CAAC,yBAAyB;IA8IjC,OAAO,CAAC,2BAA2B;IAqKnC,OAAO,CAAC,qBAAqB;IA2W7B,OAAO,CAAC,uBAAuB;IAmS/B,OAAO,CAAC,oBAAoB;IAgG5B,OAAO,CAAC,qBAAqB;IA8H7B,OAAO,CAAC,2BAA2B;IAoHnC,OAAO,CAAC,iCAAiC;IA6DzC,OAAO,CAAC,+BAA+B;IAgEvC,OAAO,CAAC,uBAAuB;IA0F/B,OAAO,CAAC,4BAA4B;IA+MpC;;;;;;;;;;OAUG;IACH;;;;;;;;;;;OAWG;IAEH,gBAAuB,iCAAiC,EAAE,WAAW,CAAC,MAAM,CAAC,CA2C1E;IAEH;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,8BAA8B;IAiHtC,OAAO,CAAC,uBAAuB;IAwD/B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,8BAA8B;IA6HtC,OAAO,CAAC,+BAA+B;IAuKvC,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,qBAAqB;IAqO7B,OAAO,CAAC,qBAAqB;IAwI7B,OAAO,CAAC,qBAAqB;IA2O7B,OAAO,CAAC,6BAA6B;IAkLrC,OAAO,CAAC,0BAA0B;IAiClC,OAAO,CAAC,0BAA0B;IA8ElC,OAAO,CAAC,0BAA0B;IA8IlC,OAAO,CAAC,gBAAgB;IAmJxB,OAAO,CAAC,6BAA6B;CAoCtC"}
|
|
@@ -4660,6 +4660,24 @@ When narrating a ship, an update I just applied, or a restart I just completed (
|
|
|
4660
4660
|
patched = true;
|
|
4661
4661
|
result.upgraded.push('CLAUDE.md: added Multi-Session Autonomy awareness section');
|
|
4662
4662
|
}
|
|
4663
|
+
// Autonomous Liveness Reconciler awareness (Agent Awareness Standard).
|
|
4664
|
+
// Existing agents need to know the level-triggered self-heal + the
|
|
4665
|
+
// GET /autonomous/liveness read surface exist + the proactive trigger
|
|
4666
|
+
// ("why did my autonomous run come back by itself?"), even if initialized
|
|
4667
|
+
// before this capability shipped. Content-sniffed marker.
|
|
4668
|
+
if (!content.includes('Autonomous Liveness Reconciler')) {
|
|
4669
|
+
const livenessSection = `
|
|
4670
|
+
### Autonomous Liveness Reconciler
|
|
4671
|
+
|
|
4672
|
+
**Autonomous Liveness Reconciler** — A level-triggered self-heal for an autonomous run whose state file says it is ACTIVE (with time remaining) but has NO live session executing it ("dead but marked active"). Per tick it compares desired (run active+remaining) vs actual (a live session exists) and converges: a debounced, lease-gated, quota-gated, pressure-gated respawn of a run that genuinely should be alive, capped (P19) so a flapping run gives up LOUDLY rather than respawn forever, respecting any operator stop. Ships DARK on the fleet (\`monitoring.autonomousLivenessReconciler.enabled\` OMITTED → the dev-agent gate resolves it) and dryRun-FIRST on dev (LOGS "would respawn" until a deliberate \`dryRun:false\` flip).
|
|
4673
|
+
|
|
4674
|
+
- Status (content-free: topic ids + counters + conditions): \`curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/autonomous/liveness\` (503 when dark/disabled).
|
|
4675
|
+
- Proactive: user asks "why did my autonomous run come back by itself?" / "why did an autonomous run die / not resume?" → the reconciler noticed the run was marked active with no live session and self-healed it (GET /autonomous/liveness for the conditions; the per-transition audit is \`logs/autonomous-liveness.jsonl\`). A respawn it makes is tagged so a later reaper kill is revived by the resume queue, never silently dropped.
|
|
4676
|
+
`;
|
|
4677
|
+
content += '\n' + livenessSection;
|
|
4678
|
+
patched = true;
|
|
4679
|
+
result.upgraded.push('CLAUDE.md: added Autonomous Liveness Reconciler awareness section');
|
|
4680
|
+
}
|
|
4663
4681
|
// Framework-Onboarding Mentor System — issue-ledger observability (Agent
|
|
4664
4682
|
// Awareness Standard). Existing agents need to know the read-only
|
|
4665
4683
|
// /framework-issues + playbook routes exist, even if initialized before this
|