@tloncorp/openclaw 0.4.2 → 0.4.3

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.
@@ -1,155 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"heartbeat-telemetry.js","sourceRoot":"","sources":["../../src/heartbeat-telemetry.ts"],"names":[],"mappings":"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"}
@@ -1,109 +0,0 @@
1
- /**
2
- * Candidate send state for two-signal nudge confirmation.
3
- *
4
- * A successful `message:sent` to ownerShip during a heartbeat session is stored
5
- * as a "candidate" here. The candidate is only promoted to a confirmed nudge
6
- * when it is paired with a matching `lastNudgeStage` settings-store update,
7
- * regardless of which signal arrives first.
8
- *
9
- * Keyed by accountId — each account has at most one candidate at a time.
10
- */
11
- /** TTL for unconfirmed candidates (10 minutes). Longer than the 5-minute settings refresh interval to give the stale-subscription fallback time to deliver a missed lastNudgeStage update. */
12
- const CANDIDATE_TTL_MS = 10 * 60 * 1000;
13
- const candidates = new Map();
14
- const pendingStageSignals = new Map();
15
- const confirmationCallbacks = new Map();
16
- function isNudgeStage(stage) {
17
- return stage === 1 || stage === 2 || stage === 3;
18
- }
19
- function cleanupStaleCandidates(now = Date.now()) {
20
- for (const [key, candidate] of candidates) {
21
- if (now - candidate.sentAt > CANDIDATE_TTL_MS) {
22
- candidates.delete(key);
23
- }
24
- }
25
- }
26
- function cleanupStaleStageSignals(now = Date.now()) {
27
- for (const [key, signal] of pendingStageSignals) {
28
- if (now - signal.observedAt > CANDIDATE_TTL_MS) {
29
- pendingStageSignals.delete(key);
30
- }
31
- }
32
- }
33
- function buildConfirmedNudge(candidate, stage) {
34
- return {
35
- accountId: candidate.accountId,
36
- sessionKey: candidate.sessionKey,
37
- sentAt: candidate.sentAt,
38
- ownerShip: candidate.ownerShip,
39
- nudgeStage: stage,
40
- content: candidate.content,
41
- provider: candidate.provider,
42
- model: candidate.model,
43
- };
44
- }
45
- function emitConfirmedNudge(accountId, confirmed) {
46
- if (confirmed) {
47
- confirmationCallbacks.get(accountId)?.(confirmed);
48
- }
49
- return confirmed;
50
- }
51
- function consumePendingConfirmation(accountId) {
52
- const candidate = candidates.get(accountId);
53
- const signal = pendingStageSignals.get(accountId);
54
- if (!candidate || !signal) {
55
- return null;
56
- }
57
- candidates.delete(accountId);
58
- pendingStageSignals.delete(accountId);
59
- return buildConfirmedNudge(candidate, signal.stage);
60
- }
61
- export function setCandidateSend(accountId, candidate) {
62
- cleanupStaleCandidates();
63
- cleanupStaleStageSignals();
64
- // Always keep the most recent candidate — if the same heartbeat session
65
- // produces multiple owner-targeted sends, we attribute to the latest one.
66
- candidates.set(accountId, candidate);
67
- return emitConfirmedNudge(accountId, consumePendingConfirmation(accountId));
68
- }
69
- export function getCandidateSend(accountId) {
70
- cleanupStaleCandidates();
71
- cleanupStaleStageSignals();
72
- return candidates.get(accountId) ?? null;
73
- }
74
- export function clearCandidateSend(accountId) {
75
- candidates.delete(accountId);
76
- pendingStageSignals.delete(accountId);
77
- }
78
- /** Clear all candidate state (shutdown cleanup). */
79
- export function clearAllCandidates() {
80
- candidates.clear();
81
- pendingStageSignals.clear();
82
- }
83
- export function confirmNudgeCandidate(accountId, lastNudgeStage) {
84
- cleanupStaleCandidates();
85
- cleanupStaleStageSignals();
86
- if (!isNudgeStage(lastNudgeStage)) {
87
- return null;
88
- }
89
- pendingStageSignals.set(accountId, {
90
- stage: lastNudgeStage,
91
- observedAt: Date.now(),
92
- });
93
- return emitConfirmedNudge(accountId, consumePendingConfirmation(accountId));
94
- }
95
- export function registerConfirmedNudgeCallback(accountId, cb) {
96
- confirmationCallbacks.set(accountId, cb);
97
- }
98
- export function clearConfirmedNudgeCallback(accountId) {
99
- confirmationCallbacks.delete(accountId);
100
- }
101
- export const _testing = {
102
- clearAll: () => {
103
- candidates.clear();
104
- pendingStageSignals.clear();
105
- confirmationCallbacks.clear();
106
- },
107
- getCandidateTtlMs: () => CANDIDATE_TTL_MS,
108
- };
109
- //# sourceMappingURL=nudge-candidate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nudge-candidate.js","sourceRoot":"","sources":["../../src/nudge-candidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH,8LAA8L;AAC9L,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;AACrD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAoD,CAAC;AACxF,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAA+C,CAAC;AAErF,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,IAAI,GAAG,GAAG,SAAS,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAC9C,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAChD,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,mBAAmB,EAAE,CAAC;QAChD,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC;YAC/C,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,SAAyB,EACzB,KAAgB;IAEhB,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,SAAiB,EAAE,SAAgC;IAC7E,IAAI,SAAS,EAAE,CAAC;QACd,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,0BAA0B,CAAC,SAAiB;IACnD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,SAAyB;IAEzB,sBAAsB,EAAE,CAAC;IACzB,wBAAwB,EAAE,CAAC;IAE3B,wEAAwE;IACxE,0EAA0E;IAC1E,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,OAAO,kBAAkB,CAAC,SAAS,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,sBAAsB,EAAE,CAAC;IACzB,wBAAwB,EAAE,CAAC;IAC3B,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,kBAAkB;IAChC,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,mBAAmB,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,cAAsB;IAEtB,sBAAsB,EAAE,CAAC;IACzB,wBAAwB,EAAE,CAAC;IAC3B,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;QAAA,OAAO,IAAI,CAAC;IAAA,CAAC;IACjD,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE;QACjC,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;KACvB,CAAC,CAAC;IACH,OAAO,kBAAkB,CAAC,SAAS,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,SAAiB,EACjB,EAAuC;IAEvC,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAAiB;IAC3D,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ,EAAE,GAAG,EAAE;QACb,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC5B,qBAAqB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IACD,iBAAiB,EAAE,GAAG,EAAE,CAAC,gBAAgB;CAC1C,CAAC"}
@@ -1,178 +0,0 @@
1
- import { formatDocsLink, promptAccountId, DEFAULT_ACCOUNT_ID, normalizeAccountId, } from "openclaw/plugin-sdk";
2
- import { buildTlonAccountFields } from "./account-fields.js";
3
- import { listTlonAccountIds, resolveTlonAccount } from "./types.js";
4
- import { isBlockedUrbitHostname, validateUrbitBaseUrl } from "./urbit/base-url.js";
5
- const channel = "tlon";
6
- function isConfigured(account) {
7
- return Boolean(account.ship && account.url && account.code);
8
- }
9
- function applyAccountConfig(params) {
10
- const { cfg, accountId, input } = params;
11
- const useDefault = accountId === DEFAULT_ACCOUNT_ID;
12
- const base = cfg.channels?.tlon ?? {};
13
- const nextValues = {
14
- enabled: true,
15
- ...(input.name ? { name: input.name } : {}),
16
- ...buildTlonAccountFields(input),
17
- };
18
- if (useDefault) {
19
- return {
20
- ...cfg,
21
- channels: {
22
- ...cfg.channels,
23
- tlon: {
24
- ...base,
25
- ...nextValues,
26
- },
27
- },
28
- };
29
- }
30
- return {
31
- ...cfg,
32
- channels: {
33
- ...cfg.channels,
34
- tlon: {
35
- ...base,
36
- enabled: base.enabled ?? true,
37
- accounts: {
38
- ...base.accounts,
39
- [accountId]: {
40
- ...base.accounts?.[accountId],
41
- ...nextValues,
42
- },
43
- },
44
- },
45
- },
46
- };
47
- }
48
- async function noteTlonHelp(prompter) {
49
- await prompter.note([
50
- "You need your Urbit ship URL and login code.",
51
- "Example URL: https://your-ship-host",
52
- "Example ship: ~sampel-palnet",
53
- "If your ship URL is on a private network (LAN/localhost), you must explicitly allow it during setup.",
54
- `Docs: ${formatDocsLink("/channels/tlon", "channels/tlon")}`,
55
- ].join("\n"), "Tlon setup");
56
- }
57
- function parseList(value) {
58
- return value
59
- .split(/[\n,;]+/g)
60
- .map((entry) => entry.trim())
61
- .filter(Boolean);
62
- }
63
- export const tlonOnboardingAdapter = {
64
- channel,
65
- getStatus: async ({ cfg }) => {
66
- const accountIds = listTlonAccountIds(cfg);
67
- const configured = accountIds.length > 0
68
- ? accountIds.some((accountId) => isConfigured(resolveTlonAccount(cfg, accountId)))
69
- : isConfigured(resolveTlonAccount(cfg, DEFAULT_ACCOUNT_ID));
70
- return {
71
- channel,
72
- configured,
73
- statusLines: [`Tlon: ${configured ? "configured" : "needs setup"}`],
74
- selectionHint: configured ? "configured" : "urbit messenger",
75
- quickstartScore: configured ? 1 : 4,
76
- };
77
- },
78
- configure: async ({ cfg, prompter, accountOverrides, shouldPromptAccountIds }) => {
79
- const override = accountOverrides[channel]?.trim();
80
- const defaultAccountId = DEFAULT_ACCOUNT_ID;
81
- let accountId = override ? normalizeAccountId(override) : defaultAccountId;
82
- if (shouldPromptAccountIds && !override) {
83
- accountId = await promptAccountId({
84
- cfg,
85
- prompter,
86
- label: "Tlon",
87
- currentId: accountId,
88
- listAccountIds: listTlonAccountIds,
89
- defaultAccountId,
90
- });
91
- }
92
- const resolved = resolveTlonAccount(cfg, accountId);
93
- await noteTlonHelp(prompter);
94
- const ship = await prompter.text({
95
- message: "Ship name",
96
- placeholder: "~sampel-palnet",
97
- initialValue: resolved.ship ?? undefined,
98
- validate: (value) => (String(value ?? "").trim() ? undefined : "Required"),
99
- });
100
- const url = await prompter.text({
101
- message: "Ship URL",
102
- placeholder: "https://your-ship-host",
103
- initialValue: resolved.url ?? undefined,
104
- validate: (value) => {
105
- const next = validateUrbitBaseUrl(String(value ?? ""));
106
- if (!next.ok) {
107
- return next.error;
108
- }
109
- return undefined;
110
- },
111
- });
112
- const validatedUrl = validateUrbitBaseUrl(String(url).trim());
113
- if (!validatedUrl.ok) {
114
- throw new Error(`Invalid URL: ${validatedUrl.error}`);
115
- }
116
- let allowPrivateNetwork = resolved.allowPrivateNetwork ?? false;
117
- if (isBlockedUrbitHostname(validatedUrl.hostname)) {
118
- allowPrivateNetwork = await prompter.confirm({
119
- message: "Ship URL looks like a private/internal host. Allow private network access? (SSRF risk)",
120
- initialValue: allowPrivateNetwork,
121
- });
122
- if (!allowPrivateNetwork) {
123
- throw new Error("Refusing private/internal Ship URL without explicit approval");
124
- }
125
- }
126
- const code = await prompter.text({
127
- message: "Login code",
128
- placeholder: "lidlut-tabwed-pillex-ridrup",
129
- initialValue: resolved.code ?? undefined,
130
- validate: (value) => (String(value ?? "").trim() ? undefined : "Required"),
131
- });
132
- const wantsGroupChannels = await prompter.confirm({
133
- message: "Add group channels manually? (optional)",
134
- initialValue: false,
135
- });
136
- let groupChannels;
137
- if (wantsGroupChannels) {
138
- const entry = await prompter.text({
139
- message: "Group channels (comma-separated)",
140
- placeholder: "chat/~host-ship/general, chat/~host-ship/support",
141
- });
142
- const parsed = parseList(String(entry ?? ""));
143
- groupChannels = parsed.length > 0 ? parsed : undefined;
144
- }
145
- const wantsAllowlist = await prompter.confirm({
146
- message: "Restrict DMs with an allowlist?",
147
- initialValue: false,
148
- });
149
- let dmAllowlist;
150
- if (wantsAllowlist) {
151
- const entry = await prompter.text({
152
- message: "DM allowlist (comma-separated ship names)",
153
- placeholder: "~zod, ~nec",
154
- });
155
- const parsed = parseList(String(entry ?? ""));
156
- dmAllowlist = parsed.length > 0 ? parsed : undefined;
157
- }
158
- const autoDiscoverChannels = await prompter.confirm({
159
- message: "Enable auto-discovery of group channels?",
160
- initialValue: resolved.autoDiscoverChannels ?? true,
161
- });
162
- const next = applyAccountConfig({
163
- cfg,
164
- accountId,
165
- input: {
166
- ship: String(ship).trim(),
167
- url: String(url).trim(),
168
- code: String(code).trim(),
169
- allowPrivateNetwork,
170
- groupChannels,
171
- dmAllowlist,
172
- autoDiscoverChannels,
173
- },
174
- });
175
- return { cfg: next, accountId };
176
- },
177
- };
178
- //# sourceMappingURL=onboarding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/onboarding.ts"],"names":[],"mappings":"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"}