@adonis-agora/agent 0.59.0 → 0.60.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/CHANGELOG.md +41 -0
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +28 -6
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/agent-deps-factory.d.ts +35 -1
- package/dist/src/agent-deps-factory.d.ts.map +1 -1
- package/dist/src/agent-deps-factory.js +81 -0
- package/dist/src/agent-deps-factory.js.map +1 -1
- package/dist/src/agent-loop.d.ts +8 -2
- package/dist/src/agent-loop.d.ts.map +1 -1
- package/dist/src/agent-loop.js +105 -18
- package/dist/src/agent-loop.js.map +1 -1
- package/dist/src/agent-service.d.ts +40 -5
- package/dist/src/agent-service.d.ts.map +1 -1
- package/dist/src/agent-service.js +110 -22
- package/dist/src/agent-service.js.map +1 -1
- package/dist/src/chat-queue-service.d.ts +18 -2
- package/dist/src/chat-queue-service.d.ts.map +1 -1
- package/dist/src/chat-queue-service.js +24 -2
- package/dist/src/chat-queue-service.js.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/personas.d.ts +43 -1
- package/dist/src/personas.d.ts.map +1 -1
- package/dist/src/personas.js +83 -0
- package/dist/src/personas.js.map +1 -1
- package/dist/src/spi/agent-store.d.ts +13 -1
- package/dist/src/spi/agent-store.d.ts.map +1 -1
- package/dist/src/spi/agent-store.js.map +1 -1
- package/dist/src/spi/chat-queue.d.ts +8 -0
- package/dist/src/spi/chat-queue.d.ts.map +1 -1
- package/dist/src/spi/chat-queue.js +1 -0
- package/dist/src/spi/chat-queue.js.map +1 -1
- package/dist/src/stores/lucid-schema.d.ts.map +1 -1
- package/dist/src/stores/lucid-schema.js +3 -0
- package/dist/src/stores/lucid-schema.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +1 -0
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +23 -5
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/testing/chat-queue-store-contract.d.ts.map +1 -1
- package/dist/src/testing/chat-queue-store-contract.js +3 -0
- package/dist/src/testing/chat-queue-store-contract.js.map +1 -1
- package/dist/src/testing/in-memory-store.d.ts +1 -0
- package/dist/src/testing/in-memory-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-store.js +8 -1
- package/dist/src/testing/in-memory-store.js.map +1 -1
- package/dist/src/thread-persona.d.ts +7 -0
- package/dist/src/thread-persona.d.ts.map +1 -0
- package/dist/src/thread-persona.js +12 -0
- package/dist/src/thread-persona.js.map +1 -0
- package/dist/src/tool-registry.d.ts +11 -2
- package/dist/src/tool-registry.d.ts.map +1 -1
- package/dist/src/tool-registry.js +8 -2
- package/dist/src/tool-registry.js.map +1 -1
- package/dist/src/types.d.ts +69 -5
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +2 -1
- package/skills/agent-personas-agents/SKILL.md +36 -8
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { defaultPersonaOf, findPersona, intersectAllowLists, PersonaNotFoundError, personaCatalogEntry, resolvePersonaAlias, } from './personas.js';
|
|
1
2
|
/** The synthesized `agent`-kind tool name for an edge to `target`: `ask_<target>`, or `start_<target>` for a detached one. */
|
|
2
3
|
export function delegateToolName(target, options = {}) {
|
|
3
4
|
const slug = target.replace(/[^a-zA-Z0-9]+/g, '_');
|
|
@@ -137,8 +138,67 @@ export class AgentDepsFactory {
|
|
|
137
138
|
}
|
|
138
139
|
return [...(definition.tools ?? []), ...delegated];
|
|
139
140
|
}
|
|
141
|
+
/** Is `name` a registered agent — or the implicit default one? */
|
|
142
|
+
isAgent(name) {
|
|
143
|
+
return name === this.defaultAgentName() || this.config.agents.get(name) !== undefined;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The agent a name stands for: itself when it is a registered agent (or unknown — the bare
|
|
147
|
+
* assistant), else the agent whose persona took the name over ({@link Persona.aliases}) and that
|
|
148
|
+
* persona.
|
|
149
|
+
*/
|
|
150
|
+
resolveAgent(name) {
|
|
151
|
+
if (this.isAgent(name)) {
|
|
152
|
+
return { agentName: name };
|
|
153
|
+
}
|
|
154
|
+
const alias = resolvePersonaAlias(this.agentDefinitions(), name);
|
|
155
|
+
return alias === undefined
|
|
156
|
+
? { agentName: name }
|
|
157
|
+
: { agentName: alias.agent, persona: alias.persona };
|
|
158
|
+
}
|
|
159
|
+
/** `agentName`'s personas as a picker reads them. Empty when it declares none. */
|
|
160
|
+
personaCatalog(agentName) {
|
|
161
|
+
return (this.config.agents.get(agentName)?.personas ?? []).map(personaCatalogEntry);
|
|
162
|
+
}
|
|
163
|
+
/** The persona `agentName` runs under when nothing names one. Undefined → none. */
|
|
164
|
+
defaultPersona(agentName) {
|
|
165
|
+
return defaultPersonaOf(this.config.agents.get(agentName));
|
|
166
|
+
}
|
|
167
|
+
/** Does `agentName` declare a persona `id`? */
|
|
168
|
+
hasPersona(agentName, id) {
|
|
169
|
+
return findPersona(this.config.agents.get(agentName), id) !== undefined;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* The persona a turn of `agentName` runs under, most specific first: the one the send names
|
|
173
|
+
* (refused with {@link PersonaNotFoundError} when the agent does not declare it), else the thread's
|
|
174
|
+
* pinned one when this agent declares it, else the agent's default. Undefined → none.
|
|
175
|
+
*/
|
|
176
|
+
resolvePersona(args) {
|
|
177
|
+
if (args.requested !== undefined) {
|
|
178
|
+
if (!this.hasPersona(args.agentName, args.requested)) {
|
|
179
|
+
throw new PersonaNotFoundError(args.agentName, args.requested);
|
|
180
|
+
}
|
|
181
|
+
return args.requested;
|
|
182
|
+
}
|
|
183
|
+
const pinned = args.threadPersona ?? undefined;
|
|
184
|
+
if (pinned !== undefined && this.hasPersona(args.agentName, pinned)) {
|
|
185
|
+
return pinned;
|
|
186
|
+
}
|
|
187
|
+
return this.defaultPersona(args.agentName);
|
|
188
|
+
}
|
|
140
189
|
forAgent(agentName) {
|
|
141
190
|
const name = agentName ?? this.defaultAgentName();
|
|
191
|
+
// A name a persona took over (`Persona.aliases`): a run journaled under the old agent name — or a
|
|
192
|
+
// caller still naming it — is served by the agent that owns the persona, with it applied.
|
|
193
|
+
if (agentName !== undefined && !this.isAgent(agentName)) {
|
|
194
|
+
const alias = resolvePersonaAlias(this.agentDefinitions(), agentName);
|
|
195
|
+
const persona = alias === undefined
|
|
196
|
+
? undefined
|
|
197
|
+
: findPersona(this.config.agents.get(alias.agent), alias.persona);
|
|
198
|
+
if (alias !== undefined && persona !== undefined) {
|
|
199
|
+
return this.withPersona(this.forAgent(alias.agent), persona);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
142
202
|
const definition = this.config.agents.get(name);
|
|
143
203
|
const personas = new Map();
|
|
144
204
|
for (const persona of definition?.personas ?? []) {
|
|
@@ -195,5 +255,26 @@ export class AgentDepsFactory {
|
|
|
195
255
|
...(definition?.intake !== undefined ? { intake: definition.intake } : {}),
|
|
196
256
|
};
|
|
197
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* A persona baked into an agent's deps — how a run journaled under an agent name that a persona has
|
|
260
|
+
* since taken over ({@link Persona.aliases}) is served. That run names no persona of its own (it
|
|
261
|
+
* predates the fold, and its input cannot change), so the persona applies the way the old agent's
|
|
262
|
+
* own config did: as config, re-read on every replay, with no checkpoint of its own.
|
|
263
|
+
*/
|
|
264
|
+
withPersona(deps, persona) {
|
|
265
|
+
const base = deps.systemPrompt;
|
|
266
|
+
const resolve = async (prompt, ctx) => typeof prompt === 'function' ? prompt(ctx) : prompt;
|
|
267
|
+
const own = persona.systemPrompt;
|
|
268
|
+
const systemPrompt = async (ctx) => {
|
|
269
|
+
const scoped = { ...ctx, persona };
|
|
270
|
+
if (own === undefined) {
|
|
271
|
+
return resolve(base, scoped);
|
|
272
|
+
}
|
|
273
|
+
const basePrompt = typeof own === 'function' ? await resolve(base, scoped) : '';
|
|
274
|
+
return resolve(own, { ...scoped, basePrompt });
|
|
275
|
+
};
|
|
276
|
+
const toolAllowList = intersectAllowLists(deps.toolAllowList, persona.allowedTools);
|
|
277
|
+
return { ...deps, systemPrompt, ...(toolAllowList !== undefined ? { toolAllowList } : {}) };
|
|
278
|
+
}
|
|
198
279
|
}
|
|
199
280
|
//# sourceMappingURL=agent-deps-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-deps-factory.js","sourceRoot":"","sources":["../../src/agent-deps-factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-deps-factory.js","sourceRoot":"","sources":["../../src/agent-deps-factory.ts"],"names":[],"mappings":"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"}
|
package/dist/src/agent-loop.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ import type { AiToolCtx } from './spi/tool.js';
|
|
|
16
16
|
import type { AgentStreamErrorCode, AgentStreamEvent } from './stream-events.js';
|
|
17
17
|
import { type ToolRegistry } from './tool-registry.js';
|
|
18
18
|
import { type ToolTransientRetrySetting } from './tool-retry.js';
|
|
19
|
-
import type { Actor, AgentRunInput, Decision, PromptBuilder, ToolCallRequest, ToolDefinition, ToolResult } from './types.js';
|
|
19
|
+
import type { Actor, AgentRunInput, Decision, Persona, PromptBuilder, ToolCallRequest, ToolDefinition, ToolResult } from './types.js';
|
|
20
20
|
export interface AgentLoopDeps<TOutput = unknown> {
|
|
21
21
|
model: ModelProvider;
|
|
22
22
|
store: AgentStore;
|
|
@@ -49,6 +49,12 @@ export interface AgentLoopDeps<TOutput = unknown> {
|
|
|
49
49
|
host?: unknown;
|
|
50
50
|
/** Agent-level tool allow-list (intersected with the persona's). Undefined → all tools. */
|
|
51
51
|
toolAllowList?: string[];
|
|
52
|
+
/**
|
|
53
|
+
* The agent's personas, by id. Read ONLY when the run names one by id (`AgentRunInput.persona`),
|
|
54
|
+
* and then only once, inside the `persona:resolve` checkpoint — so a replay runs under the persona
|
|
55
|
+
* the turn started with even after this changed. Undefined → no personas.
|
|
56
|
+
*/
|
|
57
|
+
personas?: ReadonlyMap<string, Persona>;
|
|
52
58
|
/**
|
|
53
59
|
* How many agent→agent delegations deep a chain may go. Defaults to {@link MAX_DELEGATION_DEPTH}.
|
|
54
60
|
*
|
|
@@ -429,5 +435,5 @@ export interface AgentLoopResult<TOutput = unknown> {
|
|
|
429
435
|
* It drives the model→tools→model iteration; the runner supplies the `step`/`awaitApproval`
|
|
430
436
|
* hooks that make the same loop body either in-process or a replay-safe durable workflow.
|
|
431
437
|
*/
|
|
432
|
-
export declare function runAgentLoop<TOutput = unknown>(boundDeps: AgentLoopDeps<TOutput>,
|
|
438
|
+
export declare function runAgentLoop<TOutput = unknown>(boundDeps: AgentLoopDeps<TOutput>, requested: AgentRunInput, hooks: AgentLoopHooks): Promise<AgentLoopResult<TOutput>>;
|
|
433
439
|
//# sourceMappingURL=agent-loop.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../src/agent-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAiB9D,OAAO,EACL,KAAK,WAAW,EAMhB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,KAAK,YAAY,EAQlB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../src/agent-loop.ts"],"names":[],"mappings":"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"}
|
package/dist/src/agent-loop.js
CHANGED
|
@@ -3,6 +3,7 @@ import { detachedDelivered, detachedStarted, } from './delegation.js';
|
|
|
3
3
|
import { publishAgentDelegated, publishAgentMessage, publishAgentRetrieved, publishAgentRunFinished, publishAgentRunStarted, publishAgentToolCall, publishAgentToolRetry, spannedAgent, } from './diagnostics.js';
|
|
4
4
|
import { ASK_TOOL_NAME, askInputSchema, askToolDefinition, DEFAULT_INTAKE_PREAMBLE, isHumanDecision, normalizeElicitationReply, settleElicitation, } from './elicitation.js';
|
|
5
5
|
import { buildMemoryBlock, offerMemories, REMEMBER_TOOL_NAME, rememberInputSchema, rememberToolDefinition, writeMemory, } from './memory.js';
|
|
6
|
+
import { intersectAllowLists, personaFromTurn } from './personas.js';
|
|
6
7
|
import { createFrameBuffer, createIncrementalGate, gateTail, releaseGatedFrames, resolveGateLookback, resolveOutputGateMode, runInputProcessors, runOutputProcessors, } from './processors.js';
|
|
7
8
|
import { isReplayIntegrityError } from './replay-integrity.js';
|
|
8
9
|
import { buildSkillsBlock, loadSkill, offerSkills, SKILL_TOOL_NAME, skillInputSchema, skillToolDefinition, } from './skills.js';
|
|
@@ -75,21 +76,84 @@ async function resolvePrompt(prompt, ctx) {
|
|
|
75
76
|
return typeof prompt === 'function' ? prompt(ctx) : prompt;
|
|
76
77
|
}
|
|
77
78
|
/**
|
|
78
|
-
* The effective system prompt for a turn
|
|
79
|
-
*
|
|
80
|
-
* persona
|
|
79
|
+
* The effective system prompt for a turn. A persona that carries a prompt stands in for the base —
|
|
80
|
+
* already resolved, with the base it may wrap, in {@link resolveTurnPersona} (inside `persona:resolve`
|
|
81
|
+
* for a run that names its persona by id), so a replay reads back the exact text the turn started
|
|
82
|
+
* with. Otherwise the agent's base prompt, which sees the persona too.
|
|
81
83
|
*/
|
|
82
|
-
async function resolveSystemPrompt(deps, input) {
|
|
83
|
-
|
|
84
|
+
async function resolveSystemPrompt(deps, input, persona) {
|
|
85
|
+
if (persona?.prompt !== undefined) {
|
|
86
|
+
return persona.prompt;
|
|
87
|
+
}
|
|
88
|
+
return resolvePrompt(deps.systemPrompt, { ...promptContext(input, persona), basePrompt: '' });
|
|
89
|
+
}
|
|
90
|
+
/** What every prompt builder of a turn is handed, short of `basePrompt`. */
|
|
91
|
+
function promptContext(input, persona) {
|
|
92
|
+
return {
|
|
84
93
|
actor: input.actor,
|
|
85
|
-
...(
|
|
94
|
+
...(persona !== undefined ? { persona: personaFromTurn(persona) } : {}),
|
|
86
95
|
...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
|
|
87
96
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Freeze `persona` for this turn: its id, label and allow-list, and its prompt resolved against the
|
|
100
|
+
* agent's base prompt. A flat prompt stands in for the base; a builder is handed the base as
|
|
101
|
+
* `ctx.basePrompt`; no prompt → the base, resolved per turn like any agent's.
|
|
102
|
+
*/
|
|
103
|
+
async function freezePersona(deps, input, persona) {
|
|
104
|
+
const ref = {
|
|
105
|
+
id: persona.id,
|
|
106
|
+
label: persona.label,
|
|
107
|
+
...(persona.allowedTools !== undefined ? { allowedTools: [...persona.allowedTools] } : {}),
|
|
108
|
+
};
|
|
109
|
+
if (persona.systemPrompt === undefined) {
|
|
110
|
+
return ref;
|
|
91
111
|
}
|
|
92
|
-
|
|
112
|
+
const ctx = promptContext(input, ref);
|
|
113
|
+
const basePrompt = typeof persona.systemPrompt === 'function'
|
|
114
|
+
? await resolvePrompt(deps.systemPrompt, { ...ctx, basePrompt: '' })
|
|
115
|
+
: '';
|
|
116
|
+
return { ...ref, prompt: await resolvePrompt(persona.systemPrompt, { ...ctx, basePrompt }) };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* The `persona:resolve` checkpoint's body: the persona the run names, looked up in this process's
|
|
120
|
+
* config and FROZEN ({@link freezePersona}). `null` when the agent no longer declares it, which the
|
|
121
|
+
* turn runs as no persona at all.
|
|
122
|
+
*
|
|
123
|
+
* Reached only for a run whose input names a persona by id, and every such run was started by a
|
|
124
|
+
* release that has this checkpoint; a run started before it names none (or carries the whole persona
|
|
125
|
+
* in its input), spends no position here, and replays on the sequence it recorded.
|
|
126
|
+
*/
|
|
127
|
+
async function resolveTurnPersona(deps, input, id) {
|
|
128
|
+
const persona = deps.personas?.get(id);
|
|
129
|
+
return persona === undefined ? null : freezePersona(deps, input, persona);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* A persona handed over WHOLE in the run's input — by a direct caller, or recorded so by a release
|
|
133
|
+
* before 0.60. Applied as given, with no checkpoint (its journal has none). Its input went through
|
|
134
|
+
* JSON on a durable run, which drops a builder prompt, so a prompt the input lost is looked up by id
|
|
135
|
+
* in this process's config.
|
|
136
|
+
*/
|
|
137
|
+
async function inlineTurnPersona(deps, input, persona) {
|
|
138
|
+
const prompt = persona.systemPrompt ?? deps.personas?.get(persona.id)?.systemPrompt;
|
|
139
|
+
return freezePersona(deps, input, {
|
|
140
|
+
...persona,
|
|
141
|
+
...(prompt !== undefined ? { systemPrompt: prompt } : {}),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** `{ persona: id }` for a message the turn writes, when it runs under one. */
|
|
145
|
+
function personaProvenance(input) {
|
|
146
|
+
const persona = personaOf(input);
|
|
147
|
+
return persona === undefined ? {} : { persona: persona.id };
|
|
148
|
+
}
|
|
149
|
+
/** `{ persona }` for a tool's context, when the turn runs under one. */
|
|
150
|
+
function personaContext(input) {
|
|
151
|
+
const persona = personaOf(input);
|
|
152
|
+
return persona === undefined ? {} : { persona };
|
|
153
|
+
}
|
|
154
|
+
/** The turn's persona as a whole {@link Persona} — what the run input carries once it is resolved. */
|
|
155
|
+
function personaOf(input) {
|
|
156
|
+
return typeof input.persona === 'object' ? input.persona : undefined;
|
|
93
157
|
}
|
|
94
158
|
/** An `agent`-kind tool's input is `{ task }` by convention; fall back to a JSON dump. */
|
|
95
159
|
function extractTask(input) {
|
|
@@ -185,7 +249,7 @@ async function resolveDelegation(deps, input, call, spec) {
|
|
|
185
249
|
// resolvable spec must fail closed rather than fall through.
|
|
186
250
|
throw new ToolForbiddenError(call.name);
|
|
187
251
|
}
|
|
188
|
-
const offeredAllow = intersectAllow(input
|
|
252
|
+
const offeredAllow = intersectAllow(personaOf(input)?.allowedTools, deps.toolAllowList);
|
|
189
253
|
if (offeredAllow !== undefined && !offeredAllow.includes(call.name)) {
|
|
190
254
|
throw new ToolForbiddenError(call.name);
|
|
191
255
|
}
|
|
@@ -494,7 +558,7 @@ async function runIntake(args) {
|
|
|
494
558
|
content: preamble,
|
|
495
559
|
runId: hooks.runId,
|
|
496
560
|
toolCalls: [call],
|
|
497
|
-
...(input
|
|
561
|
+
...personaProvenance(input),
|
|
498
562
|
});
|
|
499
563
|
await deps.store.recordToolCall({
|
|
500
564
|
toolCallId: request.id,
|
|
@@ -556,7 +620,7 @@ function elicitationContext(deps, input, hooks) {
|
|
|
556
620
|
requestId: hooks.runId,
|
|
557
621
|
emitUi: createNoopEmitUi(hooks.runId),
|
|
558
622
|
...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
|
|
559
|
-
...(input
|
|
623
|
+
...personaContext(input),
|
|
560
624
|
...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
|
|
561
625
|
...(deps.host !== undefined ? { host: deps.host } : {}),
|
|
562
626
|
};
|
|
@@ -588,7 +652,7 @@ const MESSAGE_TOOL_RESULTS_PATCH = 'agent:message-tool-results';
|
|
|
588
652
|
*/
|
|
589
653
|
async function claimToolCall(turn, call) {
|
|
590
654
|
const { deps, input, hooks, messageId, writer } = turn;
|
|
591
|
-
const persona = input
|
|
655
|
+
const persona = personaOf(input);
|
|
592
656
|
const persisted = (await hooks.step(`persist:toolcall:${call.id}`, async () => {
|
|
593
657
|
// The kind the llm checkpoint stamped WINS: it came from the process that offered the tool,
|
|
594
658
|
// whereas this one is only the process claiming the call — and the two disagree exactly when
|
|
@@ -750,6 +814,12 @@ function spanToolType(kind) {
|
|
|
750
814
|
async function invokeClaimedTool(turn, claimed) {
|
|
751
815
|
const { deps, hooks } = turn;
|
|
752
816
|
const { call, ctx, toolType } = claimed;
|
|
817
|
+
// Under a persona with an allow-list, the same narrowing the offer had — agent ∩ persona — is what
|
|
818
|
+
// `invoke` holds the call to. Without one, nothing new is checked.
|
|
819
|
+
const personaAllow = personaOf(turn.input)?.allowedTools;
|
|
820
|
+
const invokeOptions = personaAllow === undefined
|
|
821
|
+
? {}
|
|
822
|
+
: { allowedTools: intersectAllowLists(deps.toolAllowList, personaAllow) ?? [] };
|
|
753
823
|
try {
|
|
754
824
|
const raw = await hooks.step(`tool:${call.id}`, async () => {
|
|
755
825
|
// Pushed components stream as they happen and ride this step's RESULT into the journal (see
|
|
@@ -775,7 +845,7 @@ async function invokeClaimedTool(turn, claimed) {
|
|
|
775
845
|
toolType: spanToolType(toolType),
|
|
776
846
|
}, () => invokeWithTransientRetry(() => {
|
|
777
847
|
ui.restart();
|
|
778
|
-
return deps.registry.invoke(call.name, call.input, toolCtx, deps.rolesPolicy);
|
|
848
|
+
return deps.registry.invoke(call.name, call.input, toolCtx, deps.rolesPolicy, invokeOptions);
|
|
779
849
|
}, deps.toolTransientRetry ?? {}, {
|
|
780
850
|
...(hooks.isControlFlowError !== undefined
|
|
781
851
|
? { isControlFlowError: hooks.isControlFlowError }
|
|
@@ -1541,7 +1611,24 @@ export function streamErrorFrame(error, runId) {
|
|
|
1541
1611
|
* It drives the model→tools→model iteration; the runner supplies the `step`/`awaitApproval`
|
|
1542
1612
|
* hooks that make the same loop body either in-process or a replay-safe durable workflow.
|
|
1543
1613
|
*/
|
|
1544
|
-
export async function runAgentLoop(boundDeps,
|
|
1614
|
+
export async function runAgentLoop(boundDeps, requested, hooks) {
|
|
1615
|
+
// The persona, FIRST and only when the run names one by id: its definition is read from config
|
|
1616
|
+
// once and frozen in this checkpoint, so a run resumed after the persona was edited or removed
|
|
1617
|
+
// keeps the prompt and allow-list it started with. A run that names none spends no position here
|
|
1618
|
+
// — nor does one that carries the whole persona in its input (a direct caller, or a run recorded
|
|
1619
|
+
// by a release before this checkpoint existed), so those replay on the sequence they recorded.
|
|
1620
|
+
const turnPersona = typeof requested.persona === 'string'
|
|
1621
|
+
? ((await hooks.step('persona:resolve', () => resolveTurnPersona(boundDeps, requested, requested.persona))) ?? undefined)
|
|
1622
|
+
: requested.persona !== undefined
|
|
1623
|
+
? await inlineTurnPersona(boundDeps, requested, requested.persona)
|
|
1624
|
+
: undefined;
|
|
1625
|
+
// From here on the input carries the persona the turn actually runs under, whole and frozen — none,
|
|
1626
|
+
// when the one it named is no longer declared — so provenance and tool context never claim one
|
|
1627
|
+
// that did not apply.
|
|
1628
|
+
const { persona: _requestedPersona, ...withoutPersona } = requested;
|
|
1629
|
+
const input = turnPersona === undefined
|
|
1630
|
+
? withoutPersona
|
|
1631
|
+
: { ...withoutPersona, persona: personaFromTurn(turnPersona) };
|
|
1545
1632
|
// A turn with a selected model runs EVERY call it makes on it — the answer and a structured-output
|
|
1546
1633
|
// pass — and labels its usage with it when the provider reports no model id. The pick rides the
|
|
1547
1634
|
// run's input, so a durable replay makes the same choice.
|
|
@@ -1553,8 +1640,8 @@ export async function runAgentLoop(boundDeps, input, hooks) {
|
|
|
1553
1640
|
modelId: input.model,
|
|
1554
1641
|
};
|
|
1555
1642
|
const maxSteps = deps.maxSteps ?? 8;
|
|
1556
|
-
const persona =
|
|
1557
|
-
let system = await resolveSystemPrompt(deps, input);
|
|
1643
|
+
const persona = turnPersona;
|
|
1644
|
+
let system = await resolveSystemPrompt(deps, input, turnPersona);
|
|
1558
1645
|
const inputProcessors = deps.inputProcessors ?? [];
|
|
1559
1646
|
const outputProcessors = deps.outputProcessors ?? [];
|
|
1560
1647
|
const gateMode = resolveOutputGateMode(outputProcessors);
|