UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

195 lines (194 loc) 7.14 kB
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js"; import { t as formatDocsLink } from "./links-CsLBrRff.js"; import "./string-coerce-runtime-CEGJWkQ_.js"; import { i as createPatchedAccountSetupAdapter } from "./setup-helpers-DO5nSeNy.js"; import { t as createSetupTranslator } from "./i18n-7g_f4oaD.js"; import { C as parseSetupEntriesAllowingWildcard, J as setSetupChannelEnabled, T as patchChannelConfigForAccount, V as setAccountAllowFromForChannel, j as promptParsedAllowFromForAccount, v as mergeAllowFromEntries } from "./setup-wizard-helpers-Dv-t1nb8.js"; import { a as createDelegatedSetupWizardProxy, c as createDelegatedTextInputShouldPrompt, o as createCliPathTextInput } from "./setup-wizard-proxy-mR4OIy7C.js"; import "./setup-runtime-BvLK-H0G.js"; import "./setup-tools-c-3eI4zR.js"; import { a as resolveIMessageAccount, i as resolveDefaultIMessageAccountId } from "./accounts-DzoymhDS.js"; import { o as normalizeIMessageHandle } from "./targets-BhNdlUSi.js"; //#region extensions/imessage/src/setup-core.ts const t = createSetupTranslator(); const channel = "imessage"; const CHAT_TARGET_ALLOWFROM_PREFIXES = [ "chat_id:", "chatid:", "chat:", "chat_guid:", "chatguid:", "guid:", "chat_identifier:", "chatidentifier:", "chatident:" ]; const SERVICE_ALLOWFROM_PREFIXES = [ "imessage:", "sms:", "auto:" ]; function normalizeAllowFromEntryForPrefixCheck(entry) { let lower = normalizeLowercaseStringOrEmpty(entry); let stripped = true; while (stripped) { stripped = false; for (const prefix of SERVICE_ALLOWFROM_PREFIXES) if (lower.startsWith(prefix)) { lower = lower.slice(prefix.length).trim(); stripped = true; } } return lower; } function parseIMessageAllowFromEntries(raw) { return parseSetupEntriesAllowingWildcard(raw, (entry) => { const lower = normalizeAllowFromEntryForPrefixCheck(entry); if (CHAT_TARGET_ALLOWFROM_PREFIXES.some((prefix) => lower.startsWith(prefix))) return { error: `iMessage allowFrom entries must be sender handles: ${entry}` }; if (!normalizeIMessageHandle(entry)) return { error: `Invalid handle: ${entry}` }; return { value: entry }; }); } function buildIMessageSetupPatch(input) { return { ...input.cliPath ? { cliPath: input.cliPath } : {}, ...input.dbPath ? { dbPath: input.dbPath } : {}, ...input.service ? { service: input.service } : {}, ...input.region ? { region: input.region } : {} }; } async function promptIMessageAllowFrom(params) { return promptParsedAllowFromForAccount({ cfg: params.cfg, accountId: params.accountId, defaultAccountId: resolveDefaultIMessageAccountId(params.cfg), prompter: params.prompter, noteTitle: "iMessage allowlist", noteLines: [ "Allowlist iMessage DMs by sender handle.", "Examples:", "- +15555550123", "- user@example.com", "Multiple entries: comma-separated.", `Docs: ${formatDocsLink("/imessage", "imessage")}` ], message: "iMessage allowFrom (sender handle)", placeholder: "+15555550123, user@example.com", parseEntries: parseIMessageAllowFromEntries, getExistingAllowFrom: ({ cfg, accountId }) => resolveIMessageAccount({ cfg, accountId }).config.allowFrom ?? [], applyAllowFrom: ({ cfg, accountId, allowFrom }) => setAccountAllowFromForChannel({ cfg, channel, accountId, allowFrom }) }); } const imessageDmPolicy = { label: "iMessage", channel, policyKey: "channels.imessage.dmPolicy", allowFromKey: "channels.imessage.allowFrom", resolveConfigKeys: (_cfg, accountId) => { const targetAccountId = accountId ?? resolveDefaultIMessageAccountId(_cfg); return targetAccountId !== "default" ? { policyKey: `channels.imessage.accounts.${targetAccountId}.dmPolicy`, allowFromKey: `channels.imessage.accounts.${targetAccountId}.allowFrom` } : { policyKey: "channels.imessage.dmPolicy", allowFromKey: "channels.imessage.allowFrom" }; }, getCurrent: (cfg, accountId) => { return resolveIMessageAccount({ cfg, accountId: accountId ?? resolveDefaultIMessageAccountId(cfg) }).config.dmPolicy ?? "pairing"; }, setPolicy: (cfg, policy, accountId) => { const targetAccountId = accountId ?? resolveDefaultIMessageAccountId(cfg); return patchChannelConfigForAccount({ cfg, channel, accountId: targetAccountId, patch: policy === "open" ? { dmPolicy: "open", allowFrom: mergeAllowFromEntries(resolveIMessageAccount({ cfg, accountId: targetAccountId }).config.allowFrom, ["*"]) } : { dmPolicy: policy } }); }, promptAllowFrom: promptIMessageAllowFrom }; function resolveIMessageCliPath(params) { return resolveIMessageAccount(params).config.cliPath ?? "imsg"; } function createIMessageCliPathTextInput(shouldPrompt) { return createCliPathTextInput({ inputKey: "cliPath", message: "imsg CLI path", resolvePath: ({ cfg, accountId }) => resolveIMessageCliPath({ cfg, accountId }), shouldPrompt, helpTitle: "iMessage", helpLines: ["imsg CLI path required to enable iMessage."] }); } const imessageCompletionNote = { title: "iMessage next steps", lines: [ "Run OpenClaw on the Mac signed into Messages, or set cliPath to an SSH wrapper that runs imsg on that Mac.", "Linux/Windows hosts cannot run the default local imsg path directly.", "Run `imsg launch`, then `openclaw channels status --probe` to verify private API actions.", "Ensure OpenClaw has Full Disk Access to Messages DB.", "Grant Automation permission for Messages when prompted.", "List chats with: imsg chats --limit 20", `Docs: ${formatDocsLink("/imessage", "imessage")}` ] }; const imessageSetupAdapter = createPatchedAccountSetupAdapter({ channelKey: channel, buildPatch: (input) => buildIMessageSetupPatch(input) }); const imessageSetupStatusBase = { configuredLabel: t("wizard.channels.statusConfigured"), unconfiguredLabel: t("wizard.channels.statusNeedsSetup"), configuredHint: t("wizard.imessage.imsgFound"), unconfiguredHint: t("wizard.imessage.imsgMissing"), configuredScore: 1, unconfiguredScore: 0, resolveConfigured: ({ cfg, accountId }) => resolveIMessageAccount({ cfg, accountId }).configured }; function createIMessageSetupWizardProxy(loadWizard) { return createDelegatedSetupWizardProxy({ channel, loadWizard, status: { configuredLabel: imessageSetupStatusBase.configuredLabel, unconfiguredLabel: imessageSetupStatusBase.unconfiguredLabel, configuredHint: imessageSetupStatusBase.configuredHint, unconfiguredHint: imessageSetupStatusBase.unconfiguredHint, configuredScore: imessageSetupStatusBase.configuredScore, unconfiguredScore: imessageSetupStatusBase.unconfiguredScore }, credentials: [], textInputs: [createIMessageCliPathTextInput(createDelegatedTextInputShouldPrompt({ loadWizard, inputKey: "cliPath" }))], completionNote: imessageCompletionNote, dmPolicy: imessageDmPolicy, disable: (cfg) => setSetupChannelEnabled(cfg, channel, false) }); } //#endregion export { imessageSetupAdapter as a, imessageDmPolicy as i, createIMessageSetupWizardProxy as n, imessageSetupStatusBase as o, imessageCompletionNote as r, createIMessageCliPathTextInput as t };