instar 1.3.56 → 1.3.58
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/dist/commands/test-as-self.d.ts.map +1 -1
- package/dist/commands/test-as-self.js +2 -1
- package/dist/commands/test-as-self.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +33 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +117 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/monitoring/SessionReplyExtractor.d.ts +31 -0
- package/dist/monitoring/SessionReplyExtractor.d.ts.map +1 -0
- package/dist/monitoring/SessionReplyExtractor.js +115 -0
- package/dist/monitoring/SessionReplyExtractor.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +4 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/scheduler/MentorOnboardingRunner.d.ts +10 -1
- package/dist/scheduler/MentorOnboardingRunner.d.ts.map +1 -1
- package/dist/scheduler/MentorOnboardingRunner.js.map +1 -1
- package/dist/server/AgentServer.d.ts +20 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +122 -11
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +1 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/AgentDiscovery.d.ts +6 -1
- package/dist/threadline/AgentDiscovery.d.ts.map +1 -1
- package/dist/threadline/AgentDiscovery.js +3 -0
- package/dist/threadline/AgentDiscovery.js.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.js +20 -2
- package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
- package/dist/threadline/ThreadlineEndpoints.d.ts +2 -0
- package/dist/threadline/ThreadlineEndpoints.d.ts.map +1 -1
- package/dist/threadline/ThreadlineEndpoints.js +13 -1
- package/dist/threadline/ThreadlineEndpoints.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +4 -0
- package/upgrades/1.3.56.md +16 -17
- package/upgrades/1.3.57.md +49 -0
- package/upgrades/1.3.58.md +47 -0
- package/upgrades/side-effects/mentee-agent-name-and-botid-coercion.md +55 -0
- package/upgrades/side-effects/mentor-cycle-smoothness.md +48 -0
- package/upgrades/side-effects/test-as-self-skill-demote.md +38 -0
- package/upgrades/side-effects/threadline-identity-discovery-unification.md +100 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionReplyExtractor — pull the FINAL assistant message out of a completed
|
|
3
|
+
* mentee session's persisted transcript, instead of racing the live tmux pane.
|
|
4
|
+
*
|
|
5
|
+
* The mentor cycle's reply leg (MENTOR-LIVE-READINESS-SPEC §Recipient side)
|
|
6
|
+
* spawns a mentee session and needs its reply. Reading the tmux pane after the
|
|
7
|
+
* session completes is racy (the reaper removes the pane first → empty capture)
|
|
8
|
+
* AND yields raw stream JSON rather than clean prose. The transcript files
|
|
9
|
+
* persist the assistant's final message verbatim:
|
|
10
|
+
*
|
|
11
|
+
* - Codex: the rollout JSONL carries
|
|
12
|
+
* `{"type":"event_msg","payload":{"type":"task_complete","last_agent_message":"…"}}`
|
|
13
|
+
* (the cleanest source); fallbacks are the last `agent_message` event or the
|
|
14
|
+
* last `response_item` message with role=assistant.
|
|
15
|
+
* - Claude Code: the session JSONL carries assistant turns; the last
|
|
16
|
+
* assistant text block is the reply.
|
|
17
|
+
*
|
|
18
|
+
* Both extractors are pure (string in → string|null out), tolerant of
|
|
19
|
+
* malformed/partial lines, and return null when no assistant text is present
|
|
20
|
+
* (the caller then falls back to the tmux capture).
|
|
21
|
+
*/
|
|
22
|
+
/** Extract the final assistant message from a Codex rollout JSONL file's content. */
|
|
23
|
+
export declare function extractCodexFinalMessage(content: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Extract the final assistant message from a Claude Code session JSONL
|
|
26
|
+
* transcript's content. Claude JSONL rows are one JSON object per line; an
|
|
27
|
+
* assistant turn has `{type:'assistant', message:{content:[{type:'text',text}]}}`
|
|
28
|
+
* (or a string content). Returns the last assistant text block.
|
|
29
|
+
*/
|
|
30
|
+
export declare function extractClaudeFinalMessage(content: string): string | null;
|
|
31
|
+
//# sourceMappingURL=SessionReplyExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionReplyExtractor.d.ts","sourceRoot":"","sources":["../../src/monitoring/SessionReplyExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwCvE;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkCxE"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionReplyExtractor — pull the FINAL assistant message out of a completed
|
|
3
|
+
* mentee session's persisted transcript, instead of racing the live tmux pane.
|
|
4
|
+
*
|
|
5
|
+
* The mentor cycle's reply leg (MENTOR-LIVE-READINESS-SPEC §Recipient side)
|
|
6
|
+
* spawns a mentee session and needs its reply. Reading the tmux pane after the
|
|
7
|
+
* session completes is racy (the reaper removes the pane first → empty capture)
|
|
8
|
+
* AND yields raw stream JSON rather than clean prose. The transcript files
|
|
9
|
+
* persist the assistant's final message verbatim:
|
|
10
|
+
*
|
|
11
|
+
* - Codex: the rollout JSONL carries
|
|
12
|
+
* `{"type":"event_msg","payload":{"type":"task_complete","last_agent_message":"…"}}`
|
|
13
|
+
* (the cleanest source); fallbacks are the last `agent_message` event or the
|
|
14
|
+
* last `response_item` message with role=assistant.
|
|
15
|
+
* - Claude Code: the session JSONL carries assistant turns; the last
|
|
16
|
+
* assistant text block is the reply.
|
|
17
|
+
*
|
|
18
|
+
* Both extractors are pure (string in → string|null out), tolerant of
|
|
19
|
+
* malformed/partial lines, and return null when no assistant text is present
|
|
20
|
+
* (the caller then falls back to the tmux capture).
|
|
21
|
+
*/
|
|
22
|
+
/** Extract the final assistant message from a Codex rollout JSONL file's content. */
|
|
23
|
+
export function extractCodexFinalMessage(content) {
|
|
24
|
+
if (!content)
|
|
25
|
+
return null;
|
|
26
|
+
let lastTaskComplete = null;
|
|
27
|
+
let lastAgentMessage = null;
|
|
28
|
+
let lastAssistantItem = null;
|
|
29
|
+
for (const raw of content.split('\n')) {
|
|
30
|
+
const line = raw.trim();
|
|
31
|
+
if (!line || line[0] !== '{')
|
|
32
|
+
continue;
|
|
33
|
+
let d;
|
|
34
|
+
try {
|
|
35
|
+
d = JSON.parse(line);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const type = d['type'];
|
|
41
|
+
const payload = (d['payload'] ?? {});
|
|
42
|
+
const ptype = payload['type'];
|
|
43
|
+
if (type === 'event_msg' && ptype === 'task_complete') {
|
|
44
|
+
const m = payload['last_agent_message'];
|
|
45
|
+
if (typeof m === 'string' && m.trim())
|
|
46
|
+
lastTaskComplete = m;
|
|
47
|
+
}
|
|
48
|
+
else if (type === 'event_msg' && ptype === 'agent_message') {
|
|
49
|
+
const m = payload['message'];
|
|
50
|
+
if (typeof m === 'string' && m.trim())
|
|
51
|
+
lastAgentMessage = m;
|
|
52
|
+
}
|
|
53
|
+
else if (type === 'response_item' && ptype === 'message' && payload['role'] === 'assistant') {
|
|
54
|
+
const content_ = payload['content'];
|
|
55
|
+
if (Array.isArray(content_)) {
|
|
56
|
+
const text = content_
|
|
57
|
+
.map((c) => (c && typeof c === 'object' ? c['text'] : undefined))
|
|
58
|
+
.filter((t) => typeof t === 'string' && t.trim().length > 0)
|
|
59
|
+
.join('\n');
|
|
60
|
+
if (text.trim())
|
|
61
|
+
lastAssistantItem = text;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Preference order: task_complete (the canonical final message) → last
|
|
66
|
+
// agent_message event → last assistant response_item.
|
|
67
|
+
return lastTaskComplete ?? lastAgentMessage ?? lastAssistantItem;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Extract the final assistant message from a Claude Code session JSONL
|
|
71
|
+
* transcript's content. Claude JSONL rows are one JSON object per line; an
|
|
72
|
+
* assistant turn has `{type:'assistant', message:{content:[{type:'text',text}]}}`
|
|
73
|
+
* (or a string content). Returns the last assistant text block.
|
|
74
|
+
*/
|
|
75
|
+
export function extractClaudeFinalMessage(content) {
|
|
76
|
+
if (!content)
|
|
77
|
+
return null;
|
|
78
|
+
let last = null;
|
|
79
|
+
for (const raw of content.split('\n')) {
|
|
80
|
+
const line = raw.trim();
|
|
81
|
+
if (!line || line[0] !== '{')
|
|
82
|
+
continue;
|
|
83
|
+
let d;
|
|
84
|
+
try {
|
|
85
|
+
d = JSON.parse(line);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Two shapes seen: top-level {type:'assistant', message:{...}} and the
|
|
91
|
+
// message object directly. Normalize.
|
|
92
|
+
const isAssistant = d['type'] === 'assistant' ||
|
|
93
|
+
(typeof d['role'] === 'string' && d['role'] === 'assistant');
|
|
94
|
+
if (!isAssistant)
|
|
95
|
+
continue;
|
|
96
|
+
const msg = (d['message'] ?? d);
|
|
97
|
+
const c = msg['content'];
|
|
98
|
+
let text = null;
|
|
99
|
+
if (typeof c === 'string' && c.trim()) {
|
|
100
|
+
text = c;
|
|
101
|
+
}
|
|
102
|
+
else if (Array.isArray(c)) {
|
|
103
|
+
const joined = c
|
|
104
|
+
.map((b) => (b && typeof b === 'object' ? b['text'] : undefined))
|
|
105
|
+
.filter((t) => typeof t === 'string' && t.trim().length > 0)
|
|
106
|
+
.join('\n');
|
|
107
|
+
if (joined.trim())
|
|
108
|
+
text = joined;
|
|
109
|
+
}
|
|
110
|
+
if (text)
|
|
111
|
+
last = text;
|
|
112
|
+
}
|
|
113
|
+
return last;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=SessionReplyExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionReplyExtractor.js","sourceRoot":"","sources":["../../src/monitoring/SessionReplyExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CA4qCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAuSR"}
|
|
@@ -1398,6 +1398,10 @@ I have these Threadline tools for managing agent-to-agent communication:
|
|
|
1398
1398
|
- \`threadline_trust\` — Manage trust levels for known agents
|
|
1399
1399
|
- \`threadline_relay\` — Check relay status, enable/disable, or get explanations
|
|
1400
1400
|
|
|
1401
|
+
### What address reaches me (Threadline routing fingerprint)
|
|
1402
|
+
|
|
1403
|
+
If a peer's messages to me never land (their side shows \`sent=true\`, my \`logs/server.log\` shows no "Accepted message from <them>"), the usual cause is a **wrong address**. The authoritative "what address reaches me" value is my **routing fingerprint** — the one my relay registers with (\`logs/server.log\`: \`Threadline: relay connected (fingerprint: …)\`) and the one I publish at \`GET /threadline/health\` (\`fingerprint\` field) and in \`threadline/agent-info.json\`. These are sourced from my canonical \`identity.json\`, so they always agree. Hand peers THAT fingerprint — never the legacy \`publicKey\` hex from an old keypair. If \`/threadline/health\` returns no \`fingerprint\`, I have no resolvable routing identity yet (none on disk, or it's locked-encrypted) and am simply not relay-discoverable until I do.
|
|
1404
|
+
|
|
1401
1405
|
### The "Threadline" hub topic — notifications + "open this"
|
|
1402
1406
|
|
|
1403
1407
|
Threadline activity NEVER spawns a new Telegram topic per event. Notices route one of two ways:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO,KAAK,QAAQ,CAAC,IAAI;;;;OAIpB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;;;;EAIpC,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;6BAsBO,QAAQ,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D7C,CAAC;AAEF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,WAAmB,EAAE,QAAgB;IACrF,OAAO;;;;;;;;;;;;;;;;;;EAkBP,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAkDH,QAAQ;;;;;CAKjB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,KAAK,QAAQ;;;;;;;;;;;;;;4CAcsB,QAAQ;CACnD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,OAAO,KAAK,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;CAyBtB,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK,EAC5B,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,kFAAkF,IAAI;;;;;;;;;;;;;8EAa5C,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;;;;;;;;;;;;;;;;;;;;;;;0CAuBjE,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;;;;;gCAY7B,IAAI;;;;;;;;;sFASkD,IAAI;4FACE,IAAI;;;;;;;mEAO7B,IAAI;8EACO,IAAI;;;mEAGf,IAAI;4EACK,IAAI;;;;sHAIsC,IAAI;;;;;6EAK7C,IAAI;;2FAEU,IAAI;qFACV,IAAI;;;;;;mGAMU,IAAI;;;;;mEAKpC,IAAI;;;8EAGO,IAAI;6EACL,IAAI;0EACP,IAAI;;;;;6EAKD,IAAI;yCACxC,IAAI;mEACsB,IAAI;4EACK,IAAI;+EACD,IAAI;;;;;2EAKR,IAAI;;;;;;uFAMQ,IAAI;;;;;2EAKhB,IAAI;+EACA,IAAI;;;;;;wFAMK,IAAI;6EACf,IAAI;+FACc,IAAI;;;;;gIAK6B,IAAI;sFAC9C,IAAI;0HACgC,IAAI;;;;qEAIzD,IAAI;;;;;;;;4EAQG,IAAI;yEACP,IAAI;+EACE,IAAI;;;;qEAId,IAAI;wFACe,IAAI;2IAC+C,IAAI;;;0EAGrE,IAAI;6EACD,IAAI;oFACG,IAAI;;;;;;;;;8EASV,IAAI;sEACZ,IAAI;8EACI,IAAI;4EACN,IAAI;mFACG,IAAI;;;;oEAInB,IAAI;0EACE,IAAI;4EACF,IAAI;+EACD,IAAI;iFACF,IAAI;;;oEAGjB,IAAI;;;;+EAIO,IAAI;6EACN,IAAI;0EACP,IAAI;uFACS,IAAI;qFACN,IAAI;wEACjB,IAAI;;;;oEAIR,IAAI;;;qEAGH,IAAI;sEACH,IAAI;mKACyF,IAAI;;;sEAGjG,IAAI;;;qEAGL,IAAI;;;8BAG3C,IAAI;;;;4OAI0M,IAAI;;;;;;;;mFAQ7J,IAAI;;;;;uBAKhE,IAAI;;;wFAG6D,IAAI;;;;;;;;;;;;6EAYf,IAAI;sFACK,IAAI;8EACZ,IAAI;;;;;sEAKZ,IAAI;oEACN,IAAI;8EACM,IAAI;yFACO,IAAI;;;;;;;;;qEASxB,IAAI;6EACI,IAAI;2EACN,IAAI;2EACJ,IAAI;kEACb,IAAI;;;;;0EAKI,IAAI;4FACc,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yDA4EvC,IAAI;;;;;;;;;;;;;;;8EAeiB,IAAI;4HAC0C,IAAI;kKACkC,IAAI;;;6GAGzD,IAAI;2FACtB,IAAI;;;2FAGJ,IAAI;;kFAEb,IAAI;wFACE,IAAI;6FACC,IAAI;iJACgD,IAAI;;;;;;;;;;;;;;;;;;;uFAmB9D,IAAI;wFACH,IAAI;;;wFAGJ,IAAI;;0FAEF,IAAI;+FACC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoGrF,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CA4HmB,IAAI;;;;;;;;;;;mCAWX,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mCA8CJ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;mEAwB4B,IAAI;;;;;mEAKJ,IAAI;;;;;mEAKJ,IAAI;;;;mEAIJ,IAAI;;;;;;yDAMd,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2EAiFc,IAAI;yEACN,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqF5E,CAAC;IAEA,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgEd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4Bd,CAAC;IACA,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGZ,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,SAAiB,EACjB,IAAY,EACZ,WAAoB,EACpB,cAAuB,KAAK;IAE5B,IAAI,OAAO,GAAG,iBAAiB,WAAW;;;;OAIrC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCT,SAAS;;gCAEgB,IAAI,qFAAqF,IAAI;;;;;;CAM5H,CAAC;IAEA,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;;;;;;;;;;;;;;;;;;;CAsBd,CAAC;IACA,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI;;;;CAId,CAAC;IACA,CAAC;IAED,OAAO,IAAI;;;;;;;8EAOiE,IAAI;;;yFAGO,IAAI;;;;;;;uGAOU,IAAI;yFAClB,IAAI;;;;;;0DAMnC,IAAI;;;;;;;;;;;;;;;;;;;;;;;2FAuB6B,IAAI;8FACD,IAAI;+MAC6G,IAAI;mGAChH,IAAI;;;;;;;;;;0CAU7D,IAAI;oCACV,IAAI;;;;;;;;;;;;;yDAaiB,IAAI;;;;;;;;0DAQH,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+GhD,SAAS;;;;;;;;;;;;sEAY+C,IAAI;;CAEzE,CAAC;IAEA,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -18,8 +18,17 @@ import type { CaptureRunInput, CaptureRunResult, ForensicFinding } from '../moni
|
|
|
18
18
|
export interface MentorConfig {
|
|
19
19
|
enabled: boolean;
|
|
20
20
|
mode: 'off' | 'dry-run' | 'live';
|
|
21
|
-
/** The framework being mentored (parametric).
|
|
21
|
+
/** The framework being mentored (parametric). Used for Stage-B forensics
|
|
22
|
+
* (codex-rollout parsing keys on framework). NOT necessarily the mentee's
|
|
23
|
+
* agent-registry name — see menteeAgentName. */
|
|
22
24
|
menteeFramework: string;
|
|
25
|
+
/** The mentee's actual agent-registry name (e.g. 'instar-codey'). Used for
|
|
26
|
+
* same-machine peer lookup + the a2a marker `to=`/reply-allowlist. Defaults
|
|
27
|
+
* to `instar-${menteeFramework}` when unset (back-compat), but framework and
|
|
28
|
+
* registered agent name routinely differ (framework=codex-cli, agent
|
|
29
|
+
* name=instar-codey) — that mismatch silently broke same-machine a2a routing
|
|
30
|
+
* + reply-allowlisting until this field existed. */
|
|
31
|
+
menteeAgentName?: string;
|
|
23
32
|
minIntervalMs: number;
|
|
24
33
|
maxRoundsPerDay: number;
|
|
25
34
|
/** @deprecated dead config — we run on a Claude subscription; replacement is the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MentorOnboardingRunner.d.ts","sourceRoot":"","sources":["../../src/scheduler/MentorOnboardingRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAiB,KAAK,gBAAgB,EAAmB,MAAM,2BAA2B,CAAC;AAClG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAEhH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IACjC
|
|
1
|
+
{"version":3,"file":"MentorOnboardingRunner.d.ts","sourceRoot":"","sources":["../../src/scheduler/MentorOnboardingRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MentorOnboardingRunner.js","sourceRoot":"","sources":["../../src/scheduler/MentorOnboardingRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,aAAa,EAA0C,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"MentorOnboardingRunner.js","sourceRoot":"","sources":["../../src/scheduler/MentorOnboardingRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -308,6 +308,18 @@ export declare class AgentServer {
|
|
|
308
308
|
/** Find the N most recently-modified rollout .jsonl files under a codex sessions
|
|
309
309
|
* dir (nested year/month/day). Best-effort; returns [] on any error. */
|
|
310
310
|
private findRecentRolloutFiles;
|
|
311
|
+
/**
|
|
312
|
+
* Extract a completed mentee session's FINAL assistant message from its
|
|
313
|
+
* persisted transcript (clean prose), rather than the racy tmux-pane read.
|
|
314
|
+
* Returns null when no transcript reply is found — the caller then keeps the
|
|
315
|
+
* tmux-capture fallback.
|
|
316
|
+
*
|
|
317
|
+
* - Codex sessions: the newest rollout JSONL under $CODEX_HOME/sessions that
|
|
318
|
+
* was written at/after the spawn → `task_complete.last_agent_message`.
|
|
319
|
+
* - Claude sessions: the session's JSONL transcript (by claudeSessionId) →
|
|
320
|
+
* the last assistant text block.
|
|
321
|
+
*/
|
|
322
|
+
private extractMenteeReplyFromTranscript;
|
|
311
323
|
/**
|
|
312
324
|
* Lazily construct + cache the mentor-bot TelegramAdapter for the given token. Uses
|
|
313
325
|
* PR 2a's multi-instance support (subDir + suppressLifelineAutoCreate) so the second
|
|
@@ -375,6 +387,14 @@ export declare class AgentServer {
|
|
|
375
387
|
private deliverA2aMessage;
|
|
376
388
|
/** Snapshot of mentee config for the receiver-wiring installer. */
|
|
377
389
|
private getMenteeConfigSnapshot;
|
|
390
|
+
/**
|
|
391
|
+
* This agent's own primary Telegram bot id (the numeric prefix of its
|
|
392
|
+
* messaging bot token), or undefined if no Telegram messaging is configured.
|
|
393
|
+
* Used as the a2a `senderBotId` so a recipient's allowlist check
|
|
394
|
+
* (knownAgents[from].botId === senderBotId) passes — the sender must
|
|
395
|
+
* identify with its OWN bot id.
|
|
396
|
+
*/
|
|
397
|
+
private ownPrimaryBotId;
|
|
378
398
|
/** Snapshot of mentor config for use outside the runner's getConfig closure. */
|
|
379
399
|
private getMentorConfigSnapshot;
|
|
380
400
|
private buildMentorRunner;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAgB,EAAE,KAAK,OAAO,EAA+B,MAAM,SAAS,CAAC;AAM7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAexF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentServer.d.ts","sourceRoot":"","sources":["../../src/server/AgentServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,7 @@ import { ProcessedIdStore } from '../messaging/ProcessedIdStore.js';
|
|
|
46
46
|
import { buildAgentMessageHook } from '../messaging/installAgentMessageHook.js';
|
|
47
47
|
import { OutstandingPromptTracker } from '../scheduler/OutstandingPromptTracker.js';
|
|
48
48
|
import { parseCodexRollout } from '../monitoring/CodexRolloutParser.js';
|
|
49
|
+
import { extractCodexFinalMessage, extractClaudeFinalMessage } from '../monitoring/SessionReplyExtractor.js';
|
|
49
50
|
import { BurnDetector } from '../monitoring/BurnDetector.js';
|
|
50
51
|
import { BurnThrottleRunbook } from '../monitoring/BurnThrottleRunbook.js';
|
|
51
52
|
import { BurnVerifier } from '../monitoring/BurnVerifier.js';
|
|
@@ -607,6 +608,72 @@ export class AgentServer {
|
|
|
607
608
|
walk(sessionsDir, 0);
|
|
608
609
|
return found.sort((a, b) => b.mtime - a.mtime).slice(0, n).map((f) => f.path);
|
|
609
610
|
}
|
|
611
|
+
/**
|
|
612
|
+
* Extract a completed mentee session's FINAL assistant message from its
|
|
613
|
+
* persisted transcript (clean prose), rather than the racy tmux-pane read.
|
|
614
|
+
* Returns null when no transcript reply is found — the caller then keeps the
|
|
615
|
+
* tmux-capture fallback.
|
|
616
|
+
*
|
|
617
|
+
* - Codex sessions: the newest rollout JSONL under $CODEX_HOME/sessions that
|
|
618
|
+
* was written at/after the spawn → `task_complete.last_agent_message`.
|
|
619
|
+
* - Claude sessions: the session's JSONL transcript (by claudeSessionId) →
|
|
620
|
+
* the last assistant text block.
|
|
621
|
+
*/
|
|
622
|
+
extractMenteeReplyFromTranscript(session, spawnTs) {
|
|
623
|
+
try {
|
|
624
|
+
const framework = String(session.framework ?? '');
|
|
625
|
+
// ── Codex path ──
|
|
626
|
+
if (framework.startsWith('codex')) {
|
|
627
|
+
const sessionsDir = path.join(os.homedir(), '.codex', 'sessions');
|
|
628
|
+
// The mentee rollout is the newest rollout written since the spawn
|
|
629
|
+
// (allow a small skew for the rollout file's first write lag).
|
|
630
|
+
const candidates = this.findRecentRolloutFiles(sessionsDir, 5);
|
|
631
|
+
for (const f of candidates) {
|
|
632
|
+
try {
|
|
633
|
+
if (fs.statSync(f).mtimeMs < spawnTs - 5_000)
|
|
634
|
+
continue;
|
|
635
|
+
const text = extractCodexFinalMessage(fs.readFileSync(f, 'utf-8'));
|
|
636
|
+
if (text && text.trim())
|
|
637
|
+
return text;
|
|
638
|
+
}
|
|
639
|
+
catch { /* try next candidate */ }
|
|
640
|
+
}
|
|
641
|
+
return null;
|
|
642
|
+
}
|
|
643
|
+
// ── Claude path ──
|
|
644
|
+
const claudeId = session.claudeSessionId;
|
|
645
|
+
if (claudeId) {
|
|
646
|
+
const projectsDir = path.join(os.homedir(), '.claude', 'projects');
|
|
647
|
+
// Find the <claudeId>.jsonl transcript anywhere under projects/.
|
|
648
|
+
const stack = [projectsDir];
|
|
649
|
+
for (let guard = 0; guard < 10_000 && stack.length; guard++) {
|
|
650
|
+
const dir = stack.pop();
|
|
651
|
+
let entries;
|
|
652
|
+
try {
|
|
653
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
654
|
+
}
|
|
655
|
+
catch {
|
|
656
|
+
continue;
|
|
657
|
+
}
|
|
658
|
+
for (const e of entries) {
|
|
659
|
+
const full = path.join(dir, e.name);
|
|
660
|
+
if (e.isDirectory())
|
|
661
|
+
stack.push(full);
|
|
662
|
+
else if (e.name === `${claudeId}.jsonl`) {
|
|
663
|
+
const text = extractClaudeFinalMessage(fs.readFileSync(full, 'utf-8'));
|
|
664
|
+
if (text && text.trim())
|
|
665
|
+
return text;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
return null;
|
|
671
|
+
}
|
|
672
|
+
catch (err) {
|
|
673
|
+
console.warn(`[mentee] transcript extraction failed (falling back to tmux capture): ${err instanceof Error ? err.message : String(err)}`);
|
|
674
|
+
return null;
|
|
675
|
+
}
|
|
676
|
+
}
|
|
610
677
|
/**
|
|
611
678
|
* Lazily construct + cache the mentor-bot TelegramAdapter for the given token. Uses
|
|
612
679
|
* PR 2a's multi-instance support (subDir + suppressLifelineAutoCreate) so the second
|
|
@@ -677,10 +744,11 @@ export class AgentServer {
|
|
|
677
744
|
const cfg = this.getMentorConfigSnapshot();
|
|
678
745
|
if (!cfg.menteeBotId)
|
|
679
746
|
return;
|
|
747
|
+
const menteeAgent = cfg.menteeAgentName || `instar-${cfg.menteeFramework}`;
|
|
680
748
|
const recipientCfg = {
|
|
681
749
|
localAgent: 'echo',
|
|
682
|
-
knownAgents: { [
|
|
683
|
-
acceptRoles: { [
|
|
750
|
+
knownAgents: { [menteeAgent]: { botId: String(cfg.menteeBotId) } },
|
|
751
|
+
acceptRoles: { [menteeAgent]: ['mentor-reply'] },
|
|
684
752
|
skewWindowMs: 24 * 60 * 60 * 1000,
|
|
685
753
|
maxVersion: A2A_VERSION,
|
|
686
754
|
};
|
|
@@ -774,7 +842,9 @@ export class AgentServer {
|
|
|
774
842
|
}
|
|
775
843
|
if (menteeReady) {
|
|
776
844
|
for (const [mentorName, info] of Object.entries(menteeCfg.knownMentors)) {
|
|
777
|
-
|
|
845
|
+
// Coerce botId to string (config may store it as a JSON number; the
|
|
846
|
+
// marker senderBotId is always a string + the allowlist uses ===).
|
|
847
|
+
knownAgents[mentorName] = { botId: String(info.botId) };
|
|
778
848
|
acceptRoles[mentorName] = [...(acceptRoles[mentorName] ?? []), 'mentor'];
|
|
779
849
|
}
|
|
780
850
|
const sessionTimeoutMs = menteeCfg.sessionTimeoutMs;
|
|
@@ -785,6 +855,7 @@ export class AgentServer {
|
|
|
785
855
|
// by the time we detect completion, so captureOutput returns empty).
|
|
786
856
|
let reply = '';
|
|
787
857
|
let sessionId = '';
|
|
858
|
+
const spawnTs = Date.now();
|
|
788
859
|
try {
|
|
789
860
|
const session = await self.sessionManager.spawnSession({
|
|
790
861
|
name: `mentee-handle-${Date.now()}`,
|
|
@@ -818,6 +889,12 @@ export class AgentServer {
|
|
|
818
889
|
catch { /* best-effort */ }
|
|
819
890
|
console.warn(`[mentee] session ${session.id} timed out at ${sessionTimeoutMs}ms (corr=${msg.corr}); sending best-effort partial reply`);
|
|
820
891
|
}
|
|
892
|
+
// Robust capture: prefer the session's persisted transcript (clean
|
|
893
|
+
// assistant prose) over the racy tmux-pane read. The pane read is
|
|
894
|
+
// only a fallback for when no transcript is found.
|
|
895
|
+
const fromTranscript = self.extractMenteeReplyFromTranscript(session, spawnTs);
|
|
896
|
+
if (fromTranscript && fromTranscript.trim())
|
|
897
|
+
reply = fromTranscript;
|
|
821
898
|
}
|
|
822
899
|
catch (err) {
|
|
823
900
|
console.warn(`[mentee] mentor-message handler spawn failed (corr=${msg.corr}, sessionId=${sessionId}):`, err instanceof Error ? err.message : String(err));
|
|
@@ -839,6 +916,9 @@ export class AgentServer {
|
|
|
839
916
|
body: reply,
|
|
840
917
|
allowedRoles: new Set(['mentor-reply']),
|
|
841
918
|
telegramTopicId: menteeCfg.replyTopicId,
|
|
919
|
+
// fromBotId = THIS agent's own bot id, so the mentor's allowlist
|
|
920
|
+
// (knownAgents[instar-codey].botId === senderBotId) passes.
|
|
921
|
+
fromBotId: self.ownPrimaryBotId(),
|
|
842
922
|
toBotId: menteeCfg.knownMentors[msg.from]?.botId,
|
|
843
923
|
});
|
|
844
924
|
};
|
|
@@ -850,8 +930,11 @@ export class AgentServer {
|
|
|
850
930
|
// the mentor-BOT adapter (spec §250 — capability-handle, capture-only).
|
|
851
931
|
const mentorCfg = this.getMentorConfigSnapshot();
|
|
852
932
|
if (mentorCfg.menteeBotId) {
|
|
853
|
-
const menteeAgent = `instar-${mentorCfg.menteeFramework}`;
|
|
854
|
-
|
|
933
|
+
const menteeAgent = mentorCfg.menteeAgentName || `instar-${mentorCfg.menteeFramework}`;
|
|
934
|
+
// Coerce to string — config may store the bot id as a JSON number, but
|
|
935
|
+
// the a2a marker's senderBotId is always a string; the allowlist compares
|
|
936
|
+
// with === so a number/string mismatch silently drops every reply.
|
|
937
|
+
knownAgents[menteeAgent] = { botId: String(mentorCfg.menteeBotId) };
|
|
855
938
|
acceptRoles[menteeAgent] = [...(acceptRoles[menteeAgent] ?? []), 'mentor-reply'];
|
|
856
939
|
const outstanding = this.getOrCreateMentorOutstanding();
|
|
857
940
|
const replyJsonl = path.join(this.config.stateDir, 'mentor-replies.jsonl');
|
|
@@ -935,7 +1018,7 @@ export class AgentServer {
|
|
|
935
1018
|
topicId: opts.telegramTopicId ?? 0,
|
|
936
1019
|
senderAgent: opts.fromAgent,
|
|
937
1020
|
senderIsBot: true,
|
|
938
|
-
senderBotId: opts.
|
|
1021
|
+
senderBotId: opts.fromBotId ?? `${opts.fromAgent}-local`,
|
|
939
1022
|
}),
|
|
940
1023
|
signal: AbortSignal.timeout(10_000),
|
|
941
1024
|
});
|
|
@@ -1006,6 +1089,18 @@ export class AgentServer {
|
|
|
1006
1089
|
...(this.config.mentee ?? {}),
|
|
1007
1090
|
};
|
|
1008
1091
|
}
|
|
1092
|
+
/**
|
|
1093
|
+
* This agent's own primary Telegram bot id (the numeric prefix of its
|
|
1094
|
+
* messaging bot token), or undefined if no Telegram messaging is configured.
|
|
1095
|
+
* Used as the a2a `senderBotId` so a recipient's allowlist check
|
|
1096
|
+
* (knownAgents[from].botId === senderBotId) passes — the sender must
|
|
1097
|
+
* identify with its OWN bot id.
|
|
1098
|
+
*/
|
|
1099
|
+
ownPrimaryBotId() {
|
|
1100
|
+
const tg = (this.config.messaging ?? []).find((m) => m.type === 'telegram' && m.enabled);
|
|
1101
|
+
const token = tg?.config?.token;
|
|
1102
|
+
return token ? token.split(':')[0] : undefined;
|
|
1103
|
+
}
|
|
1009
1104
|
/** Snapshot of mentor config for use outside the runner's getConfig closure. */
|
|
1010
1105
|
getMentorConfigSnapshot() {
|
|
1011
1106
|
return {
|
|
@@ -1098,10 +1193,20 @@ export class AgentServer {
|
|
|
1098
1193
|
evaluate: (prompt) => intelligence.evaluate(prompt, { model: 'capable', maxTokens: 1500, attribution: { component: 'mentor-stage-b' } }),
|
|
1099
1194
|
});
|
|
1100
1195
|
},
|
|
1101
|
-
// Safe-window:
|
|
1102
|
-
//
|
|
1103
|
-
//
|
|
1104
|
-
|
|
1196
|
+
// Safe-window: the mentee is "busy" iff there is an OUTSTANDING mentor
|
|
1197
|
+
// prompt already in-flight to it (the OutstandingPromptTracker is the
|
|
1198
|
+
// honest per-mentee busy signal — a prompt sent + not yet replied).
|
|
1199
|
+
// The mentee is REMOTE (a separate agent/process), so Echo's own
|
|
1200
|
+
// local session count says nothing about whether the mentee is free;
|
|
1201
|
+
// the prior code (listRunningSessions().length > 0) wrongly blocked
|
|
1202
|
+
// every tick because Echo always has sessions running. Gating on the
|
|
1203
|
+
// outstanding-prompt tracker means: don't send a new prompt while the
|
|
1204
|
+
// last one is unanswered — exactly the anti-ping-pong invariant.
|
|
1205
|
+
isMenteeBusy: () => {
|
|
1206
|
+
const cfg = getConfig();
|
|
1207
|
+
const menteeAgent = cfg.menteeAgentName || `instar-${cfg.menteeFramework}`;
|
|
1208
|
+
return !self.getOrCreateMentorOutstanding().canSendTo(menteeAgent).ok;
|
|
1209
|
+
},
|
|
1105
1210
|
minIntervalElapsed: () => {
|
|
1106
1211
|
const cfg = getConfig();
|
|
1107
1212
|
return Date.now() - self.mentorLastTickAt >= cfg.minIntervalMs;
|
|
@@ -1125,7 +1230,10 @@ export class AgentServer {
|
|
|
1125
1230
|
// the bot isn't configured yet, this no-ops with a log — the dark default.
|
|
1126
1231
|
deliverToMentee: async (framework, message) => {
|
|
1127
1232
|
const cfg = getConfig();
|
|
1128
|
-
|
|
1233
|
+
// Prefer the explicit registry name; fall back to the framework-derived
|
|
1234
|
+
// name (back-compat). framework=codex-cli but the agent registers as
|
|
1235
|
+
// instar-codey — using the derived name silently broke peer lookup.
|
|
1236
|
+
const menteeAgent = cfg.menteeAgentName || `instar-${framework}`;
|
|
1129
1237
|
const corr = `mp-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
1130
1238
|
// Anti-ping-pong (spec §Fix 2b item 4 + Justin's original concern). Same
|
|
1131
1239
|
// logic regardless of transport. Refuse to send a new prompt while a
|
|
@@ -1167,6 +1275,9 @@ export class AgentServer {
|
|
|
1167
1275
|
body: message,
|
|
1168
1276
|
allowedRoles: new Set(['mentor']),
|
|
1169
1277
|
telegramTopicId: cfg.menteeTopicId,
|
|
1278
|
+
// fromBotId = echo's mentor-bot id, so the mentee's allowlist
|
|
1279
|
+
// (knownMentors[echo].botId === senderBotId) passes.
|
|
1280
|
+
fromBotId: cfg.botToken ? cfg.botToken.split(':')[0] : undefined,
|
|
1170
1281
|
toBotId: cfg.menteeBotId,
|
|
1171
1282
|
telegramBot: telegramBot
|
|
1172
1283
|
? { sendToTopic: (t, txt) => telegramBot.sendToTopic(t, txt) }
|