@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.
Files changed (88) hide show
  1. package/README.md +232 -23
  2. package/dist/index.js +292 -43
  3. package/dist/index.js.map +1 -1
  4. package/dist/setup-api.js +3 -0
  5. package/dist/setup-api.js.map +1 -0
  6. package/dist/setup-entry.js +4 -0
  7. package/dist/setup-entry.js.map +1 -0
  8. package/dist/src/actions.js +30 -8
  9. package/dist/src/actions.js.map +1 -1
  10. package/dist/src/channel.js +156 -373
  11. package/dist/src/channel.js.map +1 -1
  12. package/dist/src/channel.runtime.js +142 -0
  13. package/dist/src/channel.runtime.js.map +1 -0
  14. package/dist/src/config-schema.js +41 -1
  15. package/dist/src/config-schema.js.map +1 -1
  16. package/dist/src/effective-owner.js +22 -0
  17. package/dist/src/effective-owner.js.map +1 -0
  18. package/dist/src/gateway-status.js +72 -0
  19. package/dist/src/gateway-status.js.map +1 -0
  20. package/dist/src/monitor/approval.js +194 -96
  21. package/dist/src/monitor/approval.js.map +1 -1
  22. package/dist/src/monitor/command-auth.js +62 -0
  23. package/dist/src/monitor/command-auth.js.map +1 -0
  24. package/dist/src/monitor/command-bridge.js +27 -0
  25. package/dist/src/monitor/command-bridge.js.map +1 -0
  26. package/dist/src/monitor/computing-presence.js +221 -0
  27. package/dist/src/monitor/computing-presence.js.map +1 -0
  28. package/dist/src/monitor/discovery.js +17 -9
  29. package/dist/src/monitor/discovery.js.map +1 -1
  30. package/dist/src/monitor/index.js +960 -251
  31. package/dist/src/monitor/index.js.map +1 -1
  32. package/dist/src/monitor/media.js +195 -30
  33. package/dist/src/monitor/media.js.map +1 -1
  34. package/dist/src/monitor/nudge-runner.js +232 -0
  35. package/dist/src/monitor/nudge-runner.js.map +1 -0
  36. package/dist/src/monitor/nudge-state.js +58 -0
  37. package/dist/src/monitor/nudge-state.js.map +1 -0
  38. package/dist/src/monitor/owner-reply-persistence.js +92 -0
  39. package/dist/src/monitor/owner-reply-persistence.js.map +1 -0
  40. package/dist/src/monitor/pending-nudge-persistence.js +15 -0
  41. package/dist/src/monitor/pending-nudge-persistence.js.map +1 -0
  42. package/dist/src/monitor/settings-sync.js +28 -0
  43. package/dist/src/monitor/settings-sync.js.map +1 -0
  44. package/dist/src/monitor/utils.js +21 -4
  45. package/dist/src/monitor/utils.js.map +1 -1
  46. package/dist/src/nudge-decision.js +309 -0
  47. package/dist/src/nudge-decision.js.map +1 -0
  48. package/dist/src/nudge-messages.js +25 -0
  49. package/dist/src/nudge-messages.js.map +1 -0
  50. package/dist/src/nudge-scheduler.js +91 -0
  51. package/dist/src/nudge-scheduler.js.map +1 -0
  52. package/dist/src/pending-nudge.js +57 -0
  53. package/dist/src/pending-nudge.js.map +1 -0
  54. package/dist/src/session-roles.js +39 -0
  55. package/dist/src/session-roles.js.map +1 -0
  56. package/dist/src/settings.js +82 -6
  57. package/dist/src/settings.js.map +1 -1
  58. package/dist/src/setup-core.js +164 -0
  59. package/dist/src/setup-core.js.map +1 -0
  60. package/dist/src/setup-surface.js +85 -0
  61. package/dist/src/setup-surface.js.map +1 -0
  62. package/dist/src/telemetry.js +252 -0
  63. package/dist/src/telemetry.js.map +1 -0
  64. package/dist/src/tlon-binary.js +46 -0
  65. package/dist/src/tlon-binary.js.map +1 -0
  66. package/dist/src/tlon-tool-guard.js +44 -0
  67. package/dist/src/tlon-tool-guard.js.map +1 -0
  68. package/dist/src/tool-trace.js +100 -0
  69. package/dist/src/tool-trace.js.map +1 -0
  70. package/dist/src/types.js +35 -0
  71. package/dist/src/types.js.map +1 -1
  72. package/dist/src/urbit/api-client.js +4 -3
  73. package/dist/src/urbit/api-client.js.map +1 -1
  74. package/dist/src/urbit/base-url.js +2 -2
  75. package/dist/src/urbit/base-url.js.map +1 -1
  76. package/dist/src/urbit/fetch.js +1 -1
  77. package/dist/src/urbit/fetch.js.map +1 -1
  78. package/dist/src/urbit/send.js +6 -2
  79. package/dist/src/urbit/send.js.map +1 -1
  80. package/dist/src/urbit/sse-client.js +13 -2
  81. package/dist/src/urbit/sse-client.js.map +1 -1
  82. package/dist/src/urbit/upload.js +25 -20
  83. package/dist/src/urbit/upload.js.map +1 -1
  84. package/dist/src/version.generated.js +3 -0
  85. package/dist/src/version.generated.js.map +1 -0
  86. package/package.json +32 -25
  87. package/dist/src/onboarding.js +0 -178
  88. 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":"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"}
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/config-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;CAC7C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,QAAQ,EAAE;CACrE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IACpD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IAC3C,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5C,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C,uBAAuB;IACvB,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,4CAA4C;IACzF,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,gCAAgC;IAChF,iCAAiC;IACjC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,4DAA4D;IAC9F,6GAA6G;IAC7G,aAAa,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IAC7C,yCAAyC;IACzC,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,wDAAwD;IACxH,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IACpD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IAC3C,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5C,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC1C,aAAa,EAAE,uBAAuB,CAAC,QAAQ,EAAE;IACjD,sBAAsB,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IACtD,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IAC5D,uBAAuB;IACvB,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,4CAA4C;IACzF,sBAAsB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,gCAAgC;IAChF,iCAAiC;IACjC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,4DAA4D;IAC9F,6GAA6G;IAC7G,aAAa,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IAC7C,yCAAyC;IACzC,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,wDAAwD;IACxH,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IACzC,kEAAkE;IAClE,mDAAmD;IACnD,YAAY,EAAE,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,kEAAkE;IAClE,+DAA+D;IAC/D,gBAAgB,EAAE,0BAA0B,CAAC,QAAQ,EAAE;CACxD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC"}
@@ -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"}