@ethosagent/core 0.1.0 → 0.1.1
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/index.d.ts +7 -2
- package/dist/index.js +31 -7
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,9 @@ type AgentEvent = {
|
|
|
35
35
|
type: 'done';
|
|
36
36
|
text: string;
|
|
37
37
|
turnCount: number;
|
|
38
|
+
} | {
|
|
39
|
+
type: 'context_meta';
|
|
40
|
+
data: Record<string, unknown>;
|
|
38
41
|
};
|
|
39
42
|
interface AgentLoopConfig {
|
|
40
43
|
llm: LLMProvider;
|
|
@@ -44,6 +47,7 @@ interface AgentLoopConfig {
|
|
|
44
47
|
session?: SessionStore;
|
|
45
48
|
hooks?: HookRegistry;
|
|
46
49
|
injectors?: ContextInjector[];
|
|
50
|
+
modelRouting?: Record<string, string>;
|
|
47
51
|
options?: {
|
|
48
52
|
maxIterations?: number;
|
|
49
53
|
historyLimit?: number;
|
|
@@ -70,6 +74,7 @@ declare class AgentLoop {
|
|
|
70
74
|
private readonly platform;
|
|
71
75
|
private readonly workingDir;
|
|
72
76
|
private readonly resultBudgetChars;
|
|
77
|
+
private readonly modelRouting;
|
|
73
78
|
constructor(config: AgentLoopConfig);
|
|
74
79
|
run(text: string, opts?: RunOptions): AsyncGenerator<AgentEvent>;
|
|
75
80
|
private handleChunk;
|
|
@@ -154,7 +159,7 @@ declare class DefaultToolRegistry implements ToolRegistry {
|
|
|
154
159
|
get(name: string): Tool | undefined;
|
|
155
160
|
getAvailable(): Tool[];
|
|
156
161
|
getForToolset(toolset: string): Tool[];
|
|
157
|
-
toDefinitions(): {
|
|
162
|
+
toDefinitions(allowedTools?: string[]): {
|
|
158
163
|
name: string;
|
|
159
164
|
description: string;
|
|
160
165
|
parameters: Record<string, unknown>;
|
|
@@ -163,7 +168,7 @@ declare class DefaultToolRegistry implements ToolRegistry {
|
|
|
163
168
|
toolCallId: string;
|
|
164
169
|
name: string;
|
|
165
170
|
args: unknown;
|
|
166
|
-
}>, ctx: ToolContext): Promise<Array<{
|
|
171
|
+
}>, ctx: ToolContext, allowedTools?: string[]): Promise<Array<{
|
|
167
172
|
toolCallId: string;
|
|
168
173
|
name: string;
|
|
169
174
|
result: ToolResult;
|
package/dist/index.js
CHANGED
|
@@ -271,8 +271,10 @@ var DefaultToolRegistry = class {
|
|
|
271
271
|
getForToolset(toolset) {
|
|
272
272
|
return this.getAvailable().filter((t) => t.toolset === toolset);
|
|
273
273
|
}
|
|
274
|
-
toDefinitions() {
|
|
275
|
-
|
|
274
|
+
toDefinitions(allowedTools) {
|
|
275
|
+
const available = this.getAvailable();
|
|
276
|
+
const filtered = allowedTools && allowedTools.length > 0 ? available.filter((t) => allowedTools.includes(t.name)) : available;
|
|
277
|
+
return filtered.map((t) => ({
|
|
276
278
|
name: t.name,
|
|
277
279
|
description: t.description,
|
|
278
280
|
parameters: t.schema
|
|
@@ -280,10 +282,22 @@ var DefaultToolRegistry = class {
|
|
|
280
282
|
}
|
|
281
283
|
// Runs all tool calls in parallel. Results are returned in input order.
|
|
282
284
|
// Budget is split evenly across parallel calls; each result is post-trimmed to budget.
|
|
283
|
-
|
|
285
|
+
// allowedTools enforces toolset at execution time (belt-and-suspenders after toDefinitions filtering).
|
|
286
|
+
async executeParallel(calls, ctx, allowedTools) {
|
|
284
287
|
const perCallBudget = Math.floor(ctx.resultBudgetChars / Math.max(calls.length, 1));
|
|
285
288
|
const results = await Promise.allSettled(
|
|
286
289
|
calls.map(async (call) => {
|
|
290
|
+
if (allowedTools && allowedTools.length > 0 && !allowedTools.includes(call.name)) {
|
|
291
|
+
return {
|
|
292
|
+
toolCallId: call.toolCallId,
|
|
293
|
+
name: call.name,
|
|
294
|
+
result: {
|
|
295
|
+
ok: false,
|
|
296
|
+
error: `Tool ${call.name} is not permitted for this personality`,
|
|
297
|
+
code: "not_available"
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
}
|
|
287
301
|
const tool = this.tools.get(call.name);
|
|
288
302
|
if (!tool) {
|
|
289
303
|
return {
|
|
@@ -366,6 +380,7 @@ var AgentLoop = class {
|
|
|
366
380
|
platform;
|
|
367
381
|
workingDir;
|
|
368
382
|
resultBudgetChars;
|
|
383
|
+
modelRouting;
|
|
369
384
|
constructor(config) {
|
|
370
385
|
this.llm = config.llm;
|
|
371
386
|
this.tools = config.tools ?? new DefaultToolRegistry();
|
|
@@ -379,6 +394,7 @@ var AgentLoop = class {
|
|
|
379
394
|
this.platform = config.options?.platform ?? "cli";
|
|
380
395
|
this.workingDir = config.options?.workingDir ?? process.cwd();
|
|
381
396
|
this.resultBudgetChars = config.options?.resultBudgetChars ?? 8e4;
|
|
397
|
+
this.modelRouting = config.modelRouting ?? {};
|
|
382
398
|
}
|
|
383
399
|
async *run(text, opts = {}) {
|
|
384
400
|
const abortSignal = opts.abortSignal ?? new AbortController().signal;
|
|
@@ -402,6 +418,9 @@ var AgentLoop = class {
|
|
|
402
418
|
});
|
|
403
419
|
const sessionId = ethosSession.id;
|
|
404
420
|
const personality = (opts.personalityId ? this.personalities.get(opts.personalityId) : null) ?? this.personalities.getDefault();
|
|
421
|
+
const effectiveModel = this.modelRouting[personality.id] ?? this.llm.model;
|
|
422
|
+
const modelOverride = effectiveModel !== this.llm.model ? effectiveModel : void 0;
|
|
423
|
+
const allowedTools = personality.toolset?.length ? personality.toolset : void 0;
|
|
405
424
|
await this.hooks.fireVoid("session_start", {
|
|
406
425
|
sessionId,
|
|
407
426
|
sessionKey,
|
|
@@ -420,7 +439,8 @@ var AgentLoop = class {
|
|
|
420
439
|
sessionKey,
|
|
421
440
|
platform: this.platform,
|
|
422
441
|
workingDir: this.workingDir,
|
|
423
|
-
personalityId: personality.id
|
|
442
|
+
personalityId: personality.id,
|
|
443
|
+
query: text
|
|
424
444
|
});
|
|
425
445
|
const promptCtx = {
|
|
426
446
|
sessionId,
|
|
@@ -453,6 +473,9 @@ var AgentLoop = class {
|
|
|
453
473
|
}
|
|
454
474
|
}
|
|
455
475
|
}
|
|
476
|
+
if (promptCtx.meta && Object.keys(promptCtx.meta).length > 0) {
|
|
477
|
+
yield { type: "context_meta", data: promptCtx.meta };
|
|
478
|
+
}
|
|
456
479
|
if (memCtx) {
|
|
457
480
|
systemParts.push(`## Memory
|
|
458
481
|
|
|
@@ -487,10 +510,11 @@ ${memCtx.content}`);
|
|
|
487
510
|
const pendingToolCalls = [];
|
|
488
511
|
let chunkText = "";
|
|
489
512
|
try {
|
|
490
|
-
const stream = this.llm.complete(llmMessages, this.tools.toDefinitions(), {
|
|
513
|
+
const stream = this.llm.complete(llmMessages, this.tools.toDefinitions(allowedTools), {
|
|
491
514
|
system: systemPrompt,
|
|
492
515
|
cacheSystemPrompt: true,
|
|
493
|
-
abortSignal
|
|
516
|
+
abortSignal,
|
|
517
|
+
...modelOverride ? { modelOverride } : {}
|
|
494
518
|
});
|
|
495
519
|
for await (const chunk of stream) {
|
|
496
520
|
if (abortSignal.aborted) break;
|
|
@@ -585,7 +609,7 @@ ${memCtx.content}`);
|
|
|
585
609
|
}
|
|
586
610
|
const execInputs = prepped.filter((p) => p.rejected === void 0).map((p) => ({ toolCallId: p.toolCallId, name: p.name, args: p.args }));
|
|
587
611
|
const startedAt = Date.now();
|
|
588
|
-
const execResults = execInputs.length > 0 ? await this.tools.executeParallel(execInputs, toolCtxBase) : [];
|
|
612
|
+
const execResults = execInputs.length > 0 ? await this.tools.executeParallel(execInputs, toolCtxBase, allowedTools) : [];
|
|
589
613
|
const execResultMap = new Map(execResults.map((r) => [r.toolCallId, r]));
|
|
590
614
|
const toolResultContent = [];
|
|
591
615
|
for (const p of prepped) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/defaults/in-memory-session.ts","../src/defaults/noop-memory.ts","../src/defaults/noop-personality.ts","../src/hook-registry.ts","../src/tool-registry.ts","../src/agent-loop.ts","../src/plugin-registry.ts"],"sourcesContent":["import type {\n SearchResult,\n Session,\n SessionFilter,\n SessionStore,\n SessionUsage,\n StoredMessage,\n} from '@ethosagent/types';\n\nexport class InMemorySessionStore implements SessionStore {\n private sessions = new Map<string, Session>();\n private messages = new Map<string, StoredMessage[]>();\n private idCounter = 0;\n\n async createSession(data: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>): Promise<Session> {\n const session: Session = {\n ...data,\n id: `session_${++this.idCounter}`,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.sessions.set(session.id, session);\n this.messages.set(session.id, []);\n return session;\n }\n\n async getSession(id: string): Promise<Session | null> {\n return this.sessions.get(id) ?? null;\n }\n\n async getSessionByKey(key: string): Promise<Session | null> {\n for (const s of this.sessions.values()) {\n if (s.key === key) return s;\n }\n return null;\n }\n\n async updateSession(id: string, patch: Partial<Session>): Promise<void> {\n const session = this.sessions.get(id);\n if (!session) throw new Error(`Session not found: ${id}`);\n this.sessions.set(id, { ...session, ...patch, updatedAt: new Date() });\n }\n\n async deleteSession(id: string): Promise<void> {\n this.sessions.delete(id);\n this.messages.delete(id);\n }\n\n async listSessions(filter?: SessionFilter): Promise<Session[]> {\n let results = [...this.sessions.values()];\n if (filter?.platform) results = results.filter((s) => s.platform === filter.platform);\n if (filter?.personalityId)\n results = results.filter((s) => s.personalityId === filter.personalityId);\n if (filter?.workingDir) results = results.filter((s) => s.workingDir === filter.workingDir);\n if (filter?.since) {\n const since = filter.since;\n results = results.filter((s) => s.createdAt >= since);\n }\n results.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n const offset = filter?.offset ?? 0;\n const limit = filter?.limit ?? results.length;\n return results.slice(offset, offset + limit);\n }\n\n async appendMessage(data: Omit<StoredMessage, 'id' | 'timestamp'>): Promise<StoredMessage> {\n const message: StoredMessage = {\n ...data,\n id: `msg_${++this.idCounter}`,\n timestamp: new Date(),\n };\n const list = this.messages.get(data.sessionId) ?? [];\n list.push(message);\n this.messages.set(data.sessionId, list);\n return message;\n }\n\n async getMessages(\n sessionId: string,\n options?: { limit?: number; offset?: number },\n ): Promise<StoredMessage[]> {\n const all = this.messages.get(sessionId) ?? [];\n const offset = options?.offset ?? 0;\n // Return most-recent messages: trim from the tail, then skip `offset` from the end\n const end = all.length - offset;\n const start = options?.limit ? Math.max(0, end - options.limit) : 0;\n return all.slice(start, end);\n }\n\n async updateUsage(sessionId: string, delta: Partial<SessionUsage>): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n const usage = { ...session.usage };\n for (const [k, v] of Object.entries(delta) as [keyof SessionUsage, number][]) {\n (usage[k] as number) += v;\n }\n this.sessions.set(sessionId, { ...session, usage, updatedAt: new Date() });\n }\n\n async search(\n query: string,\n options?: { limit?: number; sessionId?: string },\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n const lower = query.toLowerCase();\n for (const [sessionId, msgs] of this.messages.entries()) {\n if (options?.sessionId && sessionId !== options.sessionId) continue;\n for (const msg of msgs) {\n const idx = msg.content.toLowerCase().indexOf(lower);\n if (idx >= 0) {\n results.push({\n sessionId,\n messageId: msg.id,\n snippet: msg.content.slice(Math.max(0, idx - 50), idx + 150),\n score: 1,\n timestamp: msg.timestamp,\n });\n }\n }\n }\n results.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n return results.slice(0, options?.limit ?? 20);\n }\n\n async pruneOldSessions(olderThan: Date): Promise<number> {\n let count = 0;\n for (const [id, session] of this.sessions.entries()) {\n if (session.updatedAt < olderThan) {\n this.sessions.delete(id);\n this.messages.delete(id);\n count++;\n }\n }\n return count;\n }\n\n async vacuum(): Promise<void> {\n // No-op for in-memory store\n }\n}\n","import type { MemoryLoadContext, MemoryProvider, MemoryUpdate } from '@ethosagent/types';\n\nexport class NoopMemoryProvider implements MemoryProvider {\n async prefetch(_ctx: MemoryLoadContext) {\n return null;\n }\n\n async sync(_ctx: MemoryLoadContext, _updates: MemoryUpdate[]): Promise<void> {\n // No-op\n }\n}\n","import type { PersonalityConfig, PersonalityRegistry } from '@ethosagent/types';\n\nconst DEFAULT_PERSONALITY: PersonalityConfig = {\n id: 'default',\n name: 'Default',\n description: 'Default Ethos personality',\n};\n\nexport class DefaultPersonalityRegistry implements PersonalityRegistry {\n private readonly personalities = new Map<string, PersonalityConfig>([\n ['default', DEFAULT_PERSONALITY],\n ]);\n private defaultId = 'default';\n\n define(config: PersonalityConfig): void {\n this.personalities.set(config.id, config);\n }\n\n get(id: string): PersonalityConfig | undefined {\n return this.personalities.get(id);\n }\n\n list(): PersonalityConfig[] {\n return [...this.personalities.values()];\n }\n\n getDefault(): PersonalityConfig {\n return this.personalities.get(this.defaultId) ?? DEFAULT_PERSONALITY;\n }\n\n setDefault(id: string): void {\n if (!this.personalities.has(id)) {\n throw new Error(`Unknown personality: ${id}`);\n }\n this.defaultId = id;\n }\n\n async loadFromDirectory(_dir: string): Promise<void> {\n // Implemented in extensions/personalities\n }\n}\n","import type { ClaimingHooks, HookRegistry, ModifyingHooks, VoidHooks } from '@ethosagent/types';\n\ntype AnyHandler = (...args: unknown[]) => Promise<unknown>;\n\ninterface RegisteredHandler {\n handler: AnyHandler;\n pluginId?: string;\n failurePolicy: 'fail-open' | 'fail-closed';\n}\n\nexport class DefaultHookRegistry implements HookRegistry {\n private readonly voidHandlers = new Map<string, RegisteredHandler[]>();\n private readonly modifyingHandlers = new Map<string, RegisteredHandler[]>();\n private readonly claimingHandlers = new Map<string, RegisteredHandler[]>();\n\n registerVoid<K extends keyof VoidHooks>(\n name: K,\n handler: (payload: VoidHooks[K]) => Promise<void>,\n opts?: { pluginId?: string; failurePolicy?: 'fail-open' | 'fail-closed' },\n ): () => void {\n const entry: RegisteredHandler = {\n handler: handler as AnyHandler,\n pluginId: opts?.pluginId,\n failurePolicy: opts?.failurePolicy ?? 'fail-open',\n };\n const list = this.voidHandlers.get(name) ?? [];\n list.push(entry);\n this.voidHandlers.set(name, list);\n return () => this.remove(this.voidHandlers, name, entry);\n }\n\n registerModifying<K extends keyof ModifyingHooks>(\n name: K,\n handler: (payload: ModifyingHooks[K][0]) => Promise<Partial<ModifyingHooks[K][1]> | null>,\n opts?: { pluginId?: string },\n ): () => void {\n const entry: RegisteredHandler = {\n handler: handler as AnyHandler,\n pluginId: opts?.pluginId,\n failurePolicy: 'fail-open',\n };\n const list = this.modifyingHandlers.get(name) ?? [];\n list.push(entry);\n this.modifyingHandlers.set(name, list);\n return () => this.remove(this.modifyingHandlers, name, entry);\n }\n\n registerClaiming<K extends keyof ClaimingHooks>(\n name: K,\n handler: (payload: ClaimingHooks[K][0]) => Promise<ClaimingHooks[K][1]>,\n opts?: { pluginId?: string },\n ): () => void {\n const entry: RegisteredHandler = {\n handler: handler as AnyHandler,\n pluginId: opts?.pluginId,\n failurePolicy: 'fail-open',\n };\n const list = this.claimingHandlers.get(name) ?? [];\n list.push(entry);\n this.claimingHandlers.set(name, list);\n return () => this.remove(this.claimingHandlers, name, entry);\n }\n\n // Void hooks: all handlers run in parallel via Promise.allSettled.\n // Failures are logged but never propagate (fail-open by default).\n async fireVoid<K extends keyof VoidHooks>(name: K, payload: VoidHooks[K]): Promise<void> {\n const handlers = this.voidHandlers.get(name) ?? [];\n await Promise.allSettled(handlers.map((h) => h.handler(payload)));\n }\n\n // Modifying hooks: handlers run sequentially; results are merged (first non-null value per key wins).\n async fireModifying<K extends keyof ModifyingHooks>(\n name: K,\n payload: ModifyingHooks[K][0],\n ): Promise<ModifyingHooks[K][1]> {\n const handlers = this.modifyingHandlers.get(name) ?? [];\n const merged: Record<string, unknown> = {};\n for (const h of handlers) {\n try {\n const result = await h.handler(payload);\n if (result && typeof result === 'object') {\n for (const [k, v] of Object.entries(result)) {\n if (!(k in merged) && v !== null && v !== undefined) {\n merged[k] = v;\n }\n }\n }\n } catch {\n // fail-open: continue with other handlers\n }\n }\n return merged as ModifyingHooks[K][1];\n }\n\n // Claiming hooks: handlers run sequentially, stop after first { handled: true }.\n async fireClaiming<K extends keyof ClaimingHooks>(\n name: K,\n payload: ClaimingHooks[K][0],\n ): Promise<ClaimingHooks[K][1]> {\n const handlers = this.claimingHandlers.get(name) ?? [];\n for (const h of handlers) {\n try {\n const result = (await h.handler(payload)) as ClaimingHooks[K][1];\n if (result && (result as { handled: boolean }).handled) {\n return result;\n }\n } catch {\n // fail-open: try next handler\n }\n }\n return { handled: false } as ClaimingHooks[K][1];\n }\n\n unregisterPlugin(pluginId: string): void {\n for (const map of [this.voidHandlers, this.modifyingHandlers, this.claimingHandlers]) {\n for (const [name, handlers] of map.entries()) {\n map.set(\n name,\n handlers.filter((h) => h.pluginId !== pluginId),\n );\n }\n }\n }\n\n private remove(\n map: Map<string, RegisteredHandler[]>,\n name: string,\n entry: RegisteredHandler,\n ): void {\n const list = map.get(name) ?? [];\n map.set(\n name,\n list.filter((h) => h !== entry),\n );\n }\n}\n","import type { Tool, ToolContext, ToolRegistry, ToolResult } from '@ethosagent/types';\n\nexport class DefaultToolRegistry implements ToolRegistry {\n private readonly tools = new Map<string, Tool>();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n registerAll(tools: Tool[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n unregister(name: string): void {\n this.tools.delete(name);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n getAvailable(): Tool[] {\n return [...this.tools.values()].filter((t) => !t.isAvailable || t.isAvailable());\n }\n\n getForToolset(toolset: string): Tool[] {\n return this.getAvailable().filter((t) => t.toolset === toolset);\n }\n\n toDefinitions() {\n return this.getAvailable().map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.schema,\n }));\n }\n\n // Runs all tool calls in parallel. Results are returned in input order.\n // Budget is split evenly across parallel calls; each result is post-trimmed to budget.\n async executeParallel(\n calls: Array<{ toolCallId: string; name: string; args: unknown }>,\n ctx: ToolContext,\n ): Promise<Array<{ toolCallId: string; name: string; result: ToolResult }>> {\n const perCallBudget = Math.floor(ctx.resultBudgetChars / Math.max(calls.length, 1));\n\n const results = await Promise.allSettled(\n calls.map(async (call) => {\n const tool = this.tools.get(call.name);\n if (!tool) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: `Unknown tool: ${call.name}`,\n code: 'not_available',\n } as ToolResult,\n };\n }\n\n if (tool.isAvailable && !tool.isAvailable()) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: `Tool ${call.name} is not currently available`,\n code: 'not_available',\n } as ToolResult,\n };\n }\n\n const budget = Math.min(perCallBudget, tool.maxResultChars ?? perCallBudget);\n const toolCtx: ToolContext = { ...ctx, resultBudgetChars: budget };\n\n try {\n const result = await tool.execute(call.args, toolCtx);\n // Post-trim result to budget\n if (result.ok && result.value.length > budget) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: true,\n value: `${result.value.slice(0, budget)}\\n[truncated — ${result.value.length} chars total]`,\n } as ToolResult,\n };\n }\n return { toolCallId: call.toolCallId, name: call.name, result };\n } catch (err) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n code: 'execution_failed',\n } as ToolResult,\n };\n }\n }),\n );\n\n // Unwrap settled results — always return, never throw\n return results.map((r, i) => {\n if (r.status === 'fulfilled') return r.value;\n const call = calls[i] ?? { toolCallId: 'unknown', name: 'unknown', args: {} };\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: String(r.reason),\n code: 'execution_failed',\n } as ToolResult,\n };\n });\n }\n}\n","import type {\n CompletionChunk,\n ContextInjector,\n HookRegistry,\n LLMProvider,\n MemoryProvider,\n Message,\n MessageContent,\n PersonalityRegistry,\n SessionStore,\n StoredMessage,\n ToolRegistry,\n ToolResult,\n} from '@ethosagent/types';\n\nimport { InMemorySessionStore } from './defaults/in-memory-session';\nimport { NoopMemoryProvider } from './defaults/noop-memory';\nimport { DefaultPersonalityRegistry } from './defaults/noop-personality';\nimport { DefaultHookRegistry } from './hook-registry';\nimport { DefaultToolRegistry } from './tool-registry';\n\n// ---------------------------------------------------------------------------\n// Agent events emitted by run()\n// ---------------------------------------------------------------------------\n\nexport type AgentEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'thinking_delta'; thinking: string }\n | { type: 'tool_start'; toolCallId: string; toolName: string; args: unknown }\n | { type: 'tool_progress'; toolName: string; message: string; percent?: number }\n | { type: 'tool_end'; toolCallId: string; toolName: string; ok: boolean; durationMs: number }\n | { type: 'usage'; inputTokens: number; outputTokens: number; estimatedCostUsd: number }\n | { type: 'error'; error: string; code: string }\n | { type: 'done'; text: string; turnCount: number };\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AgentLoopConfig {\n llm: LLMProvider;\n tools?: ToolRegistry;\n personalities?: PersonalityRegistry;\n memory?: MemoryProvider;\n session?: SessionStore;\n hooks?: HookRegistry;\n injectors?: ContextInjector[];\n options?: {\n maxIterations?: number;\n historyLimit?: number;\n platform?: string;\n workingDir?: string;\n resultBudgetChars?: number;\n };\n}\n\nexport interface RunOptions {\n sessionKey?: string;\n personalityId?: string;\n abortSignal?: AbortSignal;\n}\n\n// ---------------------------------------------------------------------------\n// AgentLoop\n// ---------------------------------------------------------------------------\n\nexport class AgentLoop {\n private readonly llm: LLMProvider;\n private readonly tools: ToolRegistry;\n private readonly personalities: PersonalityRegistry;\n private readonly memory: MemoryProvider;\n private readonly session: SessionStore;\n private readonly hooks: HookRegistry;\n private readonly injectors: ContextInjector[];\n private readonly maxIterations: number;\n private readonly historyLimit: number;\n private readonly platform: string;\n private readonly workingDir: string;\n private readonly resultBudgetChars: number;\n\n constructor(config: AgentLoopConfig) {\n this.llm = config.llm;\n this.tools = config.tools ?? new DefaultToolRegistry();\n this.personalities = config.personalities ?? new DefaultPersonalityRegistry();\n this.memory = config.memory ?? new NoopMemoryProvider();\n this.session = config.session ?? new InMemorySessionStore();\n this.hooks = config.hooks ?? new DefaultHookRegistry();\n this.injectors = (config.injectors ?? []).sort((a, b) => b.priority - a.priority);\n this.maxIterations = config.options?.maxIterations ?? 50;\n this.historyLimit = config.options?.historyLimit ?? 200;\n this.platform = config.options?.platform ?? 'cli';\n this.workingDir = config.options?.workingDir ?? process.cwd();\n this.resultBudgetChars = config.options?.resultBudgetChars ?? 80_000;\n }\n\n async *run(text: string, opts: RunOptions = {}): AsyncGenerator<AgentEvent> {\n const abortSignal = opts.abortSignal ?? new AbortController().signal;\n const sessionKey = opts.sessionKey ?? `${this.platform}:default`;\n\n // Step 1: Resolve or create session\n const ethosSession =\n (await this.session.getSessionByKey(sessionKey)) ??\n (await this.session.createSession({\n key: sessionKey,\n platform: this.platform,\n model: this.llm.model,\n provider: this.llm.name,\n personalityId: opts.personalityId,\n workingDir: this.workingDir,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n estimatedCostUsd: 0,\n apiCallCount: 0,\n compactionCount: 0,\n },\n }));\n\n const sessionId = ethosSession.id;\n const personality =\n (opts.personalityId ? this.personalities.get(opts.personalityId) : null) ??\n this.personalities.getDefault();\n\n // Step 2: Fire session_start hooks\n await this.hooks.fireVoid('session_start', {\n sessionId,\n sessionKey,\n platform: this.platform,\n personalityId: personality.id,\n });\n\n // Step 3: Persist the user message\n await this.session.appendMessage({\n sessionId,\n role: 'user',\n content: text,\n });\n\n // Step 4: Load history (trimmed to most-recent limit)\n const allMessages = await this.session.getMessages(sessionId, { limit: this.historyLimit });\n const history = allMessages.filter((m) => m.role !== 'system');\n\n // Step 5: Prefetch memory\n const memCtx = await this.memory.prefetch({\n sessionId,\n sessionKey,\n platform: this.platform,\n workingDir: this.workingDir,\n personalityId: personality.id,\n });\n\n // Step 6: Build system prompt from injectors\n const promptCtx = {\n sessionId,\n sessionKey,\n platform: this.platform,\n model: this.llm.model,\n history,\n workingDir: this.workingDir,\n isDm: true,\n turnNumber: allMessages.length,\n personalityId: personality.id,\n };\n\n const systemParts: string[] = [];\n\n // ETHOS.md / personality identity\n if (personality.ethosFile) {\n try {\n const fs = await import('node:fs/promises');\n const identity = await fs.readFile(personality.ethosFile, 'utf-8');\n systemParts.push(identity.trim());\n } catch {\n // ethosFile not readable — skip\n }\n }\n\n // Context injectors sorted by priority (already sorted in constructor)\n for (const injector of this.injectors) {\n if (injector.shouldInject && !injector.shouldInject(promptCtx)) continue;\n const result = await injector.inject(promptCtx);\n if (result) {\n if (result.position === 'prepend') {\n systemParts.unshift(result.content);\n } else {\n systemParts.push(result.content);\n }\n }\n }\n\n // Memory injected last, as context about the user\n if (memCtx) {\n systemParts.push(`## Memory\\n\\n${memCtx.content}`);\n }\n\n // Step 7: Before-prompt-build modifying hooks (plugins can prepend/append/override)\n const buildResult = await this.hooks.fireModifying('before_prompt_build', {\n sessionId,\n personalityId: personality.id,\n history,\n });\n\n if (buildResult.overrideSystem) {\n systemParts.length = 0;\n systemParts.push(buildResult.overrideSystem);\n } else {\n if (buildResult.prependSystem) systemParts.unshift(buildResult.prependSystem);\n if (buildResult.appendSystem) systemParts.push(buildResult.appendSystem);\n }\n\n const systemPrompt = systemParts.join('\\n\\n').trim() || undefined;\n\n // Step 8: Agentic loop — LLM call → tool use → LLM call → ...\n const llmMessages = this.toLLMMessages(history);\n let fullText = '';\n let turnCount = 0;\n\n for (let iteration = 0; iteration < this.maxIterations; iteration++) {\n if (abortSignal.aborted) {\n yield { type: 'error', error: 'Aborted', code: 'aborted' };\n return;\n }\n\n // Fire before_llm_call\n await this.hooks.fireVoid('before_llm_call', {\n sessionId,\n model: this.llm.model,\n turnNumber: turnCount,\n });\n\n // Stream LLM response\n const pendingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n partialJson: string;\n args?: unknown;\n }> = [];\n let chunkText = '';\n\n try {\n const stream = this.llm.complete(llmMessages, this.tools.toDefinitions(), {\n system: systemPrompt,\n cacheSystemPrompt: true,\n abortSignal,\n });\n\n for await (const chunk of stream) {\n if (abortSignal.aborted) break;\n yield* this.handleChunk(chunk, pendingToolCalls, (t) => {\n chunkText += t;\n fullText += t;\n });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n yield { type: 'error', error: msg, code: 'llm_error' };\n return;\n }\n\n turnCount++;\n\n // Determine which tool calls completed parsing\n const completedToolCalls = pendingToolCalls.filter((tc) => tc.args !== undefined);\n\n // Persist assistant message — include tool_use references so history is LLM-replayable\n await this.session.appendMessage({\n sessionId,\n role: 'assistant',\n content: chunkText,\n ...(completedToolCalls.length > 0 && {\n toolCalls: completedToolCalls.map((tc) => ({\n id: tc.toolCallId,\n name: tc.toolName,\n input: tc.args,\n })),\n }),\n });\n\n // Fire after_llm_call\n await this.hooks.fireVoid('after_llm_call', {\n sessionId,\n text: chunkText,\n usage: { inputTokens: 0, outputTokens: 0 },\n });\n\n // Push assistant message with proper content blocks for next iteration\n if (completedToolCalls.length > 0) {\n const assistantContent: MessageContent[] = [];\n if (chunkText) assistantContent.push({ type: 'text', text: chunkText });\n for (const tc of completedToolCalls) {\n assistantContent.push({\n type: 'tool_use',\n id: tc.toolCallId,\n name: tc.toolName,\n input: tc.args,\n });\n }\n llmMessages.push({ role: 'assistant', content: assistantContent });\n } else {\n llmMessages.push({ role: 'assistant', content: chunkText });\n break;\n }\n\n // Step 9: Pre-flight hooks → execute non-rejected tools → collect all results\n const toolCtxBase = {\n sessionId,\n sessionKey,\n platform: this.platform,\n workingDir: this.workingDir,\n currentTurn: turnCount,\n messageCount: allMessages.length + turnCount,\n abortSignal,\n emit: (_event: {\n type: 'progress';\n toolName: string;\n message: string;\n percent?: number;\n }) => {\n // Progress emission wired in Phase 6 (terminal streaming)\n },\n resultBudgetChars: this.resultBudgetChars,\n };\n\n // Run before_tool_call hooks; build exec list with effective args\n // Rejected tools get tool_end ok:false + an error tool_result sent back to LLM\n type Prepped = { toolCallId: string; name: string; args: unknown; rejected?: string };\n const prepped: Prepped[] = [];\n\n for (const tc of completedToolCalls) {\n const beforeResult = await this.hooks.fireModifying('before_tool_call', {\n sessionId,\n toolName: tc.toolName,\n args: tc.args,\n });\n\n if (beforeResult.error) {\n yield {\n type: 'tool_end',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n ok: false,\n durationMs: 0,\n };\n prepped.push({\n toolCallId: tc.toolCallId,\n name: tc.toolName,\n args: tc.args,\n rejected: beforeResult.error,\n });\n continue;\n }\n\n const effectiveArgs = beforeResult.args ?? tc.args;\n yield {\n type: 'tool_start',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: effectiveArgs,\n };\n prepped.push({ toolCallId: tc.toolCallId, name: tc.toolName, args: effectiveArgs });\n }\n\n // Execute only non-rejected tools; results keyed by toolCallId\n const execInputs = prepped\n .filter((p) => p.rejected === undefined)\n .map((p) => ({ toolCallId: p.toolCallId, name: p.name, args: p.args }));\n\n const startedAt = Date.now();\n const execResults =\n execInputs.length > 0 ? await this.tools.executeParallel(execInputs, toolCtxBase) : [];\n const execResultMap = new Map(execResults.map((r) => [r.toolCallId, r]));\n\n // Persist results + emit tool_end + build tool_result content blocks (original order)\n const toolResultContent: MessageContent[] = [];\n\n for (const p of prepped) {\n const durationMs = Date.now() - startedAt;\n let result: ToolResult;\n\n if (p.rejected !== undefined) {\n result = { ok: false, error: p.rejected, code: 'execution_failed' };\n // tool_end already emitted above; no after_tool_call hook for blocked tools\n } else {\n const execResult = execResultMap.get(p.toolCallId);\n result = execResult?.result ?? {\n ok: false,\n error: 'Tool result missing',\n code: 'execution_failed',\n };\n yield {\n type: 'tool_end',\n toolCallId: p.toolCallId,\n toolName: p.name,\n ok: result.ok,\n durationMs,\n };\n await this.hooks.fireVoid('after_tool_call', {\n sessionId,\n toolName: p.name,\n result,\n durationMs,\n });\n }\n\n // Persist every result (rejected or not) so history matches what LLM sees\n await this.session.appendMessage({\n sessionId,\n role: 'tool_result',\n content: result.ok ? result.value : result.error,\n toolCallId: p.toolCallId,\n toolName: p.name,\n });\n\n toolResultContent.push({\n type: 'tool_result',\n tool_use_id: p.toolCallId,\n content: result.ok ? result.value : result.error,\n is_error: !result.ok,\n });\n }\n\n // Feed all tool results back to LLM as a single user message with content blocks\n llmMessages.push({ role: 'user', content: toolResultContent });\n }\n\n // Step 10: Sync memory\n await this.memory.sync(\n { sessionId, sessionKey, platform: this.platform, workingDir: this.workingDir },\n [],\n );\n\n // Step 11: Update usage\n await this.session.updateUsage(sessionId, { apiCallCount: turnCount });\n\n // Step 12: Fire agent_done\n await this.hooks.fireVoid('agent_done', { sessionId, text: fullText, turnCount });\n\n yield { type: 'done', text: fullText, turnCount };\n }\n\n private *handleChunk(\n chunk: CompletionChunk,\n pendingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n partialJson: string;\n args?: unknown;\n }>,\n onText: (t: string) => void,\n ): Generator<AgentEvent> {\n switch (chunk.type) {\n case 'text_delta':\n onText(chunk.text);\n yield { type: 'text_delta', text: chunk.text };\n break;\n\n case 'thinking_delta':\n yield { type: 'thinking_delta', thinking: chunk.thinking };\n break;\n\n case 'tool_use_start':\n pendingToolCalls.push({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n partialJson: '',\n });\n break;\n\n case 'tool_use_delta': {\n const tc = pendingToolCalls.find((t) => t.toolCallId === chunk.toolCallId);\n if (tc) tc.partialJson += chunk.partialJson;\n break;\n }\n\n case 'tool_use_end': {\n const tc = pendingToolCalls.find((t) => t.toolCallId === chunk.toolCallId);\n if (tc) {\n try {\n tc.args = JSON.parse(chunk.inputJson || tc.partialJson);\n } catch {\n tc.args = {};\n }\n }\n break;\n }\n\n case 'usage':\n yield {\n type: 'usage',\n inputTokens: chunk.usage.inputTokens,\n outputTokens: chunk.usage.outputTokens,\n estimatedCostUsd: chunk.usage.estimatedCostUsd,\n };\n break;\n\n case 'done':\n // finishReason available here for future context-compaction (Phase 3)\n break;\n }\n }\n\n // Reconstruct LLM-ready messages from stored history.\n // Assistant messages with tool calls produce proper tool_use content blocks.\n // Consecutive tool_result rows are grouped into a single user message.\n private toLLMMessages(stored: StoredMessage[]): Message[] {\n const messages: Message[] = [];\n\n for (const msg of stored) {\n if (msg.role === 'system') continue;\n\n if (msg.role === 'user') {\n messages.push({ role: 'user', content: msg.content });\n } else if (msg.role === 'assistant') {\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n const content: MessageContent[] = [];\n if (msg.content) content.push({ type: 'text', text: msg.content });\n for (const tc of msg.toolCalls) {\n content.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input });\n }\n messages.push({ role: 'assistant', content });\n } else {\n messages.push({ role: 'assistant', content: msg.content });\n }\n } else if (msg.role === 'tool_result') {\n const resultBlock: MessageContent = {\n type: 'tool_result',\n tool_use_id: msg.toolCallId ?? '',\n content: msg.content,\n is_error: false,\n };\n const last = messages[messages.length - 1];\n // Append to existing tool_result user message, or start a new one\n if (last?.role === 'user' && Array.isArray(last.content)) {\n (last.content as MessageContent[]).push(resultBlock);\n } else {\n messages.push({ role: 'user', content: [resultBlock] });\n }\n }\n }\n\n return messages;\n }\n}\n","// Generic plugin registry — adapted from praxis PluginRegistry pattern.\n// Each subsystem (tools, channels, memory backends) gets its own instance.\n\nexport type PluginFactory<T, C = unknown> = (config: C) => T | null;\n\nexport class PluginRegistry<T, C = unknown> {\n private readonly factories = new Map<string, PluginFactory<T, C>>();\n\n register(type: string, factory: PluginFactory<T, C>): void {\n this.factories.set(type, factory);\n }\n\n create(type: string, config: C): T {\n const factory = this.factories.get(type);\n if (!factory) {\n throw new Error(\n `Unknown plugin type: \"${type}\". Registered: ${[...this.factories.keys()].join(', ')}`,\n );\n }\n const instance = factory(config);\n if (!instance) {\n throw new Error(`Plugin factory for \"${type}\" returned null`);\n }\n return instance;\n }\n\n has(type: string): boolean {\n return this.factories.has(type);\n }\n\n types(): string[] {\n return [...this.factories.keys()];\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/defaults/in-memory-session.ts","../src/defaults/noop-memory.ts","../src/defaults/noop-personality.ts","../src/hook-registry.ts","../src/tool-registry.ts","../src/agent-loop.ts","../src/plugin-registry.ts"],"sourcesContent":["import type {\n SearchResult,\n Session,\n SessionFilter,\n SessionStore,\n SessionUsage,\n StoredMessage,\n} from '@ethosagent/types';\n\nexport class InMemorySessionStore implements SessionStore {\n private sessions = new Map<string, Session>();\n private messages = new Map<string, StoredMessage[]>();\n private idCounter = 0;\n\n async createSession(data: Omit<Session, 'id' | 'createdAt' | 'updatedAt'>): Promise<Session> {\n const session: Session = {\n ...data,\n id: `session_${++this.idCounter}`,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.sessions.set(session.id, session);\n this.messages.set(session.id, []);\n return session;\n }\n\n async getSession(id: string): Promise<Session | null> {\n return this.sessions.get(id) ?? null;\n }\n\n async getSessionByKey(key: string): Promise<Session | null> {\n for (const s of this.sessions.values()) {\n if (s.key === key) return s;\n }\n return null;\n }\n\n async updateSession(id: string, patch: Partial<Session>): Promise<void> {\n const session = this.sessions.get(id);\n if (!session) throw new Error(`Session not found: ${id}`);\n this.sessions.set(id, { ...session, ...patch, updatedAt: new Date() });\n }\n\n async deleteSession(id: string): Promise<void> {\n this.sessions.delete(id);\n this.messages.delete(id);\n }\n\n async listSessions(filter?: SessionFilter): Promise<Session[]> {\n let results = [...this.sessions.values()];\n if (filter?.platform) results = results.filter((s) => s.platform === filter.platform);\n if (filter?.personalityId)\n results = results.filter((s) => s.personalityId === filter.personalityId);\n if (filter?.workingDir) results = results.filter((s) => s.workingDir === filter.workingDir);\n if (filter?.since) {\n const since = filter.since;\n results = results.filter((s) => s.createdAt >= since);\n }\n results.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n const offset = filter?.offset ?? 0;\n const limit = filter?.limit ?? results.length;\n return results.slice(offset, offset + limit);\n }\n\n async appendMessage(data: Omit<StoredMessage, 'id' | 'timestamp'>): Promise<StoredMessage> {\n const message: StoredMessage = {\n ...data,\n id: `msg_${++this.idCounter}`,\n timestamp: new Date(),\n };\n const list = this.messages.get(data.sessionId) ?? [];\n list.push(message);\n this.messages.set(data.sessionId, list);\n return message;\n }\n\n async getMessages(\n sessionId: string,\n options?: { limit?: number; offset?: number },\n ): Promise<StoredMessage[]> {\n const all = this.messages.get(sessionId) ?? [];\n const offset = options?.offset ?? 0;\n // Return most-recent messages: trim from the tail, then skip `offset` from the end\n const end = all.length - offset;\n const start = options?.limit ? Math.max(0, end - options.limit) : 0;\n return all.slice(start, end);\n }\n\n async updateUsage(sessionId: string, delta: Partial<SessionUsage>): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n const usage = { ...session.usage };\n for (const [k, v] of Object.entries(delta) as [keyof SessionUsage, number][]) {\n (usage[k] as number) += v;\n }\n this.sessions.set(sessionId, { ...session, usage, updatedAt: new Date() });\n }\n\n async search(\n query: string,\n options?: { limit?: number; sessionId?: string },\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n const lower = query.toLowerCase();\n for (const [sessionId, msgs] of this.messages.entries()) {\n if (options?.sessionId && sessionId !== options.sessionId) continue;\n for (const msg of msgs) {\n const idx = msg.content.toLowerCase().indexOf(lower);\n if (idx >= 0) {\n results.push({\n sessionId,\n messageId: msg.id,\n snippet: msg.content.slice(Math.max(0, idx - 50), idx + 150),\n score: 1,\n timestamp: msg.timestamp,\n });\n }\n }\n }\n results.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n return results.slice(0, options?.limit ?? 20);\n }\n\n async pruneOldSessions(olderThan: Date): Promise<number> {\n let count = 0;\n for (const [id, session] of this.sessions.entries()) {\n if (session.updatedAt < olderThan) {\n this.sessions.delete(id);\n this.messages.delete(id);\n count++;\n }\n }\n return count;\n }\n\n async vacuum(): Promise<void> {\n // No-op for in-memory store\n }\n}\n","import type { MemoryLoadContext, MemoryProvider, MemoryUpdate } from '@ethosagent/types';\n\nexport class NoopMemoryProvider implements MemoryProvider {\n async prefetch(_ctx: MemoryLoadContext) {\n return null;\n }\n\n async sync(_ctx: MemoryLoadContext, _updates: MemoryUpdate[]): Promise<void> {\n // No-op\n }\n}\n","import type { PersonalityConfig, PersonalityRegistry } from '@ethosagent/types';\n\nconst DEFAULT_PERSONALITY: PersonalityConfig = {\n id: 'default',\n name: 'Default',\n description: 'Default Ethos personality',\n};\n\nexport class DefaultPersonalityRegistry implements PersonalityRegistry {\n private readonly personalities = new Map<string, PersonalityConfig>([\n ['default', DEFAULT_PERSONALITY],\n ]);\n private defaultId = 'default';\n\n define(config: PersonalityConfig): void {\n this.personalities.set(config.id, config);\n }\n\n get(id: string): PersonalityConfig | undefined {\n return this.personalities.get(id);\n }\n\n list(): PersonalityConfig[] {\n return [...this.personalities.values()];\n }\n\n getDefault(): PersonalityConfig {\n return this.personalities.get(this.defaultId) ?? DEFAULT_PERSONALITY;\n }\n\n setDefault(id: string): void {\n if (!this.personalities.has(id)) {\n throw new Error(`Unknown personality: ${id}`);\n }\n this.defaultId = id;\n }\n\n async loadFromDirectory(_dir: string): Promise<void> {\n // Implemented in extensions/personalities\n }\n}\n","import type { ClaimingHooks, HookRegistry, ModifyingHooks, VoidHooks } from '@ethosagent/types';\n\ntype AnyHandler = (...args: unknown[]) => Promise<unknown>;\n\ninterface RegisteredHandler {\n handler: AnyHandler;\n pluginId?: string;\n failurePolicy: 'fail-open' | 'fail-closed';\n}\n\nexport class DefaultHookRegistry implements HookRegistry {\n private readonly voidHandlers = new Map<string, RegisteredHandler[]>();\n private readonly modifyingHandlers = new Map<string, RegisteredHandler[]>();\n private readonly claimingHandlers = new Map<string, RegisteredHandler[]>();\n\n registerVoid<K extends keyof VoidHooks>(\n name: K,\n handler: (payload: VoidHooks[K]) => Promise<void>,\n opts?: { pluginId?: string; failurePolicy?: 'fail-open' | 'fail-closed' },\n ): () => void {\n const entry: RegisteredHandler = {\n handler: handler as AnyHandler,\n pluginId: opts?.pluginId,\n failurePolicy: opts?.failurePolicy ?? 'fail-open',\n };\n const list = this.voidHandlers.get(name) ?? [];\n list.push(entry);\n this.voidHandlers.set(name, list);\n return () => this.remove(this.voidHandlers, name, entry);\n }\n\n registerModifying<K extends keyof ModifyingHooks>(\n name: K,\n handler: (payload: ModifyingHooks[K][0]) => Promise<Partial<ModifyingHooks[K][1]> | null>,\n opts?: { pluginId?: string },\n ): () => void {\n const entry: RegisteredHandler = {\n handler: handler as AnyHandler,\n pluginId: opts?.pluginId,\n failurePolicy: 'fail-open',\n };\n const list = this.modifyingHandlers.get(name) ?? [];\n list.push(entry);\n this.modifyingHandlers.set(name, list);\n return () => this.remove(this.modifyingHandlers, name, entry);\n }\n\n registerClaiming<K extends keyof ClaimingHooks>(\n name: K,\n handler: (payload: ClaimingHooks[K][0]) => Promise<ClaimingHooks[K][1]>,\n opts?: { pluginId?: string },\n ): () => void {\n const entry: RegisteredHandler = {\n handler: handler as AnyHandler,\n pluginId: opts?.pluginId,\n failurePolicy: 'fail-open',\n };\n const list = this.claimingHandlers.get(name) ?? [];\n list.push(entry);\n this.claimingHandlers.set(name, list);\n return () => this.remove(this.claimingHandlers, name, entry);\n }\n\n // Void hooks: all handlers run in parallel via Promise.allSettled.\n // Failures are logged but never propagate (fail-open by default).\n async fireVoid<K extends keyof VoidHooks>(name: K, payload: VoidHooks[K]): Promise<void> {\n const handlers = this.voidHandlers.get(name) ?? [];\n await Promise.allSettled(handlers.map((h) => h.handler(payload)));\n }\n\n // Modifying hooks: handlers run sequentially; results are merged (first non-null value per key wins).\n async fireModifying<K extends keyof ModifyingHooks>(\n name: K,\n payload: ModifyingHooks[K][0],\n ): Promise<ModifyingHooks[K][1]> {\n const handlers = this.modifyingHandlers.get(name) ?? [];\n const merged: Record<string, unknown> = {};\n for (const h of handlers) {\n try {\n const result = await h.handler(payload);\n if (result && typeof result === 'object') {\n for (const [k, v] of Object.entries(result)) {\n if (!(k in merged) && v !== null && v !== undefined) {\n merged[k] = v;\n }\n }\n }\n } catch {\n // fail-open: continue with other handlers\n }\n }\n return merged as ModifyingHooks[K][1];\n }\n\n // Claiming hooks: handlers run sequentially, stop after first { handled: true }.\n async fireClaiming<K extends keyof ClaimingHooks>(\n name: K,\n payload: ClaimingHooks[K][0],\n ): Promise<ClaimingHooks[K][1]> {\n const handlers = this.claimingHandlers.get(name) ?? [];\n for (const h of handlers) {\n try {\n const result = (await h.handler(payload)) as ClaimingHooks[K][1];\n if (result && (result as { handled: boolean }).handled) {\n return result;\n }\n } catch {\n // fail-open: try next handler\n }\n }\n return { handled: false } as ClaimingHooks[K][1];\n }\n\n unregisterPlugin(pluginId: string): void {\n for (const map of [this.voidHandlers, this.modifyingHandlers, this.claimingHandlers]) {\n for (const [name, handlers] of map.entries()) {\n map.set(\n name,\n handlers.filter((h) => h.pluginId !== pluginId),\n );\n }\n }\n }\n\n private remove(\n map: Map<string, RegisteredHandler[]>,\n name: string,\n entry: RegisteredHandler,\n ): void {\n const list = map.get(name) ?? [];\n map.set(\n name,\n list.filter((h) => h !== entry),\n );\n }\n}\n","import type { Tool, ToolContext, ToolRegistry, ToolResult } from '@ethosagent/types';\n\nexport class DefaultToolRegistry implements ToolRegistry {\n private readonly tools = new Map<string, Tool>();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n }\n\n registerAll(tools: Tool[]): void {\n for (const tool of tools) {\n this.register(tool);\n }\n }\n\n unregister(name: string): void {\n this.tools.delete(name);\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n getAvailable(): Tool[] {\n return [...this.tools.values()].filter((t) => !t.isAvailable || t.isAvailable());\n }\n\n getForToolset(toolset: string): Tool[] {\n return this.getAvailable().filter((t) => t.toolset === toolset);\n }\n\n toDefinitions(allowedTools?: string[]) {\n const available = this.getAvailable();\n const filtered =\n allowedTools && allowedTools.length > 0\n ? available.filter((t) => allowedTools.includes(t.name))\n : available;\n return filtered.map((t) => ({\n name: t.name,\n description: t.description,\n parameters: t.schema,\n }));\n }\n\n // Runs all tool calls in parallel. Results are returned in input order.\n // Budget is split evenly across parallel calls; each result is post-trimmed to budget.\n // allowedTools enforces toolset at execution time (belt-and-suspenders after toDefinitions filtering).\n async executeParallel(\n calls: Array<{ toolCallId: string; name: string; args: unknown }>,\n ctx: ToolContext,\n allowedTools?: string[],\n ): Promise<Array<{ toolCallId: string; name: string; result: ToolResult }>> {\n const perCallBudget = Math.floor(ctx.resultBudgetChars / Math.max(calls.length, 1));\n\n const results = await Promise.allSettled(\n calls.map(async (call) => {\n if (allowedTools && allowedTools.length > 0 && !allowedTools.includes(call.name)) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: `Tool ${call.name} is not permitted for this personality`,\n code: 'not_available',\n } as ToolResult,\n };\n }\n\n const tool = this.tools.get(call.name);\n if (!tool) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: `Unknown tool: ${call.name}`,\n code: 'not_available',\n } as ToolResult,\n };\n }\n\n if (tool.isAvailable && !tool.isAvailable()) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: `Tool ${call.name} is not currently available`,\n code: 'not_available',\n } as ToolResult,\n };\n }\n\n const budget = Math.min(perCallBudget, tool.maxResultChars ?? perCallBudget);\n const toolCtx: ToolContext = { ...ctx, resultBudgetChars: budget };\n\n try {\n const result = await tool.execute(call.args, toolCtx);\n // Post-trim result to budget\n if (result.ok && result.value.length > budget) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: true,\n value: `${result.value.slice(0, budget)}\\n[truncated — ${result.value.length} chars total]`,\n } as ToolResult,\n };\n }\n return { toolCallId: call.toolCallId, name: call.name, result };\n } catch (err) {\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n code: 'execution_failed',\n } as ToolResult,\n };\n }\n }),\n );\n\n // Unwrap settled results — always return, never throw\n return results.map((r, i) => {\n if (r.status === 'fulfilled') return r.value;\n const call = calls[i] ?? { toolCallId: 'unknown', name: 'unknown', args: {} };\n return {\n toolCallId: call.toolCallId,\n name: call.name,\n result: {\n ok: false,\n error: String(r.reason),\n code: 'execution_failed',\n } as ToolResult,\n };\n });\n }\n}\n","import type {\n CompletionChunk,\n ContextInjector,\n HookRegistry,\n LLMProvider,\n MemoryProvider,\n Message,\n MessageContent,\n PersonalityRegistry,\n PromptContext,\n SessionStore,\n StoredMessage,\n ToolRegistry,\n ToolResult,\n} from '@ethosagent/types';\n\nimport { InMemorySessionStore } from './defaults/in-memory-session';\nimport { NoopMemoryProvider } from './defaults/noop-memory';\nimport { DefaultPersonalityRegistry } from './defaults/noop-personality';\nimport { DefaultHookRegistry } from './hook-registry';\nimport { DefaultToolRegistry } from './tool-registry';\n\n// ---------------------------------------------------------------------------\n// Agent events emitted by run()\n// ---------------------------------------------------------------------------\n\nexport type AgentEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'thinking_delta'; thinking: string }\n | { type: 'tool_start'; toolCallId: string; toolName: string; args: unknown }\n | { type: 'tool_progress'; toolName: string; message: string; percent?: number }\n | { type: 'tool_end'; toolCallId: string; toolName: string; ok: boolean; durationMs: number }\n | { type: 'usage'; inputTokens: number; outputTokens: number; estimatedCostUsd: number }\n | { type: 'error'; error: string; code: string }\n | { type: 'done'; text: string; turnCount: number }\n // Emitted once after context injectors run; carries any metadata they wrote to PromptContext.meta.\n | { type: 'context_meta'; data: Record<string, unknown> };\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AgentLoopConfig {\n llm: LLMProvider;\n tools?: ToolRegistry;\n personalities?: PersonalityRegistry;\n memory?: MemoryProvider;\n session?: SessionStore;\n hooks?: HookRegistry;\n injectors?: ContextInjector[];\n // Maps personality ID → model ID. Resolution: modelRouting[id] → personality.model → llm.model\n modelRouting?: Record<string, string>;\n options?: {\n maxIterations?: number;\n historyLimit?: number;\n platform?: string;\n workingDir?: string;\n resultBudgetChars?: number;\n };\n}\n\nexport interface RunOptions {\n sessionKey?: string;\n personalityId?: string;\n abortSignal?: AbortSignal;\n}\n\n// ---------------------------------------------------------------------------\n// AgentLoop\n// ---------------------------------------------------------------------------\n\nexport class AgentLoop {\n private readonly llm: LLMProvider;\n private readonly tools: ToolRegistry;\n private readonly personalities: PersonalityRegistry;\n private readonly memory: MemoryProvider;\n private readonly session: SessionStore;\n private readonly hooks: HookRegistry;\n private readonly injectors: ContextInjector[];\n private readonly maxIterations: number;\n private readonly historyLimit: number;\n private readonly platform: string;\n private readonly workingDir: string;\n private readonly resultBudgetChars: number;\n private readonly modelRouting: Record<string, string>;\n\n constructor(config: AgentLoopConfig) {\n this.llm = config.llm;\n this.tools = config.tools ?? new DefaultToolRegistry();\n this.personalities = config.personalities ?? new DefaultPersonalityRegistry();\n this.memory = config.memory ?? new NoopMemoryProvider();\n this.session = config.session ?? new InMemorySessionStore();\n this.hooks = config.hooks ?? new DefaultHookRegistry();\n this.injectors = (config.injectors ?? []).sort((a, b) => b.priority - a.priority);\n this.maxIterations = config.options?.maxIterations ?? 50;\n this.historyLimit = config.options?.historyLimit ?? 200;\n this.platform = config.options?.platform ?? 'cli';\n this.workingDir = config.options?.workingDir ?? process.cwd();\n this.resultBudgetChars = config.options?.resultBudgetChars ?? 80_000;\n this.modelRouting = config.modelRouting ?? {};\n }\n\n async *run(text: string, opts: RunOptions = {}): AsyncGenerator<AgentEvent> {\n const abortSignal = opts.abortSignal ?? new AbortController().signal;\n const sessionKey = opts.sessionKey ?? `${this.platform}:default`;\n\n // Step 1: Resolve or create session\n const ethosSession =\n (await this.session.getSessionByKey(sessionKey)) ??\n (await this.session.createSession({\n key: sessionKey,\n platform: this.platform,\n model: this.llm.model,\n provider: this.llm.name,\n personalityId: opts.personalityId,\n workingDir: this.workingDir,\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n estimatedCostUsd: 0,\n apiCallCount: 0,\n compactionCount: 0,\n },\n }));\n\n const sessionId = ethosSession.id;\n const personality =\n (opts.personalityId ? this.personalities.get(opts.personalityId) : null) ??\n this.personalities.getDefault();\n\n // Resolve effective model: explicit per-personality routing > LLM base model.\n // personality.model is intentionally skipped — those IDs are Anthropic-specific\n // and break non-Anthropic providers (OpenRouter, Gemini, Ollama, etc.).\n // Configure overrides via modelRouting in ~/.ethos/config.yaml instead.\n const effectiveModel = this.modelRouting[personality.id] ?? this.llm.model;\n const modelOverride = effectiveModel !== this.llm.model ? effectiveModel : undefined;\n // Allowed tool names for this personality (undefined = no restriction)\n const allowedTools = personality.toolset?.length ? personality.toolset : undefined;\n\n // Step 2: Fire session_start hooks\n await this.hooks.fireVoid('session_start', {\n sessionId,\n sessionKey,\n platform: this.platform,\n personalityId: personality.id,\n });\n\n // Step 3: Persist the user message\n await this.session.appendMessage({\n sessionId,\n role: 'user',\n content: text,\n });\n\n // Step 4: Load history (trimmed to most-recent limit)\n const allMessages = await this.session.getMessages(sessionId, { limit: this.historyLimit });\n const history = allMessages.filter((m) => m.role !== 'system');\n\n // Step 5: Prefetch memory\n const memCtx = await this.memory.prefetch({\n sessionId,\n sessionKey,\n platform: this.platform,\n workingDir: this.workingDir,\n personalityId: personality.id,\n query: text,\n });\n\n // Step 6: Build system prompt from injectors\n const promptCtx: PromptContext = {\n sessionId,\n sessionKey,\n platform: this.platform,\n model: this.llm.model,\n history,\n workingDir: this.workingDir,\n isDm: true,\n turnNumber: allMessages.length,\n personalityId: personality.id,\n };\n\n const systemParts: string[] = [];\n\n // ETHOS.md / personality identity\n if (personality.ethosFile) {\n try {\n const fs = await import('node:fs/promises');\n const identity = await fs.readFile(personality.ethosFile, 'utf-8');\n systemParts.push(identity.trim());\n } catch {\n // ethosFile not readable — skip\n }\n }\n\n // Context injectors sorted by priority (already sorted in constructor)\n for (const injector of this.injectors) {\n if (injector.shouldInject && !injector.shouldInject(promptCtx)) continue;\n const result = await injector.inject(promptCtx);\n if (result) {\n if (result.position === 'prepend') {\n systemParts.unshift(result.content);\n } else {\n systemParts.push(result.content);\n }\n }\n }\n\n // Emit injector metadata (e.g. skill_files_used) so eval harness can capture it.\n if (promptCtx.meta && Object.keys(promptCtx.meta).length > 0) {\n yield { type: 'context_meta', data: promptCtx.meta };\n }\n\n // Memory injected last, as context about the user\n if (memCtx) {\n systemParts.push(`## Memory\\n\\n${memCtx.content}`);\n }\n\n // Step 7: Before-prompt-build modifying hooks (plugins can prepend/append/override)\n const buildResult = await this.hooks.fireModifying('before_prompt_build', {\n sessionId,\n personalityId: personality.id,\n history,\n });\n\n if (buildResult.overrideSystem) {\n systemParts.length = 0;\n systemParts.push(buildResult.overrideSystem);\n } else {\n if (buildResult.prependSystem) systemParts.unshift(buildResult.prependSystem);\n if (buildResult.appendSystem) systemParts.push(buildResult.appendSystem);\n }\n\n const systemPrompt = systemParts.join('\\n\\n').trim() || undefined;\n\n // Step 8: Agentic loop — LLM call → tool use → LLM call → ...\n const llmMessages = this.toLLMMessages(history);\n let fullText = '';\n let turnCount = 0;\n\n for (let iteration = 0; iteration < this.maxIterations; iteration++) {\n if (abortSignal.aborted) {\n yield { type: 'error', error: 'Aborted', code: 'aborted' };\n return;\n }\n\n // Fire before_llm_call\n await this.hooks.fireVoid('before_llm_call', {\n sessionId,\n model: this.llm.model,\n turnNumber: turnCount,\n });\n\n // Stream LLM response\n const pendingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n partialJson: string;\n args?: unknown;\n }> = [];\n let chunkText = '';\n\n try {\n const stream = this.llm.complete(llmMessages, this.tools.toDefinitions(allowedTools), {\n system: systemPrompt,\n cacheSystemPrompt: true,\n abortSignal,\n ...(modelOverride ? { modelOverride } : {}),\n });\n\n for await (const chunk of stream) {\n if (abortSignal.aborted) break;\n yield* this.handleChunk(chunk, pendingToolCalls, (t) => {\n chunkText += t;\n fullText += t;\n });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n yield { type: 'error', error: msg, code: 'llm_error' };\n return;\n }\n\n turnCount++;\n\n // Determine which tool calls completed parsing\n const completedToolCalls = pendingToolCalls.filter((tc) => tc.args !== undefined);\n\n // Persist assistant message — include tool_use references so history is LLM-replayable\n await this.session.appendMessage({\n sessionId,\n role: 'assistant',\n content: chunkText,\n ...(completedToolCalls.length > 0 && {\n toolCalls: completedToolCalls.map((tc) => ({\n id: tc.toolCallId,\n name: tc.toolName,\n input: tc.args,\n })),\n }),\n });\n\n // Fire after_llm_call\n await this.hooks.fireVoid('after_llm_call', {\n sessionId,\n text: chunkText,\n usage: { inputTokens: 0, outputTokens: 0 },\n });\n\n // Push assistant message with proper content blocks for next iteration\n if (completedToolCalls.length > 0) {\n const assistantContent: MessageContent[] = [];\n if (chunkText) assistantContent.push({ type: 'text', text: chunkText });\n for (const tc of completedToolCalls) {\n assistantContent.push({\n type: 'tool_use',\n id: tc.toolCallId,\n name: tc.toolName,\n input: tc.args,\n });\n }\n llmMessages.push({ role: 'assistant', content: assistantContent });\n } else {\n llmMessages.push({ role: 'assistant', content: chunkText });\n break;\n }\n\n // Step 9: Pre-flight hooks → execute non-rejected tools → collect all results\n const toolCtxBase = {\n sessionId,\n sessionKey,\n platform: this.platform,\n workingDir: this.workingDir,\n currentTurn: turnCount,\n messageCount: allMessages.length + turnCount,\n abortSignal,\n emit: (_event: {\n type: 'progress';\n toolName: string;\n message: string;\n percent?: number;\n }) => {\n // Progress emission wired in Phase 6 (terminal streaming)\n },\n resultBudgetChars: this.resultBudgetChars,\n };\n\n // Run before_tool_call hooks; build exec list with effective args\n // Rejected tools get tool_end ok:false + an error tool_result sent back to LLM\n type Prepped = { toolCallId: string; name: string; args: unknown; rejected?: string };\n const prepped: Prepped[] = [];\n\n for (const tc of completedToolCalls) {\n const beforeResult = await this.hooks.fireModifying('before_tool_call', {\n sessionId,\n toolName: tc.toolName,\n args: tc.args,\n });\n\n if (beforeResult.error) {\n yield {\n type: 'tool_end',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n ok: false,\n durationMs: 0,\n };\n prepped.push({\n toolCallId: tc.toolCallId,\n name: tc.toolName,\n args: tc.args,\n rejected: beforeResult.error,\n });\n continue;\n }\n\n const effectiveArgs = beforeResult.args ?? tc.args;\n yield {\n type: 'tool_start',\n toolCallId: tc.toolCallId,\n toolName: tc.toolName,\n args: effectiveArgs,\n };\n prepped.push({ toolCallId: tc.toolCallId, name: tc.toolName, args: effectiveArgs });\n }\n\n // Execute only non-rejected tools; results keyed by toolCallId\n const execInputs = prepped\n .filter((p) => p.rejected === undefined)\n .map((p) => ({ toolCallId: p.toolCallId, name: p.name, args: p.args }));\n\n const startedAt = Date.now();\n const execResults =\n execInputs.length > 0\n ? await this.tools.executeParallel(execInputs, toolCtxBase, allowedTools)\n : [];\n const execResultMap = new Map(execResults.map((r) => [r.toolCallId, r]));\n\n // Persist results + emit tool_end + build tool_result content blocks (original order)\n const toolResultContent: MessageContent[] = [];\n\n for (const p of prepped) {\n const durationMs = Date.now() - startedAt;\n let result: ToolResult;\n\n if (p.rejected !== undefined) {\n result = { ok: false, error: p.rejected, code: 'execution_failed' };\n // tool_end already emitted above; no after_tool_call hook for blocked tools\n } else {\n const execResult = execResultMap.get(p.toolCallId);\n result = execResult?.result ?? {\n ok: false,\n error: 'Tool result missing',\n code: 'execution_failed',\n };\n yield {\n type: 'tool_end',\n toolCallId: p.toolCallId,\n toolName: p.name,\n ok: result.ok,\n durationMs,\n };\n await this.hooks.fireVoid('after_tool_call', {\n sessionId,\n toolName: p.name,\n result,\n durationMs,\n });\n }\n\n // Persist every result (rejected or not) so history matches what LLM sees\n await this.session.appendMessage({\n sessionId,\n role: 'tool_result',\n content: result.ok ? result.value : result.error,\n toolCallId: p.toolCallId,\n toolName: p.name,\n });\n\n toolResultContent.push({\n type: 'tool_result',\n tool_use_id: p.toolCallId,\n content: result.ok ? result.value : result.error,\n is_error: !result.ok,\n });\n }\n\n // Feed all tool results back to LLM as a single user message with content blocks\n llmMessages.push({ role: 'user', content: toolResultContent });\n }\n\n // Step 10: Sync memory\n await this.memory.sync(\n { sessionId, sessionKey, platform: this.platform, workingDir: this.workingDir },\n [],\n );\n\n // Step 11: Update usage\n await this.session.updateUsage(sessionId, { apiCallCount: turnCount });\n\n // Step 12: Fire agent_done\n await this.hooks.fireVoid('agent_done', { sessionId, text: fullText, turnCount });\n\n yield { type: 'done', text: fullText, turnCount };\n }\n\n private *handleChunk(\n chunk: CompletionChunk,\n pendingToolCalls: Array<{\n toolCallId: string;\n toolName: string;\n partialJson: string;\n args?: unknown;\n }>,\n onText: (t: string) => void,\n ): Generator<AgentEvent> {\n switch (chunk.type) {\n case 'text_delta':\n onText(chunk.text);\n yield { type: 'text_delta', text: chunk.text };\n break;\n\n case 'thinking_delta':\n yield { type: 'thinking_delta', thinking: chunk.thinking };\n break;\n\n case 'tool_use_start':\n pendingToolCalls.push({\n toolCallId: chunk.toolCallId,\n toolName: chunk.toolName,\n partialJson: '',\n });\n break;\n\n case 'tool_use_delta': {\n const tc = pendingToolCalls.find((t) => t.toolCallId === chunk.toolCallId);\n if (tc) tc.partialJson += chunk.partialJson;\n break;\n }\n\n case 'tool_use_end': {\n const tc = pendingToolCalls.find((t) => t.toolCallId === chunk.toolCallId);\n if (tc) {\n try {\n tc.args = JSON.parse(chunk.inputJson || tc.partialJson);\n } catch {\n tc.args = {};\n }\n }\n break;\n }\n\n case 'usage':\n yield {\n type: 'usage',\n inputTokens: chunk.usage.inputTokens,\n outputTokens: chunk.usage.outputTokens,\n estimatedCostUsd: chunk.usage.estimatedCostUsd,\n };\n break;\n\n case 'done':\n // finishReason available here for future context-compaction (Phase 3)\n break;\n }\n }\n\n // Reconstruct LLM-ready messages from stored history.\n // Assistant messages with tool calls produce proper tool_use content blocks.\n // Consecutive tool_result rows are grouped into a single user message.\n private toLLMMessages(stored: StoredMessage[]): Message[] {\n const messages: Message[] = [];\n\n for (const msg of stored) {\n if (msg.role === 'system') continue;\n\n if (msg.role === 'user') {\n messages.push({ role: 'user', content: msg.content });\n } else if (msg.role === 'assistant') {\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n const content: MessageContent[] = [];\n if (msg.content) content.push({ type: 'text', text: msg.content });\n for (const tc of msg.toolCalls) {\n content.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.input });\n }\n messages.push({ role: 'assistant', content });\n } else {\n messages.push({ role: 'assistant', content: msg.content });\n }\n } else if (msg.role === 'tool_result') {\n const resultBlock: MessageContent = {\n type: 'tool_result',\n tool_use_id: msg.toolCallId ?? '',\n content: msg.content,\n is_error: false,\n };\n const last = messages[messages.length - 1];\n // Append to existing tool_result user message, or start a new one\n if (last?.role === 'user' && Array.isArray(last.content)) {\n (last.content as MessageContent[]).push(resultBlock);\n } else {\n messages.push({ role: 'user', content: [resultBlock] });\n }\n }\n }\n\n return messages;\n }\n}\n","// Generic plugin registry — adapted from praxis PluginRegistry pattern.\n// Each subsystem (tools, channels, memory backends) gets its own instance.\n\nexport type PluginFactory<T, C = unknown> = (config: C) => T | null;\n\nexport class PluginRegistry<T, C = unknown> {\n private readonly factories = new Map<string, PluginFactory<T, C>>();\n\n register(type: string, factory: PluginFactory<T, C>): void {\n this.factories.set(type, factory);\n }\n\n create(type: string, config: C): T {\n const factory = this.factories.get(type);\n if (!factory) {\n throw new Error(\n `Unknown plugin type: \"${type}\". Registered: ${[...this.factories.keys()].join(', ')}`,\n );\n }\n const instance = factory(config);\n if (!instance) {\n throw new Error(`Plugin factory for \"${type}\" returned null`);\n }\n return instance;\n }\n\n has(type: string): boolean {\n return this.factories.has(type);\n }\n\n types(): string[] {\n return [...this.factories.keys()];\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ethosagent/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Core agent loop, tool registry, and hook registry for the Ethos agent framework",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@ethosagent/types": "0.1.
|
|
22
|
+
"@ethosagent/types": "0.1.1"
|
|
23
23
|
},
|
|
24
24
|
"scripts": {
|
|
25
25
|
"build": "tsup src/index.ts --format esm --dts --sourcemap"
|