@tloncorp/openclaw 0.2.0 → 0.4.1
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 +204 -69
- 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 +155 -420
- 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 +37 -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/heartbeat-telemetry.js +155 -0
- package/dist/src/heartbeat-telemetry.js.map +1 -0
- package/dist/src/monitor/approval.js.map +1 -1
- 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 +2 -2
- package/dist/src/monitor/index.js +665 -171
- package/dist/src/monitor/index.js.map +1 -1
- package/dist/src/monitor/media.js +165 -6
- 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 +0 -4
- package/dist/src/monitor/utils.js.map +1 -1
- package/dist/src/nudge-candidate.js +109 -0
- package/dist/src/nudge-candidate.js.map +1 -0
- 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/settings.js +77 -5
- 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 +31 -1
- 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/upload.js +1 -1
- package/dist/src/urbit/upload.js.map +1 -1
- package/dist/src/version.generated.js +1 -1
- package/dist/src/version.generated.js.map +1 -1
- package/package.json +34 -24
|
@@ -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(),
|
|
@@ -30,6 +58,7 @@ export const TlonAccountSchema = z.object({
|
|
|
30
58
|
reactionLevel: ReactionLevelSchema.optional(),
|
|
31
59
|
// Rate limiting for bot-to-bot responses
|
|
32
60
|
maxConsecutiveBotResponses: z.number().int().min(0).optional(), // Max consecutive responses to another bot (default: 3)
|
|
61
|
+
telemetry: TlonTelemetrySchema.optional(),
|
|
33
62
|
});
|
|
34
63
|
export const TlonConfigSchema = z.object({
|
|
35
64
|
name: z.string().optional(),
|
|
@@ -54,6 +83,13 @@ export const TlonConfigSchema = z.object({
|
|
|
54
83
|
reactionLevel: ReactionLevelSchema.optional(),
|
|
55
84
|
// Rate limiting for bot-to-bot responses
|
|
56
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(),
|
|
57
93
|
});
|
|
58
94
|
export const tlonChannelConfigSchema = buildChannelConfigSchema(TlonConfigSchema);
|
|
59
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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Heartbeat telemetry hook handler logic.
|
|
3
|
+
*
|
|
4
|
+
* Owns heartbeat session tracking and candidate-send classification.
|
|
5
|
+
* Independent of index.ts plugin registration. Does NOT own PostHog emission —
|
|
6
|
+
* that happens in the monitor at confirmation time.
|
|
7
|
+
*/
|
|
8
|
+
import { clearAllCandidates, setCandidateSend } from "./nudge-candidate.js";
|
|
9
|
+
import { normalizeShip } from "./targets.js";
|
|
10
|
+
import { resolveTlonAccount, listTlonAccountIds } from "./types.js";
|
|
11
|
+
// Stage markers from HEARTBEAT.md — retained for optional debugging/validation.
|
|
12
|
+
const STAGE_1_MARKER = "Quick ideas for your week";
|
|
13
|
+
const STAGE_2_MARKER = "A few things I can do for you";
|
|
14
|
+
const STAGE_3_MARKER = "Still here! Here's what I can do";
|
|
15
|
+
/**
|
|
16
|
+
* Derive nudge stage from message content markers.
|
|
17
|
+
* Retained for optional debugging/validation only — NOT the source of truth
|
|
18
|
+
* for nudgeStage (that comes from lastNudgeStage in the settings store).
|
|
19
|
+
*/
|
|
20
|
+
export function deriveNudgeStage(content) {
|
|
21
|
+
const lower = content.toLowerCase();
|
|
22
|
+
if (lower.includes(STAGE_1_MARKER.toLowerCase())) {
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
if (lower.includes(STAGE_2_MARKER.toLowerCase())) {
|
|
26
|
+
return 2;
|
|
27
|
+
}
|
|
28
|
+
if (lower.includes(STAGE_3_MARKER.toLowerCase())) {
|
|
29
|
+
return 3;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/** TTL for heartbeat sessions (30 minutes). */
|
|
34
|
+
const HEARTBEAT_SESSION_TTL_MS = 30 * 60 * 1000;
|
|
35
|
+
const heartbeatSessions = new Map();
|
|
36
|
+
function cleanupStaleSessions(now = Date.now()) {
|
|
37
|
+
for (const [key, session] of heartbeatSessions) {
|
|
38
|
+
if (now - session.startedAt > HEARTBEAT_SESSION_TTL_MS) {
|
|
39
|
+
heartbeatSessions.delete(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function createHeartbeatTelemetryHandlers(deps) {
|
|
44
|
+
// Resolve configured account IDs once at creation time for safe accountId resolution.
|
|
45
|
+
const configuredAccountIds = listTlonAccountIds(deps.config);
|
|
46
|
+
function resolveAccountId(contextAccountId) {
|
|
47
|
+
if (contextAccountId) {
|
|
48
|
+
return contextAccountId;
|
|
49
|
+
}
|
|
50
|
+
if (configuredAccountIds.length === 1) {
|
|
51
|
+
return configuredAccountIds[0];
|
|
52
|
+
}
|
|
53
|
+
if (configuredAccountIds.length > 1) {
|
|
54
|
+
deps.logger.warn(`[tlon] heartbeat: message:sent missing accountId with ${configuredAccountIds.length} accounts configured; dropping event`);
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function resolveOwnerShip(accountId) {
|
|
59
|
+
const effective = deps.getEffectiveOwnerShip(accountId);
|
|
60
|
+
if (effective) {
|
|
61
|
+
return effective;
|
|
62
|
+
}
|
|
63
|
+
const fileConfig = resolveTlonAccount(deps.config, accountId).ownerShip;
|
|
64
|
+
return fileConfig ? normalizeShip(fileConfig) : null;
|
|
65
|
+
}
|
|
66
|
+
const onBeforeAgentStart = (_event, ctx) => {
|
|
67
|
+
if (ctx.messageProvider !== "heartbeat" || !ctx.sessionKey) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
cleanupStaleSessions();
|
|
71
|
+
heartbeatSessions.set(ctx.sessionKey, {
|
|
72
|
+
sessionKey: ctx.sessionKey,
|
|
73
|
+
startedAt: Date.now(),
|
|
74
|
+
provider: null,
|
|
75
|
+
model: null,
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const onLlmInput = (event, ctx) => {
|
|
79
|
+
if (!ctx.sessionKey) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const session = heartbeatSessions.get(ctx.sessionKey);
|
|
83
|
+
if (!session) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
session.provider = event.provider;
|
|
87
|
+
session.model = event.model;
|
|
88
|
+
};
|
|
89
|
+
const onMessageSent = (event) => {
|
|
90
|
+
if (!event.sessionKey) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const session = heartbeatSessions.get(event.sessionKey);
|
|
94
|
+
if (!session) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Defensive field access — InternalHookEvent.context is Record<string, unknown>
|
|
98
|
+
const ctx = event.context;
|
|
99
|
+
const success = ctx.success;
|
|
100
|
+
const channelId = ctx.channelId;
|
|
101
|
+
const to = ctx.to;
|
|
102
|
+
const content = ctx.content;
|
|
103
|
+
const contextAccountId = ctx.accountId;
|
|
104
|
+
if (!success || channelId !== "tlon") {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (typeof to !== "string") {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const accountId = resolveAccountId(typeof contextAccountId === "string" ? contextAccountId : undefined);
|
|
111
|
+
if (!accountId) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const ownerShip = resolveOwnerShip(accountId);
|
|
115
|
+
if (!ownerShip) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const normalizedTo = normalizeShip(to);
|
|
119
|
+
if (normalizedTo !== ownerShip) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
setCandidateSend(accountId, {
|
|
123
|
+
accountId,
|
|
124
|
+
sessionKey: event.sessionKey,
|
|
125
|
+
sentAt: event.timestamp.getTime(),
|
|
126
|
+
ownerShip,
|
|
127
|
+
content: typeof content === "string" ? content : "",
|
|
128
|
+
provider: session.provider,
|
|
129
|
+
model: session.model,
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
const onAgentEnd = (_event, ctx) => {
|
|
133
|
+
if (ctx.sessionKey) {
|
|
134
|
+
heartbeatSessions.delete(ctx.sessionKey);
|
|
135
|
+
}
|
|
136
|
+
cleanupStaleSessions();
|
|
137
|
+
};
|
|
138
|
+
const close = () => {
|
|
139
|
+
heartbeatSessions.clear();
|
|
140
|
+
clearAllCandidates();
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
onBeforeAgentStart,
|
|
144
|
+
onLlmInput,
|
|
145
|
+
onMessageSent,
|
|
146
|
+
onAgentEnd,
|
|
147
|
+
close,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
export const _testing = {
|
|
151
|
+
clearSessions: () => heartbeatSessions.clear(),
|
|
152
|
+
getSessionTtlMs: () => HEARTBEAT_SESSION_TTL_MS,
|
|
153
|
+
getSession: (key) => heartbeatSessions.get(key) ?? null,
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=heartbeat-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat-telemetry.js","sourceRoot":"","sources":["../../src/heartbeat-telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/monitor/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/monitor/approval.ts"],"names":[],"mappings":"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"}
|