@tloncorp/openclaw 0.1.0 → 0.4.0
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/README.md +232 -23
- package/dist/index.js +292 -43
- package/dist/index.js.map +1 -1
- package/dist/setup-api.js +3 -0
- package/dist/setup-api.js.map +1 -0
- package/dist/setup-entry.js +4 -0
- package/dist/setup-entry.js.map +1 -0
- package/dist/src/actions.js +30 -8
- package/dist/src/actions.js.map +1 -1
- package/dist/src/channel.js +156 -373
- package/dist/src/channel.js.map +1 -1
- package/dist/src/channel.runtime.js +142 -0
- package/dist/src/channel.runtime.js.map +1 -0
- package/dist/src/config-schema.js +41 -1
- package/dist/src/config-schema.js.map +1 -1
- package/dist/src/effective-owner.js +22 -0
- package/dist/src/effective-owner.js.map +1 -0
- package/dist/src/gateway-status.js +72 -0
- package/dist/src/gateway-status.js.map +1 -0
- package/dist/src/monitor/approval.js +194 -96
- package/dist/src/monitor/approval.js.map +1 -1
- package/dist/src/monitor/command-auth.js +62 -0
- package/dist/src/monitor/command-auth.js.map +1 -0
- package/dist/src/monitor/command-bridge.js +27 -0
- package/dist/src/monitor/command-bridge.js.map +1 -0
- package/dist/src/monitor/computing-presence.js +221 -0
- package/dist/src/monitor/computing-presence.js.map +1 -0
- package/dist/src/monitor/discovery.js +17 -9
- package/dist/src/monitor/discovery.js.map +1 -1
- package/dist/src/monitor/index.js +960 -251
- package/dist/src/monitor/index.js.map +1 -1
- package/dist/src/monitor/media.js +195 -30
- package/dist/src/monitor/media.js.map +1 -1
- package/dist/src/monitor/nudge-runner.js +232 -0
- package/dist/src/monitor/nudge-runner.js.map +1 -0
- package/dist/src/monitor/nudge-state.js +58 -0
- package/dist/src/monitor/nudge-state.js.map +1 -0
- package/dist/src/monitor/owner-reply-persistence.js +92 -0
- package/dist/src/monitor/owner-reply-persistence.js.map +1 -0
- package/dist/src/monitor/pending-nudge-persistence.js +15 -0
- package/dist/src/monitor/pending-nudge-persistence.js.map +1 -0
- package/dist/src/monitor/settings-sync.js +28 -0
- package/dist/src/monitor/settings-sync.js.map +1 -0
- package/dist/src/monitor/utils.js +21 -4
- package/dist/src/monitor/utils.js.map +1 -1
- package/dist/src/nudge-decision.js +309 -0
- package/dist/src/nudge-decision.js.map +1 -0
- package/dist/src/nudge-messages.js +25 -0
- package/dist/src/nudge-messages.js.map +1 -0
- package/dist/src/nudge-scheduler.js +91 -0
- package/dist/src/nudge-scheduler.js.map +1 -0
- package/dist/src/pending-nudge.js +57 -0
- package/dist/src/pending-nudge.js.map +1 -0
- package/dist/src/session-roles.js +39 -0
- package/dist/src/session-roles.js.map +1 -0
- package/dist/src/settings.js +82 -6
- package/dist/src/settings.js.map +1 -1
- package/dist/src/setup-core.js +164 -0
- package/dist/src/setup-core.js.map +1 -0
- package/dist/src/setup-surface.js +85 -0
- package/dist/src/setup-surface.js.map +1 -0
- package/dist/src/telemetry.js +252 -0
- package/dist/src/telemetry.js.map +1 -0
- package/dist/src/tlon-binary.js +46 -0
- package/dist/src/tlon-binary.js.map +1 -0
- package/dist/src/tlon-tool-guard.js +44 -0
- package/dist/src/tlon-tool-guard.js.map +1 -0
- package/dist/src/tool-trace.js +100 -0
- package/dist/src/tool-trace.js.map +1 -0
- package/dist/src/types.js +35 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/urbit/api-client.js +4 -3
- package/dist/src/urbit/api-client.js.map +1 -1
- package/dist/src/urbit/base-url.js +2 -2
- package/dist/src/urbit/base-url.js.map +1 -1
- package/dist/src/urbit/fetch.js +1 -1
- package/dist/src/urbit/fetch.js.map +1 -1
- package/dist/src/urbit/send.js +6 -2
- package/dist/src/urbit/send.js.map +1 -1
- package/dist/src/urbit/sse-client.js +13 -2
- package/dist/src/urbit/sse-client.js.map +1 -1
- package/dist/src/urbit/upload.js +25 -20
- package/dist/src/urbit/upload.js.map +1 -1
- package/dist/src/version.generated.js +3 -0
- package/dist/src/version.generated.js.map +1 -0
- package/package.json +32 -25
- package/dist/src/onboarding.js +0 -178
- package/dist/src/onboarding.js.map +0 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { monitorTlonProvider } from "./monitor/index.js";
|
|
2
|
+
import { tlonSetupWizard } from "./setup-surface.js";
|
|
3
|
+
import { formatTargetHint, normalizeShip, parseTlonTarget, } from "./targets.js";
|
|
4
|
+
import { resolveTlonAccount } from "./types.js";
|
|
5
|
+
import { authenticate } from "./urbit/auth.js";
|
|
6
|
+
import { withAuthenticatedTlonApi } from "./urbit/api-client.js";
|
|
7
|
+
import { ssrfPolicyFromAllowPrivateNetwork } from "./urbit/context.js";
|
|
8
|
+
import { urbitFetch } from "./urbit/fetch.js";
|
|
9
|
+
import { buildMediaStory, sendDm, sendDmWithStory, sendChannelPost, } from "./urbit/send.js";
|
|
10
|
+
import { uploadImageFromUrl } from "./urbit/upload.js";
|
|
11
|
+
import { markdownToStory } from "./urbit/story.js";
|
|
12
|
+
import { scry } from "@tloncorp/api";
|
|
13
|
+
// Cache for bot profiles per ship (supports multi-account setups)
|
|
14
|
+
const profileCache = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Get bot profile for outbound messages from the ship's Tlon profile.
|
|
17
|
+
* Caches per-ship to support multi-account configurations.
|
|
18
|
+
*/
|
|
19
|
+
async function getBotProfile(ship) {
|
|
20
|
+
if (profileCache.has(ship)) {
|
|
21
|
+
const cached = profileCache.get(ship);
|
|
22
|
+
if (cached && (cached.nickname || cached.avatar)) {
|
|
23
|
+
return cached;
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const selfProfile = await scry({ app: "contacts", path: "/v1/self" });
|
|
29
|
+
const profile = {
|
|
30
|
+
nickname: selfProfile?.nickname?.value ?? "",
|
|
31
|
+
avatar: selfProfile?.avatar?.value ?? "",
|
|
32
|
+
};
|
|
33
|
+
profileCache.set(ship, profile);
|
|
34
|
+
if (profile.nickname || profile.avatar) {
|
|
35
|
+
console.log(`[tlon] Using self profile for bot meta (${ship}): ${profile.nickname || "(no nickname)"}`);
|
|
36
|
+
return profile;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.log(`[tlon] Could not fetch self profile for bot meta: ${err}`);
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
function resolveOutboundContext(params) {
|
|
45
|
+
const account = resolveTlonAccount(params.cfg, params.accountId ?? undefined);
|
|
46
|
+
if (!account.configured || !account.ship || !account.url || !account.code) {
|
|
47
|
+
throw new Error("Tlon account not configured");
|
|
48
|
+
}
|
|
49
|
+
const parsed = parseTlonTarget(params.to);
|
|
50
|
+
if (!parsed) {
|
|
51
|
+
throw new Error(`Invalid Tlon target. Use ${formatTargetHint()}`);
|
|
52
|
+
}
|
|
53
|
+
return { account: account, parsed };
|
|
54
|
+
}
|
|
55
|
+
function resolveReplyId(replyToId, threadId) {
|
|
56
|
+
return (replyToId ?? threadId) ? String(replyToId ?? threadId) : undefined;
|
|
57
|
+
}
|
|
58
|
+
export const tlonRuntimeOutbound = {
|
|
59
|
+
sendText: async ({ cfg, to, text, accountId, replyToId, threadId }) => {
|
|
60
|
+
const { account, parsed } = resolveOutboundContext({ cfg, accountId, to });
|
|
61
|
+
return await withAuthenticatedTlonApi({ url: account.url, code: account.code, ship: account.ship, allowPrivateNetwork: account.allowPrivateNetwork ?? undefined }, async () => {
|
|
62
|
+
const fromShip = normalizeShip(account.ship);
|
|
63
|
+
const replyId = resolveReplyId(replyToId, threadId);
|
|
64
|
+
const botProfile = await getBotProfile(fromShip);
|
|
65
|
+
if (parsed.kind === "dm") {
|
|
66
|
+
return await sendDm({ fromShip, toShip: parsed.ship, text, replyToId: replyId, botProfile });
|
|
67
|
+
}
|
|
68
|
+
return await sendChannelPost({
|
|
69
|
+
fromShip,
|
|
70
|
+
nest: parsed.nest,
|
|
71
|
+
story: markdownToStory(text),
|
|
72
|
+
replyToId: replyId,
|
|
73
|
+
botProfile,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
},
|
|
77
|
+
sendMedia: async ({ cfg, to, text, mediaUrl, accountId, replyToId, threadId }) => {
|
|
78
|
+
const { account, parsed } = resolveOutboundContext({ cfg, accountId, to });
|
|
79
|
+
return await withAuthenticatedTlonApi({ url: account.url, code: account.code, ship: account.ship, allowPrivateNetwork: account.allowPrivateNetwork ?? undefined }, async () => {
|
|
80
|
+
const uploadedUrl = mediaUrl ? await uploadImageFromUrl(mediaUrl) : undefined;
|
|
81
|
+
const fromShip = normalizeShip(account.ship);
|
|
82
|
+
const story = buildMediaStory(text, uploadedUrl);
|
|
83
|
+
const replyId = resolveReplyId(replyToId, threadId);
|
|
84
|
+
const botProfile = await getBotProfile(fromShip);
|
|
85
|
+
if (parsed.kind === "dm") {
|
|
86
|
+
return await sendDmWithStory({ fromShip, toShip: parsed.ship, story, replyToId: replyId, botProfile });
|
|
87
|
+
}
|
|
88
|
+
return await sendChannelPost({
|
|
89
|
+
fromShip,
|
|
90
|
+
nest: parsed.nest,
|
|
91
|
+
story,
|
|
92
|
+
replyToId: replyId,
|
|
93
|
+
botProfile,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
export async function probeTlonAccount(account) {
|
|
99
|
+
try {
|
|
100
|
+
const ssrfPolicy = ssrfPolicyFromAllowPrivateNetwork(account.allowPrivateNetwork);
|
|
101
|
+
const cookie = await authenticate(account.url, account.code, { ssrfPolicy });
|
|
102
|
+
const { response, release } = await urbitFetch({
|
|
103
|
+
baseUrl: account.url,
|
|
104
|
+
path: "/~/name",
|
|
105
|
+
init: {
|
|
106
|
+
method: "GET",
|
|
107
|
+
headers: { Cookie: cookie },
|
|
108
|
+
},
|
|
109
|
+
ssrfPolicy,
|
|
110
|
+
timeoutMs: 30_000,
|
|
111
|
+
auditContext: "tlon-probe-account",
|
|
112
|
+
});
|
|
113
|
+
try {
|
|
114
|
+
if (!response.ok) {
|
|
115
|
+
return { ok: false, error: `Name request failed: ${response.status}` };
|
|
116
|
+
}
|
|
117
|
+
return { ok: true };
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
await release();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
return { ok: false, error: error?.message ?? String(error) };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export async function startTlonGatewayAccount(ctx) {
|
|
128
|
+
const account = ctx.account;
|
|
129
|
+
ctx.setStatus({
|
|
130
|
+
accountId: account.accountId,
|
|
131
|
+
ship: account.ship,
|
|
132
|
+
url: account.url,
|
|
133
|
+
});
|
|
134
|
+
ctx.log?.info(`[${account.accountId}] starting Tlon provider for ${account.ship ?? "tlon"}`);
|
|
135
|
+
return monitorTlonProvider({
|
|
136
|
+
runtime: ctx.runtime,
|
|
137
|
+
abortSignal: ctx.abortSignal,
|
|
138
|
+
accountId: account.accountId,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
export { tlonSetupWizard };
|
|
142
|
+
//# sourceMappingURL=channel.runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.runtime.js","sourceRoot":"","sources":["../../src/channel.runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildChannelConfigSchema } from "openclaw/plugin-sdk";
|
|
1
|
+
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/tlon";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
const ShipSchema = z.string().min(1);
|
|
4
4
|
const ChannelNestSchema = z.string().min(1);
|
|
@@ -10,6 +10,34 @@ export const TlonAuthorizationSchema = z.object({
|
|
|
10
10
|
channelRules: z.record(z.string(), TlonChannelRuleSchema).optional(),
|
|
11
11
|
});
|
|
12
12
|
export const ReactionLevelSchema = z.enum(["off", "ack", "minimal", "extensive"]);
|
|
13
|
+
export const TlonTelemetrySchema = z.object({
|
|
14
|
+
enabled: z.boolean().optional(),
|
|
15
|
+
apiKey: z.string().min(1).optional(),
|
|
16
|
+
host: z.string().min(1).optional(),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Explicit opt-in for the plugin-driven owner re-engagement nudge scheduler.
|
|
20
|
+
*
|
|
21
|
+
* Default-off. The scheduler is hosted-only and requires `ownerShip` to
|
|
22
|
+
* target delivery, but `ownerShip` alone must not enable nudges (it also
|
|
23
|
+
* gates unrelated approval/admin DM flows). This flag is the authoritative
|
|
24
|
+
* enablement signal — see `tlonbot/entrypoint/tlawn.py` for the hosted
|
|
25
|
+
* generator that turns it on.
|
|
26
|
+
*/
|
|
27
|
+
export const TlonReengagementSchema = z.object({
|
|
28
|
+
enabled: z.boolean().optional(),
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Static file-config override for the plugin scheduler's active-hours
|
|
32
|
+
* window. Takes precedence over `agents.defaults.heartbeat.activeHours`
|
|
33
|
+
* but defers to `%settings` keys (`nudgeActiveHoursStart/End/Timezone`)
|
|
34
|
+
* when those are present.
|
|
35
|
+
*/
|
|
36
|
+
export const TlonNudgeActiveHoursSchema = z.object({
|
|
37
|
+
start: z.string().min(1).optional(),
|
|
38
|
+
end: z.string().min(1).optional(),
|
|
39
|
+
timezone: z.string().min(1).optional(),
|
|
40
|
+
});
|
|
13
41
|
export const TlonAccountSchema = z.object({
|
|
14
42
|
name: z.string().optional(),
|
|
15
43
|
enabled: z.boolean().optional(),
|
|
@@ -28,6 +56,9 @@ export const TlonAccountSchema = z.object({
|
|
|
28
56
|
ownerShip: ShipSchema.optional(), // Ship that receives approval requests and can approve/deny
|
|
29
57
|
// Reaction level: off (no reactions), ack (notify only), minimal (react sparingly), extensive (react freely)
|
|
30
58
|
reactionLevel: ReactionLevelSchema.optional(),
|
|
59
|
+
// Rate limiting for bot-to-bot responses
|
|
60
|
+
maxConsecutiveBotResponses: z.number().int().min(0).optional(), // Max consecutive responses to another bot (default: 3)
|
|
61
|
+
telemetry: TlonTelemetrySchema.optional(),
|
|
31
62
|
});
|
|
32
63
|
export const TlonConfigSchema = z.object({
|
|
33
64
|
name: z.string().optional(),
|
|
@@ -50,6 +81,15 @@ export const TlonConfigSchema = z.object({
|
|
|
50
81
|
ownerShip: ShipSchema.optional(), // Ship that receives approval requests and can approve/deny
|
|
51
82
|
// Reaction level: off (no reactions), ack (notify only), minimal (react sparingly), extensive (react freely)
|
|
52
83
|
reactionLevel: ReactionLevelSchema.optional(),
|
|
84
|
+
// Rate limiting for bot-to-bot responses
|
|
85
|
+
maxConsecutiveBotResponses: z.number().int().min(0).optional(), // Max consecutive responses to another bot (default: 3)
|
|
86
|
+
telemetry: TlonTelemetrySchema.optional(),
|
|
87
|
+
// Opt-in hosted-only re-engagement nudges; absent/false keeps the
|
|
88
|
+
// scheduler off even when ownerShip is configured.
|
|
89
|
+
reengagement: TlonReengagementSchema.optional(),
|
|
90
|
+
// Optional static file-config override for the plugin scheduler's
|
|
91
|
+
// active hours. See TlonNudgeActiveHoursSchema for precedence.
|
|
92
|
+
nudgeActiveHours: TlonNudgeActiveHoursSchema.optional(),
|
|
53
93
|
});
|
|
54
94
|
export const tlonChannelConfigSchema = buildChannelConfigSchema(TlonConfigSchema);
|
|
55
95
|
//# sourceMappingURL=config-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared effective-owner state.
|
|
3
|
+
*
|
|
4
|
+
* The monitor writes to this when ownerShip is loaded or hot-reloaded from
|
|
5
|
+
* the settings store. The heartbeat handler reads from it at event time.
|
|
6
|
+
*
|
|
7
|
+
* Follows the same module-level Map pattern as src/session-roles.ts.
|
|
8
|
+
*/
|
|
9
|
+
const effectiveOwners = new Map();
|
|
10
|
+
export function setEffectiveOwnerShip(accountId, ship) {
|
|
11
|
+
if (ship) {
|
|
12
|
+
effectiveOwners.set(accountId, ship);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
effectiveOwners.delete(accountId);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function getEffectiveOwnerShip(accountId) {
|
|
19
|
+
return effectiveOwners.get(accountId) ?? null;
|
|
20
|
+
}
|
|
21
|
+
export const _testing = { clearAll: () => effectiveOwners.clear() };
|
|
22
|
+
//# sourceMappingURL=effective-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effective-owner.js","sourceRoot":"","sources":["../../src/effective-owner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAElD,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,IAAmB;IAC1E,IAAI,IAAI,EAAE,CAAC;QACT,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACrD,OAAO,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { gatewayHeartbeat } from "@tloncorp/api";
|
|
3
|
+
// ── Constants (matching design doc recommendations) ─────────
|
|
4
|
+
const HEARTBEAT_INTERVAL_MS = 30_000; // 30s
|
|
5
|
+
const LEASE_DURATION_MS = 90_000; // 90s
|
|
6
|
+
export const ACTIVE_WINDOW_SECS = 300; // 5 min
|
|
7
|
+
export const OFFLINE_REPLY_COOLDOWN_SECS = 300; // 5 min
|
|
8
|
+
export function computeLeaseUntil() {
|
|
9
|
+
return Date.now() + LEASE_DURATION_MS;
|
|
10
|
+
}
|
|
11
|
+
// ── Factory ─────────────────────────────────────────────────
|
|
12
|
+
export function createGatewayStatusManager(opts) {
|
|
13
|
+
const bootId = randomUUID();
|
|
14
|
+
let heartbeatInterval = null;
|
|
15
|
+
let activated = false;
|
|
16
|
+
let stopped = false;
|
|
17
|
+
let resolveStarted;
|
|
18
|
+
const startedPromise = new Promise((r) => {
|
|
19
|
+
resolveStarted = r;
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
bootId,
|
|
23
|
+
signalGatewayStarted() {
|
|
24
|
+
resolveStarted();
|
|
25
|
+
},
|
|
26
|
+
waitForGatewayStart() {
|
|
27
|
+
return startedPromise;
|
|
28
|
+
},
|
|
29
|
+
get activated() {
|
|
30
|
+
return activated;
|
|
31
|
+
},
|
|
32
|
+
markActivated() {
|
|
33
|
+
activated = true;
|
|
34
|
+
},
|
|
35
|
+
get stopped() {
|
|
36
|
+
return stopped;
|
|
37
|
+
},
|
|
38
|
+
markStopped() {
|
|
39
|
+
stopped = true;
|
|
40
|
+
},
|
|
41
|
+
startHeartbeat() {
|
|
42
|
+
if (stopped || !activated || heartbeatInterval) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
heartbeatInterval = setInterval(async () => {
|
|
46
|
+
try {
|
|
47
|
+
await gatewayHeartbeat({ bootId, leaseUntil: computeLeaseUntil() });
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
opts.logger?.error?.(`[gateway-status] heartbeat failed: ${String(err)}`);
|
|
51
|
+
}
|
|
52
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
53
|
+
opts.logger?.log?.(`[gateway-status] heartbeat started (interval=${HEARTBEAT_INTERVAL_MS}ms)`);
|
|
54
|
+
},
|
|
55
|
+
stopHeartbeat() {
|
|
56
|
+
if (heartbeatInterval) {
|
|
57
|
+
clearInterval(heartbeatInterval);
|
|
58
|
+
heartbeatInterval = null;
|
|
59
|
+
opts.logger?.log?.("[gateway-status] heartbeat stopped");
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ── Module-level accessor (same pattern as setTlonRuntime) ──
|
|
65
|
+
let _manager = null;
|
|
66
|
+
export function setGatewayStatusManager(m) {
|
|
67
|
+
_manager = m;
|
|
68
|
+
}
|
|
69
|
+
export function getGatewayStatusManager() {
|
|
70
|
+
return _manager;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=gateway-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway-status.js","sourceRoot":"","sources":["../../src/gateway-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,+DAA+D;AAC/D,MAAM,qBAAqB,GAAG,MAAM,CAAC,CAAC,MAAM;AAC5C,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,MAAM;AACxC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC,CAAC,QAAQ;AAC/C,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC,CAAC,QAAQ;AAExD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAiB,CAAC;AACxC,CAAC;AA2BD,+DAA+D;AAC/D,MAAM,UAAU,0BAA0B,CAAC,IAE1C;IACC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,iBAAiB,GAA0C,IAAI,CAAC;IACpE,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,cAA0B,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;QAC7C,cAAc,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QAEN,oBAAoB;YAClB,cAAc,EAAE,CAAC;QACnB,CAAC;QACD,mBAAmB;YACjB,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,aAAa;YACX,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,WAAW;YACT,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,cAAc;YACZ,IAAI,OAAO,IAAI,CAAC,SAAS,IAAI,iBAAiB,EAAE,CAAC;gBAC/C,OAAO;YACT,CAAC;YACD,iBAAiB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;gBACzC,IAAI,CAAC;oBACH,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;gBACtE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,sCAAsC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,gDAAgD,qBAAqB,KAAK,CAAC,CAAC;QACjG,CAAC;QAED,aAAa;YACX,IAAI,iBAAiB,EAAE,CAAC;gBACtB,aAAa,CAAC,iBAAiB,CAAC,CAAC;gBACjC,iBAAiB,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,oCAAoC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,IAAI,QAAQ,GAAgC,IAAI,CAAC;AAEjD,MAAM,UAAU,uBAAuB,CAAC,CAA8B;IACpE,QAAQ,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|