@tokenfactory/acc-runner 0.40.7 → 0.40.9
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/chat-transport.d.ts +25 -1
- package/dist/chat-transport.d.ts.map +1 -1
- package/dist/chat-transport.js +56 -4
- package/dist/chat-transport.js.map +1 -1
- package/dist/companion-run.d.ts +2 -0
- package/dist/companion-run.d.ts.map +1 -1
- package/dist/companion-run.js +100 -4
- package/dist/companion-run.js.map +1 -1
- package/dist/companion.d.ts +92 -3
- package/dist/companion.d.ts.map +1 -1
- package/dist/companion.js +166 -11
- package/dist/companion.js.map +1 -1
- package/dist/runtime/auth-lifecycle.d.ts +61 -0
- package/dist/runtime/auth-lifecycle.d.ts.map +1 -0
- package/dist/runtime/auth-lifecycle.js +120 -0
- package/dist/runtime/auth-lifecycle.js.map +1 -0
- package/dist/watch.d.ts +2 -21
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +5 -111
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
package/dist/chat-transport.d.ts
CHANGED
|
@@ -38,14 +38,38 @@ export declare function mapClaimedTurn(row: ChatTurnRow): ClaimedChatTurn;
|
|
|
38
38
|
export interface SupabaseChatTransportOptions {
|
|
39
39
|
now?: () => number;
|
|
40
40
|
onLog?: (line: string) => void;
|
|
41
|
+
/**
|
|
42
|
+
* CHAT-LANE-BRIDGE: the durable-ingest sink. The runner runs as `authenticated`
|
|
43
|
+
* and is grant-blocked from the service-role delta/message writers, so the
|
|
44
|
+
* lifecycle frames are ALSO POSTed to POST /api/chat/turn-ingest, which persists
|
|
45
|
+
* them (acc.chat_turn_deltas + the canonical acc.chat_messages assistant row)
|
|
46
|
+
* under the service role. The Realtime broadcast stays as the low-latency live
|
|
47
|
+
* path; this POST is the durable half that completes the round-trip. Omit it and
|
|
48
|
+
* the transport reverts to broadcast-only (no durable reply) — used in tests
|
|
49
|
+
* that assert the wire broadcast in isolation.
|
|
50
|
+
*/
|
|
51
|
+
ingest?: {
|
|
52
|
+
url: string;
|
|
53
|
+
token: string;
|
|
54
|
+
};
|
|
55
|
+
/** Injected for tests; defaults to the global fetch. */
|
|
56
|
+
fetchImpl?: typeof fetch;
|
|
41
57
|
}
|
|
42
58
|
/**
|
|
43
59
|
* Build the production chat-lane transport bound to a runner's Supabase client.
|
|
44
60
|
* Claim uses the DB RPC; the lifecycle messages broadcast on the per-conversation
|
|
45
|
-
* chat topic.
|
|
61
|
+
* chat topic AND (when `ingest` is set) POST to the durable-ingest endpoint.
|
|
46
62
|
*/
|
|
47
63
|
export declare function createSupabaseChatTransport(client: RunnerSupabaseClient, opts?: SupabaseChatTransportOptions): ChatLaneTransport & {
|
|
48
64
|
close: () => Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* AUTH-REFRESH: hot-swap the Supabase client (and,
|
|
67
|
+
* optionally, the durable-ingest bearer) after a token refresh. Old
|
|
68
|
+
* per-conversation channels are torn down so the next stream frame re-subscribes
|
|
69
|
+
* on the fresh socket — turn-serving keeps working across a rotation instead of
|
|
70
|
+
* riding the old, soon-to-expire JWT until the process restarts.
|
|
71
|
+
*/
|
|
72
|
+
refreshClient: (nextClient: RunnerSupabaseClient, nextIngestToken?: string) => Promise<void>;
|
|
49
73
|
};
|
|
50
74
|
export {};
|
|
51
75
|
//# sourceMappingURL=chat-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-transport.d.ts","sourceRoot":"","sources":["../src/chat-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAEL,KAAK,iBAAiB,EAItB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAgBxB,0EAA0E;AAC1E,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAahE;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-transport.d.ts","sourceRoot":"","sources":["../src/chat-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAEL,KAAK,iBAAiB,EAItB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAgBxB,0EAA0E;AAC1E,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAahE;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,oBAAoB,EAC5B,IAAI,GAAE,4BAAiC,GACtC,iBAAiB,GAAG;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,UAAU,EAAE,oBAAoB,EAAE,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9F,CAsJA"}
|
package/dist/chat-transport.js
CHANGED
|
@@ -17,10 +17,15 @@ export function mapClaimedTurn(row) {
|
|
|
17
17
|
/**
|
|
18
18
|
* Build the production chat-lane transport bound to a runner's Supabase client.
|
|
19
19
|
* Claim uses the DB RPC; the lifecycle messages broadcast on the per-conversation
|
|
20
|
-
* chat topic.
|
|
20
|
+
* chat topic AND (when `ingest` is set) POST to the durable-ingest endpoint.
|
|
21
21
|
*/
|
|
22
22
|
export function createSupabaseChatTransport(client, opts = {}) {
|
|
23
23
|
const now = opts.now ?? Date.now;
|
|
24
|
+
const doFetch = opts.fetchImpl ?? globalThis.fetch;
|
|
25
|
+
// AUTH-REFRESH: the client + ingest bearer are mutable so a token refresh can
|
|
26
|
+
// swap them in place (see refreshClient). Closures below read the live values.
|
|
27
|
+
let liveClient = client;
|
|
28
|
+
let ingestToken = opts.ingest?.token;
|
|
24
29
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
25
30
|
const channels = new Map(); // any-allowed: supabase RealtimeChannel type is not re-exported by the schema-scoped client
|
|
26
31
|
async function channelFor(conversationId) {
|
|
@@ -28,7 +33,7 @@ export function createSupabaseChatTransport(client, opts = {}) {
|
|
|
28
33
|
const existing = channels.get(conversationId);
|
|
29
34
|
if (existing)
|
|
30
35
|
return existing;
|
|
31
|
-
const ch =
|
|
36
|
+
const ch = liveClient.channel(topic);
|
|
32
37
|
channels.set(conversationId, ch);
|
|
33
38
|
await new Promise((resolve) => {
|
|
34
39
|
ch.subscribe((status) => {
|
|
@@ -62,10 +67,41 @@ export function createSupabaseChatTransport(client, opts = {}) {
|
|
|
62
67
|
catch (err) {
|
|
63
68
|
opts.onLog?.(`[acc-runner] chat broadcast(${event}, ${turn.id}) failed: ${err.message}`);
|
|
64
69
|
}
|
|
70
|
+
// Durable half: POST the same frame to the server ingest so it is persisted
|
|
71
|
+
// (deltas + assistant message) under the service role. Awaited so a turn's
|
|
72
|
+
// frames land in order (stream frames before the terminal complete). A failed
|
|
73
|
+
// POST is logged, never thrown — it must not abort the turn.
|
|
74
|
+
await postIngest(turn, event, payload);
|
|
75
|
+
}
|
|
76
|
+
async function postIngest(turn, event, payload) {
|
|
77
|
+
if (!opts.ingest || !doFetch)
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
const res = await doFetch(`${opts.ingest.url.replace(/\/+$/, "")}/api/chat/turn-ingest`, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
Authorization: `Bearer ${ingestToken ?? opts.ingest.token}`,
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({
|
|
87
|
+
event,
|
|
88
|
+
conversation_id: turn.conversation_id,
|
|
89
|
+
turn_id: turn.id,
|
|
90
|
+
runner_id: turn.runner_id,
|
|
91
|
+
payload,
|
|
92
|
+
}),
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok) {
|
|
95
|
+
opts.onLog?.(`[acc-runner] chat ingest(${event}, ${turn.id}) HTTP ${res.status}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
opts.onLog?.(`[acc-runner] chat ingest(${event}, ${turn.id}) failed: ${err.message}`);
|
|
100
|
+
}
|
|
65
101
|
}
|
|
66
102
|
return {
|
|
67
103
|
async claim(args) {
|
|
68
|
-
const { data, error } = await
|
|
104
|
+
const { data, error } = await liveClient.rpc("claim_chat_turn", {
|
|
69
105
|
p_conversation_id: args.conversationId,
|
|
70
106
|
p_runner_id: args.runnerId,
|
|
71
107
|
p_engine_id: args.engineId,
|
|
@@ -92,13 +128,29 @@ export function createSupabaseChatTransport(client, opts = {}) {
|
|
|
92
128
|
async close() {
|
|
93
129
|
for (const ch of channels.values()) {
|
|
94
130
|
try {
|
|
95
|
-
await
|
|
131
|
+
await liveClient.removeChannel(ch);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
/* best-effort teardown */
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
channels.clear();
|
|
138
|
+
},
|
|
139
|
+
async refreshClient(nextClient, nextIngestToken) {
|
|
140
|
+
// Tear the old channels down on the OLD client (they carry the stale JWT),
|
|
141
|
+
// then swap. The next stream/complete re-subscribes on the fresh socket.
|
|
142
|
+
for (const ch of channels.values()) {
|
|
143
|
+
try {
|
|
144
|
+
await liveClient.removeChannel(ch);
|
|
96
145
|
}
|
|
97
146
|
catch {
|
|
98
147
|
/* best-effort teardown */
|
|
99
148
|
}
|
|
100
149
|
}
|
|
101
150
|
channels.clear();
|
|
151
|
+
liveClient = nextClient;
|
|
152
|
+
if (nextIngestToken !== undefined)
|
|
153
|
+
ingestToken = nextIngestToken;
|
|
102
154
|
},
|
|
103
155
|
};
|
|
104
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-transport.js","sourceRoot":"","sources":["../src/chat-transport.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,0BAA0B,GAM3B,MAAM,gBAAgB,CAAC;AA8BxB,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,GAAgB;IAC7C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;QACxB,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAyB;QAClD,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;QAC9B,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;QAC9B,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,CAAC;QACrC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;KACvC,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-transport.js","sourceRoot":"","sources":["../src/chat-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/companion-run.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface CompanionHandle {
|
|
|
4
4
|
}
|
|
5
5
|
/** Env var seeding the owner's conversations the companion should serve at boot. */
|
|
6
6
|
export declare const COMPANION_CONVERSATIONS_ENV = "ACC_RUNNER_COMPANION_CONVERSATIONS";
|
|
7
|
+
/** Env var naming the acc.ai_identities row this companion serves (enrollment id). */
|
|
8
|
+
export declare const COMPANION_IDENTITY_ENV = "ACC_RUNNER_COMPANION_IDENTITY";
|
|
7
9
|
/**
|
|
8
10
|
* Start companion mode. Registers the owner-bound identity, serves the owner's
|
|
9
11
|
* chat turns (chat lane only), and returns a handle whose `stop()` requeues
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion-run.d.ts","sourceRoot":"","sources":["../src/companion-run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"companion-run.d.ts","sourceRoot":"","sources":["../src/companion-run.ts"],"names":[],"mappings":"AAsCA,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,oFAAoF;AACpF,eAAO,MAAM,2BAA2B,uCAAuC,CAAC;AAChF,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AAEtE;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,eAAe,CAAC,CAkLjE;AAED,+DAA+D;AAC/D,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB5D;AAED,8DAA8D;AAC9D,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7D;AAED,wCAAwC;AACxC,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK/D"}
|
package/dist/companion-run.js
CHANGED
|
@@ -11,6 +11,7 @@ import chalk from "chalk";
|
|
|
11
11
|
import { applyBootstrapConfig, loadConfig, resolveRunnerConcurrency } from "./config.js";
|
|
12
12
|
import { getTokenProvider } from "./token-provider.js";
|
|
13
13
|
import { createRunnerClient } from "./supabase.js";
|
|
14
|
+
import { RefreshReuseDetectedError, expiresSoon, refreshAccessToken, } from "./runtime/auth-lifecycle.js";
|
|
14
15
|
import { createSupabaseChatTransport } from "./chat-transport.js";
|
|
15
16
|
import { getChatEngine } from "./engines/registry.js";
|
|
16
17
|
import { ChatCircuitBreaker, getChatCircuit } from "./runtime/chat-circuit-breaker.js";
|
|
@@ -20,6 +21,8 @@ import { companionStatusLine, defaultAutostartHost, installAutostart, uninstallA
|
|
|
20
21
|
import { PACKAGE_VERSION } from "./pkg-version.js";
|
|
21
22
|
/** Env var seeding the owner's conversations the companion should serve at boot. */
|
|
22
23
|
export const COMPANION_CONVERSATIONS_ENV = "ACC_RUNNER_COMPANION_CONVERSATIONS";
|
|
24
|
+
/** Env var naming the acc.ai_identities row this companion serves (enrollment id). */
|
|
25
|
+
export const COMPANION_IDENTITY_ENV = "ACC_RUNNER_COMPANION_IDENTITY";
|
|
23
26
|
/**
|
|
24
27
|
* Start companion mode. Registers the owner-bound identity, serves the owner's
|
|
25
28
|
* chat turns (chat lane only), and returns a handle whose `stop()` requeues
|
|
@@ -27,16 +30,43 @@ export const COMPANION_CONVERSATIONS_ENV = "ACC_RUNNER_COMPANION_CONVERSATIONS";
|
|
|
27
30
|
*/
|
|
28
31
|
export async function companionCommand() {
|
|
29
32
|
let cfg = loadConfig();
|
|
30
|
-
const
|
|
31
|
-
|
|
33
|
+
const tokenProvider = getTokenProvider();
|
|
34
|
+
// AUTH-REFRESH: session + client are mutable so a token refresh (proactive or
|
|
35
|
+
// reactive) can rotate the JWT in place without tearing the companion down.
|
|
36
|
+
const loaded = await tokenProvider.load();
|
|
37
|
+
if (!loaded) {
|
|
32
38
|
throw new Error("Not logged in. Run `acc-runner login` first.");
|
|
33
39
|
}
|
|
40
|
+
let session = loaded;
|
|
34
41
|
cfg = applyBootstrapConfig(cfg, session);
|
|
35
|
-
|
|
42
|
+
// AUTH-REFRESH: startup refresh — if the access token expires within the hour,
|
|
43
|
+
// grab a fresh one before coming online (mirrors the fleet `watch` runner) so
|
|
44
|
+
// the companion doesn't start on a token that lapses minutes later.
|
|
45
|
+
if (tokenProvider.canRefresh() && expiresSoon(session)) {
|
|
46
|
+
try {
|
|
47
|
+
session = await refreshAccessToken(cfg, session);
|
|
48
|
+
await tokenProvider.save(session);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (err instanceof RefreshReuseDetectedError) {
|
|
52
|
+
throw err; // keychain compromised — surface loudly, don't come online
|
|
53
|
+
}
|
|
54
|
+
// A transient startup refresh failure is non-fatal: come online on the
|
|
55
|
+
// existing token; the heartbeat lifecycle refreshes / backs off / exits.
|
|
56
|
+
console.log(chalk.yellow(`[acc-runner] companion startup refresh failed: ${err.message}`));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let supabase = createRunnerClient(cfg, session.access_token, session.realtime_config);
|
|
36
60
|
const breaker = new ChatCircuitBreaker();
|
|
37
61
|
await breaker.load();
|
|
38
62
|
const engine = getChatEngine();
|
|
39
|
-
|
|
63
|
+
// CHAT-LANE-BRIDGE: the durable-ingest sink completes the round-trip. The
|
|
64
|
+
// runner (authenticated) can't write the service-role delta/message tables, so
|
|
65
|
+
// it POSTs its stream/complete frames to the server, which persists them under
|
|
66
|
+
// the service role and re-broadcasts to the browser.
|
|
67
|
+
const transport = createSupabaseChatTransport(supabase, {
|
|
68
|
+
ingest: { url: cfg.publicUrl, token: session.access_token },
|
|
69
|
+
});
|
|
40
70
|
const companionCfg = resolveCompanionConfig();
|
|
41
71
|
const conc = resolveRunnerConcurrency();
|
|
42
72
|
const mirror = companionCfg.mirrorEnabled
|
|
@@ -58,6 +88,64 @@ export async function companionCommand() {
|
|
|
58
88
|
const broadcaster = createIdentityBroadcaster(supabase, session.user_id, {
|
|
59
89
|
onLog: (line) => console.log(chalk.gray(line)),
|
|
60
90
|
});
|
|
91
|
+
// CHAT-LANE-BRIDGE: the identity this companion serves (enrollment id). When
|
|
92
|
+
// set, start() persists the runner_ids binding + probe tier onto the row via
|
|
93
|
+
// POST /api/identities/probe, so provider-status can confirm a live companion.
|
|
94
|
+
const identityId = (process.env[COMPANION_IDENTITY_ENV] ?? "").trim() || undefined;
|
|
95
|
+
const reportRegistration = identityId
|
|
96
|
+
? async (payload) => {
|
|
97
|
+
const url = `${cfg.publicUrl.replace(/\/+$/, "")}/api/identities/probe`;
|
|
98
|
+
const res = await fetch(url, {
|
|
99
|
+
method: "POST",
|
|
100
|
+
headers: {
|
|
101
|
+
"Content-Type": "application/json",
|
|
102
|
+
Authorization: `Bearer ${session.access_token}`,
|
|
103
|
+
},
|
|
104
|
+
body: JSON.stringify({
|
|
105
|
+
identity_id: payload.identityId,
|
|
106
|
+
runner_id: payload.runnerId,
|
|
107
|
+
tier: payload.tier ?? undefined,
|
|
108
|
+
capacity: payload.capacity,
|
|
109
|
+
status: "active",
|
|
110
|
+
}),
|
|
111
|
+
});
|
|
112
|
+
if (!res.ok) {
|
|
113
|
+
throw new Error(`probe report HTTP ${res.status}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
: undefined;
|
|
117
|
+
// AUTH-REFRESH: rotate the ACC session in place. Called proactively (token
|
|
118
|
+
// near expiry) and reactively (ONE per auth-failure streak) by CompanionRunner.
|
|
119
|
+
// Rebuilds the Supabase client so the next heartbeat bears the fresh JWT, and
|
|
120
|
+
// hot-swaps the transport's client + ingest bearer so turn-serving keeps
|
|
121
|
+
// working across the rotation. Returns true on success. Best-effort persistence.
|
|
122
|
+
const refreshAuth = async () => {
|
|
123
|
+
if (!tokenProvider.canRefresh())
|
|
124
|
+
return false;
|
|
125
|
+
let next;
|
|
126
|
+
try {
|
|
127
|
+
next = await refreshAccessToken(cfg, session);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
if (err instanceof RefreshReuseDetectedError) {
|
|
131
|
+
// No safe recovery from a running loop — surface loudly. The lifecycle
|
|
132
|
+
// then rides the backoff ladder to the offline flip + non-zero exit, and
|
|
133
|
+
// the operator must re-login on a trusted machine.
|
|
134
|
+
console.log(chalk.red.bold(`[acc-runner] CRITICAL: ${err.message}`));
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
throw err; // caught by CompanionRunner.runRefresh → logged, treated as "not refreshed"
|
|
138
|
+
}
|
|
139
|
+
session = next;
|
|
140
|
+
await tokenProvider.save(session).catch(() => {
|
|
141
|
+
/* env-mode save is in-memory; never fatal */
|
|
142
|
+
});
|
|
143
|
+
supabase = createRunnerClient(cfg, session.access_token, session.realtime_config);
|
|
144
|
+
await transport.refreshClient(supabase, session.access_token).catch(() => {
|
|
145
|
+
/* channel teardown is best-effort; the next frame re-subscribes */
|
|
146
|
+
});
|
|
147
|
+
return true;
|
|
148
|
+
};
|
|
61
149
|
const runner = new CompanionRunner({
|
|
62
150
|
runnerId: session.runner_id,
|
|
63
151
|
boundUserId: session.user_id,
|
|
@@ -71,6 +159,8 @@ export async function companionCommand() {
|
|
|
71
159
|
maxShare: 1,
|
|
72
160
|
leaseMs: 60_000,
|
|
73
161
|
mirror,
|
|
162
|
+
...(identityId ? { identityId } : {}),
|
|
163
|
+
...(reportRegistration ? { reportRegistration } : {}),
|
|
74
164
|
announce: (event, payload) => broadcaster.announce(event, payload),
|
|
75
165
|
heartbeat: async () => {
|
|
76
166
|
const { error } = await supabase.rpc("heartbeat_runner", {
|
|
@@ -80,6 +170,12 @@ export async function companionCommand() {
|
|
|
80
170
|
if (error)
|
|
81
171
|
throw new Error(error.message);
|
|
82
172
|
},
|
|
173
|
+
// AUTH-REFRESH: proactive + reactive re-auth. Only wired when the session can
|
|
174
|
+
// actually rotate; a no-refresh session rides the backoff ladder to a clean
|
|
175
|
+
// offline flip + exit instead of a silent zombie loop.
|
|
176
|
+
...(tokenProvider.canRefresh()
|
|
177
|
+
? { refreshAuth, expiresSoon: (leadMs) => expiresSoon(session, leadMs) }
|
|
178
|
+
: {}),
|
|
83
179
|
cwd: cfg.repoPath,
|
|
84
180
|
onLog: (line) => console.log(chalk.gray(line)),
|
|
85
181
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion-run.js","sourceRoot":"","sources":["../src/companion-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOnD,oFAAoF;AACpF,MAAM,CAAC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"companion-run.js","sourceRoot":"","sources":["../src/companion-run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOnD,oFAAoF;AACpF,MAAM,CAAC,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AAChF,sFAAsF;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAG,+BAA+B,CAAC;AAEtE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,GAAkB,MAAM,CAAC;IACpC,GAAG,GAAG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAEzC,+EAA+E;IAC/E,8EAA8E;IAC9E,oEAAoE;IACpE,IAAI,aAAa,CAAC,UAAU,EAAE,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,yBAAyB,EAAE,CAAC;gBAC7C,MAAM,GAAG,CAAC,CAAC,2DAA2D;YACxE,CAAC;YACD,uEAAuE;YACvE,yEAAyE;YACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kDAAmD,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACzC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,0EAA0E;IAC1E,+EAA+E;IAC/E,+EAA+E;IAC/E,qDAAqD;IACrD,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,EAAE;QACtD,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE;KAC5D,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,sBAAsB,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;IAExC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa;QACvC,CAAC,CAAC,IAAI,qBAAqB,CAAC;YACxB,aAAa,EAAE,YAAY,CAAC,WAAW,IAAI,iBAAiB,CAAC,OAAO,CAAC;YACrE,IAAI,EAAE,YAAY,CAAC,UAAU;YAC7B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC/C,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC;IAET,6EAA6E;IAC7E,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAC;SAC7D,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,IAAI,uBAAuB,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAG,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE;QACvE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/C,CAAC,CAAC;IAEH,6EAA6E;IAC7E,6EAA6E;IAC7E,+EAA+E;IAC/E,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IACnF,MAAM,kBAAkB,GAAG,UAAU;QACnC,CAAC,CAAC,KAAK,EAAE,OAKN,EAAE,EAAE;YACH,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,uBAAuB,CAAC;YACxE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC3B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,OAAO,CAAC,YAAY,EAAE;iBAChD;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,WAAW,EAAE,OAAO,CAAC,UAAU;oBAC/B,SAAS,EAAE,OAAO,CAAC,QAAQ;oBAC3B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS;oBAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,MAAM,EAAE,QAAQ;iBACjB,CAAC;aACH,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,2EAA2E;IAC3E,gFAAgF;IAChF,8EAA8E;IAC9E,yEAAyE;IACzE,iFAAiF;IACjF,MAAM,WAAW,GAAG,KAAK,IAAsB,EAAE;QAC/C,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,yBAAyB,EAAE,CAAC;gBAC7C,uEAAuE;gBACvE,yEAAyE;gBACzE,mDAAmD;gBACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACrE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,GAAG,CAAC,CAAC,4EAA4E;QACzF,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAC3C,6CAA6C;QAC/C,CAAC,CAAC,CAAC;QACH,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QAClF,MAAM,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACvE,mEAAmE;QACrE,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,QAAQ,EAAE,OAAO,CAAC,SAAS;QAC3B,WAAW,EAAE,OAAO,CAAC,OAAO;QAC5B,MAAM;QACN,SAAS;QACT,OAAO;QACP,aAAa;QACb,gBAAgB,EAAE,IAAI,CAAC,WAAW;QAClC,wEAAwE;QACxE,kDAAkD;QAClD,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,MAAM;QACf,MAAM;QACN,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAClE,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE;gBACvD,IAAI,EAAE,OAAO,CAAC,SAAS;gBACvB,SAAS,EAAE,eAAe;aAC3B,CAAC,CAAC;YACH,IAAI,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,8EAA8E;QAC9E,4EAA4E;QAC5E,uDAAuD;QACvD,GAAG,CAAC,aAAa,CAAC,UAAU,EAAE;YAC5B,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;YAChF,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,EAAE,GAAG,CAAC,QAAQ;QACjB,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,aAAa,aAAa,CAAC,IAAI,EAAE,kBAAkB;QACjD,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAC5E,CACF,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,IAAI;YACR,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;IACrC,6EAA6E;IAC7E,8EAA8E;IAC9E,6EAA6E;IAC7E,mCAAmC;IACnC,OAAO,CAAC,GAAG,CACT,mBAAmB,CAAC;QAClB,MAAM,EAAE,OAAO,KAAK,IAAI;QACxB,UAAU,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;QAClC,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,OAAO,KAAK,IAAI;QAC7B,MAAM,EAAE,GAAG,CAAC,aAAa;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/companion.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveChatLaneConfig, type ChatLaneTransport, type ClaimedChatTurn } from "./chat-lane.js";
|
|
2
2
|
import type { CompanionMirrorSocket } from "./companion-mirror-socket.js";
|
|
3
3
|
import type { ChatCircuitBreaker } from "./runtime/chat-circuit-breaker.js";
|
|
4
|
-
import type { ConformantAgentEngine, EngineCapabilityMatrix, RunnerCapacityClass } from "./engines/types.js";
|
|
4
|
+
import type { ConformantAgentEngine, EngineCapabilityMatrix, EngineCapabilityTier, RunnerCapacityClass } from "./engines/types.js";
|
|
5
5
|
import type { StoredSession } from "./types.js";
|
|
6
6
|
/** Identity-topic events (mirror of the web-app `IdentityTopicEvent`). */
|
|
7
7
|
export type IdentityTopicEvent = "capacity_changed" | "companion_registered" | "companion_lost";
|
|
@@ -119,8 +119,60 @@ export interface CompanionRunnerDeps {
|
|
|
119
119
|
mirror?: CompanionMirrorSocket | null;
|
|
120
120
|
/** Broadcast an identity-topic event (companion_registered / capacity_changed / companion_lost). */
|
|
121
121
|
announce: (event: IdentityTopicEvent, payload: unknown) => Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* CHAT-LANE-BRIDGE: the acc.ai_identities row this companion serves (the id
|
|
124
|
+
* from `acc-runner companion --identity <id>` / the enrollment guidance). When
|
|
125
|
+
* set alongside `reportRegistration`, start() DURABLY persists the runner_ids
|
|
126
|
+
* binding + the chat-auth probe tier onto that row — the Realtime announce alone
|
|
127
|
+
* left probe_tier/last_probe_at NULL and the roster empty, so provider-status
|
|
128
|
+
* could never confirm the companion.
|
|
129
|
+
*/
|
|
130
|
+
identityId?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Persist the companion registration to acc.ai_identities (runner_ids bind +
|
|
133
|
+
* probe_tier/last_probe_at via POST /api/identities/probe). Best-effort — a
|
|
134
|
+
* failure is logged and never blocks the companion coming online. Only invoked
|
|
135
|
+
* when `identityId` is also set.
|
|
136
|
+
*/
|
|
137
|
+
reportRegistration?: (payload: {
|
|
138
|
+
identityId: string;
|
|
139
|
+
runnerId: string;
|
|
140
|
+
tier: EngineCapabilityTier | null;
|
|
141
|
+
capacity: RunnerCapacityClass;
|
|
142
|
+
}) => Promise<void>;
|
|
122
143
|
/** Keep the runner identity online (typically acc.heartbeat_runner). */
|
|
123
144
|
heartbeat: () => Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* AUTH-REFRESH: re-authenticate the ACC session — rotate
|
|
147
|
+
* the access token via the device-code refresh-token path and rebuild the
|
|
148
|
+
* Supabase client so the NEXT `heartbeat()` bears the fresh JWT. Returns true
|
|
149
|
+
* when the session was refreshed. Called (a) PROACTIVELY once the access token
|
|
150
|
+
* is within `proactiveRefreshLeadMs` of expiry (so a live session never lapses
|
|
151
|
+
* — zero user-visible interruption) and (b) REACTIVELY exactly ONCE per
|
|
152
|
+
* auth-failure streak. Absent ⇒ the companion cannot refresh and rides the
|
|
153
|
+
* backoff ladder down to the offline flip + non-zero exit. Best-effort: a
|
|
154
|
+
* throw is caught, logged, and treated as "not refreshed".
|
|
155
|
+
*/
|
|
156
|
+
refreshAuth?: () => Promise<boolean>;
|
|
157
|
+
/**
|
|
158
|
+
* AUTH-REFRESH: probe whether the LIVE session's access token expires within
|
|
159
|
+
* `leadMs`. Paired with `refreshAuth` to drive the proactive refresh. Absent ⇒
|
|
160
|
+
* no proactive refresh (reactive-only recovery). Reads the current session so
|
|
161
|
+
* a just-rotated token reports "not soon" and the proactive path self-limits
|
|
162
|
+
* to one refresh per token lifetime rather than every beat.
|
|
163
|
+
*/
|
|
164
|
+
expiresSoon?: (leadMs: number) => boolean;
|
|
165
|
+
/** AUTH-REFRESH: proactive-refresh lead time (ms). Default ONE_HOUR_MS. */
|
|
166
|
+
proactiveRefreshLeadMs?: number;
|
|
167
|
+
/**
|
|
168
|
+
* AUTH-REFRESH: consecutive heartbeat failures tolerated before the companion
|
|
169
|
+
* flips its identity offline and exits non-zero. Default 5 (mirrors the fleet
|
|
170
|
+
* runner's HEARTBEAT_EXIT_AFTER). The exit is what makes an infinite spam loop
|
|
171
|
+
* structurally impossible.
|
|
172
|
+
*/
|
|
173
|
+
maxHeartbeatFailures?: number;
|
|
174
|
+
/** AUTH-REFRESH: process-exit hook (test seam). Default process.exit. */
|
|
175
|
+
exit?: (code: number) => void;
|
|
124
176
|
/** Working directory forwarded to the engine per turn. */
|
|
125
177
|
cwd?: string;
|
|
126
178
|
/** Mint a per-turn delegation token (narrowly-scoped identity) — optional. */
|
|
@@ -148,6 +200,17 @@ export declare class CompanionRunner {
|
|
|
148
200
|
private lastCapacity;
|
|
149
201
|
private stopped;
|
|
150
202
|
private readonly now;
|
|
203
|
+
private readonly exit;
|
|
204
|
+
private readonly maxHeartbeatFailures;
|
|
205
|
+
private beatMs;
|
|
206
|
+
/** Consecutive failed heartbeats; drives the backoff ladder + offline exit. */
|
|
207
|
+
private heartbeatFailures;
|
|
208
|
+
/** One reactive re-auth per failure streak (reset on the next healthy beat). */
|
|
209
|
+
private reauthedThisStreak;
|
|
210
|
+
/** One consolidated warning line per streak — never a per-tick wall of noise. */
|
|
211
|
+
private warnedThisStreak;
|
|
212
|
+
/** Single-flight guard so proactive + reactive refresh never overlap. */
|
|
213
|
+
private refreshing;
|
|
151
214
|
constructor(deps: CompanionRunnerDeps);
|
|
152
215
|
/** Chat turns currently in flight on this companion. */
|
|
153
216
|
activeChatTurns(): number;
|
|
@@ -159,8 +222,34 @@ export declare class CompanionRunner {
|
|
|
159
222
|
* offline so Auto routes to the fleet, and tear the mirror down.
|
|
160
223
|
*/
|
|
161
224
|
stop(): Promise<void>;
|
|
162
|
-
/**
|
|
163
|
-
|
|
225
|
+
/**
|
|
226
|
+
* One production heartbeat cycle: run a beat then arm the next backoff-aware
|
|
227
|
+
* timer (unless the beat exited / stopped the runner).
|
|
228
|
+
*/
|
|
229
|
+
private beatCycle;
|
|
230
|
+
/**
|
|
231
|
+
* Test hook: run exactly one beat cycle WITHOUT arming the next timer, so a
|
|
232
|
+
* chaos/fake-clock test drives beats deterministically past the backoff ladder
|
|
233
|
+
* (whose ≥4s delays make real-timer tests impractical).
|
|
234
|
+
*/
|
|
235
|
+
beatOnce(): Promise<void>;
|
|
236
|
+
/**
|
|
237
|
+
* One heartbeat: proactively refresh a near-expiry token, beat the identity,
|
|
238
|
+
* and on failure walk the backoff ladder → ONE re-auth → offline flip + exit.
|
|
239
|
+
* Does NOT schedule the next beat — the caller (beatCycle) does. A healthy beat
|
|
240
|
+
* also announces a capacity change.
|
|
241
|
+
*/
|
|
242
|
+
private runBeat;
|
|
243
|
+
/** Schedule the next beat on the backoff-aware timer (unref'd; test seam via now/heartbeatMs). */
|
|
244
|
+
private scheduleBeat;
|
|
245
|
+
/** Proactively refresh when the live session is within the lead window of expiry. */
|
|
246
|
+
private maybeProactiveRefresh;
|
|
247
|
+
/** Single-flight refresh wrapper — proactive and reactive share one in-flight call. */
|
|
248
|
+
private runRefresh;
|
|
249
|
+
/** Flip the identity offline (via the shared stop() teardown) and exit non-zero. */
|
|
250
|
+
private flipOfflineAndExit;
|
|
251
|
+
/** Announce a capacity change on a healthy beat (unchanged behaviour). */
|
|
252
|
+
private announceCapacityIfChanged;
|
|
164
253
|
}
|
|
165
254
|
/**
|
|
166
255
|
* Build the identity-topic broadcaster for a companion. Broadcasts on
|
package/dist/companion.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"companion.d.ts","sourceRoot":"","sources":["../src/companion.ts"],"names":[],"mappings":"AAsCA,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EAItB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"companion.d.ts","sourceRoot":"","sources":["../src/companion.ts"],"names":[],"mappings":"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"}
|