@animalabs/agent-framework 0.26.1 → 0.27.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 +57 -7
- package/dist/src/agent.d.ts +263 -22
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +531 -54
- package/dist/src/agent.js.map +1 -1
- package/dist/src/api/server.d.ts.map +1 -1
- package/dist/src/api/server.js +1 -2
- package/dist/src/api/server.js.map +1 -1
- package/dist/src/auto-continue.d.ts +33 -0
- package/dist/src/auto-continue.d.ts.map +1 -0
- package/dist/src/auto-continue.js +35 -0
- package/dist/src/auto-continue.js.map +1 -0
- package/dist/src/code-execution/isolate/scripts.d.ts +11 -0
- package/dist/src/code-execution/isolate/scripts.d.ts.map +1 -1
- package/dist/src/code-execution/isolate/scripts.js +5 -1
- package/dist/src/code-execution/isolate/scripts.js.map +1 -1
- package/dist/src/framework.d.ts +829 -156
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +3906 -1008
- package/dist/src/framework.js.map +1 -1
- package/dist/src/gate/event-gate.d.ts +309 -46
- package/dist/src/gate/event-gate.d.ts.map +1 -1
- package/dist/src/gate/event-gate.js +2117 -395
- package/dist/src/gate/event-gate.js.map +1 -1
- package/dist/src/gate/index.d.ts +2 -2
- package/dist/src/gate/index.d.ts.map +1 -1
- package/dist/src/gate/index.js +1 -1
- package/dist/src/gate/index.js.map +1 -1
- package/dist/src/gate/recipe-reconcile.d.ts +103 -0
- package/dist/src/gate/recipe-reconcile.d.ts.map +1 -0
- package/dist/src/gate/recipe-reconcile.js +325 -0
- package/dist/src/gate/recipe-reconcile.js.map +1 -0
- package/dist/src/gate/types.d.ts +68 -8
- package/dist/src/gate/types.d.ts.map +1 -1
- package/dist/src/index.d.ts +6 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +433 -113
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +1152 -434
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/mcpl/conversation-router.d.ts +16 -8
- package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
- package/dist/src/mcpl/conversation-router.js +29 -15
- package/dist/src/mcpl/conversation-router.js.map +1 -1
- package/dist/src/mcpl/convert-block.d.ts.map +1 -1
- package/dist/src/mcpl/convert-block.js +14 -2
- package/dist/src/mcpl/convert-block.js.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts +7 -1
- package/dist/src/mcpl/hook-orchestrator.d.ts.map +1 -1
- package/dist/src/mcpl/hook-orchestrator.js +32 -7
- package/dist/src/mcpl/hook-orchestrator.js.map +1 -1
- package/dist/src/mcpl/index.d.ts +5 -1
- package/dist/src/mcpl/index.d.ts.map +1 -1
- package/dist/src/mcpl/index.js +4 -0
- package/dist/src/mcpl/index.js.map +1 -1
- package/dist/src/mcpl/inference-router.d.ts +14 -2
- package/dist/src/mcpl/inference-router.d.ts.map +1 -1
- package/dist/src/mcpl/inference-router.js +73 -28
- package/dist/src/mcpl/inference-router.js.map +1 -1
- package/dist/src/mcpl/prose-grammar.d.ts +4 -0
- package/dist/src/mcpl/prose-grammar.d.ts.map +1 -1
- package/dist/src/mcpl/prose-grammar.js +6 -0
- package/dist/src/mcpl/prose-grammar.js.map +1 -1
- package/dist/src/mcpl/protocol-family.d.ts.map +1 -1
- package/dist/src/mcpl/protocol-family.js +3 -0
- package/dist/src/mcpl/protocol-family.js.map +1 -1
- package/dist/src/mcpl/push-coalescer.d.ts +20 -2
- package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
- package/dist/src/mcpl/push-coalescer.js +33 -11
- package/dist/src/mcpl/push-coalescer.js.map +1 -1
- package/dist/src/mcpl/reference-fetcher.d.ts +63 -42
- package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
- package/dist/src/mcpl/reference-fetcher.js +177 -145
- package/dist/src/mcpl/reference-fetcher.js.map +1 -1
- package/dist/src/mcpl/references.d.ts +380 -46
- package/dist/src/mcpl/references.d.ts.map +1 -1
- package/dist/src/mcpl/references.js +737 -78
- package/dist/src/mcpl/references.js.map +1 -1
- package/dist/src/mcpl/server-connection.d.ts +82 -3
- package/dist/src/mcpl/server-connection.d.ts.map +1 -1
- package/dist/src/mcpl/server-connection.js +132 -7
- package/dist/src/mcpl/server-connection.js.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.d.ts +11 -0
- package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -1
- package/dist/src/mcpl/tool-lifecycle.js +21 -0
- package/dist/src/mcpl/tool-lifecycle.js.map +1 -1
- package/dist/src/mcpl/tool-presence.d.ts +259 -0
- package/dist/src/mcpl/tool-presence.d.ts.map +1 -0
- package/dist/src/mcpl/tool-presence.js +628 -0
- package/dist/src/mcpl/tool-presence.js.map +1 -0
- package/dist/src/mcpl/tool-result-normalize.d.ts +9 -3
- package/dist/src/mcpl/tool-result-normalize.d.ts.map +1 -1
- package/dist/src/mcpl/tool-result-normalize.js +14 -6
- package/dist/src/mcpl/tool-result-normalize.js.map +1 -1
- package/dist/src/mcpl/tool-signature.d.ts +39 -0
- package/dist/src/mcpl/tool-signature.d.ts.map +1 -0
- package/dist/src/mcpl/tool-signature.js +292 -0
- package/dist/src/mcpl/tool-signature.js.map +1 -0
- package/dist/src/mcpl/toolset-host.d.ts +200 -0
- package/dist/src/mcpl/toolset-host.d.ts.map +1 -0
- package/dist/src/mcpl/toolset-host.js +621 -0
- package/dist/src/mcpl/toolset-host.js.map +1 -0
- package/dist/src/mcpl/toolsets-module.d.ts +80 -0
- package/dist/src/mcpl/toolsets-module.d.ts.map +1 -0
- package/dist/src/mcpl/toolsets-module.js +431 -0
- package/dist/src/mcpl/toolsets-module.js.map +1 -0
- package/dist/src/mcpl/transport.d.ts +2 -2
- package/dist/src/mcpl/transport.d.ts.map +1 -1
- package/dist/src/mcpl/transport.js +3 -2
- package/dist/src/mcpl/transport.js.map +1 -1
- package/dist/src/mcpl/types.d.ts +21 -1
- package/dist/src/mcpl/types.d.ts.map +1 -1
- package/dist/src/mcpl/types.js.map +1 -1
- package/dist/src/mcpl/visible-content.d.ts +7 -9
- package/dist/src/mcpl/visible-content.d.ts.map +1 -1
- package/dist/src/mcpl/visible-content.js +21 -9
- package/dist/src/mcpl/visible-content.js.map +1 -1
- package/dist/src/module-registry.d.ts +23 -8
- package/dist/src/module-registry.d.ts.map +1 -1
- package/dist/src/module-registry.js +68 -15
- package/dist/src/module-registry.js.map +1 -1
- package/dist/src/modules/discord/index.js +1 -1
- package/dist/src/modules/discord/index.js.map +1 -1
- package/dist/src/modules/history/index.d.ts +2 -1
- package/dist/src/modules/history/index.d.ts.map +1 -1
- package/dist/src/modules/history/index.js +51 -17
- package/dist/src/modules/history/index.js.map +1 -1
- package/dist/src/modules/history/semantic.d.ts +108 -6
- package/dist/src/modules/history/semantic.d.ts.map +1 -1
- package/dist/src/modules/history/semantic.js +273 -57
- package/dist/src/modules/history/semantic.js.map +1 -1
- package/dist/src/modules/workspace/direct-write.d.ts +181 -0
- package/dist/src/modules/workspace/direct-write.d.ts.map +1 -0
- package/dist/src/modules/workspace/direct-write.js +384 -0
- package/dist/src/modules/workspace/direct-write.js.map +1 -0
- package/dist/src/modules/workspace/edit-text.d.ts +26 -12
- package/dist/src/modules/workspace/edit-text.d.ts.map +1 -1
- package/dist/src/modules/workspace/edit-text.js +58 -28
- package/dist/src/modules/workspace/edit-text.js.map +1 -1
- package/dist/src/modules/workspace/effects.d.ts +10 -0
- package/dist/src/modules/workspace/effects.d.ts.map +1 -1
- package/dist/src/modules/workspace/effects.js +1 -1
- package/dist/src/modules/workspace/effects.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts +246 -27
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +1216 -236
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/modules/workspace/read-page.d.ts +41 -0
- package/dist/src/modules/workspace/read-page.d.ts.map +1 -0
- package/dist/src/modules/workspace/read-page.js +213 -0
- package/dist/src/modules/workspace/read-page.js.map +1 -0
- package/dist/src/modules/workspace/result-text.d.ts +67 -0
- package/dist/src/modules/workspace/result-text.d.ts.map +1 -0
- package/dist/src/modules/workspace/result-text.js +94 -0
- package/dist/src/modules/workspace/result-text.js.map +1 -0
- package/dist/src/modules/workspace/text.d.ts +29 -12
- package/dist/src/modules/workspace/text.d.ts.map +1 -1
- package/dist/src/modules/workspace/text.js +35 -33
- package/dist/src/modules/workspace/text.js.map +1 -1
- package/dist/src/modules/workspace/types.d.ts +41 -17
- package/dist/src/modules/workspace/types.d.ts.map +1 -1
- package/dist/src/modules/workspace/types.js.map +1 -1
- package/dist/src/sent-rows.d.ts +59 -0
- package/dist/src/sent-rows.d.ts.map +1 -0
- package/dist/src/sent-rows.js +145 -0
- package/dist/src/sent-rows.js.map +1 -0
- package/dist/src/silent-heartbeat.d.ts +17 -10
- package/dist/src/silent-heartbeat.d.ts.map +1 -1
- package/dist/src/silent-heartbeat.js.map +1 -1
- package/dist/src/stable-hash.d.ts +3 -0
- package/dist/src/stable-hash.d.ts.map +1 -0
- package/dist/src/stable-hash.js +15 -0
- package/dist/src/stable-hash.js.map +1 -0
- package/dist/src/stored-injections.d.ts +99 -0
- package/dist/src/stored-injections.d.ts.map +1 -0
- package/dist/src/stored-injections.js +106 -0
- package/dist/src/stored-injections.js.map +1 -0
- package/dist/src/text-as-stored.d.ts +4 -3
- package/dist/src/text-as-stored.d.ts.map +1 -1
- package/dist/src/text-as-stored.js +4 -3
- package/dist/src/text-as-stored.js.map +1 -1
- package/dist/src/thinking-drops.d.ts +81 -0
- package/dist/src/thinking-drops.d.ts.map +1 -0
- package/dist/src/thinking-drops.js +103 -0
- package/dist/src/thinking-drops.js.map +1 -0
- package/dist/src/tool-image-ledger.d.ts +9 -8
- package/dist/src/tool-image-ledger.d.ts.map +1 -1
- package/dist/src/tool-image-ledger.js +9 -8
- package/dist/src/tool-image-ledger.js.map +1 -1
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +3 -1
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/tool-result-guard.d.ts +4 -2
- package/dist/src/tool-result-guard.d.ts.map +1 -1
- package/dist/src/tool-result-guard.js +21 -6
- package/dist/src/tool-result-guard.js.map +1 -1
- package/dist/src/tool-result-history.d.ts +186 -21
- package/dist/src/tool-result-history.d.ts.map +1 -1
- package/dist/src/tool-result-history.js +428 -89
- package/dist/src/tool-result-history.js.map +1 -1
- package/dist/src/tune-out/coordinator.d.ts +17 -9
- package/dist/src/tune-out/coordinator.d.ts.map +1 -1
- package/dist/src/tune-out/coordinator.js +84 -37
- package/dist/src/tune-out/coordinator.js.map +1 -1
- package/dist/src/types/agent.d.ts +186 -7
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/events.d.ts +19 -2
- package/dist/src/types/events.d.ts.map +1 -1
- package/dist/src/types/framework.d.ts +24 -3
- package/dist/src/types/framework.d.ts.map +1 -1
- package/dist/src/types/module.d.ts +90 -7
- package/dist/src/types/module.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +57 -2
- package/dist/src/types/trace.d.ts.map +1 -1
- package/package.json +4 -3
- package/src/agent.ts +593 -60
- package/src/api/server.ts +1 -2
- package/src/auto-continue.ts +42 -0
- package/src/code-execution/isolate/scripts.ts +11 -3
- package/src/framework.ts +4004 -1026
- package/src/gate/event-gate.ts +2315 -389
- package/src/gate/index.ts +2 -1
- package/src/gate/recipe-reconcile.ts +355 -0
- package/src/gate/types.ts +70 -8
- package/src/index.ts +7 -4
- package/src/mcpl/channel-registry.ts +1220 -467
- package/src/mcpl/conversation-router.ts +34 -16
- package/src/mcpl/convert-block.ts +14 -1
- package/src/mcpl/hook-orchestrator.ts +33 -6
- package/src/mcpl/index.ts +6 -1
- package/src/mcpl/inference-router.ts +79 -34
- package/src/mcpl/prose-grammar.ts +7 -0
- package/src/mcpl/protocol-family.ts +2 -0
- package/src/mcpl/push-coalescer.ts +51 -13
- package/src/mcpl/reference-fetcher.ts +201 -162
- package/src/mcpl/references.ts +852 -78
- package/src/mcpl/server-connection.ts +145 -7
- package/src/mcpl/tool-lifecycle.ts +21 -0
- package/src/mcpl/tool-presence.ts +650 -0
- package/src/mcpl/tool-result-normalize.ts +18 -6
- package/src/mcpl/tool-signature.ts +285 -0
- package/src/mcpl/toolset-host.ts +637 -0
- package/src/mcpl/toolsets-module.ts +451 -0
- package/src/mcpl/transport.ts +3 -2
- package/src/mcpl/types.ts +22 -1
- package/src/mcpl/visible-content.ts +22 -9
- package/src/module-registry.ts +77 -24
- package/src/modules/discord/index.ts +1 -1
- package/src/modules/history/index.ts +48 -18
- package/src/modules/history/semantic.ts +308 -54
- package/src/modules/workspace/direct-write.ts +425 -0
- package/src/modules/workspace/edit-text.ts +82 -35
- package/src/modules/workspace/effects.ts +1 -1
- package/src/modules/workspace/index.ts +1274 -241
- package/src/modules/workspace/read-page.ts +222 -0
- package/src/modules/workspace/result-text.ts +119 -0
- package/src/modules/workspace/text.ts +58 -32
- package/src/modules/workspace/types.ts +41 -17
- package/src/sent-rows.ts +162 -0
- package/src/silent-heartbeat.ts +17 -10
- package/src/stable-hash.ts +14 -0
- package/src/stored-injections.ts +131 -0
- package/src/text-as-stored.ts +4 -3
- package/src/thinking-drops.ts +141 -0
- package/src/tool-image-ledger.ts +9 -8
- package/src/tool-presentation.ts +3 -1
- package/src/tool-result-guard.ts +19 -6
- package/src/tool-result-history.ts +488 -88
- package/src/tune-out/coordinator.ts +80 -37
- package/src/types/agent.ts +189 -7
- package/src/types/events.ts +19 -2
- package/src/types/framework.ts +21 -3
- package/src/types/module.ts +86 -7
- package/src/types/trace.ts +58 -2
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
import { isToolAllowed } from './tool-policy.js';
|
|
2
|
+
import { ToolPresence, emptyChange, isEmptyChange, joinChanges, keyOf, } from './tool-presence.js';
|
|
3
|
+
/** The meta-tools' module, whose tools are `toolsets--open` and so on. */
|
|
4
|
+
export const TOOLSETS_MODULE = 'toolsets';
|
|
5
|
+
export const META_TOOL_NAMES = {
|
|
6
|
+
open: `${TOOLSETS_MODULE}--open`,
|
|
7
|
+
act: `${TOOLSETS_MODULE}--act`,
|
|
8
|
+
look: `${TOOLSETS_MODULE}--look`,
|
|
9
|
+
close: `${TOOLSETS_MODULE}--close`,
|
|
10
|
+
};
|
|
11
|
+
/** How long an open, close or call is waited for. A late result still applies when it's read. */
|
|
12
|
+
export const TOOLSET_REQUEST_TIMEOUT_MS = 60_000;
|
|
13
|
+
/** A toolsets/list after a (re)connect or in a recovery. */
|
|
14
|
+
const LIST_TIMEOUT_MS = 15_000;
|
|
15
|
+
/** A toolsets/list that only refreshes titles for look. */
|
|
16
|
+
const REFRESH_TIMEOUT_MS = 5_000;
|
|
17
|
+
/** A burst of anomalies is one recovery. */
|
|
18
|
+
const RECOVERY_DEBOUNCE_MS = 200;
|
|
19
|
+
const isObj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
20
|
+
const metaHints = (res) => (isObj(res._meta) ? res._meta['mcpl/hints'] : undefined);
|
|
21
|
+
/** One server's RFC-014 state and traffic. Lives as long as the server's
|
|
22
|
+
* configuration, across reconnects and restarts (its `ended` ids and what
|
|
23
|
+
* the model was shown carry over). */
|
|
24
|
+
export class ToolsetController {
|
|
25
|
+
serverId;
|
|
26
|
+
config;
|
|
27
|
+
deps;
|
|
28
|
+
presence;
|
|
29
|
+
connection = null;
|
|
30
|
+
/** The transport epoch the presence's revs belong to. */
|
|
31
|
+
epoch = -1;
|
|
32
|
+
/** What applying a message's hints changed, by the object that carried them. */
|
|
33
|
+
readChanges = new WeakMap();
|
|
34
|
+
/** Results whose change no one has rendered yet (tellUnlessClaimed). */
|
|
35
|
+
unclaimed = new Set();
|
|
36
|
+
/** eventIds of pushes read on this transport (bounded): a repeat's hints are ignored (RFC §6.1). */
|
|
37
|
+
seenEvents = new Set();
|
|
38
|
+
/** A paged tools/list being read. */
|
|
39
|
+
listPages = null;
|
|
40
|
+
/** Lists this controller asked for itself, whose change it delivers. */
|
|
41
|
+
ownLists = 0;
|
|
42
|
+
/** What lists read while one of its own was out changed, for it to tell. */
|
|
43
|
+
ownListChange = null;
|
|
44
|
+
recoveryTimer = null;
|
|
45
|
+
recovering = false;
|
|
46
|
+
recoverAgain = false;
|
|
47
|
+
constructor(serverId, config, deps) {
|
|
48
|
+
this.serverId = serverId;
|
|
49
|
+
this.config = config;
|
|
50
|
+
this.deps = deps;
|
|
51
|
+
this.presence = new ToolPresence(serverId, META_TOOL_NAMES, (tool) => isToolAllowed(tool, this.config), (tool) => deps.listedName(serverId, tool));
|
|
52
|
+
}
|
|
53
|
+
log(line) {
|
|
54
|
+
this.deps.log(`${this.serverId}: ${line}`);
|
|
55
|
+
}
|
|
56
|
+
/** A restart can bring a new configuration under the same id. */
|
|
57
|
+
setConfig(config) {
|
|
58
|
+
this.config = config;
|
|
59
|
+
}
|
|
60
|
+
/** Tap this connection (a connect or a restart's new one). */
|
|
61
|
+
attach(connection) {
|
|
62
|
+
if (this.connection !== connection) {
|
|
63
|
+
this.connection?.setReadTap(null);
|
|
64
|
+
// A new connection numbers its transports from 0 again.
|
|
65
|
+
this.epoch = -1;
|
|
66
|
+
}
|
|
67
|
+
this.connection = connection;
|
|
68
|
+
connection.setReadTap((read, epoch) => this.onRead(connection, read, epoch));
|
|
69
|
+
}
|
|
70
|
+
/** The server's connection is gone for good (disconnected, removed). */
|
|
71
|
+
detach(connection) {
|
|
72
|
+
if (this.connection !== connection)
|
|
73
|
+
return;
|
|
74
|
+
connection.setReadTap(null);
|
|
75
|
+
this.connection = null;
|
|
76
|
+
this.epoch = -1;
|
|
77
|
+
if (this.recoveryTimer)
|
|
78
|
+
clearTimeout(this.recoveryTimer);
|
|
79
|
+
this.recoveryTimer = null;
|
|
80
|
+
// Nothing of it presents any more; what the agent was told (ended ids,
|
|
81
|
+
// definitions shown) is kept for a next connection.
|
|
82
|
+
this.presence.deactivate();
|
|
83
|
+
}
|
|
84
|
+
/** Whether the meta-tools speak for this server now. */
|
|
85
|
+
get presents() {
|
|
86
|
+
return this.presence.presents;
|
|
87
|
+
}
|
|
88
|
+
/** The live connection, for a request. */
|
|
89
|
+
live() {
|
|
90
|
+
const c = this.connection;
|
|
91
|
+
if (!c || !c.isConnected)
|
|
92
|
+
throw new Error(`${this.serverId} is not connected right now; try again later`);
|
|
93
|
+
this.sync(c.transportEpoch, c);
|
|
94
|
+
return c;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* A new transport: revs start over (RFC §6.1), and its advertisement says
|
|
98
|
+
* whether hints are in effect. Read from the connection, which holds the
|
|
99
|
+
* advertisement before its transport can deliver anything.
|
|
100
|
+
*/
|
|
101
|
+
sync(epoch, connection) {
|
|
102
|
+
if (epoch === this.epoch)
|
|
103
|
+
return;
|
|
104
|
+
this.epoch = epoch;
|
|
105
|
+
this.seenEvents = new Set();
|
|
106
|
+
this.listPages = null;
|
|
107
|
+
this.presence.beginConnection(connection.toolsetDeclarations, true);
|
|
108
|
+
}
|
|
109
|
+
// ── RFC §6.1: apply on arrival ──
|
|
110
|
+
onRead(connection, read, epoch) {
|
|
111
|
+
if (connection !== this.connection)
|
|
112
|
+
return;
|
|
113
|
+
this.sync(epoch, connection);
|
|
114
|
+
if (read.kind === 'result') {
|
|
115
|
+
this.readResult(read.method, read.params, read.result, read.awaited);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!this.presence.active || !isObj(read.params))
|
|
119
|
+
return;
|
|
120
|
+
const p = read.params;
|
|
121
|
+
if (read.kind === 'hints') {
|
|
122
|
+
const cs = this.applyHints(p, 'tools/hints');
|
|
123
|
+
// Carrier 3: a change with nothing to say, told on its own.
|
|
124
|
+
this.deliver(cs);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (p.hints === undefined)
|
|
128
|
+
return;
|
|
129
|
+
// RFC §7: a push carrying hints is never coalesced; when its changes
|
|
130
|
+
// would apply is undefined, so they're ignored and the state re-read.
|
|
131
|
+
if (p.coalesce !== undefined && p.coalesce !== null) {
|
|
132
|
+
this.log(`push ${String(p.eventId ?? '')} carries hints and coalesce (RFC-014 §7 forbids it): its hints are ignored; recovering`);
|
|
133
|
+
this.scheduleRecovery();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// RFC §6.1: never retried, so a seen eventId is a duplicate whose hints applied once.
|
|
137
|
+
const eventId = typeof p.eventId === 'string' || typeof p.eventId === 'number' ? String(p.eventId) : '';
|
|
138
|
+
if (eventId) {
|
|
139
|
+
if (this.seenEvents.has(eventId)) {
|
|
140
|
+
this.log(`push ${eventId} was read before: its hints are ignored`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
this.seenEvents.add(eventId);
|
|
144
|
+
if (this.seenEvents.size > 1000)
|
|
145
|
+
this.seenEvents.delete(this.seenEvents.values().next().value);
|
|
146
|
+
}
|
|
147
|
+
// Applied now, before (and whatever) the host decides about the push.
|
|
148
|
+
this.readChanges.set(p, this.applyHints(p.hints, 'push'));
|
|
149
|
+
}
|
|
150
|
+
readResult(method, params, res, awaited) {
|
|
151
|
+
let cs;
|
|
152
|
+
switch (method) {
|
|
153
|
+
case 'tools/list': {
|
|
154
|
+
const page = Array.isArray(res.tools) ? res.tools : [];
|
|
155
|
+
// A first page (no cursor) starts the list; a page with no next cursor ends it.
|
|
156
|
+
if (params.cursor === undefined || this.listPages === null)
|
|
157
|
+
this.listPages = [];
|
|
158
|
+
this.listPages.push(...page);
|
|
159
|
+
if (res.nextCursor !== undefined && res.nextCursor !== null)
|
|
160
|
+
return;
|
|
161
|
+
const tools = this.listPages;
|
|
162
|
+
this.listPages = null;
|
|
163
|
+
cs = this.readToolList(tools, res);
|
|
164
|
+
// The framework's own refresh (a list change, a reconnect) told here;
|
|
165
|
+
// a list this controller asked for is told by whoever asked.
|
|
166
|
+
if (this.ownLists === 0)
|
|
167
|
+
this.deliver(cs);
|
|
168
|
+
else
|
|
169
|
+
this.ownListChange = joinChanges(this.ownListChange ?? emptyChange(), cs);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
case 'toolsets/list':
|
|
173
|
+
cs = this.readToolsetList(res);
|
|
174
|
+
break;
|
|
175
|
+
case 'toolsets/open': {
|
|
176
|
+
if (!this.presence.active)
|
|
177
|
+
return;
|
|
178
|
+
cs = this.applyHints(metaHints(res), 'toolsets/open');
|
|
179
|
+
const before = this.presence.view();
|
|
180
|
+
const toolset = typeof res.toolset === 'string' ? res.toolset : String(params.toolset ?? '');
|
|
181
|
+
const instance = typeof res.instance === 'string' && res.instance ? res.instance : typeof params.instance === 'string' ? params.instance : undefined;
|
|
182
|
+
this.presence.noteOpened(toolset, instance, typeof res.title === 'string' && res.title ? res.title : undefined);
|
|
183
|
+
cs.changes.push(...this.presence.diff(before, this.presence.view()).changes);
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case 'toolsets/close': {
|
|
187
|
+
if (!this.presence.active)
|
|
188
|
+
return;
|
|
189
|
+
// RFC §5.2: the hint changes the close caused ride in its result, like an open's.
|
|
190
|
+
cs = this.applyHints(metaHints(res), 'toolsets/close');
|
|
191
|
+
const before = this.presence.view();
|
|
192
|
+
this.presence.noteClosed(String(params.toolset ?? ''), typeof params.instance === 'string' ? params.instance : undefined);
|
|
193
|
+
cs.changes.push(...this.presence.diff(before, this.presence.view()).changes);
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
default:
|
|
197
|
+
if (!this.presence.active)
|
|
198
|
+
return;
|
|
199
|
+
cs = this.applyHints(metaHints(res), method);
|
|
200
|
+
}
|
|
201
|
+
if (awaited) {
|
|
202
|
+
this.readChanges.set(res, cs);
|
|
203
|
+
this.tellUnlessClaimed(res, cs, method);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// RFC §6.1: a result nobody waits for any more (it timed out) applies
|
|
207
|
+
// all the same, and its change is told on its own.
|
|
208
|
+
this.log(`late ${method} result read: its hint changes applied`);
|
|
209
|
+
this.deliver(cs);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* The one apply path (RFC §6.1) for a HintChanges from any carrier, as its
|
|
214
|
+
* message is read. Revs are consecutive: anything but the last + 1 means a
|
|
215
|
+
* message was lost or misordered, and the host recovers.
|
|
216
|
+
*/
|
|
217
|
+
applyHints(h, source) {
|
|
218
|
+
if (h === undefined || !this.presence.active)
|
|
219
|
+
return emptyChange();
|
|
220
|
+
const before = this.presence.view();
|
|
221
|
+
const last = this.presence.rev;
|
|
222
|
+
const r = this.presence.apply(h);
|
|
223
|
+
const rev = String(h?.rev);
|
|
224
|
+
if (r.behind) {
|
|
225
|
+
this.log(`hint change rev ${rev} (${source}) is not after rev ${last}: ignored; recovering from tools/list and toolsets/list`);
|
|
226
|
+
this.scheduleRecovery();
|
|
227
|
+
}
|
|
228
|
+
else if (r.skipped) {
|
|
229
|
+
this.log(`hint change rev ${rev} (${source}) after rev ${last}: a rev was lost; applied, and recovering from tools/list and toolsets/list`);
|
|
230
|
+
this.scheduleRecovery();
|
|
231
|
+
}
|
|
232
|
+
else if (!r.applied) {
|
|
233
|
+
this.log(`a malformed hint change (${source}) was ignored`);
|
|
234
|
+
}
|
|
235
|
+
const cs = this.presence.diff(before, this.presence.view());
|
|
236
|
+
cs.suggest.push(...r.suggest);
|
|
237
|
+
return cs;
|
|
238
|
+
}
|
|
239
|
+
/** tools/list, as read: definitions and presence as of its `mcpl/rev`, which takes no rev of its own (RFC §4.1). */
|
|
240
|
+
readToolList(tools, last) {
|
|
241
|
+
const before = this.presence.view();
|
|
242
|
+
this.presence.setTools(tools);
|
|
243
|
+
if (this.presence.active && this.presence.noteListRev(isObj(last._meta) ? last._meta['mcpl/rev'] : undefined)) {
|
|
244
|
+
this.log(`tools/list was written after rev ${String(isObj(last._meta) ? last._meta['mcpl/rev'] : '')}, past the last rev read: a message was lost; recovering`);
|
|
245
|
+
this.scheduleRecovery();
|
|
246
|
+
}
|
|
247
|
+
return this.presence.diff(before, this.presence.view());
|
|
248
|
+
}
|
|
249
|
+
/** toolsets/list, as read: a full statement of dynamic-tool state under its own rev (RFC §5.3, §6.1). */
|
|
250
|
+
readToolsetList(res) {
|
|
251
|
+
if (!this.presence.active)
|
|
252
|
+
return emptyChange();
|
|
253
|
+
const before = this.presence.view();
|
|
254
|
+
const { lost, ended, suggest, skipped } = this.presence.adopt(res);
|
|
255
|
+
if (skipped && !this.recovering) {
|
|
256
|
+
// Per-instance state is restated in full; what else was lost (presence) comes from tools/list.
|
|
257
|
+
this.log('toolsets/list skipped a rev: re-reading tools/list');
|
|
258
|
+
this.scheduleRecovery();
|
|
259
|
+
}
|
|
260
|
+
const cs = this.presence.diff(before, this.presence.view());
|
|
261
|
+
cs.suggest.push(...suggest);
|
|
262
|
+
// A lost toolset gets its note, not also a "closed" line.
|
|
263
|
+
cs.changes = cs.changes.filter((c) => !lost.some((o) => keyOf(o.toolset, o.instance) === c.key));
|
|
264
|
+
cs.notes.push(...this.presence.adoptionNotes(lost, ended));
|
|
265
|
+
return cs;
|
|
266
|
+
}
|
|
267
|
+
/** A change with nothing else to ride on, told as a notice. */
|
|
268
|
+
deliver(cs) {
|
|
269
|
+
if (isEmptyChange(cs))
|
|
270
|
+
return;
|
|
271
|
+
const text = this.presence.render(cs);
|
|
272
|
+
if (!text)
|
|
273
|
+
return;
|
|
274
|
+
this.deps.notify(this.serverId, text, { invite: cs.suggest.some((s) => s.action === 'open') });
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* A dynamic tool called by its namespaced name, as if it were listed (a
|
|
278
|
+
* model imitating an earlier call, a module): refused, so every call into
|
|
279
|
+
* a toolset goes through act, which knows its instance and gates closed
|
|
280
|
+
* groups (RFC §5.4, §5.5). Null for any other tool.
|
|
281
|
+
*/
|
|
282
|
+
dynamicCallRefusal(tool, calledAs) {
|
|
283
|
+
if (!this.presence.active || !this.presence.tool(tool) || this.presence.presenceOf(tool) !== 'dynamic')
|
|
284
|
+
return null;
|
|
285
|
+
return `There's no tool "${calledAs}" in your tool list, so nothing ran: ${tool} is a dynamic tool of ${this.serverId}, ` +
|
|
286
|
+
`called with ${META_TOOL_NAMES.act} {server:"${this.serverId}", tool:"${tool}", args}. ${this.presence.toolStatus(tool)}.`;
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* An awaited result's change is told by whoever renders that result, when
|
|
290
|
+
* the result goes to the agent: the model's own call of a tool (its tool
|
|
291
|
+
* result), a meta-tool. One no one renders by the time the awaiting code has
|
|
292
|
+
* run (the next macrotask), such as the result of a call the framework makes
|
|
293
|
+
* itself (a reaction, a send, an accounted side effect), is told as a notice
|
|
294
|
+
* instead, as a standalone tools/hints is (RFC §6.1: every change reaches the
|
|
295
|
+
* agent once).
|
|
296
|
+
*/
|
|
297
|
+
tellUnlessClaimed(res, cs, method) {
|
|
298
|
+
if (isEmptyChange(cs))
|
|
299
|
+
return;
|
|
300
|
+
this.unclaimed.add(res);
|
|
301
|
+
setImmediate(() => {
|
|
302
|
+
if (!this.unclaimed.delete(res))
|
|
303
|
+
return;
|
|
304
|
+
this.log(`${method} result's tool change wasn't shown with it: told as a notice`);
|
|
305
|
+
this.deliver(cs);
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/** What applying `carrier`'s hints changed (a tool result, a push's params),
|
|
309
|
+
* rendered, for its handler to show with it; '' for nothing. Taking it
|
|
310
|
+
* means it's told there, not as a notice. */
|
|
311
|
+
changeText(carrier) {
|
|
312
|
+
if (!isObj(carrier))
|
|
313
|
+
return '';
|
|
314
|
+
this.unclaimed.delete(carrier);
|
|
315
|
+
const cs = this.readChanges.get(carrier);
|
|
316
|
+
return cs ? this.presence.render(cs) : '';
|
|
317
|
+
}
|
|
318
|
+
/** The change a carrier's hints made, or an empty one; taken as changeText's is. */
|
|
319
|
+
changeOf(carrier) {
|
|
320
|
+
if (!isObj(carrier))
|
|
321
|
+
return emptyChange();
|
|
322
|
+
this.unclaimed.delete(carrier);
|
|
323
|
+
return this.readChanges.get(carrier) ?? emptyChange();
|
|
324
|
+
}
|
|
325
|
+
// ── recovery (RFC §6.1) ──
|
|
326
|
+
scheduleRecovery() {
|
|
327
|
+
if (!this.presence.active)
|
|
328
|
+
return;
|
|
329
|
+
if (this.recovering) {
|
|
330
|
+
this.recoverAgain = true;
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (this.recoveryTimer)
|
|
334
|
+
return;
|
|
335
|
+
this.recoveryTimer = setTimeout(() => {
|
|
336
|
+
this.recoveryTimer = null;
|
|
337
|
+
void this.recover();
|
|
338
|
+
}, RECOVERY_DEBOUNCE_MS);
|
|
339
|
+
this.recoveryTimer.unref?.();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Recovering: re-read tools/list (presence, declared definitions), then
|
|
343
|
+
* toolsets/list (dynamic-tool state in full), so every tool the statement
|
|
344
|
+
* names is already known; each applies where it's read. What changed is
|
|
345
|
+
* told. (stdio and WebSocket deliver in order, so no early rev is held.)
|
|
346
|
+
*/
|
|
347
|
+
async recover() {
|
|
348
|
+
const connection = this.connection;
|
|
349
|
+
if (!connection || !connection.isConnected)
|
|
350
|
+
return;
|
|
351
|
+
this.recovering = true;
|
|
352
|
+
try {
|
|
353
|
+
const tools = await this.ownToolList(connection);
|
|
354
|
+
if (connection !== this.connection)
|
|
355
|
+
return;
|
|
356
|
+
const lists = await this.ownToolsetList(connection, LIST_TIMEOUT_MS, 'recovery');
|
|
357
|
+
if (connection !== this.connection)
|
|
358
|
+
return;
|
|
359
|
+
this.deliver(joinChanges(tools, lists));
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
this.recovering = false;
|
|
363
|
+
if (this.recoverAgain) {
|
|
364
|
+
this.recoverAgain = false;
|
|
365
|
+
this.scheduleRecovery();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
async ownToolList(connection) {
|
|
370
|
+
if (this.ownLists++ === 0)
|
|
371
|
+
this.ownListChange = null;
|
|
372
|
+
try {
|
|
373
|
+
// The tap applied each page as it was read, and kept what the whole
|
|
374
|
+
// list changed (ownListChange).
|
|
375
|
+
await connection.sendToolsList();
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
this.log(`tools/list failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
379
|
+
}
|
|
380
|
+
finally {
|
|
381
|
+
this.ownLists--;
|
|
382
|
+
}
|
|
383
|
+
const collected = this.ownListChange ?? emptyChange();
|
|
384
|
+
if (this.ownLists === 0)
|
|
385
|
+
this.ownListChange = null;
|
|
386
|
+
else
|
|
387
|
+
this.ownListChange = emptyChange();
|
|
388
|
+
return collected;
|
|
389
|
+
}
|
|
390
|
+
async ownToolsetList(connection, timeoutMs, why) {
|
|
391
|
+
try {
|
|
392
|
+
const r = await connection.sendToolsetsList(timeoutMs);
|
|
393
|
+
return this.changeOf(r);
|
|
394
|
+
}
|
|
395
|
+
catch (error) {
|
|
396
|
+
this.log(`toolsets/list (${why}) failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
397
|
+
return emptyChange();
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* After every (re)connect, once its policy has settled (RFC §5.3): tools/list
|
|
402
|
+
* then toolsets/list, the truth. What the server reports open is adopted
|
|
403
|
+
* (a game kept across the reconnect); what the host believed open and it
|
|
404
|
+
* doesn't report is closed, never re-opened here, since opening can start a
|
|
405
|
+
* new game. What ended meanwhile is told, each `ended` id once.
|
|
406
|
+
*/
|
|
407
|
+
async connected(connection) {
|
|
408
|
+
if (connection !== this.connection || !connection.isConnected)
|
|
409
|
+
return;
|
|
410
|
+
this.sync(connection.transportEpoch, connection);
|
|
411
|
+
if (!this.presence.active)
|
|
412
|
+
return;
|
|
413
|
+
const epoch = connection.transportEpoch;
|
|
414
|
+
const tools = await this.ownToolList(connection);
|
|
415
|
+
if (connection !== this.connection || connection.transportEpoch !== epoch)
|
|
416
|
+
return;
|
|
417
|
+
const lists = await this.ownToolsetList(connection, LIST_TIMEOUT_MS, 'after connecting');
|
|
418
|
+
if (connection !== this.connection || connection.transportEpoch !== epoch)
|
|
419
|
+
return;
|
|
420
|
+
this.deliver(joinChanges(tools, lists));
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Re-read what the server holds open (titles, visibility) without telling
|
|
424
|
+
* it: for look, which restates everything anyway. Returns notes for what
|
|
425
|
+
* the server no longer holds.
|
|
426
|
+
*/
|
|
427
|
+
async refreshOpen() {
|
|
428
|
+
if (!this.presence.active)
|
|
429
|
+
return [];
|
|
430
|
+
const connection = this.connection;
|
|
431
|
+
if (!connection || !connection.isConnected)
|
|
432
|
+
return [];
|
|
433
|
+
try {
|
|
434
|
+
const r = await connection.sendToolsetsList(REFRESH_TIMEOUT_MS);
|
|
435
|
+
return this.changeOf(r).notes;
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
this.log(`toolsets/list (look) failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
439
|
+
return [];
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// ── the host's acts ──
|
|
443
|
+
/** toolsets/open (RFC §5.2). The server's refusal rejects. */
|
|
444
|
+
async open(toolset, instance, options) {
|
|
445
|
+
const connection = this.live();
|
|
446
|
+
const r = await connection.sendToolsetsOpen({ toolset, ...(instance ? { instance } : {}), ...(options ? { options } : {}) }, TOOLSET_REQUEST_TIMEOUT_MS);
|
|
447
|
+
const res = isObj(r) ? r : {};
|
|
448
|
+
const inst = typeof res.instance === 'string' && res.instance ? res.instance : instance;
|
|
449
|
+
// RFC §5.2: a proposed name is used as given or the open refused.
|
|
450
|
+
if (instance && inst !== instance)
|
|
451
|
+
this.log(`proposed instance "${instance}" came back as "${inst}" (RFC-014 §5.2 forbids renaming): using the server's`);
|
|
452
|
+
const key = keyOf(toolset, this.presence.declared[toolset]?.instances ? inst : undefined);
|
|
453
|
+
const title = typeof res.title === 'string' && res.title ? res.title : this.presence.openRecords().find((o) => keyOf(o.toolset, o.instance) === key)?.title;
|
|
454
|
+
return {
|
|
455
|
+
key,
|
|
456
|
+
...(title ? { title } : {}),
|
|
457
|
+
content: Array.isArray(res.content) ? res.content : [],
|
|
458
|
+
change: this.changeOf(res),
|
|
459
|
+
adopted: res.adopted === true,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
/** toolsets/close (RFC §5.2). */
|
|
463
|
+
async close(toolset, instance) {
|
|
464
|
+
const connection = this.live();
|
|
465
|
+
const r = await connection.sendToolsetsClose({ toolset, ...(instance ? { instance } : {}) }, TOOLSET_REQUEST_TIMEOUT_MS);
|
|
466
|
+
const res = isObj(r) ? r : {};
|
|
467
|
+
return { content: Array.isArray(res.content) ? res.content : [], change: this.changeOf(res) };
|
|
468
|
+
}
|
|
469
|
+
/** Open or close an undeclared group (RFC §5.4): the host's own act; the server isn't told. */
|
|
470
|
+
setGroupOpen(group, open) {
|
|
471
|
+
const before = this.presence.view();
|
|
472
|
+
if (open)
|
|
473
|
+
this.presence.openGroup(group);
|
|
474
|
+
else
|
|
475
|
+
this.presence.closeGroup(group);
|
|
476
|
+
return this.presence.diff(before, this.presence.view());
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* A manifest re-fetch (RFC §5.1): the `toolsets` domain's declarations, as
|
|
480
|
+
* the server sent them. A toolset removed ends its instances; a server
|
|
481
|
+
* that withdraws toolHints is hint-less from then on. What changed is told.
|
|
482
|
+
*/
|
|
483
|
+
manifestChanged(declarations) {
|
|
484
|
+
const before = this.presence.view();
|
|
485
|
+
const wasActive = this.presence.active;
|
|
486
|
+
if (!declarations || declarations.toolHints !== true) {
|
|
487
|
+
if (!wasActive)
|
|
488
|
+
return;
|
|
489
|
+
this.presence.deactivate();
|
|
490
|
+
this.log('the server withdrew toolHints: every tool is static from now on');
|
|
491
|
+
const cs = this.presence.diff(before, this.presence.view());
|
|
492
|
+
cs.notes.push(`${this.serverId} no longer presents toolsets: its tools are all in your tool list now.`);
|
|
493
|
+
this.deliver(cs);
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
if (!wasActive) {
|
|
497
|
+
// Hints that arrive by a manifest change take effect at the next
|
|
498
|
+
// connection's handshake: revs belong to a connection's first message.
|
|
499
|
+
this.log('the server now advertises toolHints: in effect from its next connection');
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
this.presence.setManifest(declarations);
|
|
503
|
+
this.deliver(this.presence.diff(before, this.presence.view()));
|
|
504
|
+
}
|
|
505
|
+
/** Apply pending static↔dynamic moves (RFC §4.2) at a tool-list boundary, and say where they went. */
|
|
506
|
+
applyMoves() {
|
|
507
|
+
return this.presence.applyMoves().map(({ name, to }) => to === 'dynamic'
|
|
508
|
+
? `${name} left your tool list: it's announced when available now, and called with ${META_TOOL_NAMES.act} {server:"${this.serverId}", tool:"${name}", args}.`
|
|
509
|
+
: `${name} is in your tool list now, as ${this.deps.listedName(this.serverId, name)}.`);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
/** Every server's controller, for the meta-tools and reminders. */
|
|
513
|
+
export class ToolsetHub {
|
|
514
|
+
deps;
|
|
515
|
+
controllers = new Map();
|
|
516
|
+
/** Per agent: the markers it has had in view (seen), and whether a reminder is due. */
|
|
517
|
+
seen = new Map();
|
|
518
|
+
due = new Set();
|
|
519
|
+
constructor(deps) {
|
|
520
|
+
this.deps = deps;
|
|
521
|
+
}
|
|
522
|
+
/** The controller for a server, made at its first connect. */
|
|
523
|
+
controllerFor(config) {
|
|
524
|
+
let c = this.controllers.get(config.id);
|
|
525
|
+
if (!c) {
|
|
526
|
+
c = new ToolsetController(config.id, config, this.deps);
|
|
527
|
+
this.controllers.set(config.id, c);
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
c.setConfig(config);
|
|
531
|
+
}
|
|
532
|
+
return c;
|
|
533
|
+
}
|
|
534
|
+
get(serverId) {
|
|
535
|
+
return this.controllers.get(serverId);
|
|
536
|
+
}
|
|
537
|
+
/** A server's configuration went (removed): forget its controller. */
|
|
538
|
+
forget(serverId) {
|
|
539
|
+
this.controllers.delete(serverId);
|
|
540
|
+
}
|
|
541
|
+
all() {
|
|
542
|
+
return [...this.controllers.values()];
|
|
543
|
+
}
|
|
544
|
+
/** The servers the meta-tools speak for now. */
|
|
545
|
+
presenting() {
|
|
546
|
+
return this.all().filter((c) => c.presents);
|
|
547
|
+
}
|
|
548
|
+
/** Every open key's marker, across servers. */
|
|
549
|
+
openMarkers() {
|
|
550
|
+
return this.all().flatMap((c) => (c.presence.active ? c.presence.openKeys().map((k) => c.presence.label(k)) : []));
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* A compile built to send for `agentName` (RFC §8.3): which open toolsets'
|
|
554
|
+
* announcements the request carries. One the agent has had in view and the
|
|
555
|
+
* request no longer carries (compressed, or out of the window) makes a
|
|
556
|
+
* reminder due.
|
|
557
|
+
*/
|
|
558
|
+
observeCompile(agentName, messages) {
|
|
559
|
+
const open = this.openMarkers();
|
|
560
|
+
if (open.length === 0) {
|
|
561
|
+
this.seen.delete(agentName);
|
|
562
|
+
this.due.delete(agentName);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
const text = compiledText(messages);
|
|
566
|
+
const seen = this.seen.get(agentName) ?? new Set();
|
|
567
|
+
let missing = false;
|
|
568
|
+
for (const marker of open) {
|
|
569
|
+
if (text.includes(marker))
|
|
570
|
+
seen.add(marker);
|
|
571
|
+
else if (seen.has(marker))
|
|
572
|
+
missing = true;
|
|
573
|
+
}
|
|
574
|
+
for (const marker of [...seen])
|
|
575
|
+
if (!open.includes(marker))
|
|
576
|
+
seen.delete(marker);
|
|
577
|
+
this.seen.set(agentName, seen);
|
|
578
|
+
// Due until a request carries every marker the agent has seen again: a
|
|
579
|
+
// gather that doesn't send (a preview) leaves it due for the next start.
|
|
580
|
+
if (missing)
|
|
581
|
+
this.due.add(agentName);
|
|
582
|
+
else
|
|
583
|
+
this.due.delete(agentName);
|
|
584
|
+
}
|
|
585
|
+
/** The reminder due for `agentName`, or null when none is. */
|
|
586
|
+
reminderFor(agentName) {
|
|
587
|
+
if (!this.due.has(agentName))
|
|
588
|
+
return null;
|
|
589
|
+
const parts = this.presenting().map((c) => c.presence.reminder()).filter((r) => !!r);
|
|
590
|
+
if (parts.length === 0)
|
|
591
|
+
return null;
|
|
592
|
+
return `Open toolsets (a reminder: their earlier announcements have left your context):\n${parts.join('\n')}`;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
/** The text a compiled request carries, for marker search: text blocks and tool results' text, at any depth. */
|
|
596
|
+
function compiledText(messages) {
|
|
597
|
+
const out = [];
|
|
598
|
+
const walk = (v, depth) => {
|
|
599
|
+
if (depth > 6)
|
|
600
|
+
return;
|
|
601
|
+
if (typeof v === 'string') {
|
|
602
|
+
out.push(v);
|
|
603
|
+
return;
|
|
604
|
+
}
|
|
605
|
+
if (Array.isArray(v)) {
|
|
606
|
+
for (const x of v)
|
|
607
|
+
walk(x, depth + 1);
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
if (!isObj(v))
|
|
611
|
+
return;
|
|
612
|
+
if (typeof v.text === 'string')
|
|
613
|
+
out.push(v.text);
|
|
614
|
+
if (v.content !== undefined)
|
|
615
|
+
walk(v.content, depth + 1);
|
|
616
|
+
};
|
|
617
|
+
for (const m of messages)
|
|
618
|
+
walk(isObj(m) ? m.content : undefined, 0);
|
|
619
|
+
return out.join('\n');
|
|
620
|
+
}
|
|
621
|
+
//# sourceMappingURL=toolset-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolset-host.js","sourceRoot":"","sources":["../../../src/mcpl/toolset-host.ts"],"names":[],"mappings":"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"}
|