@circuitwall/jarela 0.7.2 → 0.7.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.
Files changed (91) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +2 -2
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  15. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  16. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  17. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  19. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js +51 -35
  23. package/.next/standalone/.next/server/app/api/v1/agents/[id]/compact/route.js.map +1 -1
  24. package/.next/standalone/.next/server/app/api/v1/threads/[thread_id]/run/route.js +2 -2
  25. package/.next/standalone/.next/server/app/index.html +2 -2
  26. package/.next/standalone/.next/server/app/index.rsc +3 -3
  27. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  28. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  29. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  30. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  31. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  32. package/.next/standalone/.next/server/app/page.js +515 -104
  33. package/.next/standalone/.next/server/app/page.js.map +1 -1
  34. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/setup.html +1 -1
  37. package/.next/standalone/.next/server/app/setup.rsc +2 -2
  38. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  39. package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  40. package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  41. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  42. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  43. package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  44. package/.next/standalone/.next/server/chunks/1683.js +26 -16
  45. package/.next/standalone/.next/server/chunks/1683.js.map +1 -1
  46. package/.next/standalone/.next/server/chunks/{317.js → 5432.js} +11100 -10858
  47. package/.next/standalone/.next/server/chunks/5432.js.map +1 -0
  48. package/.next/standalone/.next/server/chunks/7885.js +606 -353
  49. package/.next/standalone/.next/server/chunks/7885.js.map +1 -1
  50. package/.next/standalone/.next/server/chunks/8135.js +59 -16
  51. package/.next/standalone/.next/server/chunks/8135.js.map +1 -1
  52. package/.next/standalone/.next/server/chunks/9032.js +3 -3
  53. package/.next/standalone/.next/server/chunks/9032.js.map +1 -1
  54. package/.next/standalone/.next/server/instrumentation.js +3 -3
  55. package/.next/standalone/.next/server/instrumentation.js.map +1 -1
  56. package/.next/standalone/.next/server/middleware-build-manifest.js +2 -2
  57. package/.next/standalone/.next/server/pages/404.html +2 -2
  58. package/.next/standalone/.next/server/pages/500.html +1 -1
  59. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  60. package/.next/standalone/.next/static/chunks/app/{page-a20902703c0a4f10.js → page-9fb006074fb13526.js} +582 -171
  61. package/.next/standalone/.next/static/chunks/app/page-9fb006074fb13526.js.map +1 -0
  62. package/.next/standalone/.next/static/css/5507dbe1cdc6c599.css +5 -0
  63. package/.next/standalone/.next/static/css/5507dbe1cdc6c599.css.map +1 -0
  64. package/.next/standalone/package.json +1 -1
  65. package/CHANGELOG.md +11 -0
  66. package/README.md +83 -1
  67. package/api/types.ts +7 -0
  68. package/app/api/v1/agents/[id]/compact/route.ts +2 -40
  69. package/components/bridges/BridgeEditor.tsx +8 -0
  70. package/components/chat/MessageBubble.tsx +3 -36
  71. package/components/models/ModelEditor.tsx +141 -0
  72. package/components/scheduled-tasks/ScheduledTasksPanel.tsx +5 -0
  73. package/components/scheduled-tasks/WatchersSection.tsx +5 -0
  74. package/lib/agents/context-budget.test.ts +128 -0
  75. package/lib/agents/context-budget.ts +128 -0
  76. package/lib/agents/conversation-summary.test.ts +68 -0
  77. package/lib/agents/conversation-summary.ts +51 -0
  78. package/lib/agents/run-thread.ts +112 -2
  79. package/lib/bridges/dispatcher.test.ts +134 -0
  80. package/lib/bridges/dispatcher.ts +34 -16
  81. package/lib/bridges/message-role.test.ts +83 -0
  82. package/lib/bridges/message-role.ts +46 -0
  83. package/lib/triggers/handlers/watcher.test.ts +23 -4
  84. package/lib/triggers/handlers/watcher.ts +56 -8
  85. package/package.json +1 -1
  86. package/.next/standalone/.next/server/chunks/317.js.map +0 -1
  87. package/.next/standalone/.next/static/chunks/app/page-a20902703c0a4f10.js.map +0 -1
  88. package/.next/standalone/.next/static/css/cc66c456aba91258.css +0 -5
  89. package/.next/standalone/.next/static/css/cc66c456aba91258.css.map +0 -1
  90. /package/.next/standalone/.next/static/{IauO0rNZkUVPX834k-SBa → AbCOWpaxP4v4lUSeFWWYz}/_buildManifest.js +0 -0
  91. /package/.next/standalone/.next/static/{IauO0rNZkUVPX834k-SBa → AbCOWpaxP4v4lUSeFWWYz}/_ssgManifest.js +0 -0
@@ -31,8 +31,8 @@ var global_state = __webpack_require__(15559);
31
31
  var threads = __webpack_require__(83042);
32
32
  // EXTERNAL MODULE: ./lib/stores/agent-configs.ts
33
33
  var agent_configs = __webpack_require__(41720);
34
- // EXTERNAL MODULE: ./lib/agents/run-thread.ts + 11 modules
35
- var run_thread = __webpack_require__(91396);
34
+ // EXTERNAL MODULE: ./lib/agents/run-thread.ts + 12 modules
35
+ var run_thread = __webpack_require__(76644);
36
36
  // EXTERNAL MODULE: ./lib/agents/stream-collector.ts
37
37
  var stream_collector = __webpack_require__(30685);
38
38
  ;// ./lib/bridges/router.ts
@@ -126,6 +126,39 @@ var stream_collector = __webpack_require__(30685);
126
126
  }
127
127
  return `${note}\n\n${lines.join("\n")}\n\n${input.text}`;
128
128
  }
129
+ // Parses bridge prompt envelopes rendered by formatBridgePrompt().
130
+ // Back-compat: also accepts legacy keys (chat_jid/sender_jid) and optional
131
+ // prose preface before the [bridge:...] metadata block.
132
+ function parseBridgePrompt(raw) {
133
+ const start = raw.indexOf("[bridge:");
134
+ if (start < 0) return null;
135
+ const src = raw.slice(start);
136
+ const headers = {};
137
+ const lines = src.split("\n");
138
+ let i = 0;
139
+ for(; i < lines.length; i++){
140
+ const line = lines[i];
141
+ if (line === "") {
142
+ i++;
143
+ break;
144
+ }
145
+ const m = /^\[([a-z_]+):([\s\S]*)\]$/.exec(line);
146
+ if (!m) return null;
147
+ headers[m[1]] = m[2];
148
+ }
149
+ const chatId = headers.chat_id || headers.chat_jid;
150
+ const senderId = headers.sender_id || headers.sender_jid || chatId;
151
+ if (!headers.bridge || !chatId || !headers.chat_type) return null;
152
+ return {
153
+ bridgeId: headers.bridge,
154
+ chatJid: chatId,
155
+ chatName: headers.chat_name || chatId,
156
+ isGroup: headers.chat_type === "group",
157
+ senderJid: senderId,
158
+ senderName: headers.sender_name || senderId || "Unknown",
159
+ body: lines.slice(i).join("\n").trimEnd()
160
+ };
161
+ }
129
162
  function roleNote(role, isGroup) {
130
163
  switch(role){
131
164
  case "user":
@@ -145,6 +178,10 @@ function roleNote(role, isGroup) {
145
178
 
146
179
 
147
180
 
181
+ const SILENT_BRIDGE_DIRECTIVE = "[SILENT_BRIDGE] Observer mode is enabled for this route. You are standing on the user's side and monitoring events. " + "Never behave like a participant in the external chat and never draft/imitate a direct chat reply. " + "Write to the user only, as a concise report of important events, risks, or user-actionable changes. " + "Keep tone informational (status/update summary), not conversational. " + "If nothing important happened, reply with exactly the single token NO_REPLY and nothing else.";
182
+ function isNoReply(text) {
183
+ return /^\s*NO[_ ]?REPLY\b/i.test(text);
184
+ }
148
185
  /**
149
186
  * Handle one inbound message from a bridge adapter:
150
187
  * 1. Resolve the chat → agent route. Unrouted → publish an advisory
@@ -195,7 +232,9 @@ function roleNote(role, isGroup) {
195
232
  sender_name: senderName,
196
233
  text: msg.text
197
234
  });
198
- const prepared = await (0,run_thread/* prepareThreadRun */.fn)(thread.thread_id, promptText, undefined, msg.attachments, undefined, undefined, "bridge");
235
+ const silent = route.silent_mode === 1;
236
+ const effectivePrompt = silent ? `${promptText}\n\n${SILENT_BRIDGE_DIRECTIVE}` : promptText;
237
+ const prepared = await (0,run_thread/* prepareThreadRun */.fn)(thread.thread_id, effectivePrompt, undefined, msg.attachments, undefined, undefined, "bridge");
199
238
  // Silent mode: suppress *any* outbound signal — no reply, no typing
200
239
  // indicator. The typing presence itself is a tell that an agent is
201
240
  // listening, so observer-mode routes must stay completely dark on the
@@ -211,7 +250,6 @@ function roleNote(role, isGroup) {
211
250
  // matches. Default 'counterpart' = agent answers the user's chat
212
251
  // partner / group members but stays quiet on the user's own messages.
213
252
  // 'user' = inverse — react only to what the paired user typed.
214
- const silent = route.silent_mode === 1;
215
253
  // Show the "composing…" presence on the channel while we drain the
216
254
  // LLM stream. Refresh every ~8s because WhatsApp drops the indicator
217
255
  // after ~10s if not renewed. We always send a final "paused" in the
@@ -246,8 +284,11 @@ function roleNote(role, isGroup) {
246
284
  void adapter.sendTyping(msg.remote_jid, false).catch(()=>{});
247
285
  }
248
286
  }
249
- (0,run_thread/* persistAssistantMessage */._w)(thread.thread_id, assistantContent, usedTools, toolEvents, "bridge");
250
287
  const reply = assistantContent.trim();
288
+ const suppressAssistant = silent && (reply.length === 0 || isNoReply(reply));
289
+ if (!suppressAssistant) {
290
+ (0,run_thread/* persistAssistantMessage */._w)(thread.thread_id, assistantContent, usedTools, toolEvents, "bridge");
291
+ }
251
292
  // Outbound reply gate: silent_mode (master switch) AND respond_to
252
293
  // (per-role trigger). Both must clear for a message to leave the
253
294
  // dispatcher. The WhatsApp adapter also re-checks `route.silent_mode`
@@ -261,17 +302,19 @@ function roleNote(role, isGroup) {
261
302
  console.error(`[bridge ${adapter.bridge_id}] sendText failed:`, m);
262
303
  }
263
304
  }
264
- (0,bus/* publish */.mk)({
265
- type: "bridge_message_received",
266
- bridge_id: adapter.bridge_id,
267
- remote_jid: msg.remote_jid,
268
- push_name: msg.push_name,
269
- is_group: msg.is_group,
270
- thread_id: thread.thread_id,
271
- agent_id: agentId,
272
- preview: reply.replace(/\s+/g, " ").slice(0, 120),
273
- ts: Date.now()
274
- });
305
+ if (!silent || !suppressAssistant) {
306
+ (0,bus/* publish */.mk)({
307
+ type: "bridge_message_received",
308
+ bridge_id: adapter.bridge_id,
309
+ remote_jid: msg.remote_jid,
310
+ push_name: msg.push_name,
311
+ is_group: msg.is_group,
312
+ thread_id: thread.thread_id,
313
+ agent_id: agentId,
314
+ preview: suppressAssistant ? "" : reply.replace(/\s+/g, " ").slice(0, 120),
315
+ ts: Date.now()
316
+ });
317
+ }
275
318
  } catch (err) {
276
319
  const m = err instanceof Error ? err.message : String(err);
277
320
  console.error(`[bridge ${adapter.bridge_id}] dispatcher error on ${msg.remote_jid}:`, m);