@yeaft/webchat-agent 0.1.485 → 0.1.487

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 (42) hide show
  1. package/package.json +1 -1
  2. package/unify/cli.js +5 -28
  3. package/unify/engine.js +8 -20
  4. package/unify/eval/cases/tool-use.js +1 -22
  5. package/unify/router/intent-classifier.js +444 -0
  6. package/unify/session.js +7 -0
  7. package/unify/skills.js +15 -9
  8. package/unify/tools/agent.js +0 -1
  9. package/unify/tools/apply-patch.js +0 -1
  10. package/unify/tools/ask-user.js +0 -1
  11. package/unify/tools/bash.js +0 -1
  12. package/unify/tools/close-agent.js +0 -1
  13. package/unify/tools/enter-worktree.js +0 -1
  14. package/unify/tools/exit-worktree.js +0 -1
  15. package/unify/tools/file-edit.js +0 -1
  16. package/unify/tools/file-read.js +0 -1
  17. package/unify/tools/file-write.js +0 -1
  18. package/unify/tools/glob.js +0 -1
  19. package/unify/tools/grep.js +0 -1
  20. package/unify/tools/history-search.js +0 -1
  21. package/unify/tools/image-generation.js +0 -1
  22. package/unify/tools/js-repl.js +0 -2
  23. package/unify/tools/list-agents.js +0 -1
  24. package/unify/tools/list-dir.js +0 -1
  25. package/unify/tools/mcp-tools.js +0 -2
  26. package/unify/tools/memory-query.js +0 -1
  27. package/unify/tools/memory-read.js +0 -1
  28. package/unify/tools/memory-search.js +0 -1
  29. package/unify/tools/memory-write.js +0 -1
  30. package/unify/tools/notebook-edit.js +0 -1
  31. package/unify/tools/request-permissions.js +0 -1
  32. package/unify/tools/send-message.js +0 -1
  33. package/unify/tools/skill.js +0 -1
  34. package/unify/tools/task-tools.js +0 -8
  35. package/unify/tools/thread-tools.js +0 -7
  36. package/unify/tools/tool-search.js +47 -56
  37. package/unify/tools/types.js +3 -6
  38. package/unify/tools/view-image.js +0 -1
  39. package/unify/tools/wait-agent.js +0 -1
  40. package/unify/tools/web-fetch.js +0 -1
  41. package/unify/tools/web-search.js +0 -1
  42. package/unify/tools/write-stdin.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yeaft/webchat-agent",
3
- "version": "0.1.485",
3
+ "version": "0.1.487",
4
4
  "description": "Remote agent for Yeaft WebChat — connects worker machines to the central server",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/unify/cli.js CHANGED
@@ -37,7 +37,6 @@ import { consolidate } from './memory/consolidate.js';
37
37
 
38
38
  function parseArgs(argv) {
39
39
  const args = {
40
- mode: 'chat',
41
40
  debug: false,
42
41
  interactive: false,
43
42
  verbose: false,
@@ -57,10 +56,6 @@ function parseArgs(argv) {
57
56
  while (i < rest.length) {
58
57
  const arg = rest[i];
59
58
  switch (arg) {
60
- case '-m':
61
- case '--mode':
62
- args.mode = rest[++i] || 'chat';
63
- break;
64
59
  case '-d':
65
60
  case '--debug':
66
61
  args.debug = true;
@@ -176,7 +171,7 @@ function handleTraceQuery(args, config) {
176
171
  // ─── Dry-run handler ───────────────────────────────────────────
177
172
 
178
173
  function handleDryRun(args, config) {
179
- const systemPrompt = buildSystemPrompt({ language: config.language, mode: args.mode });
174
+ const systemPrompt = buildSystemPrompt({ language: config.language });
180
175
  const messages = [];
181
176
 
182
177
  if (args.prompt) {
@@ -188,7 +183,6 @@ function handleDryRun(args, config) {
188
183
  console.log('--- Config ---');
189
184
  console.log(` Model: ${config.model}`);
190
185
  console.log(` Adapter: ${config.adapter || 'auto'}`);
191
- console.log(` Mode: ${args.mode}`);
192
186
  console.log(` Debug: ${config.debug}`);
193
187
  console.log();
194
188
  console.log('--- System Prompt ---');
@@ -218,7 +212,6 @@ async function runREPL(config, args) {
218
212
  });
219
213
 
220
214
  const { engine, conversationStore, memoryStore, trace, skillManager, mcpManager, toolRegistry } = session;
221
- let currentMode = args.mode;
222
215
 
223
216
  // Load persisted conversation as initial messages
224
217
  let conversationMessages = conversationStore.loadRecent(50).map(m => ({
@@ -232,7 +225,7 @@ async function runREPL(config, args) {
232
225
  const coldCount = conversationStore.countCold();
233
226
  const memStats = memoryStore.stats();
234
227
 
235
- console.log(`Yeaft Unify REPL (model: ${session.config.model}, mode: ${currentMode})`);
228
+ console.log(`Yeaft Unify REPL (model: ${session.config.model})`);
236
229
  console.log(`Conversation: ${hotCount} hot, ${coldCount} cold | Memory: ${memStats.entryCount} entries`);
237
230
  console.log(`Tools: ${session.status.tools} | Skills: ${session.status.skills}`);
238
231
  if (session.status.mcpServers.length > 0) {
@@ -247,7 +240,7 @@ async function runREPL(config, args) {
247
240
  const rl = createInterface({
248
241
  input: process.stdin,
249
242
  output: process.stdout,
250
- prompt: `yeaft:${currentMode}> `,
243
+ prompt: `yeaft> `,
251
244
  });
252
245
 
253
246
  rl.prompt();
@@ -265,7 +258,6 @@ async function runREPL(config, args) {
265
258
  switch (cmd) {
266
259
  case 'help':
267
260
  console.log('Commands:');
268
- console.log(' /mode <chat|work|dream> — Switch mode');
269
261
  console.log(' /debug — Toggle debug mode');
270
262
  console.log(' /trace <stats|recent> — Query debug trace');
271
263
  console.log(' /memory [add|clear|stats] — Memory management');
@@ -285,16 +277,6 @@ async function runREPL(config, args) {
285
277
  console.log(' /quit — Exit');
286
278
  break;
287
279
 
288
- case 'mode':
289
- if (cmdArgs[0]) {
290
- currentMode = cmdArgs[0];
291
- rl.setPrompt(`yeaft:${currentMode}> `);
292
- console.log(`Mode switched to: ${currentMode}`);
293
- } else {
294
- console.log(`Current mode: ${currentMode}`);
295
- }
296
- break;
297
-
298
280
  case 'debug':
299
281
  session.config.debug = !session.config.debug;
300
282
  console.log(`Debug mode: ${session.config.debug ? 'ON' : 'OFF'}`);
@@ -433,10 +415,9 @@ async function runREPL(config, args) {
433
415
  case 'context':
434
416
  console.log(`Context info:`);
435
417
  console.log(` Model: ${session.config.model}`);
436
- console.log(` Mode: ${currentMode}`);
437
418
  console.log(` Language: ${session.config.language}`);
438
419
  console.log(` Max context: ${session.config.maxContextTokens} tokens`);
439
- console.log(` System prompt: ${buildSystemPrompt({ language: session.config.language, mode: currentMode }).length} chars`);
420
+ console.log(` System prompt: ${buildSystemPrompt({ language: session.config.language }).length} chars`);
440
421
  console.log(` Hot messages: ${conversationStore.countHot()}`);
441
422
  console.log(` Hot tokens: ${conversationStore.hotTokens()}`);
442
423
  console.log(` Cold messages: ${conversationStore.countCold()}`);
@@ -446,13 +427,12 @@ async function runREPL(config, args) {
446
427
  break;
447
428
 
448
429
  case 'dry-run':
449
- handleDryRun({ ...args, mode: currentMode, prompt: cmdArgs.join(' ') || null }, session.config);
430
+ handleDryRun({ ...args, prompt: cmdArgs.join(' ') || null }, session.config);
450
431
  break;
451
432
 
452
433
  case 'stats': {
453
434
  const s = trace.stats();
454
435
  console.log(`Session stats:`);
455
- console.log(` Mode: ${currentMode}`);
456
436
  console.log(` Debug: ${session.config.debug}`);
457
437
  console.log(` Turns: ${s.turnCount}`);
458
438
  console.log(` Tools: ${s.toolCount}`);
@@ -607,7 +587,6 @@ async function runREPL(config, args) {
607
587
 
608
588
  for await (const event of engine.query({
609
589
  prompt: input,
610
- mode: currentMode,
611
590
  messages: conversationMessages,
612
591
  })) {
613
592
  switch (event.type) {
@@ -709,7 +688,6 @@ async function runOnce(config, args) {
709
688
 
710
689
  for await (const event of engine.query({
711
690
  prompt: args.prompt,
712
- mode: args.mode,
713
691
  messages: priorMessages,
714
692
  })) {
715
693
  switch (event.type) {
@@ -819,7 +797,6 @@ async function main() {
819
797
  console.log(' node cli.js --trace search "keyword" — Search traces');
820
798
  console.log();
821
799
  console.log('Options:');
822
- console.log(' -m, --mode <mode> Mode: chat, work, dream (default: chat)');
823
800
  console.log(' -d, --debug Enable debug tracing');
824
801
  console.log(' -i, --interactive Start REPL');
825
802
  console.log(' -v, --verbose Verbose output');
package/unify/engine.js CHANGED
@@ -167,18 +167,17 @@ export class Engine {
167
167
  /**
168
168
  * Build the system prompt with memory, compact summary, and skill content.
169
169
  *
170
- * @param {string} mode
171
170
  * @param {{ profile?: string, entries?: object[] }} [memory]
172
171
  * @param {string} [compactSummary]
173
172
  * @param {string} [prompt] — user prompt (for skill relevance matching)
174
173
  * @param {string} [memoryInjection] — task-287: prebuilt memory block (index + prefs + project)
175
174
  * @returns {string}
176
175
  */
177
- #buildSystemPrompt(mode, memory, compactSummary, prompt, memoryInjection) {
176
+ #buildSystemPrompt(memory, compactSummary, prompt, memoryInjection) {
178
177
  // Get relevant skill content if SkillManager is wired
179
178
  let skillContent = '';
180
179
  if (this.#skillManager && prompt) {
181
- skillContent = this.#skillManager.getRelevantPromptContent(prompt, mode);
180
+ skillContent = this.#skillManager.getRelevantPromptContent(prompt);
182
181
  }
183
182
 
184
183
  // Get tool names from the appropriate source
@@ -188,7 +187,6 @@ export class Engine {
188
187
 
189
188
  return buildSystemPrompt({
190
189
  language: this.#config.language || 'en',
191
- mode,
192
190
  toolNames,
193
191
  memory,
194
192
  memoryInjection,
@@ -201,10 +199,9 @@ export class Engine {
201
199
  * Build the full tool context for Phase 5 tools.
202
200
  *
203
201
  * @param {AbortSignal} [signal]
204
- * @param {string} [mode]
205
202
  * @returns {object}
206
203
  */
207
- #buildToolContext(signal, mode) {
204
+ #buildToolContext(signal) {
208
205
  return {
209
206
  signal,
210
207
  yeaftDir: this.#yeaftDir,
@@ -215,7 +212,6 @@ export class Engine {
215
212
  conversationStore: this.#conversationStore,
216
213
  adapter: this.#adapter,
217
214
  config: this.#config,
218
- mode,
219
215
  };
220
216
  }
221
217
 
@@ -265,10 +261,9 @@ export class Engine {
265
261
  *
266
262
  * @param {string} userContent
267
263
  * @param {string} assistantContent
268
- * @param {string} mode
269
264
  * @param {object[]} [toolCalls]
270
265
  */
271
- #persistMessages(userContent, assistantContent, mode, toolCalls) {
266
+ #persistMessages(userContent, assistantContent, toolCalls) {
272
267
  if (!this.#conversationStore) return;
273
268
  if (this.#config._readOnly) return;
274
269
 
@@ -288,7 +283,6 @@ export class Engine {
288
283
  this.#conversationStore.append({
289
284
  role: 'user',
290
285
  content: userContent,
291
- mode,
292
286
  threadId,
293
287
  });
294
288
 
@@ -296,7 +290,6 @@ export class Engine {
296
290
  const assistantMsg = {
297
291
  role: 'assistant',
298
292
  content: assistantContent,
299
- mode,
300
293
  model: this.#config.model,
301
294
  threadId,
302
295
  };
@@ -354,14 +347,11 @@ export class Engine {
354
347
  *
355
348
  * @param {object} params
356
349
  * @param {string} params.prompt - The user prompt (required, non-empty).
357
- * @param {'dream'} [params.mode] - Optional mode flag. Since task-297 the only
358
- * value accepted / acted on is `'dream'` (memory maintenance system prompt).
359
- * Any other value is ignored and falls through to the unified system prompt.
360
350
  * @param {Array} [params.messages] - Prior conversation messages.
361
351
  * @param {AbortSignal} [params.signal] - Abort signal.
362
352
  * @yields {EngineEvent}
363
353
  */
364
- async *query({ prompt, mode, messages = [], signal }) {
354
+ async *query({ prompt, messages = [], signal }) {
365
355
  if (!prompt || typeof prompt !== 'string' || !prompt.trim()) {
366
356
  yield {
367
357
  type: 'error',
@@ -394,7 +384,7 @@ export class Engine {
394
384
  }
395
385
 
396
386
  const compactSummary = this.#getCompactSummary();
397
- const systemPrompt = this.#buildSystemPrompt(mode, undefined, compactSummary, prompt, memoryInjection);
387
+ const systemPrompt = this.#buildSystemPrompt(undefined, compactSummary, prompt, memoryInjection);
398
388
 
399
389
  // Build conversation: existing messages + new user message
400
390
  const conversationMessages = [
@@ -423,7 +413,6 @@ export class Engine {
423
413
 
424
414
  const turnId = this.#trace.startTurn({
425
415
  traceId: this.#traceId,
426
- mode,
427
416
  turnNumber,
428
417
  });
429
418
 
@@ -590,7 +579,6 @@ export class Engine {
590
579
  // but receives both configs — messages are persisted with primary model name
591
580
  const hookResult = await runStopHooks({
592
581
  yeaftDir: this.#yeaftDir,
593
- mode,
594
582
  conversationStore: this.#conversationStore,
595
583
  memoryStore: this.#memoryStore,
596
584
  adapter: this.#adapter,
@@ -608,7 +596,7 @@ export class Engine {
608
596
  }
609
597
  } else {
610
598
  // Legacy path (no yeaftDir → use old behavior)
611
- this.#persistMessages(prompt, fullResponseText, mode, assistantMsg.toolCalls);
599
+ this.#persistMessages(prompt, fullResponseText, assistantMsg.toolCalls);
612
600
 
613
601
  const consolidated = await this.#maybeConsolidate();
614
602
  if (consolidated && consolidated.archivedCount > 0) {
@@ -620,7 +608,7 @@ export class Engine {
620
608
  }
621
609
 
622
610
  // Execute tool calls and feed results back
623
- const toolCtx = this.#buildToolContext(signal, mode);
611
+ const toolCtx = this.#buildToolContext(signal);
624
612
 
625
613
  for (const tc of toolCalls) {
626
614
  const toolStartTime = Date.now();
@@ -242,7 +242,6 @@ export const toolUseCases = [
242
242
  suite: 'tools',
243
243
  description: 'Model should read a file then modify it (sequential tools)',
244
244
  prompt: 'Read src/index.js and add a health check endpoint at /health',
245
- mode: 'work',
246
245
  registryTools: allTools,
247
246
  criteria: [
248
247
  noError,
@@ -268,9 +267,8 @@ export const toolUseCases = [
268
267
  {
269
268
  id: 'tool-multi-bash-workflow',
270
269
  suite: 'tools',
271
- description: 'Model should run git status and npm test in work mode',
270
+ description: 'Model should run git status and npm test',
272
271
  prompt: 'Check the git status and run the tests',
273
- mode: 'work',
274
272
  registryTools: allTools,
275
273
  criteria: [
276
274
  noError,
@@ -290,25 +288,6 @@ export const toolUseCases = [
290
288
  ],
291
289
  },
292
290
 
293
- // ─── Mode Awareness ───────────────────────────────────
294
-
295
- {
296
- id: 'tool-mode-chat-no-write',
297
- suite: 'tools',
298
- description: 'In chat mode, write_file should not be available (work-only tool)',
299
- prompt: 'Write "hello" to a file called greeting.txt',
300
- mode: 'chat',
301
- registryTools: allTools,
302
- criteria: [
303
- noError,
304
- toolNotCalled('write_file', {
305
- weight: 10,
306
- id: 'no-write-in-chat',
307
- description: 'write_file is work-only and should not be called in chat mode',
308
- }),
309
- ],
310
- },
311
-
312
291
  // ─── Error Handling ───────────────────────────────────
313
292
 
314
293
  {