@0xmaxma/claude-gateway 1.6.8 → 1.7.0
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/README.md +149 -20
- package/config.template.json +59 -1
- package/dist/agent/dreaming/accept.d.ts +43 -0
- package/dist/agent/dreaming/accept.d.ts.map +1 -0
- package/dist/agent/dreaming/accept.js +230 -0
- package/dist/agent/dreaming/accept.js.map +1 -0
- package/dist/agent/dreaming/applier.d.ts +77 -0
- package/dist/agent/dreaming/applier.d.ts.map +1 -0
- package/dist/agent/dreaming/applier.js +406 -0
- package/dist/agent/dreaming/applier.js.map +1 -0
- package/dist/agent/dreaming/audit.d.ts +27 -0
- package/dist/agent/dreaming/audit.d.ts.map +1 -0
- package/dist/agent/dreaming/audit.js +100 -0
- package/dist/agent/dreaming/audit.js.map +1 -0
- package/dist/agent/dreaming/compactor.d.ts +66 -0
- package/dist/agent/dreaming/compactor.d.ts.map +1 -0
- package/dist/agent/dreaming/compactor.js +306 -0
- package/dist/agent/dreaming/compactor.js.map +1 -0
- package/dist/agent/dreaming/config.d.ts +19 -0
- package/dist/agent/dreaming/config.d.ts.map +1 -0
- package/dist/agent/dreaming/config.js +107 -0
- package/dist/agent/dreaming/config.js.map +1 -0
- package/dist/agent/dreaming/episodic.d.ts +42 -0
- package/dist/agent/dreaming/episodic.d.ts.map +1 -0
- package/dist/agent/dreaming/episodic.js +116 -0
- package/dist/agent/dreaming/episodic.js.map +1 -0
- package/dist/agent/dreaming/gather.d.ts +31 -0
- package/dist/agent/dreaming/gather.d.ts.map +1 -0
- package/dist/agent/dreaming/gather.js +55 -0
- package/dist/agent/dreaming/gather.js.map +1 -0
- package/dist/agent/dreaming/index.d.ts +87 -0
- package/dist/agent/dreaming/index.d.ts.map +1 -0
- package/dist/agent/dreaming/index.js +377 -0
- package/dist/agent/dreaming/index.js.map +1 -0
- package/dist/agent/dreaming/migrate-cli.d.ts +17 -0
- package/dist/agent/dreaming/migrate-cli.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate-cli.js +42 -0
- package/dist/agent/dreaming/migrate-cli.js.map +1 -0
- package/dist/agent/dreaming/migrate.d.ts +72 -0
- package/dist/agent/dreaming/migrate.d.ts.map +1 -0
- package/dist/agent/dreaming/migrate.js +374 -0
- package/dist/agent/dreaming/migrate.js.map +1 -0
- package/dist/agent/dreaming/report.d.ts +39 -0
- package/dist/agent/dreaming/report.d.ts.map +1 -0
- package/dist/agent/dreaming/report.js +121 -0
- package/dist/agent/dreaming/report.js.map +1 -0
- package/dist/agent/dreaming/reviewer.d.ts +43 -0
- package/dist/agent/dreaming/reviewer.d.ts.map +1 -0
- package/dist/agent/dreaming/reviewer.js +249 -0
- package/dist/agent/dreaming/reviewer.js.map +1 -0
- package/dist/agent/dreaming/staleness.d.ts +68 -0
- package/dist/agent/dreaming/staleness.d.ts.map +1 -0
- package/dist/agent/dreaming/staleness.js +281 -0
- package/dist/agent/dreaming/staleness.js.map +1 -0
- package/dist/agent/dreaming/types.d.ts +130 -0
- package/dist/agent/dreaming/types.d.ts.map +1 -0
- package/dist/agent/dreaming/types.js +10 -0
- package/dist/agent/dreaming/types.js.map +1 -0
- package/dist/agent/knowledge/archive-db.d.ts +114 -0
- package/dist/agent/knowledge/archive-db.d.ts.map +1 -0
- package/dist/agent/knowledge/archive-db.js +474 -0
- package/dist/agent/knowledge/archive-db.js.map +1 -0
- package/dist/agent/knowledge/chunk.d.ts +21 -0
- package/dist/agent/knowledge/chunk.d.ts.map +1 -0
- package/dist/agent/knowledge/chunk.js +67 -0
- package/dist/agent/knowledge/chunk.js.map +1 -0
- package/dist/agent/knowledge/config.d.ts +20 -0
- package/dist/agent/knowledge/config.d.ts.map +1 -0
- package/dist/agent/knowledge/config.js +143 -0
- package/dist/agent/knowledge/config.js.map +1 -0
- package/dist/agent/knowledge/graph-demo.d.ts +25 -0
- package/dist/agent/knowledge/graph-demo.d.ts.map +1 -0
- package/dist/agent/knowledge/graph-demo.js +132 -0
- package/dist/agent/knowledge/graph-demo.js.map +1 -0
- package/dist/agent/knowledge/index.d.ts +24 -0
- package/dist/agent/knowledge/index.d.ts.map +1 -0
- package/dist/agent/knowledge/index.js +50 -0
- package/dist/agent/knowledge/index.js.map +1 -0
- package/dist/agent/knowledge/indexer.d.ts +34 -0
- package/dist/agent/knowledge/indexer.d.ts.map +1 -0
- package/dist/agent/knowledge/indexer.js +271 -0
- package/dist/agent/knowledge/indexer.js.map +1 -0
- package/dist/agent/knowledge/lifecycle.d.ts +91 -0
- package/dist/agent/knowledge/lifecycle.d.ts.map +1 -0
- package/dist/agent/knowledge/lifecycle.js +205 -0
- package/dist/agent/knowledge/lifecycle.js.map +1 -0
- package/dist/agent/knowledge/provenance.d.ts +15 -0
- package/dist/agent/knowledge/provenance.d.ts.map +1 -0
- package/dist/agent/knowledge/provenance.js +37 -0
- package/dist/agent/knowledge/provenance.js.map +1 -0
- package/dist/agent/knowledge/reindex-cli.d.ts +13 -0
- package/dist/agent/knowledge/reindex-cli.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-cli.js +53 -0
- package/dist/agent/knowledge/reindex-cli.js.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts +30 -0
- package/dist/agent/knowledge/reindex-spawn.d.ts.map +1 -0
- package/dist/agent/knowledge/reindex-spawn.js +97 -0
- package/dist/agent/knowledge/reindex-spawn.js.map +1 -0
- package/dist/agent/knowledge/shared-promote.d.ts +18 -0
- package/dist/agent/knowledge/shared-promote.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-promote.js +29 -0
- package/dist/agent/knowledge/shared-promote.js.map +1 -0
- package/dist/agent/knowledge/shared-writer.d.ts +24 -0
- package/dist/agent/knowledge/shared-writer.d.ts.map +1 -0
- package/dist/agent/knowledge/shared-writer.js +97 -0
- package/dist/agent/knowledge/shared-writer.js.map +1 -0
- package/dist/agent/knowledge/types.d.ts +83 -0
- package/dist/agent/knowledge/types.d.ts.map +1 -0
- package/dist/agent/knowledge/types.js +12 -0
- package/dist/agent/knowledge/types.js.map +1 -0
- package/dist/agent/knowledge/wiki.d.ts +107 -0
- package/dist/agent/knowledge/wiki.d.ts.map +1 -0
- package/dist/agent/knowledge/wiki.js +415 -0
- package/dist/agent/knowledge/wiki.js.map +1 -0
- package/dist/agent/memory-metrics.d.ts +48 -0
- package/dist/agent/memory-metrics.d.ts.map +1 -0
- package/dist/agent/memory-metrics.js +156 -0
- package/dist/agent/memory-metrics.js.map +1 -0
- package/dist/agent/runner.d.ts +24 -1
- package/dist/agent/runner.d.ts.map +1 -1
- package/dist/agent/runner.js +82 -6
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/skill-learning/config.d.ts +18 -0
- package/dist/agent/skill-learning/config.d.ts.map +1 -0
- package/dist/agent/skill-learning/config.js +71 -0
- package/dist/agent/skill-learning/config.js.map +1 -0
- package/dist/agent/skill-learning/curator.d.ts +45 -0
- package/dist/agent/skill-learning/curator.d.ts.map +1 -0
- package/dist/agent/skill-learning/curator.js +171 -0
- package/dist/agent/skill-learning/curator.js.map +1 -0
- package/dist/agent/skill-learning/index.d.ts +79 -0
- package/dist/agent/skill-learning/index.d.ts.map +1 -0
- package/dist/agent/skill-learning/index.js +308 -0
- package/dist/agent/skill-learning/index.js.map +1 -0
- package/dist/agent/skill-learning/metrics.d.ts +13 -0
- package/dist/agent/skill-learning/metrics.d.ts.map +1 -0
- package/dist/agent/skill-learning/metrics.js +109 -0
- package/dist/agent/skill-learning/metrics.js.map +1 -0
- package/dist/agent/skill-learning/notifier.d.ts +111 -0
- package/dist/agent/skill-learning/notifier.d.ts.map +1 -0
- package/dist/agent/skill-learning/notifier.js +398 -0
- package/dist/agent/skill-learning/notifier.js.map +1 -0
- package/dist/agent/skill-learning/reviewer.d.ts +61 -0
- package/dist/agent/skill-learning/reviewer.d.ts.map +1 -0
- package/dist/agent/skill-learning/reviewer.js +271 -0
- package/dist/agent/skill-learning/reviewer.js.map +1 -0
- package/dist/agent/skill-learning/telemetry.d.ts +22 -0
- package/dist/agent/skill-learning/telemetry.d.ts.map +1 -0
- package/dist/agent/skill-learning/telemetry.js +90 -0
- package/dist/agent/skill-learning/telemetry.js.map +1 -0
- package/dist/agent/skill-learning/trigger.d.ts +23 -0
- package/dist/agent/skill-learning/trigger.d.ts.map +1 -0
- package/dist/agent/skill-learning/trigger.js +44 -0
- package/dist/agent/skill-learning/trigger.js.map +1 -0
- package/dist/agent/skill-learning/types.d.ts +165 -0
- package/dist/agent/skill-learning/types.d.ts.map +1 -0
- package/dist/agent/skill-learning/types.js +11 -0
- package/dist/agent/skill-learning/types.js.map +1 -0
- package/dist/agent/skill-learning/writer.d.ts +37 -0
- package/dist/agent/skill-learning/writer.d.ts.map +1 -0
- package/dist/agent/skill-learning/writer.js +223 -0
- package/dist/agent/skill-learning/writer.js.map +1 -0
- package/dist/agent/workspace-loader.d.ts +83 -6
- package/dist/agent/workspace-loader.d.ts.map +1 -1
- package/dist/agent/workspace-loader.js +207 -14
- package/dist/agent/workspace-loader.js.map +1 -1
- package/dist/api/gateway-router.d.ts +2 -0
- package/dist/api/gateway-router.d.ts.map +1 -1
- package/dist/api/gateway-router.js +293 -6
- package/dist/api/gateway-router.js.map +1 -1
- package/dist/api/share-router.d.ts.map +1 -1
- package/dist/api/share-router.js +27 -1
- package/dist/api/share-router.js.map +1 -1
- package/dist/api/skills-router.d.ts +2 -2
- package/dist/api/skills-router.d.ts.map +1 -1
- package/dist/api/skills-router.js +61 -1
- package/dist/api/skills-router.js.map +1 -1
- package/dist/apps/agent-manager.d.ts +7 -0
- package/dist/apps/agent-manager.d.ts.map +1 -1
- package/dist/apps/agent-manager.js +13 -1
- package/dist/apps/agent-manager.js.map +1 -1
- package/dist/config/migrator.d.ts +2 -0
- package/dist/config/migrator.d.ts.map +1 -1
- package/dist/config/migrator.js +72 -1
- package/dist/config/migrator.js.map +1 -1
- package/dist/history/cleanup.d.ts +7 -0
- package/dist/history/cleanup.d.ts.map +1 -1
- package/dist/history/cleanup.js +27 -0
- package/dist/history/cleanup.js.map +1 -1
- package/dist/history/db.d.ts +65 -0
- package/dist/history/db.d.ts.map +1 -1
- package/dist/history/db.js +261 -0
- package/dist/history/db.js.map +1 -1
- package/dist/index.js +122 -20
- package/dist/index.js.map +1 -1
- package/dist/session/process.d.ts +10 -0
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +86 -1
- package/dist/session/process.js.map +1 -1
- package/dist/share/share-store.d.ts +11 -0
- package/dist/share/share-store.d.ts.map +1 -1
- package/dist/share/share-store.js +3 -1
- package/dist/share/share-store.js.map +1 -1
- package/dist/skills/loader.d.ts +8 -0
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +29 -1
- package/dist/skills/loader.js.map +1 -1
- package/dist/types.d.ts +116 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/web-ui.d.ts.map +1 -1
- package/dist/ui/web-ui.js +1126 -3
- package/dist/ui/web-ui.js.map +1 -1
- package/mcp/package.json +2 -1
- package/mcp/server.ts +2 -0
- package/mcp/tools/image/module.ts +114 -9
- package/mcp/tools/memory/archive-reader.test.ts +212 -0
- package/mcp/tools/memory/archive-reader.ts +253 -0
- package/mcp/tools/memory/module.ts +152 -0
- package/mcp/tools/memory/retrieval-recorder.ts +66 -0
- package/mcp/tools/shared/share-client.ts +20 -1
- package/mcp/tools/skills/module.ts +28 -0
- package/package.json +1 -1
- package/resource/claude_gateway.svg +1038 -112
package/dist/agent/runner.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { AgentConfig, GatewayConfig, Logger, ModelConfig, StreamEvent, ApiAttach
|
|
|
3
3
|
import { type SkillRegistry } from '../skills';
|
|
4
4
|
import { type CliChannel } from '../cli-viewer/pairing-store';
|
|
5
5
|
import { HistoryDB } from '../history/db';
|
|
6
|
+
import type { SkillLearningManager } from './skill-learning';
|
|
6
7
|
export declare const MAX_IMAGE_SIZE_BYTES: number;
|
|
7
8
|
export declare const DEFAULT_MODELS: ModelConfig[];
|
|
8
9
|
export declare const CHANNEL_COALESCE_WINDOW_MS = 1200;
|
|
@@ -57,6 +58,7 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
57
58
|
private readonly sessionHistory;
|
|
58
59
|
private readonly apiChatIds;
|
|
59
60
|
private skillRegistry;
|
|
61
|
+
private skillLearning?;
|
|
60
62
|
private readonly configPath;
|
|
61
63
|
private readonly historyDb;
|
|
62
64
|
private readonly agentsBaseDir;
|
|
@@ -68,6 +70,9 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
68
70
|
*/
|
|
69
71
|
setSkillRegistry(registry: SkillRegistry): void;
|
|
70
72
|
getSkillRegistry(): SkillRegistry;
|
|
73
|
+
/** Wire the skill-learning manager (planning-62). Optional; unset = feature off. */
|
|
74
|
+
setSkillLearning(manager: SkillLearningManager | undefined): void;
|
|
75
|
+
getSkillLearning(): SkillLearningManager | undefined;
|
|
71
76
|
get workspacePath(): string;
|
|
72
77
|
/**
|
|
73
78
|
* Bind a local HTTP server that receives POST /channel from TelegramReceiver.
|
|
@@ -289,10 +294,28 @@ export declare class AgentRunner extends EventEmitter {
|
|
|
289
294
|
* restarted so the change reaches them on their next spawn. The recomposed
|
|
290
295
|
* CLAUDE.md is already on disk, so a skipped busy session picks up the
|
|
291
296
|
* change on its own next natural spawn.
|
|
297
|
+
* @param opts.deferIdle When true, idle sessions are NOT `stop()`ed now.
|
|
298
|
+
* Instead they are added to the runner-level `pendingRestarts` set, so each
|
|
299
|
+
* respawns cleanly on its next message (the same lossless mechanism used for
|
|
300
|
+
* the image-size-threshold restart) rather than being SIGKILLed mid-idle and
|
|
301
|
+
* losing its in-context state. Since CLAUDE.md is frozen-at-spawn, an idle
|
|
302
|
+
* bystander gains nothing from an immediate stop — the recomposed file
|
|
303
|
+
* applies on its next spawn either way. Use for agent-writable/identity and
|
|
304
|
+
* skills changes, where dropping an unrelated idle session is pure downside.
|
|
305
|
+
* NB: idle sessions are deferred via `pendingRestarts`, NOT
|
|
306
|
+
* `proc.markPendingRestart()` — the latter emits `deferredRestartReady`
|
|
307
|
+
* synchronously on an idle process, which stops it immediately (no deferral).
|
|
308
|
+
* @returns Counts of sessions handled: `immediate` (stopped now), `deferred`
|
|
309
|
+
* (armed to restart on next turn/message), `skipped` (left untouched).
|
|
292
310
|
*/
|
|
293
311
|
restartOrDefer(opts?: {
|
|
294
312
|
skipBusy?: boolean;
|
|
295
|
-
|
|
313
|
+
deferIdle?: boolean;
|
|
314
|
+
}): Promise<{
|
|
315
|
+
immediate: number;
|
|
316
|
+
deferred: number;
|
|
317
|
+
skipped: number;
|
|
318
|
+
}>;
|
|
296
319
|
/**
|
|
297
320
|
* Format a timestamp as a human-readable age string (e.g. "5m ago", "2h ago").
|
|
298
321
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAW,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS7H,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAOvF,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG7F,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/agent/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/runner.js
CHANGED
|
@@ -61,6 +61,7 @@ const screen_1 = require("../shell/screen");
|
|
|
61
61
|
const db_1 = require("../history/db");
|
|
62
62
|
const media_store_1 = require("../history/media-store");
|
|
63
63
|
const cleanup_1 = require("../history/cleanup");
|
|
64
|
+
const knowledge_1 = require("./knowledge");
|
|
64
65
|
const DEFAULT_IDLE_TIMEOUT_MINUTES = 30;
|
|
65
66
|
const DEFAULT_MAX_CONCURRENT = 20;
|
|
66
67
|
const ANTHROPIC_SOCKET_ERROR = 'socket connection was closed unexpectedly';
|
|
@@ -327,6 +328,13 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
327
328
|
getSkillRegistry() {
|
|
328
329
|
return this.skillRegistry;
|
|
329
330
|
}
|
|
331
|
+
/** Wire the skill-learning manager (planning-62). Optional; unset = feature off. */
|
|
332
|
+
setSkillLearning(manager) {
|
|
333
|
+
this.skillLearning = manager;
|
|
334
|
+
}
|
|
335
|
+
getSkillLearning() {
|
|
336
|
+
return this.skillLearning;
|
|
337
|
+
}
|
|
330
338
|
get workspacePath() {
|
|
331
339
|
return this.agentConfig.workspace;
|
|
332
340
|
}
|
|
@@ -481,6 +489,8 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
481
489
|
failureClass: body.failureClass ?? null,
|
|
482
490
|
turnKey: body.turnKey ?? chatId,
|
|
483
491
|
};
|
|
492
|
+
// Skill-learning: an incident-driven recovery attempt on this chat's turn.
|
|
493
|
+
this.skillLearning?.onRecoveryFired(chatId);
|
|
484
494
|
try {
|
|
485
495
|
const result = await (0, recovery_executor_1.runRecovery)(req, {
|
|
486
496
|
autoRecover,
|
|
@@ -952,15 +962,25 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
952
962
|
ts: userTs,
|
|
953
963
|
});
|
|
954
964
|
}
|
|
955
|
-
//
|
|
965
|
+
// Consume a deferred restart before this turn (armed by the image-size
|
|
966
|
+
// threshold, or by a workspace/skills change that deferred this idle
|
|
967
|
+
// session). Guard on isProcessing: this same chatId key can be driven by
|
|
968
|
+
// a web-UI live-view turn (sendMessageToSession) that does NOT hold
|
|
969
|
+
// turnActive, so the session may be mid-stream here. Stopping it would
|
|
970
|
+
// truncate that live turn — instead leave the flag armed and consume it
|
|
971
|
+
// on the next idle turn. In the normal channel flow the session is idle
|
|
972
|
+
// at this point (turnActive serialises channel turns), so the guard is a
|
|
973
|
+
// no-op and the restart proceeds as before.
|
|
956
974
|
if (this.pendingRestarts.has(chatId)) {
|
|
957
975
|
const existingSession = this.sessions.get(chatId);
|
|
958
|
-
if (existingSession) {
|
|
959
|
-
|
|
960
|
-
|
|
976
|
+
if (!existingSession?.isProcessing) {
|
|
977
|
+
if (existingSession) {
|
|
978
|
+
await existingSession.stop();
|
|
979
|
+
this.sessions.delete(chatId);
|
|
980
|
+
}
|
|
981
|
+
this.pendingRestarts.delete(chatId);
|
|
982
|
+
this.imageSizePerChat.delete(chatId);
|
|
961
983
|
}
|
|
962
|
-
this.pendingRestarts.delete(chatId);
|
|
963
|
-
this.imageSizePerChat.delete(chatId);
|
|
964
984
|
}
|
|
965
985
|
// Route to session process (map key = chatId, actual sessionId passed separately)
|
|
966
986
|
// Channel sessions use agent-level model (not per-session)
|
|
@@ -968,11 +988,13 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
968
988
|
// Merge buffered messages into one turn: concat channel XML blocks, append
|
|
969
989
|
// any skill context, and accumulate image paths for size tracking.
|
|
970
990
|
const blocks = [];
|
|
991
|
+
const invokedSkills = [];
|
|
971
992
|
for (const entry of entries) {
|
|
972
993
|
let channelXml = AgentRunner.buildChannelXml(entry);
|
|
973
994
|
const skillInvocation = (0, skills_1.detectSkillCommand)(entry.content ?? '', this.skillRegistry);
|
|
974
995
|
if (skillInvocation) {
|
|
975
996
|
channelXml += (0, skills_1.formatSkillContext)(skillInvocation);
|
|
997
|
+
invokedSkills.push(skillInvocation.skillKey);
|
|
976
998
|
this.logger.info('Skill invoked', {
|
|
977
999
|
skill: skillInvocation.skillKey,
|
|
978
1000
|
args: skillInvocation.args,
|
|
@@ -998,6 +1020,8 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
998
1020
|
}
|
|
999
1021
|
session.setProcessing(true);
|
|
1000
1022
|
const turnText = blocks.join('\n');
|
|
1023
|
+
// Skill-learning: mark the start of a user turn (cheap, best-effort).
|
|
1024
|
+
this.skillLearning?.onTurnStart(chatId, sessionId, entries[0]?.content ?? '', invokedSkills);
|
|
1001
1025
|
session.sendMessage(turnText);
|
|
1002
1026
|
// Remember this turn for the C1 guarded resend (Phase 3b): reset the
|
|
1003
1027
|
// delivered/resent flags so a resend can only fire if this turn stalls
|
|
@@ -1204,6 +1228,9 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
1204
1228
|
// Apply per-session model override (caller already normalized to undefined when == agent default)
|
|
1205
1229
|
if (modelOverride)
|
|
1206
1230
|
proc.modelOverride = modelOverride;
|
|
1231
|
+
// Keep the searchable memory archive (planning-64) fresh for the memory_search
|
|
1232
|
+
// tool. Fire-and-forget, detached, OFF the event loop — never blocks the spawn.
|
|
1233
|
+
(0, knowledge_1.spawnArchiveReindex)(this.agentConfig.workspace, this.agentConfig.knowledge, this.gatewayConfig.gateway.knowledge);
|
|
1207
1234
|
// Per-agent → global → MAX_HISTORY_MESSAGES: the configured cap on how many
|
|
1208
1235
|
// history messages a healthy spawn re-injects. Lets an operator lower the
|
|
1209
1236
|
// context loaded at session start (e.g. 50 → 30) without touching code.
|
|
@@ -1293,6 +1320,12 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
1293
1320
|
const msg = obj['message'];
|
|
1294
1321
|
if (Array.isArray(msg?.content)) {
|
|
1295
1322
|
for (const block of msg.content) {
|
|
1323
|
+
// Skill-learning: count every tool_use this turn (deduped by block
|
|
1324
|
+
// id inside the manager, since cumulative assistant snapshots re-emit
|
|
1325
|
+
// completed blocks). Cheap, best-effort.
|
|
1326
|
+
if (block.type === 'tool_use') {
|
|
1327
|
+
this.skillLearning?.onToolUse(mapKey, block['id']);
|
|
1328
|
+
}
|
|
1296
1329
|
// LINE sends images through its own line_image tool (not the reply
|
|
1297
1330
|
// tool's `files`), so capture those sends into history too — the
|
|
1298
1331
|
// web transcript and the session image catalog key off mediaFiles.
|
|
@@ -1426,6 +1459,13 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
1426
1459
|
}
|
|
1427
1460
|
if (obj['type'] === 'result') {
|
|
1428
1461
|
proc.setProcessing(false);
|
|
1462
|
+
// Skill-learning: on the headless backend `result` is the true
|
|
1463
|
+
// end-of-user-turn (exactly one per message) — persist the turn metric
|
|
1464
|
+
// here. pty-shell fires `result` per sub-turn, so its capture is driven
|
|
1465
|
+
// by `session_idle` (below) to avoid over-counting.
|
|
1466
|
+
if (proc.backend !== 'pty-shell') {
|
|
1467
|
+
this.skillLearning?.onTurnEnd(mapKey, actualSessionId);
|
|
1468
|
+
}
|
|
1429
1469
|
// Gateway turn queue: on the headless backend `result` is the true end
|
|
1430
1470
|
// of the user's turn (exactly one per message), so flush the next
|
|
1431
1471
|
// queued turn here. On pty-shell `result` fires per sub-turn (across
|
|
@@ -1579,6 +1619,8 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
1579
1619
|
if (!proc.hasPendingRestart()) {
|
|
1580
1620
|
this.flushNextTurn(mapKey);
|
|
1581
1621
|
}
|
|
1622
|
+
// Skill-learning: pty-shell session_idle is the true end-of-user-turn.
|
|
1623
|
+
this.skillLearning?.onTurnEnd(mapKey, actualSessionId);
|
|
1582
1624
|
typingDoneTimer = setTimeout(() => {
|
|
1583
1625
|
this.writeTypingDone(mapKey);
|
|
1584
1626
|
typingDoneTimer = null;
|
|
@@ -1591,6 +1633,7 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
1591
1633
|
// Use actualSessionId (captured at spawn time) — NOT getActiveSessionId() —
|
|
1592
1634
|
// so tokens are attributed to the session that owns this process.
|
|
1593
1635
|
proc.on('tokenUsage', async ({ inputTokens, totalTokens }) => {
|
|
1636
|
+
this.skillLearning?.onTokenUsage(mapKey, inputTokens, totalTokens);
|
|
1594
1637
|
try {
|
|
1595
1638
|
const ch = this.channelFor(mapKey);
|
|
1596
1639
|
const index = await this.sessionStore.listSessions(this.agentConfig.id, mapKey, ch);
|
|
@@ -1958,6 +2001,8 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
1958
2001
|
*/
|
|
1959
2002
|
handleRequestTooLarge(mapKey, proc) {
|
|
1960
2003
|
proc.setProcessing(false);
|
|
2004
|
+
// Skill-learning: a recovery event this turn (feeds the trigger + recovery-rate measure).
|
|
2005
|
+
this.skillLearning?.onRecoveryFired(mapKey);
|
|
1961
2006
|
// Recovery steps through the ladder rungs strictly below the configured cap;
|
|
1962
2007
|
// the number of those rungs is how many shrink attempts exist before even the
|
|
1963
2008
|
// smallest (0-history) spawn has been tried and still trips 32MB.
|
|
@@ -2012,9 +2057,23 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
2012
2057
|
* restarted so the change reaches them on their next spawn. The recomposed
|
|
2013
2058
|
* CLAUDE.md is already on disk, so a skipped busy session picks up the
|
|
2014
2059
|
* change on its own next natural spawn.
|
|
2060
|
+
* @param opts.deferIdle When true, idle sessions are NOT `stop()`ed now.
|
|
2061
|
+
* Instead they are added to the runner-level `pendingRestarts` set, so each
|
|
2062
|
+
* respawns cleanly on its next message (the same lossless mechanism used for
|
|
2063
|
+
* the image-size-threshold restart) rather than being SIGKILLed mid-idle and
|
|
2064
|
+
* losing its in-context state. Since CLAUDE.md is frozen-at-spawn, an idle
|
|
2065
|
+
* bystander gains nothing from an immediate stop — the recomposed file
|
|
2066
|
+
* applies on its next spawn either way. Use for agent-writable/identity and
|
|
2067
|
+
* skills changes, where dropping an unrelated idle session is pure downside.
|
|
2068
|
+
* NB: idle sessions are deferred via `pendingRestarts`, NOT
|
|
2069
|
+
* `proc.markPendingRestart()` — the latter emits `deferredRestartReady`
|
|
2070
|
+
* synchronously on an idle process, which stops it immediately (no deferral).
|
|
2071
|
+
* @returns Counts of sessions handled: `immediate` (stopped now), `deferred`
|
|
2072
|
+
* (armed to restart on next turn/message), `skipped` (left untouched).
|
|
2015
2073
|
*/
|
|
2016
2074
|
async restartOrDefer(opts) {
|
|
2017
2075
|
const skipBusy = opts?.skipBusy ?? false;
|
|
2076
|
+
const deferIdle = opts?.deferIdle ?? false;
|
|
2018
2077
|
let immediate = 0;
|
|
2019
2078
|
let deferred = 0;
|
|
2020
2079
|
let skipped = 0;
|
|
@@ -2028,6 +2087,22 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
2028
2087
|
proc.markPendingRestart();
|
|
2029
2088
|
deferred++;
|
|
2030
2089
|
}
|
|
2090
|
+
else if (deferIdle && proc.source !== 'api') {
|
|
2091
|
+
// Lossless deferral for CHANNEL sessions only: leave the idle process
|
|
2092
|
+
// running and arm a restart on its next message (mirrors the
|
|
2093
|
+
// image-size-threshold path). Do NOT call proc.markPendingRestart() here
|
|
2094
|
+
// — on an idle process it fires deferredRestartReady immediately and
|
|
2095
|
+
// stops the session.
|
|
2096
|
+
//
|
|
2097
|
+
// Guard on source: `pendingRestarts` is consumed ONLY in injectTurn (the
|
|
2098
|
+
// channel turn path, keyed by chatId). api / __heartbeat__ sessions are
|
|
2099
|
+
// keyed by sessionId and never flow through injectTurn, so an entry armed
|
|
2100
|
+
// for them would never be consumed — it would leak in the Set and the
|
|
2101
|
+
// change would never reach the session. Fall through to an immediate stop
|
|
2102
|
+
// so those respawn fresh on their next use, exactly as before deferIdle.
|
|
2103
|
+
this.pendingRestarts.add(id);
|
|
2104
|
+
deferred++;
|
|
2105
|
+
}
|
|
2031
2106
|
else {
|
|
2032
2107
|
toStopNow.push(id);
|
|
2033
2108
|
}
|
|
@@ -2041,6 +2116,7 @@ class AgentRunner extends events_1.EventEmitter {
|
|
|
2041
2116
|
immediate++;
|
|
2042
2117
|
}
|
|
2043
2118
|
this.logger.info('restartOrDefer: sessions restarted', { immediate, deferred, skipped });
|
|
2119
|
+
return { immediate, deferred, skipped };
|
|
2044
2120
|
}
|
|
2045
2121
|
/**
|
|
2046
2122
|
* Format a timestamp as a human-readable age string (e.g. "5m ago", "2h ago").
|