agents-library 1.1.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.
Files changed (89) hide show
  1. package/dist/base-agent.d.ts +172 -0
  2. package/dist/base-agent.d.ts.map +1 -0
  3. package/dist/base-agent.js +255 -0
  4. package/dist/base-agent.js.map +1 -0
  5. package/dist/base-bot.d.ts +282 -0
  6. package/dist/base-bot.d.ts.map +1 -0
  7. package/dist/base-bot.js +375 -0
  8. package/dist/base-bot.js.map +1 -0
  9. package/dist/common/result.d.ts +51 -0
  10. package/dist/common/result.d.ts.map +1 -0
  11. package/dist/common/result.js +45 -0
  12. package/dist/common/result.js.map +1 -0
  13. package/dist/common/types.d.ts +57 -0
  14. package/dist/common/types.d.ts.map +1 -0
  15. package/dist/common/types.js +42 -0
  16. package/dist/common/types.js.map +1 -0
  17. package/dist/index.d.ts +94 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +108 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/kadi-event-publisher.d.ts +163 -0
  22. package/dist/kadi-event-publisher.d.ts.map +1 -0
  23. package/dist/kadi-event-publisher.js +286 -0
  24. package/dist/kadi-event-publisher.js.map +1 -0
  25. package/dist/memory/arcadedb-adapter.d.ts +159 -0
  26. package/dist/memory/arcadedb-adapter.d.ts.map +1 -0
  27. package/dist/memory/arcadedb-adapter.js +314 -0
  28. package/dist/memory/arcadedb-adapter.js.map +1 -0
  29. package/dist/memory/file-storage-adapter.d.ts +122 -0
  30. package/dist/memory/file-storage-adapter.d.ts.map +1 -0
  31. package/dist/memory/file-storage-adapter.js +352 -0
  32. package/dist/memory/file-storage-adapter.js.map +1 -0
  33. package/dist/memory/memory-service.d.ts +208 -0
  34. package/dist/memory/memory-service.d.ts.map +1 -0
  35. package/dist/memory/memory-service.js +410 -0
  36. package/dist/memory/memory-service.js.map +1 -0
  37. package/dist/memory/types.d.ts +126 -0
  38. package/dist/memory/types.d.ts.map +1 -0
  39. package/dist/memory/types.js +41 -0
  40. package/dist/memory/types.js.map +1 -0
  41. package/dist/producer-tool-utils.d.ts +474 -0
  42. package/dist/producer-tool-utils.d.ts.map +1 -0
  43. package/dist/producer-tool-utils.js +664 -0
  44. package/dist/producer-tool-utils.js.map +1 -0
  45. package/dist/providers/anthropic-provider.d.ts +160 -0
  46. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  47. package/dist/providers/anthropic-provider.js +527 -0
  48. package/dist/providers/anthropic-provider.js.map +1 -0
  49. package/dist/providers/model-manager-provider.d.ts +91 -0
  50. package/dist/providers/model-manager-provider.d.ts.map +1 -0
  51. package/dist/providers/model-manager-provider.js +355 -0
  52. package/dist/providers/model-manager-provider.js.map +1 -0
  53. package/dist/providers/provider-manager.d.ts +111 -0
  54. package/dist/providers/provider-manager.d.ts.map +1 -0
  55. package/dist/providers/provider-manager.js +337 -0
  56. package/dist/providers/provider-manager.js.map +1 -0
  57. package/dist/providers/types.d.ts +145 -0
  58. package/dist/providers/types.d.ts.map +1 -0
  59. package/dist/providers/types.js +23 -0
  60. package/dist/providers/types.js.map +1 -0
  61. package/dist/shadow-agent-factory.d.ts +623 -0
  62. package/dist/shadow-agent-factory.d.ts.map +1 -0
  63. package/dist/shadow-agent-factory.js +1117 -0
  64. package/dist/shadow-agent-factory.js.map +1 -0
  65. package/dist/types/agent-config.d.ts +307 -0
  66. package/dist/types/agent-config.d.ts.map +1 -0
  67. package/dist/types/agent-config.js +15 -0
  68. package/dist/types/agent-config.js.map +1 -0
  69. package/dist/types/event-schemas.d.ts +358 -0
  70. package/dist/types/event-schemas.d.ts.map +1 -0
  71. package/dist/types/event-schemas.js +188 -0
  72. package/dist/types/event-schemas.js.map +1 -0
  73. package/dist/types/tool-schemas.d.ts +498 -0
  74. package/dist/types/tool-schemas.d.ts.map +1 -0
  75. package/dist/types/tool-schemas.js +457 -0
  76. package/dist/types/tool-schemas.js.map +1 -0
  77. package/dist/utils/logger.d.ts +135 -0
  78. package/dist/utils/logger.d.ts.map +1 -0
  79. package/dist/utils/logger.js +205 -0
  80. package/dist/utils/logger.js.map +1 -0
  81. package/dist/utils/timer.d.ts +186 -0
  82. package/dist/utils/timer.d.ts.map +1 -0
  83. package/dist/utils/timer.js +211 -0
  84. package/dist/utils/timer.js.map +1 -0
  85. package/dist/worker-agent-factory.d.ts +688 -0
  86. package/dist/worker-agent-factory.d.ts.map +1 -0
  87. package/dist/worker-agent-factory.js +1517 -0
  88. package/dist/worker-agent-factory.js.map +1 -0
  89. package/package.json +38 -0
@@ -0,0 +1,172 @@
1
+ /**
2
+ * BaseAgent - Shared Foundation for All KĀDI Agents
3
+ * ==================================================
4
+ *
5
+ * Provides the common infrastructure that all agents need:
6
+ * - KadiClient setup and broker connection (non-blocking connect())
7
+ * - Optional ProviderManager for LLM operations
8
+ * - Optional MemoryService for context persistence
9
+ * - Graceful shutdown handling (SIGINT/SIGTERM)
10
+ * - Agent metadata (agentId, agentRole)
11
+ *
12
+ * Design: Composition, not inheritance. Each agent repo instantiates BaseAgent
13
+ * and implements its own behavior. BaseAgent is a concrete class, not abstract.
14
+ *
15
+ * Usage:
16
+ * ```typescript
17
+ * const agent = new BaseAgent({
18
+ * agentId: 'agent-artist',
19
+ * agentRole: 'artist',
20
+ * brokerUrl: 'ws://localhost:8080',
21
+ * networks: ['global'],
22
+ * });
23
+ * await agent.connect();
24
+ * // ... agent-specific logic using agent.client, agent.providerManager, etc.
25
+ * ```
26
+ *
27
+ * @module base-agent
28
+ */
29
+ import { KadiClient } from '@kadi.build/core';
30
+ import { ProviderManager } from './providers/provider-manager.js';
31
+ import { MemoryService } from './memory/memory-service.js';
32
+ /**
33
+ * Provider configuration for BaseAgent.
34
+ * Controls which LLM providers are available and how they fail over.
35
+ */
36
+ export interface BaseAgentProviderConfig {
37
+ /** Anthropic API key (required if using Anthropic provider) */
38
+ anthropicApiKey?: string;
39
+ /** Model Manager Gateway base URL (optional, enables model-manager provider) */
40
+ modelManagerBaseUrl?: string;
41
+ /** Model Manager Gateway API key (required if modelManagerBaseUrl is set) */
42
+ modelManagerApiKey?: string;
43
+ /**
44
+ * Primary provider name.
45
+ * @default 'anthropic' if only anthropicApiKey is set
46
+ * @default 'model-manager' if modelManagerBaseUrl is set
47
+ */
48
+ primaryProvider?: string;
49
+ /** Fallback provider name (optional, enables automatic failover) */
50
+ fallbackProvider?: string;
51
+ /** Number of retry attempts for failed LLM calls @default 3 */
52
+ retryAttempts?: number;
53
+ /** Delay between retries in milliseconds @default 1000 */
54
+ retryDelayMs?: number;
55
+ /** Health check interval in milliseconds @default 60000 */
56
+ healthCheckIntervalMs?: number;
57
+ }
58
+ /**
59
+ * Memory configuration for BaseAgent.
60
+ * Controls where conversation context and knowledge are stored.
61
+ */
62
+ export interface BaseAgentMemoryConfig {
63
+ /** Path to file-based memory storage directory */
64
+ dataPath: string;
65
+ /** ArcadeDB URL for long-term memory (optional) */
66
+ arcadedbUrl?: string;
67
+ /** ArcadeDB root password @default 'root' */
68
+ arcadedbPassword?: string;
69
+ }
70
+ /**
71
+ * Configuration for BaseAgent.
72
+ * Only agentId, agentRole, brokerUrl, and networks are required.
73
+ * Provider and memory are optional — agents without them still work.
74
+ */
75
+ export interface BaseAgentConfig {
76
+ /** Unique agent identifier (e.g., 'agent-producer', 'agent-artist') */
77
+ agentId: string;
78
+ /** Agent role (e.g., 'producer', 'artist', 'designer', 'programmer') */
79
+ agentRole: string;
80
+ /** Agent version string @default '1.0.0' */
81
+ version?: string;
82
+ /** KĀDI broker WebSocket URL (used as the 'default' broker) */
83
+ brokerUrl: string;
84
+ /** KĀDI networks this agent belongs to (for the default broker) */
85
+ networks: string[];
86
+ /**
87
+ * Additional named brokers to connect to simultaneously.
88
+ * Each key is a broker name, value is { url, networks }.
89
+ * The primary broker (brokerUrl + networks) is always named 'default'.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * additionalBrokers: {
94
+ * remote: { url: 'ws://remote:8080/kadi', networks: ['global'] },
95
+ * }
96
+ * ```
97
+ */
98
+ additionalBrokers?: Record<string, {
99
+ url: string;
100
+ networks: string[];
101
+ }>;
102
+ /** Optional LLM provider configuration */
103
+ provider?: BaseAgentProviderConfig;
104
+ /** Optional memory service configuration */
105
+ memory?: BaseAgentMemoryConfig;
106
+ }
107
+ /**
108
+ * Shared foundation for all KĀDI agents.
109
+ *
110
+ * Provides KadiClient, optional ProviderManager, optional MemoryService,
111
+ * and graceful shutdown. Each agent repo uses BaseAgent via composition
112
+ * and adds its own behavior.
113
+ */
114
+ export declare class BaseAgent {
115
+ /** KĀDI protocol client for broker communication */
116
+ readonly client: KadiClient;
117
+ /** LLM provider manager (undefined if no provider config) */
118
+ readonly providerManager?: ProviderManager;
119
+ /** Memory service for context persistence (undefined if no memory config) */
120
+ readonly memoryService?: MemoryService;
121
+ /** Agent configuration */
122
+ readonly config: BaseAgentConfig;
123
+ /** Whether shutdown handlers have been registered */
124
+ private shutdownHandlersRegistered;
125
+ /** Whether the agent is currently connected */
126
+ private connected;
127
+ /** Timer key for this agent's lifetime tracking */
128
+ private readonly timerKey;
129
+ constructor(config: BaseAgentConfig);
130
+ /**
131
+ * Connect to KĀDI broker and initialize async services.
132
+ *
133
+ * Uses client.connect() (non-blocking) — NOT client.serve() which blocks forever.
134
+ * After connection, initializes MemoryService if configured.
135
+ */
136
+ connect(): Promise<void>;
137
+ /**
138
+ * Register SIGINT/SIGTERM handlers for graceful shutdown.
139
+ *
140
+ * Call this once after setting up agent-specific resources.
141
+ * The shutdown sequence: agent-specific cleanup → disconnect → exit.
142
+ *
143
+ * @param onBeforeShutdown - Optional async callback for agent-specific cleanup
144
+ * (e.g., stopping bots, unsubscribing events) before broker disconnect.
145
+ */
146
+ registerShutdownHandlers(onBeforeShutdown?: () => Promise<void>): void;
147
+ /**
148
+ * Shut down the agent: dispose services and disconnect from broker.
149
+ *
150
+ * Can be called directly for programmatic shutdown, or automatically
151
+ * via registered signal handlers.
152
+ */
153
+ shutdown(): Promise<void>;
154
+ /**
155
+ * Check if the agent is currently connected to the broker.
156
+ */
157
+ isConnected(): boolean;
158
+ /**
159
+ * Get agent metadata for inclusion in event payloads.
160
+ * Used by the generic event naming system (task 3.11).
161
+ */
162
+ getMetadata(): {
163
+ agentId: string;
164
+ agentRole: string;
165
+ };
166
+ /**
167
+ * Create ProviderManager from provider configuration.
168
+ * Instantiates the appropriate LLM providers based on available credentials.
169
+ */
170
+ private createProviderManager;
171
+ }
172
+ //# sourceMappingURL=base-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-agent.d.ts","sourceRoot":"","sources":["../src/base-agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAS3D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,+DAA+D;IAC/D,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,2DAA2D;IAC3D,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IAEjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAEhB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAElB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAElB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB;;;;;;;;;;;OAWG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAExE,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IAEnC,4CAA4C;IAC5C,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAMD;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAE5B,6DAA6D;IAC7D,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAE3C,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IAEvC,0BAA0B;IAC1B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC,qDAAqD;IACrD,OAAO,CAAC,0BAA0B,CAAS;IAE3C,+CAA+C;IAC/C,OAAO,CAAC,SAAS,CAAS;IAE1B,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,MAAM,EAAE,eAAe;IA8CnC;;;;;OAKG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B9B;;;;;;;;OAQG;IACH,wBAAwB,CAAC,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAiCtE;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC/B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACH,WAAW,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAWrD;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAuC9B"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * BaseAgent - Shared Foundation for All KĀDI Agents
3
+ * ==================================================
4
+ *
5
+ * Provides the common infrastructure that all agents need:
6
+ * - KadiClient setup and broker connection (non-blocking connect())
7
+ * - Optional ProviderManager for LLM operations
8
+ * - Optional MemoryService for context persistence
9
+ * - Graceful shutdown handling (SIGINT/SIGTERM)
10
+ * - Agent metadata (agentId, agentRole)
11
+ *
12
+ * Design: Composition, not inheritance. Each agent repo instantiates BaseAgent
13
+ * and implements its own behavior. BaseAgent is a concrete class, not abstract.
14
+ *
15
+ * Usage:
16
+ * ```typescript
17
+ * const agent = new BaseAgent({
18
+ * agentId: 'agent-artist',
19
+ * agentRole: 'artist',
20
+ * brokerUrl: 'ws://localhost:8080',
21
+ * networks: ['global'],
22
+ * });
23
+ * await agent.connect();
24
+ * // ... agent-specific logic using agent.client, agent.providerManager, etc.
25
+ * ```
26
+ *
27
+ * @module base-agent
28
+ */
29
+ import { KadiClient } from '@kadi.build/core';
30
+ import { ProviderManager } from './providers/provider-manager.js';
31
+ import { AnthropicProvider } from './providers/anthropic-provider.js';
32
+ import { ModelManagerProvider } from './providers/model-manager-provider.js';
33
+ import { MemoryService } from './memory/memory-service.js';
34
+ import { logger, MODULE_AGENT } from './utils/logger.js';
35
+ import { timer } from './utils/timer.js';
36
+ // ============================================================================
37
+ // BaseAgent Class
38
+ // ============================================================================
39
+ /**
40
+ * Shared foundation for all KĀDI agents.
41
+ *
42
+ * Provides KadiClient, optional ProviderManager, optional MemoryService,
43
+ * and graceful shutdown. Each agent repo uses BaseAgent via composition
44
+ * and adds its own behavior.
45
+ */
46
+ export class BaseAgent {
47
+ /** KĀDI protocol client for broker communication */
48
+ client;
49
+ /** LLM provider manager (undefined if no provider config) */
50
+ providerManager;
51
+ /** Memory service for context persistence (undefined if no memory config) */
52
+ memoryService;
53
+ /** Agent configuration */
54
+ config;
55
+ /** Whether shutdown handlers have been registered */
56
+ shutdownHandlersRegistered = false;
57
+ /** Whether the agent is currently connected */
58
+ connected = false;
59
+ /** Timer key for this agent's lifetime tracking */
60
+ timerKey;
61
+ constructor(config) {
62
+ this.config = config;
63
+ this.timerKey = `base-agent-${config.agentId}`;
64
+ timer.start(this.timerKey);
65
+ logger.info(MODULE_AGENT, `Initializing BaseAgent: ${config.agentId} (role: ${config.agentRole})`, timer.elapsed(this.timerKey));
66
+ // Build brokers map: 'default' + any additional brokers
67
+ const brokers = {
68
+ default: { url: config.brokerUrl, networks: config.networks },
69
+ };
70
+ if (config.additionalBrokers) {
71
+ for (const [name, entry] of Object.entries(config.additionalBrokers)) {
72
+ brokers[name] = { url: entry.url, networks: entry.networks };
73
+ logger.info(MODULE_AGENT, ` Broker '${name}': ${entry.url} [${entry.networks.join(', ')}]`, timer.elapsed(this.timerKey));
74
+ }
75
+ }
76
+ // Create KadiClient
77
+ this.client = new KadiClient({
78
+ name: config.agentId,
79
+ version: config.version || '1.0.0',
80
+ brokers,
81
+ defaultBroker: 'default',
82
+ });
83
+ // Create ProviderManager if configured
84
+ if (config.provider) {
85
+ this.providerManager = this.createProviderManager(config.provider);
86
+ logger.info(MODULE_AGENT, ' ✅ ProviderManager created', timer.elapsed(this.timerKey));
87
+ }
88
+ // Create MemoryService if configured (requires async initialize() later)
89
+ if (config.memory) {
90
+ this.memoryService = new MemoryService(config.memory.dataPath, config.memory.arcadedbUrl, config.memory.arcadedbPassword, this.providerManager);
91
+ logger.info(MODULE_AGENT, ' ✅ MemoryService created (pending initialization)', timer.elapsed(this.timerKey));
92
+ }
93
+ logger.info(MODULE_AGENT, ` BaseAgent initialized for ${config.agentId}`, timer.elapsed(this.timerKey));
94
+ }
95
+ /**
96
+ * Connect to KĀDI broker and initialize async services.
97
+ *
98
+ * Uses client.connect() (non-blocking) — NOT client.serve() which blocks forever.
99
+ * After connection, initializes MemoryService if configured.
100
+ */
101
+ async connect() {
102
+ const brokerCount = 1 + Object.keys(this.config.additionalBrokers || {}).length;
103
+ logger.info(MODULE_AGENT, `Connecting ${this.config.agentId} to ${brokerCount} broker(s)...`, timer.elapsed(this.timerKey));
104
+ logger.info(MODULE_AGENT, ` Broker 'default': ${this.config.brokerUrl} [${this.config.networks.join(', ')}]`, timer.elapsed(this.timerKey));
105
+ try {
106
+ await this.client.connect();
107
+ this.connected = true;
108
+ logger.info(MODULE_AGENT, ` ✅ Connected to ${brokerCount} broker(s)`, timer.elapsed(this.timerKey));
109
+ }
110
+ catch (error) {
111
+ logger.error(MODULE_AGENT, `Failed to connect to broker: ${error.message || String(error)}`, timer.elapsed(this.timerKey), error);
112
+ throw error;
113
+ }
114
+ // Initialize MemoryService after connection (async operation)
115
+ if (this.memoryService) {
116
+ try {
117
+ await this.memoryService.initialize();
118
+ logger.info(MODULE_AGENT, ' ✅ MemoryService initialized', timer.elapsed(this.timerKey));
119
+ }
120
+ catch (error) {
121
+ // Memory initialization failure is non-fatal — agent can still operate
122
+ logger.error(MODULE_AGENT, `MemoryService initialization failed (non-fatal): ${error.message || String(error)}`, timer.elapsed(this.timerKey), error);
123
+ }
124
+ }
125
+ }
126
+ /**
127
+ * Register SIGINT/SIGTERM handlers for graceful shutdown.
128
+ *
129
+ * Call this once after setting up agent-specific resources.
130
+ * The shutdown sequence: agent-specific cleanup → disconnect → exit.
131
+ *
132
+ * @param onBeforeShutdown - Optional async callback for agent-specific cleanup
133
+ * (e.g., stopping bots, unsubscribing events) before broker disconnect.
134
+ */
135
+ registerShutdownHandlers(onBeforeShutdown) {
136
+ if (this.shutdownHandlersRegistered) {
137
+ logger.info(MODULE_AGENT, 'Shutdown handlers already registered, skipping', timer.elapsed(this.timerKey));
138
+ return;
139
+ }
140
+ const shutdownHandler = async (signal) => {
141
+ logger.info(MODULE_AGENT, `${signal} received, shutting down ${this.config.agentId}...`, timer.elapsed(this.timerKey));
142
+ try {
143
+ // Step 1: Agent-specific cleanup
144
+ if (onBeforeShutdown) {
145
+ await onBeforeShutdown();
146
+ }
147
+ // Step 2: Shutdown base services
148
+ await this.shutdown();
149
+ logger.info(MODULE_AGENT, 'Graceful shutdown complete', timer.elapsed(this.timerKey));
150
+ process.exit(0);
151
+ }
152
+ catch (error) {
153
+ logger.error(MODULE_AGENT, `Error during shutdown: ${error.message || String(error)}`, timer.elapsed(this.timerKey), error);
154
+ process.exit(1);
155
+ }
156
+ };
157
+ process.on('SIGTERM', () => shutdownHandler('SIGTERM'));
158
+ process.on('SIGINT', () => shutdownHandler('SIGINT'));
159
+ this.shutdownHandlersRegistered = true;
160
+ logger.info(MODULE_AGENT, 'Shutdown handlers registered (SIGTERM, SIGINT)', timer.elapsed(this.timerKey));
161
+ }
162
+ /**
163
+ * Shut down the agent: dispose services and disconnect from broker.
164
+ *
165
+ * Can be called directly for programmatic shutdown, or automatically
166
+ * via registered signal handlers.
167
+ */
168
+ async shutdown() {
169
+ logger.info(MODULE_AGENT, `Shutting down ${this.config.agentId}...`, timer.elapsed(this.timerKey));
170
+ // Dispose ProviderManager (stops health checks)
171
+ if (this.providerManager) {
172
+ try {
173
+ this.providerManager.dispose();
174
+ logger.info(MODULE_AGENT, ' ProviderManager disposed', timer.elapsed(this.timerKey));
175
+ }
176
+ catch (error) {
177
+ logger.error(MODULE_AGENT, `Error disposing ProviderManager: ${error.message}`, timer.elapsed(this.timerKey));
178
+ }
179
+ }
180
+ // Dispose MemoryService
181
+ if (this.memoryService) {
182
+ try {
183
+ this.memoryService.dispose();
184
+ logger.info(MODULE_AGENT, ' MemoryService disposed', timer.elapsed(this.timerKey));
185
+ }
186
+ catch (error) {
187
+ logger.error(MODULE_AGENT, `Error disposing MemoryService: ${error.message}`, timer.elapsed(this.timerKey));
188
+ }
189
+ }
190
+ // Disconnect from broker (clears subscriptions, unloads abilities)
191
+ if (this.connected) {
192
+ try {
193
+ await this.client.disconnect();
194
+ this.connected = false;
195
+ logger.info(MODULE_AGENT, ' Disconnected from broker', timer.elapsed(this.timerKey));
196
+ }
197
+ catch (error) {
198
+ logger.error(MODULE_AGENT, `Error disconnecting from broker: ${error.message}`, timer.elapsed(this.timerKey));
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Check if the agent is currently connected to the broker.
204
+ */
205
+ isConnected() {
206
+ return this.connected;
207
+ }
208
+ /**
209
+ * Get agent metadata for inclusion in event payloads.
210
+ * Used by the generic event naming system (task 3.11).
211
+ */
212
+ getMetadata() {
213
+ return {
214
+ agentId: this.config.agentId,
215
+ agentRole: this.config.agentRole,
216
+ };
217
+ }
218
+ // ============================================================================
219
+ // Private Helpers
220
+ // ============================================================================
221
+ /**
222
+ * Create ProviderManager from provider configuration.
223
+ * Instantiates the appropriate LLM providers based on available credentials.
224
+ */
225
+ createProviderManager(providerConfig) {
226
+ const providers = [];
227
+ // Add Anthropic provider if API key is available
228
+ if (providerConfig.anthropicApiKey) {
229
+ providers.push(new AnthropicProvider(providerConfig.anthropicApiKey));
230
+ }
231
+ // Add Model Manager provider if configured
232
+ if (providerConfig.modelManagerBaseUrl && providerConfig.modelManagerApiKey) {
233
+ providers.push(new ModelManagerProvider(providerConfig.modelManagerBaseUrl, providerConfig.modelManagerApiKey));
234
+ }
235
+ if (providers.length === 0) {
236
+ throw new Error('BaseAgent provider config requires at least one provider (set anthropicApiKey or modelManagerBaseUrl + modelManagerApiKey)');
237
+ }
238
+ // Determine primary/fallback providers
239
+ const hasBothProviders = providers.length > 1;
240
+ const primaryProvider = providerConfig.primaryProvider
241
+ || (providerConfig.modelManagerBaseUrl ? 'model-manager' : 'anthropic');
242
+ const fallbackProvider = providerConfig.fallbackProvider
243
+ || (hasBothProviders ? (primaryProvider === 'model-manager' ? 'anthropic' : 'model-manager') : undefined);
244
+ const config = {
245
+ primaryProvider,
246
+ fallbackProvider,
247
+ retryAttempts: providerConfig.retryAttempts ?? 3,
248
+ retryDelayMs: providerConfig.retryDelayMs ?? 1000,
249
+ healthCheckIntervalMs: providerConfig.healthCheckIntervalMs ?? 60000,
250
+ };
251
+ logger.info(MODULE_AGENT, ` Creating ProviderManager: primary=${primaryProvider}, fallback=${fallbackProvider || 'none'}, providers=${providers.length}`, timer.elapsed(this.timerKey));
252
+ return new ProviderManager(providers, config);
253
+ }
254
+ }
255
+ //# sourceMappingURL=base-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-agent.js","sourceRoot":"","sources":["../src/base-agent.ts"],"names":[],"mappings":"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"}