@songsid/agend 2.1.5 → 2.1.6-beta.10
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/agent-endpoint.d.ts +18 -0
- package/dist/agent-endpoint.js +53 -2
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/apply-job.d.ts +114 -0
- package/dist/apply-job.js +214 -0
- package/dist/apply-job.js.map +1 -0
- package/dist/backend/claude-code.d.ts +25 -0
- package/dist/backend/claude-code.js +127 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.d.ts +57 -0
- package/dist/backend/codex.js +183 -0
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +159 -0
- package/dist/backend/credential-profile.js +340 -0
- package/dist/backend/credential-profile.js.map +1 -0
- package/dist/backend/factory.js +4 -1
- package/dist/backend/factory.js.map +1 -1
- package/dist/backend/kiro-auth-store.d.ts +25 -0
- package/dist/backend/kiro-auth-store.js +61 -0
- package/dist/backend/kiro-auth-store.js.map +1 -0
- package/dist/backend/kiro.d.ts +8 -0
- package/dist/backend/kiro.js +31 -2
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.d.ts +90 -0
- package/dist/backend/muse.js +437 -0
- package/dist/backend/muse.js.map +1 -0
- package/dist/backend/types.d.ts +54 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/access-manager.d.ts +20 -0
- package/dist/channel/access-manager.js +25 -0
- package/dist/channel/access-manager.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +17 -0
- package/dist/channel/adapters/discord.js +72 -11
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +6 -0
- package/dist/channel/adapters/telegram.js +36 -0
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/markdown-chunk.d.ts +8 -3
- package/dist/channel/markdown-chunk.js +12 -3
- package/dist/channel/markdown-chunk.js.map +1 -1
- package/dist/channel/mcp-server.js +9 -12
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +6 -2
- package/dist/channel/mcp-tools.js +6 -36
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.js +32 -3
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +18 -0
- package/dist/cli.js +113 -0
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +45 -5
- package/dist/config-validator.js.map +1 -1
- package/dist/connection-secrets.d.ts +96 -0
- package/dist/connection-secrets.js +25 -0
- package/dist/connection-secrets.js.map +1 -0
- package/dist/daemon.d.ts +76 -0
- package/dist/daemon.js +489 -103
- package/dist/daemon.js.map +1 -1
- package/dist/event-log.d.ts +9 -0
- package/dist/event-log.js +21 -0
- package/dist/event-log.js.map +1 -1
- package/dist/fleet-level-config.d.ts +42 -0
- package/dist/fleet-level-config.js +78 -0
- package/dist/fleet-level-config.js.map +1 -0
- package/dist/fleet-lock.d.ts +21 -0
- package/dist/fleet-lock.js +42 -8
- package/dist/fleet-lock.js.map +1 -1
- package/dist/fleet-manager.d.ts +425 -2
- package/dist/fleet-manager.js +2055 -182
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +145 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +11 -1
- package/dist/instance-config-impact.d.ts +55 -0
- package/dist/instance-config-impact.js +152 -0
- package/dist/instance-config-impact.js.map +1 -0
- package/dist/instance-lifecycle.js +8 -4
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +24 -0
- package/dist/locale.js.map +1 -1
- package/dist/logger.js +42 -25
- package/dist/logger.js.map +1 -1
- package/dist/muse-usage-relay.d.ts +72 -0
- package/dist/muse-usage-relay.js +419 -0
- package/dist/muse-usage-relay.js.map +1 -0
- package/dist/outbound-handlers.d.ts +5 -1
- package/dist/outbound-handlers.js +199 -1
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +7 -5
- package/dist/outbound-schemas.js +3 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/provider-probe.d.ts +48 -0
- package/dist/provider-probe.js +121 -0
- package/dist/provider-probe.js.map +1 -0
- package/dist/provider-secret-registry.d.ts +98 -0
- package/dist/provider-secret-registry.js +334 -0
- package/dist/provider-secret-registry.js.map +1 -0
- package/dist/quickstart-api.d.ts +164 -0
- package/dist/quickstart-api.js +351 -0
- package/dist/quickstart-api.js.map +1 -0
- package/dist/quickstart.js +23 -50
- package/dist/quickstart.js.map +1 -1
- package/dist/scheduler/db.js +17 -5
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/db.test.js +34 -1
- package/dist/scheduler/db.test.js.map +1 -1
- package/dist/scheduler/types.d.ts +4 -0
- package/dist/scheduler/types.js.map +1 -1
- package/dist/secret-store.d.ts +25 -0
- package/dist/secret-store.js +165 -0
- package/dist/secret-store.js.map +1 -0
- package/dist/self-restart-limit.d.ts +21 -0
- package/dist/self-restart-limit.js +129 -0
- package/dist/self-restart-limit.js.map +1 -0
- package/dist/settings-api.d.ts +116 -0
- package/dist/settings-api.js +530 -5
- package/dist/settings-api.js.map +1 -1
- package/dist/setup-auth.d.ts +113 -0
- package/dist/setup-auth.js +181 -0
- package/dist/setup-auth.js.map +1 -0
- package/dist/setup-form.d.ts +18 -0
- package/dist/setup-form.js +315 -0
- package/dist/setup-form.js.map +1 -0
- package/dist/setup-host.d.ts +162 -0
- package/dist/setup-host.js +496 -0
- package/dist/setup-host.js.map +1 -0
- package/dist/setup-marker.d.ts +8 -0
- package/dist/setup-marker.js +39 -0
- package/dist/setup-marker.js.map +1 -0
- package/dist/setup-tunnel-consent.d.ts +53 -0
- package/dist/setup-tunnel-consent.js +82 -0
- package/dist/setup-tunnel-consent.js.map +1 -0
- package/dist/setup-wizard.js +4 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/steer-capability.js +4 -1
- package/dist/steer-capability.js.map +1 -1
- package/dist/tips.js +1 -1
- package/dist/tips.js.map +1 -1
- package/dist/tmux-manager.js +29 -4
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions-notice.d.ts +38 -0
- package/dist/tool-permissions-notice.js +92 -0
- package/dist/tool-permissions-notice.js.map +1 -0
- package/dist/tool-permissions.d.ts +120 -0
- package/dist/tool-permissions.js +277 -0
- package/dist/tool-permissions.js.map +1 -0
- package/dist/topic-commands.js +1 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-sources.d.ts +12 -1
- package/dist/transcript-sources.js +19 -3
- package/dist/transcript-sources.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +71 -0
- package/dist/tunnel/cloudflared.js +447 -0
- package/dist/tunnel/cloudflared.js.map +1 -0
- package/dist/tunnel/lease.d.ts +75 -0
- package/dist/tunnel/lease.js +209 -0
- package/dist/tunnel/lease.js.map +1 -0
- package/dist/tunnel/manager.d.ts +56 -0
- package/dist/tunnel/manager.js +167 -0
- package/dist/tunnel/manager.js.map +1 -0
- package/dist/tunnel/types.d.ts +119 -0
- package/dist/tunnel/types.js +33 -0
- package/dist/tunnel/types.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/ui/dashboard.html +4 -3
- package/dist/ui/settings.html +808 -156
- package/dist/ui/view.html +2 -2
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +1 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/providers.d.ts +23 -14
- package/dist/usage/providers.js +220 -58
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/usage-api.d.ts +13 -0
- package/dist/usage/usage-api.js +69 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/web-api.js +8 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +75 -0
- package/dist/web-auth.js +208 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-terminal.d.ts +30 -1
- package/dist/web-terminal.js +86 -3
- package/dist/web-terminal.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { request as httpRequest } from "node:http";
|
|
2
|
+
/** The upstream is deliberately code-owned: callers cannot turn this into an open proxy. */
|
|
3
|
+
export declare const MUSE_UPSTREAM_ORIGIN = "https://api.meta.ai";
|
|
4
|
+
export declare const MUSE_USAGE_STATE_FILE = "muse-usage.json";
|
|
5
|
+
export declare const MUSE_USAGE_STALE_MS: number;
|
|
6
|
+
export interface MuseUsageWindow {
|
|
7
|
+
usedPercent: number;
|
|
8
|
+
resetsAt: number;
|
|
9
|
+
windowMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface MuseUsageSnapshot {
|
|
12
|
+
observedAt: number;
|
|
13
|
+
plan?: string;
|
|
14
|
+
session?: MuseUsageWindow;
|
|
15
|
+
weekly?: MuseUsageWindow;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse only the subscription_usage event. The event has changed nesting in
|
|
19
|
+
* early Muse builds, so the known wrappers are accepted while arbitrary events
|
|
20
|
+
* and malformed JSON remain invisible to the usage layer.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseMuseSubscriptionUsage(data: string): Partial<MuseUsageSnapshot> | null;
|
|
23
|
+
/** Small incremental SSE parser; it never stores event payloads beyond one event. */
|
|
24
|
+
export declare class MuseUsageSseParser {
|
|
25
|
+
private pending;
|
|
26
|
+
private event;
|
|
27
|
+
private data;
|
|
28
|
+
feed(chunk: Uint8Array | string): Partial<MuseUsageSnapshot>[];
|
|
29
|
+
end(): Partial<MuseUsageSnapshot>[];
|
|
30
|
+
}
|
|
31
|
+
export declare function usageStatePath(instanceDir: string): string;
|
|
32
|
+
export declare function readMuseUsageSnapshot(instanceDir: string): MuseUsageSnapshot | null;
|
|
33
|
+
export declare function writeMuseUsageSnapshot(instanceDir: string, snapshot: MuseUsageSnapshot): void;
|
|
34
|
+
export declare function clearMuseUsageSnapshot(instanceDir: string): void;
|
|
35
|
+
/** Revision used by the fleet usage cache; only daemon state files are read. */
|
|
36
|
+
export declare function museUsageRevision(): number;
|
|
37
|
+
export declare function rewriteMuseRelayPath(path: string): string;
|
|
38
|
+
export interface MuseUsageRelayOptions {
|
|
39
|
+
instanceDir: string;
|
|
40
|
+
upstreamOrigin?: string;
|
|
41
|
+
/** Optional fixed port for restart/tests; production defaults to an ephemeral port. */
|
|
42
|
+
port?: number;
|
|
43
|
+
/** Test seam; production always uses node's HTTP(S) request implementation. */
|
|
44
|
+
request?: typeof httpRequest;
|
|
45
|
+
onUsage?: (snapshot: MuseUsageSnapshot) => void;
|
|
46
|
+
/** Called after bounded recovery cannot reclaim the original loopback port. */
|
|
47
|
+
onUnavailable?: () => void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Local-only byte-streaming relay. It is intentionally not a generic fetch
|
|
51
|
+
* proxy: the upstream origin is fixed and the only special behaviour is a
|
|
52
|
+
* side-channel parser for response.subscription_usage SSE events.
|
|
53
|
+
*/
|
|
54
|
+
export declare class MuseUsageRelay {
|
|
55
|
+
private readonly options;
|
|
56
|
+
private server;
|
|
57
|
+
private currentPort;
|
|
58
|
+
private stopped;
|
|
59
|
+
private snapshot;
|
|
60
|
+
private recovering;
|
|
61
|
+
private readonly upstreamOrigin;
|
|
62
|
+
private readonly requestImpl;
|
|
63
|
+
constructor(options: MuseUsageRelayOptions);
|
|
64
|
+
get port(): number | null;
|
|
65
|
+
get baseUrl(): string | null;
|
|
66
|
+
start(): Promise<string>;
|
|
67
|
+
private listen;
|
|
68
|
+
private recoverAfterClose;
|
|
69
|
+
stop(): Promise<void>;
|
|
70
|
+
private record;
|
|
71
|
+
private handle;
|
|
72
|
+
}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { createServer, request as httpRequest } from "node:http";
|
|
2
|
+
import { request as httpsRequest } from "node:https";
|
|
3
|
+
import { createBrotliDecompress, createGunzip } from "node:zlib";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { mkdirSync, readdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
6
|
+
import { getAgendHome } from "./paths.js";
|
|
7
|
+
/** The upstream is deliberately code-owned: callers cannot turn this into an open proxy. */
|
|
8
|
+
export const MUSE_UPSTREAM_ORIGIN = "https://api.meta.ai";
|
|
9
|
+
export const MUSE_USAGE_STATE_FILE = "muse-usage.json";
|
|
10
|
+
export const MUSE_USAGE_STALE_MS = 15 * 60_000;
|
|
11
|
+
function finitePercent(value) {
|
|
12
|
+
// Meta reports overage as a percentage above 100. Keep it: turning an
|
|
13
|
+
// exceeded subscription into "unavailable" hides the most useful state.
|
|
14
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
15
|
+
return null;
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
const SAFE_MUSE_PLANS = new Set(["free", "basic", "pro", "plus", "team", "business", "enterprise", "subscription"]);
|
|
19
|
+
function safeMusePlan(value) {
|
|
20
|
+
if (typeof value !== "string")
|
|
21
|
+
return undefined;
|
|
22
|
+
const plan = value.trim().toLowerCase();
|
|
23
|
+
return SAFE_MUSE_PLANS.has(plan) ? plan[0].toUpperCase() + plan.slice(1) : undefined;
|
|
24
|
+
}
|
|
25
|
+
function epochSeconds(value) {
|
|
26
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
27
|
+
return null;
|
|
28
|
+
return Math.floor(value > 10_000_000_000 ? value / 1000 : value);
|
|
29
|
+
}
|
|
30
|
+
function readWindow(value) {
|
|
31
|
+
if (!value || typeof value !== "object")
|
|
32
|
+
return undefined;
|
|
33
|
+
const row = value;
|
|
34
|
+
const used = finitePercent(row.used_percent ?? row.usedPercent ?? row.percent_used);
|
|
35
|
+
const reset = epochSeconds(row.resets_at ?? row.resetsAt ?? row.reset_at);
|
|
36
|
+
const mins = typeof row.window_duration_mins === "number" && Number.isFinite(row.window_duration_mins)
|
|
37
|
+
&& row.window_duration_mins > 0 && row.window_duration_mins <= 7 * 24 * 60
|
|
38
|
+
? row.window_duration_mins : undefined;
|
|
39
|
+
return used == null || reset == null
|
|
40
|
+
? undefined
|
|
41
|
+
: { usedPercent: used, resetsAt: reset, ...(mins ? { windowMs: mins * 60_000 } : {}) };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse only the subscription_usage event. The event has changed nesting in
|
|
45
|
+
* early Muse builds, so the known wrappers are accepted while arbitrary events
|
|
46
|
+
* and malformed JSON remain invisible to the usage layer.
|
|
47
|
+
*/
|
|
48
|
+
export function parseMuseSubscriptionUsage(data) {
|
|
49
|
+
let value;
|
|
50
|
+
try {
|
|
51
|
+
value = JSON.parse(data);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
if (!value || typeof value !== "object")
|
|
57
|
+
return null;
|
|
58
|
+
const root = value;
|
|
59
|
+
const usage = (root.response && typeof root.response === "object"
|
|
60
|
+
? root.response.subscription_usage
|
|
61
|
+
: undefined)
|
|
62
|
+
?? root.subscription_usage
|
|
63
|
+
?? value;
|
|
64
|
+
if (!usage || typeof usage !== "object")
|
|
65
|
+
return null;
|
|
66
|
+
const row = usage;
|
|
67
|
+
const subscription = row.subscription && typeof row.subscription === "object"
|
|
68
|
+
? row.subscription : row;
|
|
69
|
+
const session = readWindow(row.session ?? row.window ?? row.five_hour ?? row.fiveHour
|
|
70
|
+
?? subscription.window ?? subscription.five_hour ?? subscription.fiveHour);
|
|
71
|
+
const weekly = readWindow(row.weekly ?? row.seven_day ?? row.sevenDay
|
|
72
|
+
?? subscription.weekly ?? subscription.seven_day ?? subscription.sevenDay);
|
|
73
|
+
const planValue = row.plan ?? row.plan_name ?? row.planName ?? row.tier ?? row.tier_id
|
|
74
|
+
?? subscription.plan ?? subscription.plan_name ?? subscription.planName ?? subscription.tier ?? subscription.tier_id;
|
|
75
|
+
// Never expose an opaque tier/account id in `/usage`, activity, or the
|
|
76
|
+
// token-free state file. Human plan names are allowlisted; everything else
|
|
77
|
+
// is represented by the neutral Subscription fallback downstream.
|
|
78
|
+
const plan = safeMusePlan(planValue);
|
|
79
|
+
if (!session && !weekly && !plan)
|
|
80
|
+
return null;
|
|
81
|
+
return { session, weekly, plan };
|
|
82
|
+
}
|
|
83
|
+
/** Small incremental SSE parser; it never stores event payloads beyond one event. */
|
|
84
|
+
export class MuseUsageSseParser {
|
|
85
|
+
pending = "";
|
|
86
|
+
event = "";
|
|
87
|
+
data = [];
|
|
88
|
+
feed(chunk) {
|
|
89
|
+
this.pending += typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8");
|
|
90
|
+
const out = [];
|
|
91
|
+
let newline;
|
|
92
|
+
while ((newline = this.pending.indexOf("\n")) >= 0) {
|
|
93
|
+
let line = this.pending.slice(0, newline);
|
|
94
|
+
this.pending = this.pending.slice(newline + 1);
|
|
95
|
+
if (line.endsWith("\r"))
|
|
96
|
+
line = line.slice(0, -1);
|
|
97
|
+
if (line === "") {
|
|
98
|
+
if (this.event === "response.subscription_usage" && this.data.length > 0) {
|
|
99
|
+
const parsed = parseMuseSubscriptionUsage(this.data.join("\n"));
|
|
100
|
+
if (parsed)
|
|
101
|
+
out.push(parsed);
|
|
102
|
+
}
|
|
103
|
+
this.event = "";
|
|
104
|
+
this.data = [];
|
|
105
|
+
}
|
|
106
|
+
else if (line.startsWith("event:")) {
|
|
107
|
+
this.event = line.slice(6).trim();
|
|
108
|
+
}
|
|
109
|
+
else if (line.startsWith("data:")) {
|
|
110
|
+
this.data.push(line.slice(5).replace(/^ /, ""));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
end() {
|
|
116
|
+
// A server is allowed to omit the final blank SSE line. Treat the pending
|
|
117
|
+
// line as data but still require the canonical event name.
|
|
118
|
+
if (this.pending || this.event || this.data.length > 0)
|
|
119
|
+
return this.feed("\n\n");
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function mergeSnapshot(previous, update) {
|
|
124
|
+
return {
|
|
125
|
+
observedAt: Date.now(),
|
|
126
|
+
plan: update.plan ?? previous?.plan,
|
|
127
|
+
session: update.session ?? previous?.session,
|
|
128
|
+
weekly: update.weekly ?? previous?.weekly,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
export function usageStatePath(instanceDir) {
|
|
132
|
+
return join(instanceDir, MUSE_USAGE_STATE_FILE);
|
|
133
|
+
}
|
|
134
|
+
export function readMuseUsageSnapshot(instanceDir) {
|
|
135
|
+
try {
|
|
136
|
+
const value = JSON.parse(readFileSync(usageStatePath(instanceDir), "utf8"));
|
|
137
|
+
if (!value || typeof value.observedAt !== "number" || !Number.isFinite(value.observedAt))
|
|
138
|
+
return null;
|
|
139
|
+
if (Date.now() - value.observedAt > MUSE_USAGE_STALE_MS)
|
|
140
|
+
return null;
|
|
141
|
+
return { ...value, plan: safeMusePlan(value.plan) };
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export function writeMuseUsageSnapshot(instanceDir, snapshot) {
|
|
148
|
+
mkdirSync(instanceDir, { recursive: true });
|
|
149
|
+
const target = usageStatePath(instanceDir);
|
|
150
|
+
const temp = `${target}.${process.pid}.tmp`;
|
|
151
|
+
writeFileSync(temp, JSON.stringify(snapshot), { mode: 0o600 });
|
|
152
|
+
renameSync(temp, target);
|
|
153
|
+
}
|
|
154
|
+
export function clearMuseUsageSnapshot(instanceDir) {
|
|
155
|
+
try {
|
|
156
|
+
unlinkSync(usageStatePath(instanceDir));
|
|
157
|
+
}
|
|
158
|
+
catch { /* absent */ }
|
|
159
|
+
}
|
|
160
|
+
/** Revision used by the fleet usage cache; only daemon state files are read. */
|
|
161
|
+
export function museUsageRevision() {
|
|
162
|
+
const root = join(getAgendHome(), "instances");
|
|
163
|
+
let revision = 0;
|
|
164
|
+
try {
|
|
165
|
+
for (const entry of readdirSync(root, { withFileTypes: true })) {
|
|
166
|
+
if (!entry.isDirectory())
|
|
167
|
+
continue;
|
|
168
|
+
try {
|
|
169
|
+
const state = readFileSync(usageStatePath(join(root, entry.name)), "utf8");
|
|
170
|
+
revision = Math.max(revision, state.length + statMtime(usageStatePath(join(root, entry.name))));
|
|
171
|
+
}
|
|
172
|
+
catch { /* absent or concurrently replaced */ }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch { /* no instances directory */ }
|
|
176
|
+
return revision;
|
|
177
|
+
}
|
|
178
|
+
function statMtime(path) {
|
|
179
|
+
try {
|
|
180
|
+
return statSync(path).mtimeMs;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return 0;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const HOP_BY_HOP = new Set([
|
|
187
|
+
"connection", "keep-alive", "proxy-authenticate", "proxy-authorization",
|
|
188
|
+
"te", "trailer", "transfer-encoding", "upgrade",
|
|
189
|
+
]);
|
|
190
|
+
function forwardHeaders(headers) {
|
|
191
|
+
const out = {};
|
|
192
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
193
|
+
if (HOP_BY_HOP.has(name.toLowerCase()) || name.toLowerCase() === "host")
|
|
194
|
+
continue;
|
|
195
|
+
if (value !== undefined)
|
|
196
|
+
out[name] = value;
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
export function rewriteMuseRelayPath(path) {
|
|
201
|
+
const parsed = new URL(path, "http://127.0.0.1");
|
|
202
|
+
const pathname = parsed.pathname === "/muse-code" || parsed.pathname.startsWith("/muse-code/")
|
|
203
|
+
? parsed.pathname
|
|
204
|
+
: parsed.pathname.startsWith("/v1/") || parsed.pathname === "/v1"
|
|
205
|
+
? parsed.pathname
|
|
206
|
+
: `/v1${parsed.pathname.startsWith("/") ? parsed.pathname : `/${parsed.pathname}`}`;
|
|
207
|
+
return `${pathname}${parsed.search}`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Local-only byte-streaming relay. It is intentionally not a generic fetch
|
|
211
|
+
* proxy: the upstream origin is fixed and the only special behaviour is a
|
|
212
|
+
* side-channel parser for response.subscription_usage SSE events.
|
|
213
|
+
*/
|
|
214
|
+
export class MuseUsageRelay {
|
|
215
|
+
options;
|
|
216
|
+
server = null;
|
|
217
|
+
currentPort = null;
|
|
218
|
+
stopped = false;
|
|
219
|
+
snapshot;
|
|
220
|
+
recovering = false;
|
|
221
|
+
upstreamOrigin;
|
|
222
|
+
requestImpl;
|
|
223
|
+
constructor(options) {
|
|
224
|
+
this.options = options;
|
|
225
|
+
this.upstreamOrigin = new URL(options.upstreamOrigin ?? MUSE_UPSTREAM_ORIGIN);
|
|
226
|
+
// A custom origin is accepted only for an explicit loopback HTTP test
|
|
227
|
+
// seam. Production callers cannot turn this into an arbitrary proxy, even
|
|
228
|
+
// by passing a custom transport implementation.
|
|
229
|
+
const loopbackTestOrigin = options.request
|
|
230
|
+
&& this.upstreamOrigin.protocol === "http:"
|
|
231
|
+
&& (this.upstreamOrigin.hostname === "127.0.0.1" || this.upstreamOrigin.hostname === "[::1]" || this.upstreamOrigin.hostname === "::1");
|
|
232
|
+
if ((this.upstreamOrigin.protocol !== "https:" || this.upstreamOrigin.hostname !== "api.meta.ai") && !loopbackTestOrigin) {
|
|
233
|
+
throw new Error("Muse relay upstream must be https://api.meta.ai");
|
|
234
|
+
}
|
|
235
|
+
this.requestImpl = options.request ?? httpRequest;
|
|
236
|
+
}
|
|
237
|
+
get port() { return this.currentPort; }
|
|
238
|
+
get baseUrl() { return this.currentPort == null ? null : `http://127.0.0.1:${this.currentPort}`; }
|
|
239
|
+
async start() {
|
|
240
|
+
if (this.baseUrl)
|
|
241
|
+
return this.baseUrl;
|
|
242
|
+
this.stopped = false;
|
|
243
|
+
this.snapshot = undefined;
|
|
244
|
+
clearMuseUsageSnapshot(this.options.instanceDir);
|
|
245
|
+
await this.listen(this.options.port ?? 0);
|
|
246
|
+
return this.baseUrl;
|
|
247
|
+
}
|
|
248
|
+
async listen(port) {
|
|
249
|
+
const server = createServer((req, res) => { void this.handle(req, res); });
|
|
250
|
+
this.server = server;
|
|
251
|
+
await new Promise((resolve, reject) => {
|
|
252
|
+
const onError = (error) => { server.off("listening", onListening); reject(error); };
|
|
253
|
+
const onListening = () => { server.off("error", onError); resolve(); };
|
|
254
|
+
server.once("error", onError);
|
|
255
|
+
server.once("listening", onListening);
|
|
256
|
+
// Node enables SO_REUSEADDR for TCP servers by default. Recovery starts
|
|
257
|
+
// before the old server's active sockets drain, then retries briefly for
|
|
258
|
+
// a transient EADDRINUSE window instead of changing Muse's baked-in port.
|
|
259
|
+
server.listen({ port, host: "127.0.0.1", reusePort: false });
|
|
260
|
+
}).catch(error => {
|
|
261
|
+
this.server = null;
|
|
262
|
+
throw error;
|
|
263
|
+
});
|
|
264
|
+
const address = server.address();
|
|
265
|
+
if (!address || typeof address === "string")
|
|
266
|
+
throw new Error("Muse relay did not expose a TCP port");
|
|
267
|
+
this.currentPort = address.port;
|
|
268
|
+
// `close` waits for active keep-alive streams before emitting its event.
|
|
269
|
+
// Wrap it so an unexpected close starts same-port recovery immediately;
|
|
270
|
+
// the old sockets can drain while the replacement listener accepts new
|
|
271
|
+
// requests. stop() marks the relay stopped and therefore never recovers.
|
|
272
|
+
const close = server.close.bind(server);
|
|
273
|
+
server.close = ((callback) => {
|
|
274
|
+
const unexpected = !this.stopped && !this.recovering && this.server === server && this.currentPort === address.port;
|
|
275
|
+
const result = close(callback);
|
|
276
|
+
if (unexpected)
|
|
277
|
+
void this.recoverAfterClose(address.port);
|
|
278
|
+
return result;
|
|
279
|
+
});
|
|
280
|
+
server.once("close", () => {
|
|
281
|
+
if (!this.stopped && this.server === server && !this.recovering)
|
|
282
|
+
void this.recoverAfterClose(address.port);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
async recoverAfterClose(port) {
|
|
286
|
+
if (this.stopped || this.recovering)
|
|
287
|
+
return;
|
|
288
|
+
this.recovering = true;
|
|
289
|
+
this.server = null;
|
|
290
|
+
this.currentPort = null;
|
|
291
|
+
for (let attempt = 0; attempt < 3 && !this.stopped; attempt++) {
|
|
292
|
+
try {
|
|
293
|
+
await this.listen(port);
|
|
294
|
+
this.recovering = false;
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
await new Promise(resolve => setTimeout(resolve, 100 * (attempt + 1)));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
this.recovering = false;
|
|
302
|
+
clearMuseUsageSnapshot(this.options.instanceDir);
|
|
303
|
+
this.options.onUnavailable?.();
|
|
304
|
+
}
|
|
305
|
+
async stop() {
|
|
306
|
+
this.stopped = true;
|
|
307
|
+
this.recovering = false;
|
|
308
|
+
const server = this.server;
|
|
309
|
+
this.server = null;
|
|
310
|
+
this.currentPort = null;
|
|
311
|
+
clearMuseUsageSnapshot(this.options.instanceDir);
|
|
312
|
+
if (!server)
|
|
313
|
+
return;
|
|
314
|
+
await new Promise(resolve => server.close(() => resolve()));
|
|
315
|
+
}
|
|
316
|
+
record(update) {
|
|
317
|
+
this.snapshot = mergeSnapshot(this.snapshot, update);
|
|
318
|
+
try {
|
|
319
|
+
writeMuseUsageSnapshot(this.options.instanceDir, this.snapshot);
|
|
320
|
+
}
|
|
321
|
+
catch { /* usage is best effort */ }
|
|
322
|
+
this.options.onUsage?.(this.snapshot);
|
|
323
|
+
}
|
|
324
|
+
async handle(req, res) {
|
|
325
|
+
const target = new URL(rewriteMuseRelayPath(req.url ?? "/"), this.upstreamOrigin);
|
|
326
|
+
const headers = forwardHeaders(req.headers);
|
|
327
|
+
const requestOptions = {
|
|
328
|
+
method: req.method ?? "GET",
|
|
329
|
+
headers,
|
|
330
|
+
hostname: target.hostname,
|
|
331
|
+
port: target.port || 443,
|
|
332
|
+
path: `${target.pathname}${target.search}`,
|
|
333
|
+
protocol: target.protocol,
|
|
334
|
+
// Never allow ambient proxy/CA settings to turn this into an egress hop.
|
|
335
|
+
rejectUnauthorized: true,
|
|
336
|
+
};
|
|
337
|
+
const transport = target.protocol === "https:" ? httpsRequest : this.requestImpl;
|
|
338
|
+
let upstream = null;
|
|
339
|
+
let completed = false;
|
|
340
|
+
const abort = () => { if (!completed)
|
|
341
|
+
upstream?.destroy(); };
|
|
342
|
+
req.once("aborted", abort);
|
|
343
|
+
res.once("close", abort);
|
|
344
|
+
try {
|
|
345
|
+
await new Promise((resolve) => {
|
|
346
|
+
upstream = transport(requestOptions, upstreamRes => {
|
|
347
|
+
const responseHeaders = forwardHeaders(upstreamRes.headers);
|
|
348
|
+
res.writeHead(upstreamRes.statusCode ?? 502, responseHeaders);
|
|
349
|
+
const contentType = String(upstreamRes.headers["content-type"] ?? "");
|
|
350
|
+
const parser = /text\/event-stream/i.test(contentType) ? new MuseUsageSseParser() : null;
|
|
351
|
+
let parserDone;
|
|
352
|
+
if (parser) {
|
|
353
|
+
const encoding = String(upstreamRes.headers["content-encoding"] ?? "").split(",")[0].trim().toLowerCase();
|
|
354
|
+
const decoder = encoding === "gzip"
|
|
355
|
+
? createGunzip()
|
|
356
|
+
: encoding === "br" ? createBrotliDecompress() : null;
|
|
357
|
+
const parserInput = decoder ?? upstreamRes;
|
|
358
|
+
parserDone = new Promise(done => {
|
|
359
|
+
parserInput.on("data", chunk => {
|
|
360
|
+
for (const update of parser.feed(chunk))
|
|
361
|
+
this.record(update);
|
|
362
|
+
});
|
|
363
|
+
parserInput.once("end", () => {
|
|
364
|
+
for (const update of parser.end())
|
|
365
|
+
this.record(update);
|
|
366
|
+
done();
|
|
367
|
+
});
|
|
368
|
+
parserInput.once("error", () => done());
|
|
369
|
+
});
|
|
370
|
+
if (decoder)
|
|
371
|
+
upstreamRes.pipe(decoder);
|
|
372
|
+
}
|
|
373
|
+
upstreamRes.once("end", () => {
|
|
374
|
+
void (parserDone ?? Promise.resolve()).then(() => {
|
|
375
|
+
completed = true;
|
|
376
|
+
resolve();
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
upstreamRes.once("error", () => {
|
|
380
|
+
// Preserve a mid-stream disconnect instead of manufacturing a
|
|
381
|
+
// successful end-of-stream for Muse.
|
|
382
|
+
if (!res.destroyed)
|
|
383
|
+
res.destroy();
|
|
384
|
+
completed = true;
|
|
385
|
+
resolve();
|
|
386
|
+
});
|
|
387
|
+
// Direct pipe keeps response bytes and backpressure untouched. The
|
|
388
|
+
// parser's data listener is a side channel and never rewrites chunks.
|
|
389
|
+
upstreamRes.pipe(res);
|
|
390
|
+
});
|
|
391
|
+
upstream.once("error", () => {
|
|
392
|
+
if (!res.headersSent) {
|
|
393
|
+
res.writeHead(502, { "content-type": "text/plain" });
|
|
394
|
+
res.end("upstream unavailable");
|
|
395
|
+
}
|
|
396
|
+
else
|
|
397
|
+
res.destroy();
|
|
398
|
+
completed = true;
|
|
399
|
+
resolve();
|
|
400
|
+
});
|
|
401
|
+
if (req.method === "GET" || req.method === "HEAD")
|
|
402
|
+
upstream.end();
|
|
403
|
+
else
|
|
404
|
+
req.pipe(upstream);
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
if (!res.headersSent) {
|
|
409
|
+
res.writeHead(502);
|
|
410
|
+
res.end("upstream unavailable");
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
finally {
|
|
414
|
+
req.off("aborted", abort);
|
|
415
|
+
res.off("close", abort);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=muse-usage-relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"muse-usage-relay.js","sourceRoot":"","sources":["../src/muse-usage-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,9 @@ export interface OutboundContext {
|
|
|
34
34
|
} | null;
|
|
35
35
|
lastActivityMs(name: string): number;
|
|
36
36
|
startInstance(name: string, config: InstanceConfig, topicMode: boolean): Promise<void>;
|
|
37
|
-
restartSingleInstance(name: string
|
|
37
|
+
restartSingleInstance(name: string, opts?: {
|
|
38
|
+
freshStart?: boolean;
|
|
39
|
+
}): Promise<void>;
|
|
38
40
|
connectIpcToInstance(name: string): Promise<void>;
|
|
39
41
|
/** FleetManager facade that wakes paused instances before delivery. */
|
|
40
42
|
deliverToInstance?(instanceName: string, payload: Record<string, unknown>, options?: OutboundDeliveryOptions): Promise<void>;
|
|
@@ -89,5 +91,7 @@ export declare function setCrossInstanceRetryForTests(cfg: {
|
|
|
89
91
|
retries: number;
|
|
90
92
|
intervalMs: number;
|
|
91
93
|
} | null): void;
|
|
94
|
+
/** Long enough for the relaunched CLI to be listening; matches replace_instance. */
|
|
95
|
+
export declare const PROFILE_HANDOVER_SETTLE_MS = 3000;
|
|
92
96
|
export declare const outboundHandlers: Map<string, Handler>;
|
|
93
97
|
export {};
|