@yeaft/webchat-agent 1.0.456 → 1.0.457

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yeaft/webchat-agent",
3
- "version": "1.0.456",
3
+ "version": "1.0.457",
4
4
  "description": "Remote worker agent for Yeaft Web Code Agent — connects the native Yeaft engine, CLI providers, and workbench tools",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/yeaft/config.js CHANGED
@@ -377,6 +377,7 @@ function loadLegacyConfig(dir, overrides) {
377
377
  // task-318: legacy path never had the `yeaft` section — defaults.
378
378
  yeaft: normaliseYeaftSection(null),
379
379
  telemetry: normaliseTelemetrySection(null),
380
+ dream: { enabled: true },
380
381
  browserRuntime: normaliseBrowserRuntimeSection(null),
381
382
  plugins: {},
382
383
  providers: null,
@@ -534,6 +535,7 @@ export function loadConfig(overrides = {}) {
534
535
  // don't pollute the flat config namespace used by chat code.
535
536
  yeaft: normaliseYeaftSection(jsonConfig.yeaft),
536
537
  telemetry: normaliseTelemetrySection(jsonConfig.telemetry),
538
+ dream: { enabled: jsonConfig.dream?.enabled !== false },
537
539
  browserRuntime: normaliseBrowserRuntimeSection(jsonConfig.browserRuntime),
538
540
 
539
541
  // Agent-level tools / skills / MCP server allowlists. Missing fields mean
@@ -668,8 +668,8 @@ export function createV2DreamScheduler(session) {
668
668
  keepAlive: !!session?.config?.serverMode,
669
669
  logger: session.config?.debug ? console : undefined,
670
670
  });
671
- // Auto-start the timer.
672
- v2.start();
671
+ let enabled = session?.config?.dream?.enabled !== false;
672
+ if (enabled) v2.start();
673
673
 
674
674
  // task-710: wire `noteUserMessage` to a real per-session message
675
675
  // counter. When the count crosses DREAM_NUDGE_AFTER_MESSAGES (default
@@ -685,6 +685,7 @@ export function createV2DreamScheduler(session) {
685
685
  // immediately, defeating the 50-message guarantee.
686
686
  let messagesSinceLastNudgeFire = 0;
687
687
  function nudgeOnUserMessage() {
688
+ if (!enabled) return;
688
689
  messagesSinceLastNudgeFire += 1;
689
690
  if (messagesSinceLastNudgeFire < DREAM_NUDGE_AFTER_MESSAGES) return;
690
691
  if (v2.isRunning()) {
@@ -709,8 +710,20 @@ export function createV2DreamScheduler(session) {
709
710
  * below threshold are skipped — same shape as the interval timer
710
711
  * tick. Used by `bootCatchUpStaleDream`.
711
712
  */
712
- catchUpNudge() { return v2.nudge(); },
713
+ catchUpNudge() {
714
+ return enabled ? v2.nudge() : Promise.resolve({ skipped: true, skippedReason: 'disabled', trigger: 'auto' });
715
+ },
716
+ setEnabled(nextEnabled) {
717
+ enabled = nextEnabled !== false;
718
+ if (enabled) v2.start();
719
+ else {
720
+ messagesSinceLastNudgeFire = 0;
721
+ v2.stop();
722
+ }
723
+ return enabled;
724
+ },
713
725
  shutdown() { v2.stop(); },
726
+ get enabled() { return enabled; },
714
727
  get isRunning() { return v2.isRunning(); },
715
728
  // Preserve direct access for tests.
716
729
  _v2: v2,
@@ -727,12 +740,16 @@ export function createV2DreamScheduler(session) {
727
740
  * Pure side-effect, fire-and-forget. Failure logs at debug only — never
728
741
  * blocks session load.
729
742
  *
730
- * @param {{ yeaftDir: string, memoryIndex: import('../memory/index-db.js').SegmentIndex|null, dreamScheduler: { triggerDreamForScopes: (s:string[]) => Promise<any> }, config?: { debug?: boolean } }} args
743
+ * @param {{ yeaftDir: string, memoryIndex: import('../memory/index-db.js').SegmentIndex|null, dreamScheduler: { triggerDreamForScopes: (s:string[]) => Promise<any> }, config?: { debug?: boolean, dream?: { enabled?: boolean } } }} args
731
744
  * @returns {Promise<{ triggered: string[] }>}
732
745
  */
733
746
  export async function bootInitEmptyGroups(args) {
734
747
  const out = { triggered: [] };
735
748
  if (!args || !args.memoryIndex || !args.dreamScheduler) return out;
749
+ // This is automatic boot catch-up, not an explicit user trigger. The
750
+ // scheduler's scoped trigger intentionally remains manual-capable while
751
+ // disabled, so enforce the Agent toggle at this automatic entry point.
752
+ if (args.config?.dream?.enabled === false) return out;
736
753
  const sessionsRoot = join(args.yeaftDir, 'sessions');
737
754
  let ids;
738
755
  try { ids = listSessionMetas(sessionsRoot).map(g => g.id); }
package/yeaft/session.js CHANGED
@@ -136,6 +136,7 @@ export async function loadSession(options = {}) {
136
136
  extraTools = [],
137
137
  configOverrides = {},
138
138
  serverMode = false,
139
+ dreamEnabled,
139
140
  managedCliReady = null,
140
141
  } = options;
141
142
 
@@ -172,6 +173,7 @@ export async function loadSession(options = {}) {
172
173
  // can decide whether to keep its interval timer alive (server) or
173
174
  // unref it (CLI / tests). Non-persisted — set per-session by caller.
174
175
  if (serverMode) config.serverMode = true;
176
+ if (typeof dreamEnabled === 'boolean') config.dream.enabled = dreamEnabled;
175
177
 
176
178
  // Propagate the (clamped) cold-start replay window to the conversation
177
179
  // store. The default is 20 turns; a user wanting more recall after a