@rubytech/create-maxy 1.0.459 → 1.0.460
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/package.json +1 -1
- package/payload/maxy/server.js +116 -33
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +21 -4
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/references/channels-whatsapp.md +6 -6
- package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +1 -1
package/package.json
CHANGED
package/payload/maxy/server.js
CHANGED
|
@@ -23641,7 +23641,8 @@ var WhatsAppAccountSchema = external_exports.object({
|
|
|
23641
23641
|
dmPolicy: DmPolicySchema.optional().describe("Who can message your public agent via WhatsApp DM. 'Open' lets anyone message. 'Allowlist' restricts to approved phone numbers. 'Disabled' blocks all public messages."),
|
|
23642
23642
|
groupPolicy: GroupPolicySchema.optional().describe("Whether your agent responds in WhatsApp group chats. 'Open' enables group responses (subject to per-group activation). 'Allowlist' restricts to approved senders. 'Disabled' ignores all group messages."),
|
|
23643
23643
|
selfChatMode: external_exports.boolean().optional().describe("Enable if the bot uses the owner's personal WhatsApp number (same phone for admin and bot). Changes how self-messages are routed."),
|
|
23644
|
-
|
|
23644
|
+
adminPhones: external_exports.array(external_exports.string()).optional().describe("Phone numbers (E.164) that route to the admin agent. Managed via add-admin-phone / remove-admin-phone."),
|
|
23645
|
+
allowFrom: external_exports.array(external_exports.string()).optional().describe("Phone numbers allowed to message the public agent when DM policy is 'allowlist'. Add '*' for open access. Does not affect admin routing \u2014 use adminPhones for that."),
|
|
23645
23646
|
groupAllowFrom: external_exports.array(external_exports.string()).optional().describe("Phone numbers allowed to trigger the agent in groups when group policy is 'allowlist'."),
|
|
23646
23647
|
sendReadReceipts: external_exports.boolean().optional().default(true).describe("Whether to send read receipts (blue ticks) when messages are received. Disabling may feel less responsive but preserves privacy."),
|
|
23647
23648
|
groups: external_exports.record(
|
|
@@ -23671,7 +23672,8 @@ var WhatsAppConfigSchema = external_exports.object({
|
|
|
23671
23672
|
accounts: external_exports.record(external_exports.string(), WhatsAppAccountSchema.optional()).optional().describe("Per-account config keyed by account ID."),
|
|
23672
23673
|
dmPolicy: DmPolicySchema.optional().default("disabled").describe("Who can message your public agent via WhatsApp DM. 'Open' lets anyone message. 'Allowlist' restricts to approved phone numbers. 'Disabled' blocks all public messages."),
|
|
23673
23674
|
groupPolicy: GroupPolicySchema.optional().default("disabled").describe("Whether your agent responds in WhatsApp group chats. 'Open' enables group responses (subject to per-group activation). 'Allowlist' restricts to approved senders. 'Disabled' ignores all group messages."),
|
|
23674
|
-
|
|
23675
|
+
adminPhones: external_exports.array(external_exports.string()).optional().describe("Phone numbers (E.164) that route to the admin agent. Managed via add-admin-phone / remove-admin-phone."),
|
|
23676
|
+
allowFrom: external_exports.array(external_exports.string()).optional().describe("Phone numbers allowed to message the public agent when DM policy is 'allowlist'. Add '*' for open access. Does not affect admin routing \u2014 use adminPhones for that."),
|
|
23675
23677
|
groupAllowFrom: external_exports.array(external_exports.string()).optional().describe("Phone numbers allowed to trigger the agent in groups when group policy is 'allowlist'."),
|
|
23676
23678
|
sendReadReceipts: external_exports.boolean().optional().default(true).describe("Whether to send read receipts (blue ticks) when messages are received. Disabling may feel less responsive but preserves privacy."),
|
|
23677
23679
|
mediaMaxMb: external_exports.number().int().positive().optional().default(50).describe("Maximum file size in MB for media the agent will download and process."),
|
|
@@ -23852,18 +23854,16 @@ function resolveAccountConfig(config2, accountConfig) {
|
|
|
23852
23854
|
return {
|
|
23853
23855
|
dmPolicy: accountConfig?.dmPolicy ?? config2.dmPolicy ?? "disabled",
|
|
23854
23856
|
groupPolicy: accountConfig?.groupPolicy ?? config2.groupPolicy ?? "disabled",
|
|
23857
|
+
adminPhones: accountConfig?.adminPhones ?? config2.adminPhones ?? [],
|
|
23855
23858
|
allowFrom: accountConfig?.allowFrom ?? config2.allowFrom ?? [],
|
|
23856
23859
|
groupAllowFrom: accountConfig?.groupAllowFrom ?? config2.groupAllowFrom ?? [],
|
|
23857
23860
|
selfChatMode: accountConfig?.selfChatMode ?? false
|
|
23858
23861
|
};
|
|
23859
23862
|
}
|
|
23860
|
-
function isAdminPhone(phone,
|
|
23863
|
+
function isAdminPhone(phone, adminPhones) {
|
|
23861
23864
|
const normalized = normalizeE164(phone);
|
|
23862
23865
|
if (!normalized) return false;
|
|
23863
|
-
return
|
|
23864
|
-
if (entry === "*") return false;
|
|
23865
|
-
return phonesMatch(entry, normalized);
|
|
23866
|
-
});
|
|
23866
|
+
return adminPhones.some((entry) => phonesMatch(entry, normalized));
|
|
23867
23867
|
}
|
|
23868
23868
|
function checkDmAccess(params) {
|
|
23869
23869
|
const { senderPhone, selfPhone } = params;
|
|
@@ -23871,7 +23871,7 @@ function checkDmAccess(params) {
|
|
|
23871
23871
|
if (phonesMatch(senderPhone, selfPhone)) {
|
|
23872
23872
|
return { allowed: true, reason: "self-phone", agentType: "admin" };
|
|
23873
23873
|
}
|
|
23874
|
-
if (isAdminPhone(senderPhone, cfg.
|
|
23874
|
+
if (isAdminPhone(senderPhone, cfg.adminPhones)) {
|
|
23875
23875
|
return { allowed: true, reason: "admin-binding", agentType: "admin" };
|
|
23876
23876
|
}
|
|
23877
23877
|
switch (cfg.dmPolicy) {
|
|
@@ -23912,10 +23912,7 @@ function checkGroupAccess(params) {
|
|
|
23912
23912
|
return { allowed: true, reason: "group-policy-open", agentType: "public" };
|
|
23913
23913
|
}
|
|
23914
23914
|
case "allowlist": {
|
|
23915
|
-
const inList = cfg.groupAllowFrom.some((entry) => phonesMatch(entry, senderPhone)) || cfg.
|
|
23916
|
-
if (entry === "*") return false;
|
|
23917
|
-
return phonesMatch(entry, senderPhone);
|
|
23918
|
-
});
|
|
23915
|
+
const inList = cfg.groupAllowFrom.some((entry) => phonesMatch(entry, senderPhone)) || cfg.adminPhones.some((entry) => phonesMatch(entry, senderPhone));
|
|
23919
23916
|
if (!inList) {
|
|
23920
23917
|
return { allowed: false, reason: "not-in-group-allowlist", agentType: "public" };
|
|
23921
23918
|
}
|
|
@@ -24623,6 +24620,25 @@ function reloadManagerConfig(accountDir) {
|
|
|
24623
24620
|
}
|
|
24624
24621
|
}
|
|
24625
24622
|
var E164_PATTERN = /^\+\d{7,15}$/;
|
|
24623
|
+
function migrateAdminPhones(wa) {
|
|
24624
|
+
if (wa.adminPhones !== void 0) return 0;
|
|
24625
|
+
if (!Array.isArray(wa.allowFrom)) return 0;
|
|
24626
|
+
const allowFrom = wa.allowFrom;
|
|
24627
|
+
const phones = [];
|
|
24628
|
+
const remaining = [];
|
|
24629
|
+
for (const entry of allowFrom) {
|
|
24630
|
+
if (E164_PATTERN.test(entry)) {
|
|
24631
|
+
phones.push(entry);
|
|
24632
|
+
} else {
|
|
24633
|
+
remaining.push(entry);
|
|
24634
|
+
}
|
|
24635
|
+
}
|
|
24636
|
+
if (phones.length === 0) return 0;
|
|
24637
|
+
wa.adminPhones = phones;
|
|
24638
|
+
wa.allowFrom = remaining;
|
|
24639
|
+
console.error(`${TAG8} migrated ${phones.length} phone(s) from allowFrom to adminPhones`);
|
|
24640
|
+
return phones.length;
|
|
24641
|
+
}
|
|
24626
24642
|
function persistAfterPairing(accountDir, accountId, selfPhone) {
|
|
24627
24643
|
try {
|
|
24628
24644
|
const config2 = readConfig(accountDir);
|
|
@@ -24639,16 +24655,16 @@ function persistAfterPairing(accountDir, accountId, selfPhone) {
|
|
|
24639
24655
|
}
|
|
24640
24656
|
if (selfPhone) {
|
|
24641
24657
|
const normalized = selfPhone.startsWith("+") ? selfPhone : `+${selfPhone}`;
|
|
24642
|
-
if (!Array.isArray(wa.
|
|
24643
|
-
wa.
|
|
24658
|
+
if (!Array.isArray(wa.adminPhones)) {
|
|
24659
|
+
wa.adminPhones = [];
|
|
24644
24660
|
}
|
|
24645
|
-
const
|
|
24646
|
-
if (!
|
|
24647
|
-
|
|
24648
|
-
console.error(`${TAG8} added selfPhone=${normalized} to
|
|
24661
|
+
const adminPhones = wa.adminPhones;
|
|
24662
|
+
if (!adminPhones.includes(normalized)) {
|
|
24663
|
+
adminPhones.push(normalized);
|
|
24664
|
+
console.error(`${TAG8} added selfPhone=${normalized} to adminPhones`);
|
|
24649
24665
|
}
|
|
24650
24666
|
} else {
|
|
24651
|
-
console.error(`${TAG8} skipping
|
|
24667
|
+
console.error(`${TAG8} skipping adminPhones \u2014 selfPhone is null account=${accountId}`);
|
|
24652
24668
|
}
|
|
24653
24669
|
const parsed = WhatsAppConfigSchema.safeParse(wa);
|
|
24654
24670
|
if (!parsed.success) {
|
|
@@ -24678,14 +24694,14 @@ function addAdminPhone(accountDir, phone) {
|
|
|
24678
24694
|
config2.whatsapp = {};
|
|
24679
24695
|
}
|
|
24680
24696
|
const wa = config2.whatsapp;
|
|
24681
|
-
if (!Array.isArray(wa.
|
|
24682
|
-
wa.
|
|
24697
|
+
if (!Array.isArray(wa.adminPhones)) {
|
|
24698
|
+
wa.adminPhones = [];
|
|
24683
24699
|
}
|
|
24684
|
-
const
|
|
24685
|
-
if (
|
|
24700
|
+
const adminPhones = wa.adminPhones;
|
|
24701
|
+
if (adminPhones.includes(normalized)) {
|
|
24686
24702
|
return { ok: true, message: `Phone ${normalized} is already in the admin list.` };
|
|
24687
24703
|
}
|
|
24688
|
-
|
|
24704
|
+
adminPhones.push(normalized);
|
|
24689
24705
|
const parsed = WhatsAppConfigSchema.safeParse(wa);
|
|
24690
24706
|
if (!parsed.success) {
|
|
24691
24707
|
const msg = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
@@ -24710,15 +24726,15 @@ function removeAdminPhone(accountDir, phone) {
|
|
|
24710
24726
|
return { ok: true, message: `No WhatsApp config exists \u2014 nothing to remove.` };
|
|
24711
24727
|
}
|
|
24712
24728
|
const wa = config2.whatsapp;
|
|
24713
|
-
if (!Array.isArray(wa.
|
|
24729
|
+
if (!Array.isArray(wa.adminPhones)) {
|
|
24714
24730
|
return { ok: true, message: `No admin phones configured \u2014 nothing to remove.` };
|
|
24715
24731
|
}
|
|
24716
|
-
const
|
|
24717
|
-
const idx =
|
|
24732
|
+
const adminPhones = wa.adminPhones;
|
|
24733
|
+
const idx = adminPhones.indexOf(normalized);
|
|
24718
24734
|
if (idx === -1) {
|
|
24719
24735
|
return { ok: true, message: `Phone ${normalized} is not in the admin list.` };
|
|
24720
24736
|
}
|
|
24721
|
-
|
|
24737
|
+
adminPhones.splice(idx, 1);
|
|
24722
24738
|
const parsed = WhatsAppConfigSchema.safeParse(wa);
|
|
24723
24739
|
if (!parsed.success) {
|
|
24724
24740
|
const msg = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
@@ -24739,8 +24755,10 @@ function readAdminPhones(accountDir) {
|
|
|
24739
24755
|
try {
|
|
24740
24756
|
const config2 = readConfig(accountDir);
|
|
24741
24757
|
const wa = config2.whatsapp;
|
|
24742
|
-
if (!wa
|
|
24743
|
-
|
|
24758
|
+
if (!wa) return [];
|
|
24759
|
+
migrateAdminPhones(wa);
|
|
24760
|
+
if (!Array.isArray(wa.adminPhones)) return [];
|
|
24761
|
+
return wa.adminPhones.filter((p) => typeof p === "string");
|
|
24744
24762
|
} catch {
|
|
24745
24763
|
return [];
|
|
24746
24764
|
}
|
|
@@ -24791,6 +24809,57 @@ function getPublicAgent(accountDir) {
|
|
|
24791
24809
|
return null;
|
|
24792
24810
|
}
|
|
24793
24811
|
}
|
|
24812
|
+
function updateConfig(accountDir, fields) {
|
|
24813
|
+
const fieldNames = Object.keys(fields);
|
|
24814
|
+
if (fieldNames.length === 0) {
|
|
24815
|
+
return { ok: false, error: "No fields provided to update." };
|
|
24816
|
+
}
|
|
24817
|
+
try {
|
|
24818
|
+
const config2 = readConfig(accountDir);
|
|
24819
|
+
if (!config2.whatsapp || typeof config2.whatsapp !== "object") {
|
|
24820
|
+
config2.whatsapp = {};
|
|
24821
|
+
}
|
|
24822
|
+
const wa = config2.whatsapp;
|
|
24823
|
+
migrateAdminPhones(wa);
|
|
24824
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
24825
|
+
wa[key] = value;
|
|
24826
|
+
}
|
|
24827
|
+
const parsed = WhatsAppConfigSchema.safeParse(wa);
|
|
24828
|
+
if (!parsed.success) {
|
|
24829
|
+
const msg = parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
|
|
24830
|
+
console.error(`${TAG8} update validation failed: ${msg}`);
|
|
24831
|
+
return { ok: false, error: `Validation failed: ${msg}` };
|
|
24832
|
+
}
|
|
24833
|
+
config2.whatsapp = parsed.data;
|
|
24834
|
+
writeConfig(accountDir, config2);
|
|
24835
|
+
console.error(`${TAG8} updated fields=[${fieldNames.join(",")}]`);
|
|
24836
|
+
reloadManagerConfig(accountDir);
|
|
24837
|
+
return { ok: true, message: `Updated WhatsApp config: ${fieldNames.join(", ")}.` };
|
|
24838
|
+
} catch (err) {
|
|
24839
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
24840
|
+
console.error(`${TAG8} updateConfig failed: ${msg}`);
|
|
24841
|
+
return { ok: false, error: msg };
|
|
24842
|
+
}
|
|
24843
|
+
}
|
|
24844
|
+
function getConfig(accountDir) {
|
|
24845
|
+
try {
|
|
24846
|
+
const config2 = readConfig(accountDir);
|
|
24847
|
+
const wa = config2.whatsapp;
|
|
24848
|
+
if (!wa) return null;
|
|
24849
|
+
const migrated = migrateAdminPhones(wa);
|
|
24850
|
+
if (migrated > 0) {
|
|
24851
|
+
const parsed = WhatsAppConfigSchema.safeParse(wa);
|
|
24852
|
+
if (parsed.success) {
|
|
24853
|
+
config2.whatsapp = parsed.data;
|
|
24854
|
+
writeConfig(accountDir, config2);
|
|
24855
|
+
reloadManagerConfig(accountDir);
|
|
24856
|
+
}
|
|
24857
|
+
}
|
|
24858
|
+
return wa;
|
|
24859
|
+
} catch {
|
|
24860
|
+
return null;
|
|
24861
|
+
}
|
|
24862
|
+
}
|
|
24794
24863
|
|
|
24795
24864
|
// app/api/whatsapp/login/wait/route.ts
|
|
24796
24865
|
async function POST10(req) {
|
|
@@ -24977,7 +25046,7 @@ function serializeWhatsAppSchema() {
|
|
|
24977
25046
|
"",
|
|
24978
25047
|
"## Constraints (superRefine)",
|
|
24979
25048
|
"",
|
|
24980
|
-
'- `dmPolicy: "open"` requires `allowFrom` to include `"*"` (both top-level and per-account)',
|
|
25049
|
+
'- `dmPolicy: "open"` requires `allowFrom` to include `"*"` (both top-level and per-account). This is a DM policy constraint \u2014 it does not affect admin phones, which live in the separate `adminPhones` field.',
|
|
24981
25050
|
"- Account-level fields override top-level defaults when present"
|
|
24982
25051
|
].join("\n");
|
|
24983
25052
|
return [topLevel, "", account, constraints].join("\n");
|
|
@@ -24987,7 +25056,7 @@ function serializeWhatsAppSchema() {
|
|
|
24987
25056
|
async function POST14(req) {
|
|
24988
25057
|
try {
|
|
24989
25058
|
const body = await req.json().catch(() => ({}));
|
|
24990
|
-
const { action, phone, slug, accountId } = body;
|
|
25059
|
+
const { action, phone, slug, fields, accountId } = body;
|
|
24991
25060
|
if (!action || typeof action !== "string") {
|
|
24992
25061
|
return Response.json({ ok: false, error: 'Missing required field "action".' }, { status: 400 });
|
|
24993
25062
|
}
|
|
@@ -25056,9 +25125,23 @@ async function POST14(req) {
|
|
|
25056
25125
|
return Response.json({ ok: false, error: `Failed to fetch groups: ${String(err)}` });
|
|
25057
25126
|
}
|
|
25058
25127
|
}
|
|
25128
|
+
case "update-config": {
|
|
25129
|
+
if (!fields || typeof fields !== "object" || Array.isArray(fields)) {
|
|
25130
|
+
return Response.json({ ok: false, error: 'Missing required field "fields" (object with config field names and values).' }, { status: 400 });
|
|
25131
|
+
}
|
|
25132
|
+
const result = updateConfig(account.accountDir, fields);
|
|
25133
|
+
const fieldNames = Object.keys(fields);
|
|
25134
|
+
console.error(`[whatsapp:api] config action=update-config fields=[${fieldNames.join(",")}] ok=${result.ok}`);
|
|
25135
|
+
return Response.json(result, { status: result.ok ? 200 : 400 });
|
|
25136
|
+
}
|
|
25137
|
+
case "get-config": {
|
|
25138
|
+
const waConfig = getConfig(account.accountDir);
|
|
25139
|
+
console.error(`[whatsapp:api] config action=get-config`);
|
|
25140
|
+
return Response.json({ ok: true, config: waConfig });
|
|
25141
|
+
}
|
|
25059
25142
|
default:
|
|
25060
25143
|
return Response.json(
|
|
25061
|
-
{ ok: false, error: `Unknown action "${action}". Valid actions: add-admin-phone, remove-admin-phone, list-admin-phones, set-public-agent, get-public-agent, schema, list-groups.` },
|
|
25144
|
+
{ ok: false, error: `Unknown action "${action}". Valid actions: add-admin-phone, remove-admin-phone, list-admin-phones, set-public-agent, get-public-agent, update-config, get-config, schema, list-groups.` },
|
|
25062
25145
|
{ status: 400 }
|
|
25063
25146
|
);
|
|
25064
25147
|
}
|
|
@@ -127,14 +127,25 @@ server.tool("whatsapp-send", "Send a WhatsApp message to a phone number or group
|
|
|
127
127
|
}
|
|
128
128
|
});
|
|
129
129
|
// ─── whatsapp-config ──────────────────────────────────────────────────
|
|
130
|
-
server.tool("whatsapp-config", "Manage WhatsApp configuration. Actions: add-admin-phone (register a phone as admin — messages from it route to admin agent), remove-admin-phone (demote to public routing), list-admin-phones (show current admin phones), set-public-agent (set which agent handles WhatsApp messages from non-admin phones — requires the agent slug), get-public-agent (show the currently configured public agent), schema (return all config field definitions — names, types, defaults, descriptions, constraints), list-groups (return WhatsApp groups the account belongs to — names, JIDs, participant counts). Phone numbers must be E.164 format (e.g. +441234567890).", {
|
|
131
|
-
action: z.enum(["add-admin-phone", "remove-admin-phone", "list-admin-phones", "set-public-agent", "get-public-agent", "schema", "list-groups"]).describe("The config action to perform"),
|
|
130
|
+
server.tool("whatsapp-config", "Manage WhatsApp configuration. Actions: add-admin-phone (register a phone as admin — messages from it route to admin agent), remove-admin-phone (demote to public routing), list-admin-phones (show current admin phones), set-public-agent (set which agent handles WhatsApp messages from non-admin phones — requires the agent slug), get-public-agent (show the currently configured public agent), update-config (change any WhatsApp config field — pass field names and values in the fields parameter), get-config (return the full current WhatsApp config object), schema (return all config field definitions — names, types, defaults, descriptions, constraints), list-groups (return WhatsApp groups the account belongs to — names, JIDs, participant counts). Phone numbers must be E.164 format (e.g. +441234567890).", {
|
|
131
|
+
action: z.enum(["add-admin-phone", "remove-admin-phone", "list-admin-phones", "set-public-agent", "get-public-agent", "update-config", "get-config", "schema", "list-groups"]).describe("The config action to perform"),
|
|
132
132
|
phone: z.string().optional().describe("Phone number in E.164 format (required for add/remove admin phone)"),
|
|
133
133
|
slug: z.string().optional().describe("Agent slug (required for set-public-agent)"),
|
|
134
|
+
fields: z.string().optional().describe('JSON string of config fields to update (required for update-config, e.g. \'{"dmPolicy":"open","allowFrom":["*"]}\')'),
|
|
134
135
|
accountId: z.string().optional().describe('Account ID for list-groups (default: "default")'),
|
|
135
|
-
}, async ({ action, phone, slug, accountId }) => {
|
|
136
|
+
}, async ({ action, phone, slug, fields, accountId }) => {
|
|
136
137
|
try {
|
|
137
|
-
|
|
138
|
+
// Parse fields JSON string for update-config
|
|
139
|
+
let parsedFields;
|
|
140
|
+
if (action === "update-config" && fields) {
|
|
141
|
+
try {
|
|
142
|
+
parsedFields = JSON.parse(fields);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return textResult('Invalid JSON in "fields" parameter. Expected a JSON object, e.g. {"dmPolicy":"open","allowFrom":["*"]}', true);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const result = await callApi("/api/whatsapp/config", "POST", { action, phone, slug, fields: parsedFields, accountId });
|
|
138
149
|
if (!result.ok)
|
|
139
150
|
return textResult(result.error ?? "Config operation failed.", true);
|
|
140
151
|
if (action === "list-admin-phones") {
|
|
@@ -152,6 +163,12 @@ server.tool("whatsapp-config", "Manage WhatsApp configuration. Actions: add-admi
|
|
|
152
163
|
if (action === "schema") {
|
|
153
164
|
return textResult(result.text ?? "Schema unavailable.");
|
|
154
165
|
}
|
|
166
|
+
if (action === "get-config") {
|
|
167
|
+
const waConfig = result.config;
|
|
168
|
+
if (!waConfig)
|
|
169
|
+
return textResult("No WhatsApp config found. Connect WhatsApp first.");
|
|
170
|
+
return textResult(JSON.stringify(waConfig, null, 2));
|
|
171
|
+
}
|
|
155
172
|
if (action === "list-groups") {
|
|
156
173
|
const groups = result.groups ?? [];
|
|
157
174
|
if (groups.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ The initial first-run wizard flow stays single-account. Multi-account is managed
|
|
|
30
30
|
```yaml
|
|
31
31
|
channels:
|
|
32
32
|
whatsapp:
|
|
33
|
-
|
|
33
|
+
adminPhones:
|
|
34
34
|
- "<admin-phone>" # E.164 phone the user messages from
|
|
35
35
|
accounts:
|
|
36
36
|
default:
|
|
@@ -88,14 +88,14 @@ The platform enforces this at multiple levels:
|
|
|
88
88
|
| Term | Definition | Code |
|
|
89
89
|
|------|-----------|------|
|
|
90
90
|
| **Self phone** | The WhatsApp account's own phone number (the phone that scanned the QR code). Self-chat only. | `phonesMatch(senderPhone, selfPhone)` in `access-control.ts` |
|
|
91
|
-
| **Admin phones** | Phones
|
|
92
|
-
| **Public/unknown** | Any phone that is not self and not in `
|
|
91
|
+
| **Admin phones** | Phones listed in `adminPhones` in `account.json`. The user's personal phone is auto-registered on QR link; additional phones are added via `whatsapp-config action: "add-admin-phone"`. | `isAdminPhone()` in `access-control.ts` — iterates `adminPhones` |
|
|
92
|
+
| **Public/unknown** | Any phone that is not self and not in `adminPhones`. Subject to DM policy gating. | Everything else in `checkDmAccess()` |
|
|
93
93
|
|
|
94
|
-
**Critical distinction:** The *self phone* is the paired device's number (the WhatsApp account Maxy controls). The *admin phone* is the user's personal phone (the phone they message *from*). These are typically different numbers. If the user's personal phone is not in `
|
|
94
|
+
**Critical distinction:** The *self phone* is the paired device's number (the WhatsApp account Maxy controls). The *admin phone* is the user's personal phone (the phone they message *from*). These are typically different numbers. If the user's personal phone is not in `adminPhones`, their messages route as public — not admin.
|
|
95
95
|
|
|
96
96
|
**`dmPolicy` behaviour (per-account):**
|
|
97
97
|
|
|
98
|
-
| Policy | Self phone | Admin phones (in `
|
|
98
|
+
| Policy | Self phone | Admin phones (in `adminPhones`) | Public/unknown |
|
|
99
99
|
|--------|-----------|-------------------------------|----------------|
|
|
100
100
|
| `"open"` | Allowed | Allowed | Allowed |
|
|
101
101
|
| `"allowlist"` | Allowed | Allowed | Allowed only if in `allowFrom` (wildcard `"*"` counts) |
|
|
@@ -107,7 +107,7 @@ Admin phones always bypass DM policy — the `isAdminPhone()` check runs before
|
|
|
107
107
|
|
|
108
108
|
**Key file:** `access-control.ts` — `checkDmAccess()` and `checkGroupAccess()`.
|
|
109
109
|
|
|
110
|
-
**Config path:** Per-account at `whatsapp.accounts.{accountId}.dmPolicy` in `account.json`. Falls back to `whatsapp.dmPolicy`. Changes are conversational — the admin agent writes to config via
|
|
110
|
+
**Config path:** Per-account at `whatsapp.accounts.{accountId}.dmPolicy` in `account.json`. Falls back to `whatsapp.dmPolicy`. Changes are conversational — the admin agent writes to config via `whatsapp-config action: "update-config"`.
|
|
111
111
|
|
|
112
112
|
For config field definitions (field names, types, valid values), use `whatsapp-config action: schema`.
|
|
113
113
|
|
|
@@ -47,7 +47,7 @@ When the user wants to configure per-group settings:
|
|
|
47
47
|
|
|
48
48
|
## Writing changes
|
|
49
49
|
|
|
50
|
-
After the user submits, write changes via `
|
|
50
|
+
After the user submits, write changes via `whatsapp-config action: "update-config"` with the `fields` parameter containing a JSON object of the changed fields. Each field is merged individually — unchanged fields are left untouched. Confirm what changed — name each setting that was modified and its new value.
|
|
51
51
|
|
|
52
52
|
## Language
|
|
53
53
|
|