@animalabs/agent-framework 0.6.10 → 0.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/dist/src/agent.d.ts +2 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +3 -0
- package/dist/src/agent.js.map +1 -1
- package/dist/src/framework.d.ts +115 -15
- package/dist/src/framework.d.ts.map +1 -1
- package/dist/src/framework.js +820 -104
- package/dist/src/framework.js.map +1 -1
- package/dist/src/mcpl/channel-registry.d.ts +87 -7
- package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
- package/dist/src/mcpl/channel-registry.js +329 -49
- package/dist/src/mcpl/channel-registry.js.map +1 -1
- package/dist/src/modules/workspace/index.d.ts.map +1 -1
- package/dist/src/modules/workspace/index.js +13 -4
- package/dist/src/modules/workspace/index.js.map +1 -1
- package/dist/src/types/agent.d.ts +17 -0
- package/dist/src/types/agent.d.ts.map +1 -1
- package/dist/src/types/trace.d.ts +32 -0
- package/dist/src/types/trace.d.ts.map +1 -1
- package/dist/test/channel-registry-routing.test.js +186 -10
- package/dist/test/channel-registry-routing.test.js.map +1 -1
- package/dist/test/explicit-prose-routing.test.d.ts +11 -0
- package/dist/test/explicit-prose-routing.test.d.ts.map +1 -0
- package/dist/test/explicit-prose-routing.test.js +247 -0
- package/dist/test/explicit-prose-routing.test.js.map +1 -0
- package/dist/test/present-while-acting.test.js +85 -8
- package/dist/test/present-while-acting.test.js.map +1 -1
- package/dist/test/trunk-channel-routing.test.js +2 -2
- package/dist/test/trunk-channel-routing.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/agent.ts +3 -0
- package/src/framework.ts +881 -107
- package/src/mcpl/channel-registry.ts +401 -54
- package/src/modules/workspace/index.ts +13 -4
- package/src/types/agent.ts +18 -0
- package/src/types/trace.ts +47 -1
|
@@ -48,6 +48,25 @@ interface ChannelRegistryOptions {
|
|
|
48
48
|
reason: string;
|
|
49
49
|
textLen: number;
|
|
50
50
|
}) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Called when channels were opened WITHOUT the agent asking (subscription
|
|
53
|
+
* policy admitting a newly discovered channel, or delivery into a closed
|
|
54
|
+
* locus). The host wires this to drop a durable notice into the agent's
|
|
55
|
+
* window — the agent must always learn that new traffic will start
|
|
56
|
+
* flowing, and that `channel_close` opts out (their decision outranks
|
|
57
|
+
* policy). Fires ONCE per channel ever: the desired-state decision is
|
|
58
|
+
* durable, so reboots do not re-announce. Must not trigger inference.
|
|
59
|
+
*/
|
|
60
|
+
onChannelAutoOpened?: (info: {
|
|
61
|
+
/** Agent whose action caused the open (delivery); absent for policy opens. */
|
|
62
|
+
conversationId?: string;
|
|
63
|
+
serverId: string;
|
|
64
|
+
source: 'subscription-policy' | 'opened-by-delivery';
|
|
65
|
+
channels: Array<{
|
|
66
|
+
channelId: string;
|
|
67
|
+
label?: string;
|
|
68
|
+
}>;
|
|
69
|
+
}) => void;
|
|
51
70
|
/**
|
|
52
71
|
* Resolve a conversation fork's HOME channel from its agent name. Conversation
|
|
53
72
|
* forks are spawned bound to a single channel (the framework tracks this in
|
|
@@ -82,6 +101,7 @@ export declare class ChannelRegistry {
|
|
|
82
101
|
private sendTypingFn?;
|
|
83
102
|
private shouldTriggerInference?;
|
|
84
103
|
private onRouteFailure?;
|
|
104
|
+
private onChannelAutoOpened?;
|
|
85
105
|
private homeChannelResolver?;
|
|
86
106
|
private activeChannelResolver?;
|
|
87
107
|
private store?;
|
|
@@ -149,7 +169,7 @@ export declare class ChannelRegistry {
|
|
|
149
169
|
* channels/register or channels/changed overwrites this descriptor with the
|
|
150
170
|
* richer one.
|
|
151
171
|
*/
|
|
152
|
-
ensureChannelRegistered(serverId: string, channelId: string, label?: string): void;
|
|
172
|
+
ensureChannelRegistered(serverId: string, channelId: string, label?: string, extraMetadata?: Record<string, unknown>): void;
|
|
153
173
|
/**
|
|
154
174
|
* Start sending typing indicators for a channel.
|
|
155
175
|
*
|
|
@@ -215,6 +235,19 @@ export declare class ChannelRegistry {
|
|
|
215
235
|
* discovered later use their server bootstrap preference, otherwise closed.
|
|
216
236
|
*/
|
|
217
237
|
private migrateLegacyPolicy;
|
|
238
|
+
/**
|
|
239
|
+
* True when the server's recipe subscription policy wants this channel
|
|
240
|
+
* open. This is an ONGOING admission policy (subscribed ⇒ open, no matter
|
|
241
|
+
* when the channel is discovered) — not just a bootstrap seed. Allow-list
|
|
242
|
+
* entries may be composite MCPL ids or raw server-internal ids.
|
|
243
|
+
*/
|
|
244
|
+
private policyWantsOpen;
|
|
245
|
+
/**
|
|
246
|
+
* Returns true when this call made a FRESH subscription-policy decision to
|
|
247
|
+
* open the channel — the caller announces those to the agent (once per
|
|
248
|
+
* channel ever: the decision persists in chronicle, so reboots see an
|
|
249
|
+
* existing non-default source and never re-fire).
|
|
250
|
+
*/
|
|
218
251
|
private ensureInitialDesiredState;
|
|
219
252
|
private reconcileChannels;
|
|
220
253
|
/**
|
|
@@ -237,6 +270,50 @@ export declare class ChannelRegistry {
|
|
|
237
270
|
*/
|
|
238
271
|
private findChannelKey;
|
|
239
272
|
private handleToolList;
|
|
273
|
+
/**
|
|
274
|
+
* The single open executor: record durable desired-open intent, tell the
|
|
275
|
+
* server to subscribe, mark the live entry open. Every path that opens a
|
|
276
|
+
* channel — the agent's channel_open tool, delivery into a closed locus,
|
|
277
|
+
* an explicit send into a closed channel — funnels here, so lifecycle
|
|
278
|
+
* events, desired state, and live state can never diverge by path.
|
|
279
|
+
* Desired state is recorded BEFORE the server round-trip: intent sticks
|
|
280
|
+
* even if the subscribe fails, and reconciliation retries later.
|
|
281
|
+
*/
|
|
282
|
+
private openChannelNow;
|
|
283
|
+
/**
|
|
284
|
+
* Resolve a `>>` prose-routing target (explicit prose routing —
|
|
285
|
+
* docs/explicit-prose-routing.md) to a registered channel.
|
|
286
|
+
*
|
|
287
|
+
* Accepted spellings, tried in order:
|
|
288
|
+
* 1. exact descriptor id (`discord:guild:123`, always unambiguous)
|
|
289
|
+
* 2. exact raw server-internal id (`address.channelId`)
|
|
290
|
+
* 3. `#label` / bare label — case-insensitive match on descriptor label
|
|
291
|
+
* with any leading '#' stripped from both sides
|
|
292
|
+
* 4. `@name` — DM descriptor labels (`DM: name`), case-insensitive
|
|
293
|
+
*
|
|
294
|
+
* Ambiguity is an error carrying candidates — never a guess: this is the
|
|
295
|
+
* mechanism that makes prose misdelivery structurally impossible.
|
|
296
|
+
*/
|
|
297
|
+
resolveProseTarget(spec: string): {
|
|
298
|
+
channelId: string;
|
|
299
|
+
label?: string;
|
|
300
|
+
} | {
|
|
301
|
+
error: string;
|
|
302
|
+
candidates?: string[];
|
|
303
|
+
};
|
|
304
|
+
/**
|
|
305
|
+
* Open a channel because something was DELIVERED into it (explicit send
|
|
306
|
+
* tool or routed speech). Sending into a closed channel is not a thing:
|
|
307
|
+
* engaging a channel opens it, so typing indicators, reaction machinery,
|
|
308
|
+
* and inbound forwarding all come alive with the first outbound message.
|
|
309
|
+
* Accepts composite MCPL ids or raw server-internal ids (explicit send
|
|
310
|
+
* tools receive whatever the agent typed).
|
|
311
|
+
*/
|
|
312
|
+
openIfClosedForSend(rawChannelId: string, serverId?: string): Promise<{
|
|
313
|
+
status: 'opened' | 'already-open' | 'unknown-channel' | 'ambiguous' | 'open-failed';
|
|
314
|
+
channelId?: string;
|
|
315
|
+
label?: string;
|
|
316
|
+
}>;
|
|
240
317
|
private handleToolOpen;
|
|
241
318
|
private handleToolClose;
|
|
242
319
|
private handleToolDecline;
|
|
@@ -269,14 +346,17 @@ export declare class ChannelRegistry {
|
|
|
269
346
|
* ONCE and pin every segment to it via routeSpeech's `overrideChannelId`. */
|
|
270
347
|
resolveLocus(conversationId: string): string | null;
|
|
271
348
|
routeSpeech(conversationId: string, text: string,
|
|
272
|
-
/**
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
* and
|
|
277
|
-
|
|
349
|
+
/** The turn's FROZEN locus, snapshotted once by the caller (resolveLocus
|
|
350
|
+
* at turn start) and passed to every segment of the turn. Mandatory:
|
|
351
|
+
* there is deliberately no live-resolution fallback here — a late
|
|
352
|
+
* dispatch resolving live can read the NEXT turn's trigger state or a
|
|
353
|
+
* stale global default and land the reply in the wrong channel (item-3,
|
|
354
|
+
* PR #32, and the 2026-07-22 Sol DM misroute). Explicit `null` means
|
|
355
|
+
* "this turn is pinned to no locus": fail loudly rather than guess. */
|
|
356
|
+
locusChannelId: string | null): Promise<{
|
|
278
357
|
delivered: boolean;
|
|
279
358
|
channelId: string;
|
|
359
|
+
messageId?: string;
|
|
280
360
|
} | null>;
|
|
281
361
|
private handleToolPublish;
|
|
282
362
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel-registry.d.ts","sourceRoot":"","sources":["../../../src/mcpl/channel-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EAEtB,qBAAqB,EACrB,sBAAsB,EAOvB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AASlF,KAAK,mBAAmB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAgC7C,qEAAqE;AACrE,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,qEAAqE;AACrE,UAAU,SAAS;IACjB,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACpE;
|
|
1
|
+
{"version":3,"file":"channel-registry.d.ts","sourceRoot":"","sources":["../../../src/mcpl/channel-registry.ts"],"names":[],"mappings":"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"}
|