@ai-setting/roy-agent-core 1.7.66 → 1.7.68

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 (42) hide show
  1. package/dist/env/agent/agent-component.d.ts +29 -0
  2. package/dist/env/agent/agent-component.js +1 -1
  3. package/dist/env/agent/index.js +1 -1
  4. package/dist/env/agent/types.d.ts +16 -0
  5. package/dist/env/environment.d.ts +13 -0
  6. package/dist/env/event-source/event-source-handlers.js +6 -5
  7. package/dist/env/event-source/index.js +7 -6
  8. package/dist/env/event-source/timer-handler.d.ts +93 -1
  9. package/dist/env/index.js +12 -11
  10. package/dist/env/prompt/index.js +3 -2
  11. package/dist/env/prompt/prompts-index.d.ts +2 -7
  12. package/dist/env/task/delegate/delegate-tool.d.ts +21 -1
  13. package/dist/env/task/delegate/delegate-tool.js +3 -2
  14. package/dist/env/task/delegate/index.js +3 -2
  15. package/dist/env/task/index.js +5 -4
  16. package/dist/env/task/mcp/index.js +2 -1
  17. package/dist/env/task/plugins/__e2e__/laya-completion-e2e.d.ts +16 -0
  18. package/dist/env/task/plugins/index.js +4 -3
  19. package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +77 -0
  20. package/dist/env/task/plugins/lark-card-patch-notifier.js +7 -1
  21. package/dist/env/task/plugins/laya-completion-plugin.d.ts +133 -0
  22. package/dist/env/task/plugins/laya-port.d.ts +23 -0
  23. package/dist/env/task/task-component.d.ts +43 -0
  24. package/dist/env/task/tools/completion-copy.d.ts +27 -0
  25. package/dist/env/task/tools/index.js +2 -1
  26. package/dist/env/workflow/plugins/index.js +2 -2
  27. package/dist/index.js +13 -12
  28. package/dist/shared/@ai-setting/{roy-agent-core-8nksrtnf.js → roy-agent-core-19na22cc.js} +203 -18
  29. package/dist/shared/@ai-setting/{roy-agent-core-nr2m4xw1.js → roy-agent-core-1k83dq3a.js} +13 -3
  30. package/dist/shared/@ai-setting/roy-agent-core-43r4bxey.js +1083 -0
  31. package/dist/shared/@ai-setting/roy-agent-core-6m4bw8jy.js +6 -0
  32. package/dist/shared/@ai-setting/{roy-agent-core-0ys85x46.js → roy-agent-core-8bjj3d1b.js} +1 -1
  33. package/dist/shared/@ai-setting/{roy-agent-core-2wxbx36p.js → roy-agent-core-dnjm17sa.js} +21 -2
  34. package/dist/shared/@ai-setting/{roy-agent-core-t0ktaevq.js → roy-agent-core-h5vmff8w.js} +60 -4
  35. package/dist/shared/@ai-setting/{roy-agent-core-j1kksatb.js → roy-agent-core-hfr6bzts.js} +67 -10
  36. package/dist/shared/@ai-setting/{roy-agent-core-v8bz7d8x.js → roy-agent-core-keyb45z3.js} +26 -11
  37. package/dist/shared/@ai-setting/{roy-agent-core-vs5gxgwh.js → roy-agent-core-ma35jyd9.js} +14 -3
  38. package/dist/shared/@ai-setting/{roy-agent-core-zk2jg0v7.js → roy-agent-core-tadj19vp.js} +106 -22
  39. package/dist/shared/@ai-setting/{roy-agent-core-cvm1xgmg.js → roy-agent-core-wksgtqf9.js} +1 -1
  40. package/dist/shared/@ai-setting/{roy-agent-core-4882qsjx.js → roy-agent-core-x0ddc2cr.js} +1 -1
  41. package/package.json +1 -1
  42. package/dist/shared/@ai-setting/roy-agent-core-8mjnb7xc.js +0 -654
@@ -1,654 +0,0 @@
1
- import {
2
- createAutoTaskPlugin,
3
- createLayaDecisionPlugin
4
- } from "./roy-agent-core-v8bz7d8x.js";
5
- import {
6
- TaskHookPoints
7
- } from "./roy-agent-core-1pg0fepg.js";
8
- import {
9
- ContextError,
10
- ErrorCodes
11
- } from "./roy-agent-core-ctdhjv68.js";
12
- import {
13
- BaseComponent
14
- } from "./roy-agent-core-pgvcf91v.js";
15
- import {
16
- init_hook
17
- } from "./roy-agent-core-ax9e9szb.js";
18
- import {
19
- init_context
20
- } from "./roy-agent-core-qqaak24r.js";
21
- import {
22
- getEnvContext,
23
- init_env_context,
24
- runWithEnvContextAsync
25
- } from "./roy-agent-core-7cbpmk4q.js";
26
- import {
27
- TracedAs,
28
- envQueryParamFilter,
29
- init_decorator,
30
- init_trace_filters
31
- } from "./roy-agent-core-qq96p0tj.js";
32
- import {
33
- createLogger,
34
- init_logger
35
- } from "./roy-agent-core-7f7t9wwp.js";
36
- import {
37
- __legacyDecorateClassTS
38
- } from "./roy-agent-core-fs0mn2jk.js";
39
-
40
- // src/env/environment.ts
41
- init_logger();
42
-
43
- // src/utils/id.ts
44
- function generateId(prefix = "id") {
45
- const timestamp = Date.now().toString(36);
46
- const random = Math.random().toString(36).substring(2, 11);
47
- return `${prefix}_${timestamp}_${random}`;
48
- }
49
- function generateDescendingId(prefix = "id") {
50
- const timestamp = (Number.MAX_SAFE_INTEGER - Date.now()).toString(36);
51
- const random = Math.random().toString(36).substring(2, 11);
52
- return `${prefix}_${timestamp}_${random}`;
53
- }
54
-
55
- // src/env/environment.ts
56
- init_decorator();
57
- init_trace_filters();
58
- init_env_context();
59
- import * as fsSync from "fs";
60
- import * as path from "path";
61
- var logger = createLogger("environment");
62
- function registerLayaDecisionTaskHook(taskComponent, options) {
63
- if (!taskComponent) {
64
- logger.warn("[registerLayaDecisionTaskHook] TaskComponent not available — skip (fail-open)");
65
- return false;
66
- }
67
- try {
68
- const hook = createLayaDecisionPlugin(options);
69
- taskComponent.unregisterHook(TaskHookPoints.BEFORE_CREATE, hook.name);
70
- taskComponent.registerHook(TaskHookPoints.BEFORE_CREATE, {
71
- name: hook.name,
72
- priority: hook.priority,
73
- execute: async (ctx) => {
74
- try {
75
- const data = ctx && typeof ctx === "object" && "data" in ctx ? ctx.data : ctx;
76
- await hook.execute(data);
77
- } catch (err) {
78
- logger.warn(`[registerLayaDecisionTaskHook] hook execution failed (ignored): ${err?.message}`);
79
- }
80
- }
81
- });
82
- logger.info(`[registerLayaDecisionTaskHook] registered hook "${hook.name}" at ${TaskHookPoints.BEFORE_CREATE} (priority=${hook.priority})`);
83
- return true;
84
- } catch (err) {
85
- logger.warn(`[registerLayaDecisionTaskHook] registration failed (ignored): ${err?.message}`);
86
- return false;
87
- }
88
- }
89
- var DEFAULT_AGENT_NAME = "Roy";
90
- function injectAgentNamePlaceholder(prompt, context) {
91
- if (!prompt.includes("{{agent_name}}")) {
92
- return prompt;
93
- }
94
- const metadata = context?.metadata;
95
- const defaultAgentName = typeof metadata?.defaultAgentName === "string" && metadata.defaultAgentName.length > 0 ? metadata.defaultAgentName : DEFAULT_AGENT_NAME;
96
- return prompt.replace(/\{\{agent_name\}\}/g, defaultAgentName);
97
- }
98
-
99
- class BaseEnvironment extends BaseComponent {
100
- name;
101
- version;
102
- components = new Map;
103
- constructor(config) {
104
- super();
105
- this.name = config?.name ?? "base-environment";
106
- this.version = config?.version ?? "1.0.0";
107
- this.registerDefaultComponents();
108
- }
109
- registerDefaultComponents() {}
110
- getConfig() {
111
- return {
112
- name: this.name,
113
- version: this.version,
114
- enabled: true,
115
- env: this
116
- };
117
- }
118
- registerComponent(component) {
119
- this.components.set(component.name, component);
120
- logger.debug(`Component registered: ${component.name}`);
121
- }
122
- unregisterComponent(name) {
123
- const component = this.components.get(name);
124
- if (component) {
125
- this.components.delete(name);
126
- logger.debug(`Component unregistered: ${name}`);
127
- }
128
- }
129
- getComponent(name) {
130
- return this.components.get(name);
131
- }
132
- listComponents() {
133
- return Array.from(this.components.values());
134
- }
135
- async handle_query(query, context) {
136
- const agentComponent = this.getComponent("agent");
137
- if (!agentComponent) {
138
- throw new Error("AgentComponent not found. Please register AgentComponent before calling handle_query.");
139
- }
140
- const agentName = context?.agentType && context.agentType !== "default" ? context.agentType : "default";
141
- const registry = agentComponent.getRegistry?.();
142
- if (registry) {
143
- const agentDef = registry.get(agentName);
144
- if (agentDef?.type === "workflow") {
145
- const existingCtx = getEnvContext();
146
- const workflowEnvContext = {
147
- envEvent: context || { type: "workflow" },
148
- sourceId: "workflow",
149
- userId: context?.metadata?.userId || "",
150
- replyChannel: existingCtx?.replyChannel,
151
- pluginEnabled: existingCtx?.pluginEnabled,
152
- agentContext: existingCtx?.agentContext ?? {}
153
- };
154
- return await runWithEnvContextAsync(workflowEnvContext, async () => {
155
- return await this.handleWorkflowAgentQuery(agentName, query, agentComponent, context);
156
- });
157
- }
158
- }
159
- let systemPrompt = "You are a helpful assistant.";
160
- let promptSource = "fallback";
161
- try {
162
- const promptComponent = this.getComponent("prompt");
163
- if (promptComponent) {
164
- const loadedPrompt = await promptComponent.getPrompt("default", {}, {
165
- agentType: "primary"
166
- });
167
- if (loadedPrompt) {
168
- systemPrompt = loadedPrompt;
169
- promptSource = "PromptComponent";
170
- }
171
- }
172
- } catch (err) {
173
- logger.warn(`[handle_query] Failed to get prompt from PromptComponent: ${err}`);
174
- }
175
- logger.info(`[handle_query] Using system prompt from ${promptSource}, length: ${systemPrompt.length}`);
176
- let finalSystemPrompt = systemPrompt;
177
- if (systemPrompt.includes("{{memory}}")) {
178
- try {
179
- const memoryComponent = this.getComponent("memory");
180
- if (memoryComponent) {
181
- const memoryContent = await memoryComponent.recallMemory();
182
- finalSystemPrompt = systemPrompt.replace("{{memory}}", memoryContent || "(No memory)");
183
- logger.info(`[handle_query] Injected memory content, length: ${memoryContent.length}`);
184
- } else {
185
- finalSystemPrompt = systemPrompt.replace("{{memory}}", "(Memory component not available)");
186
- }
187
- } catch (err) {
188
- logger.warn(`[handle_query] Failed to load memory content: ${err}`);
189
- finalSystemPrompt = systemPrompt.replace("{{memory}}", "(Failed to load memory)");
190
- }
191
- }
192
- if (finalSystemPrompt.includes("{{workspace_dir}}")) {
193
- const workspaceDir = process.cwd();
194
- finalSystemPrompt = finalSystemPrompt.replace("{{workspace_dir}}", workspaceDir);
195
- logger.debug(`[handle_query] Injected workspace_dir: ${workspaceDir}`);
196
- }
197
- {
198
- const prev = finalSystemPrompt;
199
- finalSystemPrompt = injectAgentNamePlaceholder(finalSystemPrompt, context);
200
- if (prev !== finalSystemPrompt) {
201
- const metadata = context?.metadata;
202
- const injectedName = typeof metadata?.defaultAgentName === "string" && metadata.defaultAgentName.length > 0 ? metadata.defaultAgentName : DEFAULT_AGENT_NAME;
203
- logger.debug(`[handle_query] Injected agent_name: ${injectedName}`);
204
- }
205
- }
206
- let agent = agentComponent.getAgent(agentName);
207
- if (!agent) {
208
- if (agentName !== "default") {
209
- logger.warn(`[handle_query] Agent "${agentName}" not found, falling back to "default"`);
210
- }
211
- agent = agentComponent.getAgent("default");
212
- }
213
- if (!agent) {
214
- const defaultDeniedTools = [
215
- "echo",
216
- "glob",
217
- "grep",
218
- "write_file",
219
- "edit_file",
220
- "task_create",
221
- "task_update",
222
- "task_delete",
223
- "task_complete",
224
- "task_operation_create",
225
- "task_operation_update",
226
- "task_operation_delete",
227
- "skill",
228
- "record_memory",
229
- "recall_memory",
230
- "search_sessions",
231
- "get_session",
232
- "write_memory"
233
- ];
234
- try {
235
- const toolComponent = this.getComponent("tool");
236
- if (toolComponent?.listTools) {
237
- const allTools = toolComponent.listTools();
238
- const mcpTools = allTools.filter((t) => t.name.startsWith("mcp_")).map((t) => t.name);
239
- if (mcpTools.length > 0) {
240
- defaultDeniedTools.push(...mcpTools);
241
- logger.debug(`[handle_query] Dynamically denied MCP tools: ${mcpTools.join(", ")}`);
242
- }
243
- }
244
- } catch (err) {
245
- logger.warn(`[handle_query] Failed to dynamically filter MCP tools: ${err}`);
246
- }
247
- agent = agentComponent.registerAgent("default", {
248
- type: "primary",
249
- systemPrompt: finalSystemPrompt,
250
- deniedTools: defaultDeniedTools
251
- });
252
- logger.info(`[handle_query] Created default receptionist agent with deniedTools: ${defaultDeniedTools.length} tools denied`);
253
- try {
254
- const autoTaskPlugin = createAutoTaskPlugin({
255
- threshold: 20
256
- });
257
- agentComponent.registerPlugin("default", autoTaskPlugin);
258
- logger.info("[handle_query] AutoTaskPlugin v5.0 registered on default agent (threshold=20)");
259
- } catch (err) {
260
- logger.warn(`[handle_query] Failed to register AutoTaskPlugin: ${err}`);
261
- }
262
- } else {
263
- if (agent.config?.systemPrompt) {
264
- if (agent.config.systemPrompt.includes("{{memory}}")) {
265
- try {
266
- const memoryComponent = this.getComponent("memory");
267
- if (memoryComponent) {
268
- const memoryContent = await memoryComponent.recallMemory();
269
- agent.config.systemPrompt = agent.config.systemPrompt.replace("{{memory}}", memoryContent || "(No memory)");
270
- } else {
271
- agent.config.systemPrompt = agent.config.systemPrompt.replace("{{memory}}", "(Memory component not available)");
272
- }
273
- } catch (err) {
274
- logger.warn(`[handle_query] Failed to inject memory for agent ${agentName}: ${err}`);
275
- agent.config.systemPrompt = agent.config.systemPrompt.replace("{{memory}}", "(Failed to load memory)");
276
- }
277
- }
278
- if (agent.config.systemPrompt.includes("{{workspace_dir}}")) {
279
- agent.config.systemPrompt = agent.config.systemPrompt.replace("{{workspace_dir}}", process.cwd());
280
- }
281
- agent.config.systemPrompt = injectAgentNamePlaceholder(agent.config.systemPrompt, context);
282
- }
283
- logger.debug(`[handle_query] Injected memory/workspace_dir for existing agent: ${agentName}`);
284
- }
285
- try {
286
- const taskComponent = this.getComponent("task");
287
- registerLayaDecisionTaskHook(taskComponent);
288
- } catch (err) {
289
- logger.warn(`[handle_query] Failed to register LayaDecisionTaskHook: ${err}`);
290
- }
291
- const result = await agentComponent.run(agent.name, query, context);
292
- if (result.error) {
293
- if (result.originalError instanceof ContextError) {
294
- throw result.originalError;
295
- }
296
- const errorMsg = result.error.toLowerCase();
297
- if (errorMsg.includes("context") || errorMsg.includes("threshold") || errorMsg.includes("token") || result.error.includes("CTX_001")) {
298
- const usageMatch = result.error.match(/(\d+)\/(\d+)\s*\(([\d.]+)%\)/);
299
- let usage;
300
- let contextWindow;
301
- if (usageMatch) {
302
- const totalTokens = parseInt(usageMatch[1], 10);
303
- usage = {
304
- promptTokens: totalTokens,
305
- completionTokens: 0,
306
- totalTokens
307
- };
308
- contextWindow = parseInt(usageMatch[2], 10);
309
- }
310
- const ctxError = new ContextError(result.error, ErrorCodes.CONTEXT_THRESHOLD_EXCEEDED, context?.sessionId, usage, contextWindow);
311
- throw ctxError;
312
- }
313
- throw new Error(result.error, result.originalError ? { cause: result.originalError } : undefined);
314
- }
315
- return result.finalText || "";
316
- }
317
- async handleWorkflowAgentQuery(agentName, query, agentComponent, context) {
318
- const registry = agentComponent.getRegistry?.();
319
- if (!registry) {
320
- return null;
321
- }
322
- const agentDef = registry.get(agentName);
323
- if (!agentDef || agentDef.type !== "workflow") {
324
- return null;
325
- }
326
- const workflowComponent = this.getComponent("workflow");
327
- if (!workflowComponent) {
328
- throw new Error(`WorkflowComponent not available — cannot run workflow agent "${agentName}". ` + `Ensure the workflow component is registered.`);
329
- }
330
- const workflowName = agentDef.workflow;
331
- if (!workflowName) {
332
- throw new Error(`Agent "${agentName}" has type 'workflow' but no workflow configured.`);
333
- }
334
- const svc = workflowComponent.getService?.();
335
- if (!svc || typeof svc.getWorkflowByName !== "function") {
336
- throw new Error(`WorkflowService not available. Cannot run workflow agent "${agentName}".`);
337
- }
338
- const workflow = svc.getWorkflowByName(workflowName);
339
- if (!workflow) {
340
- throw new Error(`Workflow "${workflowName}" not found. ` + `Use 'roy-agent workflow add' to register it first.`);
341
- }
342
- const wfResult = await workflowComponent.runWorkflow(workflow.definition, { query }, { context });
343
- if (wfResult.status === "paused") {
344
- return JSON.stringify({
345
- status: "paused",
346
- message: `Workflow "${workflowName}" paused, waiting for user input.`,
347
- pendingNodeId: wfResult.pendingNodeId,
348
- query: wfResult.query,
349
- sessionId: wfResult.sessionId,
350
- hint: `Resume with: roy-agent workflow run -s ${wfResult.sessionId} --input "your response"`
351
- });
352
- }
353
- if (wfResult.status === "failed") {
354
- throw new Error(`Workflow "${workflowName}" execution failed: ${wfResult.error || "Unknown error (status: " + wfResult.status + ")"}`);
355
- }
356
- if (typeof wfResult.output === "string") {
357
- return wfResult.output;
358
- }
359
- if (wfResult.output !== undefined && wfResult.output !== null) {
360
- return JSON.stringify(wfResult.output);
361
- }
362
- if (wfResult.error) {
363
- throw new Error(`Workflow "${workflowName}" completed with error: ${wfResult.error}`);
364
- }
365
- return "";
366
- }
367
- async handle_action(action, context) {
368
- throw new Error("handle_action not implemented. Override in subclass.");
369
- }
370
- eventHandlers = new Map;
371
- wildcardHandlers = new Set;
372
- subscribe(handler) {
373
- this.wildcardHandlers.add(handler);
374
- logger.debug(`EnvEvent handler subscribed (wildcard)`);
375
- return () => {
376
- this.wildcardHandlers.delete(handler);
377
- logger.debug(`EnvEvent handler unsubscribed (wildcard)`);
378
- };
379
- }
380
- subscribeTo(eventType, handler) {
381
- const types = Array.isArray(eventType) ? eventType : [eventType];
382
- for (const type of types) {
383
- if (!this.eventHandlers.has(type)) {
384
- this.eventHandlers.set(type, new Set);
385
- }
386
- this.eventHandlers.get(type).add(handler);
387
- }
388
- logger.debug(`EnvEvent handler subscribed for types: ${types.join(", ")}`);
389
- return () => {
390
- for (const type of types) {
391
- this.eventHandlers.get(type)?.delete(handler);
392
- }
393
- logger.debug(`EnvEvent handler unsubscribed for types: ${types.join(", ")}`);
394
- };
395
- }
396
- subscribeAll(handler) {
397
- return this.subscribe(handler);
398
- }
399
- pushEnvEvent(event) {
400
- const fullEvent = "id" in event && event.id ? event : {
401
- id: event.id ?? generateId(),
402
- type: event.type,
403
- timestamp: event.timestamp ?? Date.now(),
404
- metadata: {
405
- ...event.metadata,
406
- env_name: event.metadata?.env_name ?? this.name
407
- },
408
- payload: event.payload ?? {}
409
- };
410
- for (const handler of this.wildcardHandlers) {
411
- try {
412
- handler(fullEvent);
413
- } catch (error) {
414
- logger.error(`Error in EnvEvent handler: ${error}`);
415
- }
416
- }
417
- const handlers = this.eventHandlers.get(fullEvent.type);
418
- if (handlers) {
419
- for (const handler of handlers) {
420
- try {
421
- handler(fullEvent);
422
- } catch (error) {
423
- logger.error(`Error in EnvEvent handler for ${fullEvent.type}: ${error}`);
424
- }
425
- }
426
- }
427
- }
428
- emit(type, payload, metadata) {
429
- const event = {
430
- id: generateId(),
431
- type,
432
- timestamp: Date.now(),
433
- metadata: {
434
- env_name: this.name,
435
- ...metadata
436
- },
437
- payload
438
- };
439
- this.pushEnvEvent(event);
440
- }
441
- async initializeComponents() {
442
- logger.debug(`Starting component initialization, total: ${this.components.size}`);
443
- const configComp = this.components.get("config");
444
- if (configComp && configComp.getStatus() === "created") {
445
- logger.debug(`Initializing ConfigComponent first...`);
446
- await configComp.init({
447
- name: "config",
448
- version: configComp.version,
449
- enabled: true,
450
- env: this
451
- });
452
- logger.debug(`ConfigComponent initialized`);
453
- } else {
454
- logger.debug(`No ConfigComponent found, skipping first stage`);
455
- }
456
- const otherComponents = Array.from(this.components.values()).filter((c) => c.getStatus() === "created");
457
- if (otherComponents.length > 0) {
458
- logger.debug(`Initializing ${otherComponents.length} other components...`);
459
- for (const component of otherComponents) {
460
- logger.debug(`Initializing component: ${component.name}`);
461
- await component.init({
462
- name: component.name,
463
- version: component.version,
464
- enabled: true,
465
- env: this
466
- });
467
- logger.debug(`Component initialized: ${component.name}`);
468
- }
469
- }
470
- logger.debug(`All components initialized`);
471
- }
472
- async startComponents() {
473
- const allComponents = Array.from(this.components.values());
474
- if (allComponents.length > 0) {
475
- logger.debug(`Starting ${allComponents.length} components...`);
476
- for (const component of allComponents) {
477
- logger.debug(`Starting component: ${component.name} (current status: ${component.getStatus()})`);
478
- await component.start();
479
- logger.debug(`Component started: ${component.name}`);
480
- }
481
- }
482
- }
483
- async stopComponents() {
484
- const componentsToStop = Array.from(this.components.values()).filter((c) => c.getStatus() !== "stopped");
485
- if (componentsToStop.length > 0) {
486
- logger.debug(`Stopping ${componentsToStop.length} components...`);
487
- for (const component of componentsToStop) {
488
- logger.debug(`Stopping component: ${component.name}`);
489
- await component.stop();
490
- logger.debug(`Component stopped: ${component.name}`);
491
- }
492
- }
493
- }
494
- async onInit() {
495
- await this.initializeComponents();
496
- logger.info(`Environment "${this.name}" initialized`);
497
- }
498
- async onStart() {
499
- await this.startComponents();
500
- logger.info(`Environment "${this.name}" started`);
501
- }
502
- async onStop() {
503
- await this.stopComponents();
504
- this.eventHandlers.clear();
505
- this.wildcardHandlers.clear();
506
- logger.info(`Environment "${this.name}" stopped`);
507
- }
508
- async init() {
509
- Object.defineProperty(this, "env", {
510
- value: this,
511
- writable: true,
512
- enumerable: false,
513
- configurable: true
514
- });
515
- this.setStatus("initializing");
516
- await this.onInit();
517
- this.setStatus("running");
518
- }
519
- async start() {
520
- if (this._started)
521
- return;
522
- this._started = true;
523
- await this.onStart();
524
- this.setStatus("running");
525
- logger.info(`Environment "${this.name}" started`);
526
- }
527
- async stop() {
528
- this.setStatus("stopping");
529
- await this.onStop();
530
- this.setStatus("stopped");
531
- }
532
- async loadServiceConfig(configPath) {
533
- const configComponent = this.getComponent("config");
534
- if (!configComponent) {
535
- throw new Error("ConfigComponent not found. Please register ConfigComponent before loading service config.");
536
- }
537
- const xdgDataHome = configComponent.getXdgDataHome();
538
- const fullPath = path.resolve(xdgDataHome, configPath);
539
- if (!fsSync.existsSync(fullPath)) {
540
- throw new Error(`Service config file not found: ${fullPath}`);
541
- }
542
- const content = fsSync.readFileSync(fullPath, "utf-8");
543
- let config;
544
- try {
545
- config = JSON.parse(content);
546
- } catch (e) {
547
- throw new Error(`Failed to parse service config: ${e}`);
548
- }
549
- logger.debug(`Service config loaded from: ${fullPath}`);
550
- return config;
551
- }
552
- generateComponentOptions(componentName, configEntry) {
553
- const configComponent = this.getComponent("config");
554
- if (!configComponent) {
555
- throw new Error("ConfigComponent not found. Please register ConfigComponent before generating component options.");
556
- }
557
- const options = {
558
- configComponent,
559
- configPath: configEntry.configPath,
560
- envPrefix: configEntry.envPrefix,
561
- config: configEntry.config
562
- };
563
- logger.debug(`Generated options for component: ${componentName}`);
564
- return options;
565
- }
566
- async registerComponentWithConfig(component, configEntry) {
567
- if (!this.components.has(component.name)) {
568
- this.registerComponent(component);
569
- }
570
- const options = this.generateComponentOptions(component.name, configEntry);
571
- if (component.getStatus() === "running") {
572
- logger.debug(`Component ${component.name} already initialized, skipping`);
573
- return;
574
- }
575
- await component.init({
576
- name: component.name,
577
- version: component.version,
578
- enabled: configEntry.enabled ?? true,
579
- env: this,
580
- options
581
- });
582
- logger.debug(`Component ${component.name} registered and initialized with config`);
583
- }
584
- async initFromConfig(configPath) {
585
- if (!this.env) {
586
- Object.defineProperty(this, "env", {
587
- value: this,
588
- writable: true,
589
- enumerable: false,
590
- configurable: true
591
- });
592
- }
593
- const serviceConfig = await this.loadServiceConfig(configPath);
594
- if (serviceConfig.environment) {
595
- if (serviceConfig.environment.name) {
596
- this.name = serviceConfig.environment.name;
597
- }
598
- if (serviceConfig.environment.version) {
599
- this.version = serviceConfig.environment.version;
600
- }
601
- }
602
- const configComponent = this.getComponent("config");
603
- if (!configComponent) {
604
- throw new Error("ConfigComponent not found. Please register ConfigComponent before initFromConfig.");
605
- }
606
- if (configComponent.getStatus() === "created") {
607
- await configComponent.init({
608
- name: "config",
609
- version: configComponent.version,
610
- enabled: true,
611
- env: this
612
- });
613
- }
614
- const components = serviceConfig.components || {};
615
- for (const [componentName, configEntry] of Object.entries(components)) {
616
- if (configEntry.enabled === false) {
617
- logger.debug(`Component ${componentName} is disabled, skipping`);
618
- continue;
619
- }
620
- const component = this.getComponent(componentName);
621
- if (!component) {
622
- logger.warn(`Component ${componentName} not registered, skipping`);
623
- continue;
624
- }
625
- if (component.name === "config")
626
- continue;
627
- await this.registerComponentWithConfig(component, configEntry);
628
- }
629
- this.setStatus("running");
630
- logger.info(`Environment "${this.name}" initialized from config: ${configPath}`);
631
- }
632
- }
633
- __legacyDecorateClassTS([
634
- TracedAs("env.handle_query", {
635
- paramFilter: envQueryParamFilter,
636
- recordResult: false,
637
- logResult: true,
638
- log: true
639
- })
640
- ], BaseEnvironment.prototype, "handle_query", null);
641
- __legacyDecorateClassTS([
642
- TracedAs("env.handle_workflow_agent_query", {
643
- paramFilter: envQueryParamFilter,
644
- recordResult: false,
645
- logResult: true,
646
- log: true
647
- })
648
- ], BaseEnvironment.prototype, "handleWorkflowAgentQuery", null);
649
-
650
- // src/env/index.ts
651
- init_hook();
652
- init_context();
653
-
654
- export { generateId, generateDescendingId, BaseEnvironment };