@c4t4/heyamigo 0.1.13 → 0.1.15

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.
@@ -92,16 +92,23 @@ async function processMessages(messages, sock, ownerJid, isHistorySync = false)
92
92
  logger.info(logCtx, 'command handled');
93
93
  continue;
94
94
  }
95
+ // Self-chat: owner messaging themselves — always trigger
96
+ const isSelfChat = stored.fromMe && !isGroup &&
97
+ jidDecode(stored.jid)?.user === config.owner.number;
95
98
  // Trigger gate: alias / @mention / reply-to-bot depending on mode
96
- const trigger = checkTrigger({
97
- isGroup,
98
- text: stored.text,
99
- msg,
100
- sock,
101
- });
102
- if (!trigger.triggered) {
103
- logger.info({ ...logCtx, trigger: trigger.reason }, 'message captured, no trigger');
104
- continue;
99
+ let triggerReason = isSelfChat ? 'self-chat' : '';
100
+ if (!isSelfChat) {
101
+ const trigger = checkTrigger({
102
+ isGroup,
103
+ text: stored.text,
104
+ msg,
105
+ sock,
106
+ });
107
+ if (!trigger.triggered) {
108
+ logger.info({ ...logCtx, trigger: trigger.reason }, 'message captured, no trigger');
109
+ continue;
110
+ }
111
+ triggerReason = trigger.reason;
105
112
  }
106
113
  const { role } = getRoleForContext(stored.senderNumber, isGroup);
107
114
  const existingSession = getSession(stored.jid);
@@ -126,7 +133,7 @@ async function processMessages(messages, sock, ownerJid, isHistorySync = false)
126
133
  userNumber: stored.senderNumber,
127
134
  });
128
135
  const input = `${memoryPreamble}\n\n---\n\n${core}`;
129
- logger.info({ ...logCtx, resume: !!existingSession, trigger: trigger.reason }, 'message captured, enqueuing');
136
+ logger.info({ ...logCtx, resume: !!existingSession, trigger: triggerReason }, 'message captured, enqueuing');
130
137
  const job = {
131
138
  jid: stored.jid,
132
139
  text: stored.text,
@@ -52,7 +52,8 @@ export function buildMemoryPreamble(params) {
52
52
  'Browser: you have a real Chrome browser available via Playwright.\n' +
53
53
  'You can navigate to URLs, click, fill forms, take screenshots, and read page content.\n' +
54
54
  'Use the browser tools (mcp__playwright__*) when asked to visit websites, look something up, or take a screenshot.\n' +
55
- 'To send a screenshot back, take one with the browser tool, then include [IMAGE: /path/to/screenshot.png] in your reply.');
55
+ 'To send a screenshot back, take one with the browser tool, then include [IMAGE: /path/to/screenshot.png] in your reply.\n\n' +
56
+ 'File storage: if you need to save any files (screenshots, research, notes), always save them to storage/temp/. Never save files to the project root.');
56
57
  // Critical section
57
58
  sections.push(buildCriticalSection({
58
59
  senderNumber: params.senderNumber,
@@ -177,9 +177,11 @@ export function checkAccess(params) {
177
177
  }
178
178
  return storeOnly('group sender not in allowedSenders');
179
179
  }
180
- if (fromMe)
181
- return storeOnly('dm owner chatting');
182
180
  const partnerNumber = jidDecode(jid)?.user ?? '';
181
+ // Self-chat: owner messaging themselves — respond like a direct conversation with the bot
182
+ const isSelfChat = fromMe && partnerNumber === config.owner.number;
183
+ if (fromMe && !isSelfChat)
184
+ return storeOnly('dm owner chatting');
183
185
  const dmEntry = current.dms.allowed.find((d) => d.number === partnerNumber);
184
186
  const mode = dmEntry?.mode ?? current.dms.defaultMode;
185
187
  if (mode === 'off')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@c4t4/heyamigo",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "WhatsApp AI bot powered by Claude with long-term memory, browser control, and role-based access",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",