@mappies/miniwat-agent 0.5.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -22,24 +22,51 @@ var index_exports = {};
22
22
  __export(index_exports, {
23
23
  Agent: () => Agent,
24
24
  AgentConfig: () => AgentConfig,
25
- Session: () => Session
25
+ DefaultPlanner: () => DefaultPlanner,
26
+ Plan: () => Plan,
27
+ Session: () => Session,
28
+ Task: () => Task
26
29
  });
27
30
  module.exports = __toCommonJS(index_exports);
28
31
 
29
32
  // src/entities/agent.ts
30
33
  var import_miniwat_agent_core = require("@mappies/miniwat-agent-core");
31
34
  var import_stream = require("stream");
35
+ var verbose = !!process.env.VERBOSE;
36
+ function log(...data) {
37
+ if (verbose) console.log(data);
38
+ }
32
39
  var Agent = class {
33
40
  constructor(config) {
34
41
  this.model = config.model;
35
42
  this.instruction = config.instruction;
36
43
  this.toolDispatcher = config.toolDispatcher;
44
+ this.planner = config.planner;
45
+ this.maxToolCalls = config.maxToolCalls;
37
46
  }
38
47
  async invoke(prompt, session, option) {
48
+ option = {
49
+ maxToolCalls: this.maxToolCalls,
50
+ ...option
51
+ };
52
+ return this.planner ? this.invokeWithPlanner(this.planner, prompt, session, option) : this.invokeDirect(prompt, session, option);
53
+ }
54
+ async stream(prompt, session, option) {
55
+ option = {
56
+ maxToolCalls: this.maxToolCalls,
57
+ ...option
58
+ };
59
+ return this.planner ? this.streamWithPlanner(this.planner, prompt, session, option) : this.streamDirect(prompt, session, option);
60
+ }
61
+ async invokeDirect(prompt, session, option) {
39
62
  if (!session.messages) {
40
63
  session.messages = [];
41
64
  }
42
- session.messages.push(new import_miniwat_agent_core.Message({ type: import_miniwat_agent_core.MessageType.User, content: prompt, createdTimestamp: (/* @__PURE__ */ new Date()).toISOString() }));
65
+ session.messages.push(new import_miniwat_agent_core.Message({
66
+ type: import_miniwat_agent_core.MessageType.User,
67
+ content: prompt,
68
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
69
+ }));
43
70
  const response = await this.model.invoke(session.messages, {
44
71
  ...option,
45
72
  instruction: this.instruction
@@ -50,7 +77,38 @@ var Agent = class {
50
77
  }
51
78
  return response;
52
79
  }
53
- async stream(prompt, session, option) {
80
+ async invokeWithPlanner(planner, prompt, session, option) {
81
+ const plan = await planner.createPlan(prompt, session.messages);
82
+ log(">>>", plan);
83
+ if (!session.messages) {
84
+ session.messages = [];
85
+ }
86
+ session.messages.push(new import_miniwat_agent_core.Message({
87
+ type: import_miniwat_agent_core.MessageType.User,
88
+ content: prompt,
89
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
90
+ }));
91
+ if (plan.directAnswer) {
92
+ const message = new import_miniwat_agent_core.Message({
93
+ type: import_miniwat_agent_core.MessageType.Agent,
94
+ content: plan.directAnswer.content,
95
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
96
+ });
97
+ session.messages.push(message);
98
+ return new import_miniwat_agent_core.ResponseMessage({
99
+ message,
100
+ stopReason: import_miniwat_agent_core.StopReason.END_TURN,
101
+ tokenUsage: plan.directAnswer.tokenUsage
102
+ });
103
+ }
104
+ const response = await this.executePlan(planner, plan, session, option);
105
+ session.messages.push(response.message);
106
+ if (option?.event?.onResponse) {
107
+ await option.event.onResponse(response.message);
108
+ }
109
+ return response;
110
+ }
111
+ async streamDirect(prompt, session, option) {
54
112
  if (!session.messages) {
55
113
  session.messages = [];
56
114
  }
@@ -107,6 +165,174 @@ var Agent = class {
107
165
  source.pipe(tee);
108
166
  return tee;
109
167
  }
168
+ async streamWithPlanner(planner, prompt, session, option) {
169
+ const plan = await planner.createPlan(prompt, session.messages);
170
+ log(">>>", plan);
171
+ if (!session.messages) {
172
+ session.messages = [];
173
+ }
174
+ session.messages.push(new import_miniwat_agent_core.Message({
175
+ type: import_miniwat_agent_core.MessageType.User,
176
+ content: prompt,
177
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
178
+ }));
179
+ if (plan.directAnswer) {
180
+ const textContent = plan.directAnswer.content;
181
+ const message = new import_miniwat_agent_core.Message({
182
+ type: import_miniwat_agent_core.MessageType.Agent,
183
+ content: textContent,
184
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
185
+ });
186
+ session.messages.push(message);
187
+ if (option?.event?.onResponse) {
188
+ await option.event.onResponse(message);
189
+ }
190
+ const resultDirectStream = new import_stream.Readable({
191
+ read() {
192
+ this.push(Buffer.from(textContent, "utf8"));
193
+ this.push(null);
194
+ }
195
+ });
196
+ resultDirectStream.promise = Promise.resolve();
197
+ return resultDirectStream;
198
+ }
199
+ const source = new import_stream.PassThrough();
200
+ (async () => {
201
+ try {
202
+ await this.executePlan(planner, plan, session, option, source);
203
+ source.end();
204
+ } catch (err) {
205
+ source.destroy(err);
206
+ }
207
+ })();
208
+ const tee = new import_stream.PassThrough();
209
+ const chunks = [];
210
+ let sourceEnded = false;
211
+ let resolveCompleted;
212
+ let rejectCompleted;
213
+ tee.promise = new Promise((resolve, reject) => {
214
+ resolveCompleted = resolve;
215
+ rejectCompleted = reject;
216
+ });
217
+ source.on("data", (chunk) => {
218
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
219
+ });
220
+ source.on("end", async () => {
221
+ sourceEnded = true;
222
+ (async () => {
223
+ const content = Buffer.concat(chunks).toString("utf8");
224
+ if (content.trim().length > 0) {
225
+ let responseMessage = new import_miniwat_agent_core.Message({
226
+ type: import_miniwat_agent_core.MessageType.Agent,
227
+ content,
228
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
229
+ });
230
+ session.messages?.push(responseMessage);
231
+ if (option?.event?.onResponse) {
232
+ await option.event.onResponse(responseMessage);
233
+ }
234
+ }
235
+ resolveCompleted();
236
+ })().catch(rejectCompleted);
237
+ });
238
+ source.on("error", (error) => {
239
+ rejectCompleted(error);
240
+ tee.destroy(error);
241
+ });
242
+ tee.on("close", () => {
243
+ if (!sourceEnded && !source.destroyed) {
244
+ const err = new Error("Stream closed before completion");
245
+ rejectCompleted(err);
246
+ source.destroy(err);
247
+ }
248
+ });
249
+ source.pipe(tee);
250
+ return tee;
251
+ }
252
+ async executePlan(planner, plan, session, option, outputStream) {
253
+ let activeTask = plan.getNextPendingTask();
254
+ if (option?.event?.onPlanUpdated) {
255
+ await option.event.onPlanUpdated(plan);
256
+ }
257
+ while (activeTask?.id) {
258
+ log(`[Planner] Processing Step ${activeTask.id}: ${activeTask.description}`);
259
+ plan.updateTaskStatus(activeTask.id, "running");
260
+ if (option?.event?.onPlanUpdated) {
261
+ await option.event.onPlanUpdated(plan);
262
+ }
263
+ const stepInstruction = plan.getInstruction(activeTask);
264
+ const conversationContext = (session.messages ?? []).slice(0, -1).map((message) => `${message.type}: ${message.content}`).join("\n\n");
265
+ const turnMessages = [
266
+ new import_miniwat_agent_core.Message({
267
+ type: import_miniwat_agent_core.MessageType.User,
268
+ content: `${conversationContext ? `CONVERSATION HISTORY
269
+ ${conversationContext}
270
+
271
+ ` : ""}${plan.getExecutionContext(activeTask.id)}`
272
+ })
273
+ ];
274
+ let turnResultText = "";
275
+ const isLastTask = !plan.tasks?.find((t) => t.id > activeTask.id);
276
+ if (isLastTask) {
277
+ const stepStream = await this.model.stream(turnMessages, {
278
+ ...option,
279
+ toolsEnabled: true,
280
+ instruction: { system: { value: stepInstruction } }
281
+ });
282
+ log("[Planner] Messages", turnMessages);
283
+ log("[Planner] SystemPrompt", stepInstruction);
284
+ for await (const chunk of stepStream) {
285
+ const textChunk = typeof chunk === "string" ? chunk : chunk.toString("utf8");
286
+ turnResultText += textChunk;
287
+ if (outputStream && !outputStream.destroyed) {
288
+ outputStream.write(textChunk);
289
+ }
290
+ }
291
+ } else {
292
+ const taskInvoke = await this.model.invoke(turnMessages, {
293
+ ...option,
294
+ toolsEnabled: true,
295
+ instruction: { system: { value: stepInstruction } }
296
+ });
297
+ turnResultText = taskInvoke.message.content || "";
298
+ log("[Planner] Messages", turnMessages);
299
+ log("[Planner] SystemPrompt", stepInstruction);
300
+ log("[Planner] Result", turnResultText);
301
+ }
302
+ plan.appendLogToTask(activeTask.id, turnResultText);
303
+ if (isLastTask) {
304
+ plan.updateTaskStatus(activeTask.id, "completed");
305
+ } else {
306
+ log(`[Reflection] Auditing output for Step ${activeTask.id}...`);
307
+ const isSuccessful = await planner.reflect(activeTask, turnResultText);
308
+ if (isSuccessful) {
309
+ plan.updateTaskStatus(activeTask.id, "completed");
310
+ log(`[Planner] Step ${activeTask.id} passed verification.`);
311
+ } else {
312
+ plan.updateTaskStatus(activeTask.id, "failed");
313
+ log(`[Planner] Step ${activeTask.id} failed verification. Re-planning...`);
314
+ await planner.replan(plan, activeTask, turnResultText);
315
+ }
316
+ }
317
+ if (option?.event?.onPlanUpdated) {
318
+ await option.event.onPlanUpdated(plan);
319
+ }
320
+ activeTask = plan.getNextPendingTask();
321
+ }
322
+ if (option?.event?.onPlanUpdated) {
323
+ await option.event.onPlanUpdated(plan);
324
+ }
325
+ const finalAgentMsg = new import_miniwat_agent_core.Message({
326
+ type: import_miniwat_agent_core.MessageType.Agent,
327
+ content: plan.getLastCompletedOutput(),
328
+ createdTimestamp: (/* @__PURE__ */ new Date()).toISOString()
329
+ });
330
+ return new import_miniwat_agent_core.ResponseMessage({
331
+ message: finalAgentMsg,
332
+ stopReason: import_miniwat_agent_core.StopReason.END_TURN,
333
+ tokenUsage: { totalTokens: 0, inputTokens: 0, outputTokens: 0 }
334
+ });
335
+ }
110
336
  };
111
337
 
112
338
  // src/entities/agentConfig.ts
@@ -115,6 +341,8 @@ var AgentConfig = class {
115
341
  this.instruction = data.instruction;
116
342
  this.model = data.model;
117
343
  this.toolDispatcher = data.toolDispatcher;
344
+ this.planner = data.planner;
345
+ this.maxToolCalls = data.maxToolCalls;
118
346
  }
119
347
  };
120
348
 
@@ -128,10 +356,259 @@ var Session = class {
128
356
  this.createdTimestamp = data?.createdTimestamp;
129
357
  }
130
358
  };
359
+
360
+ // src/entities/planners/task.ts
361
+ var Task = class {
362
+ constructor(task) {
363
+ this.id = task.id;
364
+ this.description = task.description;
365
+ this.status = task.status;
366
+ this.executionLogs = task.executionLogs;
367
+ }
368
+ };
369
+
370
+ // src/entities/planners/plan.ts
371
+ var Plan = class {
372
+ constructor(plan) {
373
+ this.id = plan?.id;
374
+ this.userGoal = plan?.userGoal;
375
+ this.tasks = plan?.tasks;
376
+ this.directAnswer = plan?.directAnswer;
377
+ this.createdAt = plan?.createdAt;
378
+ }
379
+ getInstruction(currentTask) {
380
+ return `You are working on one task which is a part of a structured plan.
381
+
382
+ Complete only the CURRENT TASK.
383
+ The current task is considered complete once you have gathered enough information to produce useful recommendations.
384
+ Do not attempt exhaustive research.
385
+ If the tool-use limit is reached, stop researching and complete the task using the information already gathered.
386
+ If additional information would only improve completeness rather than change the recommendation, stop researching and summarize what you have.
387
+ Treat completed task results as established context.
388
+ Do not repeat work already completed by previous tasks unless verification is necessary.
389
+ Use tools only for information required by the current task that is not already available.
390
+
391
+ CURRENT TASK:
392
+ ${currentTask.description ?? ""}
393
+ `;
394
+ }
395
+ getExecutionContext(currentTaskId) {
396
+ const taskDirectives = (this.tasks ?? []).map((t) => `Step ${t.id} [${t.status || "pending"}]: ${t.description}`).join("\n");
397
+ const completedTaskResults = (this.tasks ?? []).filter((t) => t.id !== currentTaskId && t.status === "completed" && (t.executionLogs?.length ?? 0) > 0).map((t) => `Step ${t.id}: ${t.description}
398
+ Result:
399
+ ${t.executionLogs[t.executionLogs.length - 1]}`).join("\n\n");
400
+ return `OVERALL GOAL
401
+ ${this.userGoal ?? ""}
402
+
403
+ PLAN
404
+ ${taskDirectives}
405
+
406
+ COMPLETED TASK RESULTS
407
+ ${completedTaskResults || "None."}`;
408
+ }
409
+ getLastCompletedOutput() {
410
+ if (!this.tasks) {
411
+ return "";
412
+ }
413
+ for (let i = this.tasks.length - 1; i >= 0; i--) {
414
+ const task = this.tasks[i];
415
+ if (task.status === "completed" && task.executionLogs?.length) {
416
+ return task.executionLogs[task.executionLogs.length - 1];
417
+ }
418
+ }
419
+ return "";
420
+ }
421
+ getNextPendingTask() {
422
+ if (!Array.isArray(this.tasks) || this.tasks.length === 0) {
423
+ return void 0;
424
+ }
425
+ return this.tasks.find((task) => task.status === "pending") || void 0;
426
+ }
427
+ updateTaskStatus(taskId, status) {
428
+ if (!Array.isArray(this.tasks)) {
429
+ throw new Error(`Could not update a task's status because tasks array is undefined.`);
430
+ }
431
+ const task = this.tasks.find((t) => t.id === taskId);
432
+ if (!task) {
433
+ throw new Error(`Could not update a task's status because the given task ID ${taskId} could not be found.`);
434
+ }
435
+ task.status = status;
436
+ }
437
+ appendLogToTask(taskId, log2) {
438
+ if (!Array.isArray(this.tasks)) {
439
+ throw new Error(`Could not update a task's status because tasks array is undefined.`);
440
+ }
441
+ const task = this.tasks.find((t) => t.id === taskId);
442
+ if (!task) {
443
+ throw new Error(`Could not update a task's status because the given task ID ${taskId} could not be found.`);
444
+ }
445
+ if (!task.executionLogs) {
446
+ task.executionLogs = [];
447
+ }
448
+ task.executionLogs.push(log2);
449
+ }
450
+ insertTask(afterStepId, description) {
451
+ if (Array.isArray(this.tasks) === false) {
452
+ throw new Error(`Could not inject a task because the tasks is undefined.`);
453
+ }
454
+ const targetIndex = this.tasks?.findIndex((s) => s.id === afterStepId);
455
+ if (targetIndex === -1) throw new Error(`Could not inject a task because the task '${afterStepId}' could not be found.`);
456
+ for (let i = targetIndex + 1; i < this.tasks.length; i++) {
457
+ const task = this.tasks[i];
458
+ if (task.id === void 0) {
459
+ throw new Error(`Could not inject a task because the tasks is undefined.`);
460
+ }
461
+ task.id += 1;
462
+ }
463
+ const newTask = new Task({
464
+ id: afterStepId + 1,
465
+ description,
466
+ status: "pending",
467
+ executionLogs: []
468
+ });
469
+ this.tasks.splice(targetIndex + 1, 0, newTask);
470
+ }
471
+ };
472
+
473
+ // src/entities/planners/defaultPlanner.ts
474
+ var import_miniwat_agent_core2 = require("@mappies/miniwat-agent-core");
475
+ var DefaultPlanner = class {
476
+ constructor(model) {
477
+ this.model = model;
478
+ }
479
+ async callLLM(systemPrompt, userPrompt) {
480
+ return this.model.invoke(
481
+ [
482
+ new import_miniwat_agent_core2.Message({ type: import_miniwat_agent_core2.MessageType.User, content: userPrompt })
483
+ ],
484
+ {
485
+ toolsEnabled: false,
486
+ instruction: {
487
+ system: { value: systemPrompt }
488
+ }
489
+ }
490
+ );
491
+ }
492
+ async createPlan(userGoal, conversationHistory) {
493
+ const systemPrompt = `Current time: ${(/* @__PURE__ */ new Date()).toISOString()}
494
+
495
+ You are a Routing and Planning Engine.
496
+ Analyze the input to decide if it requires multi-step tools/scripts, or if it can be directly answered.
497
+
498
+ Only give a direct answer when multi-step plan is not required.
499
+
500
+ If a plan is needed:
501
+
502
+ - Do not include directAnswer.
503
+ - Each task should represent a distinct, independently executable unit of work.
504
+ - Keep tightly coupled retrieval and processing together when they depend on the same data.
505
+ - When separating steps would require passing a large or structured dataset from one task to another, do not split them into separate tasks.
506
+ - If the user explicitly requests a single workflow or single task, create exactly one task unless doing so is impossible.
507
+
508
+ Output in JSON with the following structure:
509
+ {
510
+ "directAnswer": "String text if a direct answer can be made without a planning.",
511
+ "tasks": [
512
+ { "id": 1, "description": "What to do" }
513
+ ]
514
+ }`;
515
+ const conversationContext = (conversationHistory ?? []).map((message) => `${message.type}: ${message.content}`).join("\n\n");
516
+ const userPrompt = `${conversationContext ? `Conversation History:
517
+ ${conversationContext}
518
+
519
+ ` : ""}User Goal: "${userGoal}"`;
520
+ const rawResult = await this.callLLM(systemPrompt, userPrompt);
521
+ const content = rawResult.message.content.trim();
522
+ const cleanJson = content.replace(/```json|```/g, "").trim();
523
+ let parsed;
524
+ try {
525
+ parsed = JSON.parse(cleanJson);
526
+ if (parsed.tasks?.length) {
527
+ parsed.directAnswer = void 0;
528
+ }
529
+ } catch {
530
+ parsed = {
531
+ tasks: [],
532
+ directAnswer: content
533
+ };
534
+ }
535
+ const taskInstances = parsed.tasks?.map((t) => new Task({
536
+ id: t.id,
537
+ description: t.description,
538
+ status: "pending",
539
+ executionLogs: []
540
+ })) || [];
541
+ return new Plan({
542
+ id: crypto.randomUUID(),
543
+ userGoal,
544
+ directAnswer: parsed.directAnswer ? {
545
+ content: parsed.directAnswer,
546
+ tokenUsage: rawResult.tokenUsage
547
+ } : void 0,
548
+ tasks: taskInstances
549
+ });
550
+ }
551
+ /**
552
+ * PURE CRITIC INTERFACE
553
+ * Cross-references an execution string block against the target task expectations.
554
+ */
555
+ async reflect(task, executionOutput) {
556
+ const systemPrompt = `Current time: ${(/* @__PURE__ */ new Date()).toISOString()}
557
+
558
+ You are a Quality Assurance Auditor.
559
+ Your only job is to evaluate whether the task objective has been sufficiently completed for the overall plan to continue safely.
560
+
561
+ CRITERIA TO MEET:
562
+ Task Objective: ${task.description}
563
+
564
+ OUTPUT FORMAT:
565
+ If the task is sufficiently complete for the plan to continue, output exactly: YES
566
+ If the task is missing or incorrect in a way that prevents the plan from continuing safely, output: NO: <brief reason describing only the missing or incorrect part>
567
+ Do not include any other words or preamble.`;
568
+ const response = await this.callLLM(systemPrompt, `Actual Agent Execution Log Output:
569
+ ${executionOutput}`);
570
+ let result = response.message.content.trim().toUpperCase().startsWith("YES");
571
+ return result;
572
+ }
573
+ /**
574
+ * CONTEXTUAL WORKFLOW PATCHING
575
+ * Invokes an LLM strategy session to formulate an actionable patch, injecting it into the state array.
576
+ */
577
+ async replan(plan, failedTask, failureOutput) {
578
+ const systemPrompt = `Current time: ${(/* @__PURE__ */ new Date()).toISOString()}
579
+
580
+ You are a Master System Architect. A sub-task has failed verification.
581
+ Analyze the original goal and failure log to generate a single "Recovery Task" to resolve the issue.
582
+
583
+ OUTPUT FORMAT:
584
+ You must respond with a raw JSON object matching this exact structure:
585
+ {
586
+ "recoveryDescription": "What the agent needs to do from scratch to fix this explicit error state",
587
+ }`;
588
+ const userPrompt = `
589
+ Overall Goal: ${plan.userGoal}
590
+ Failed Step Description: ${failedTask.description}
591
+ Actual Failed Output Received: ${failureOutput}
592
+ `;
593
+ const response = await this.callLLM(systemPrompt, userPrompt);
594
+ const cleanJson = response.message.content.replace(/```json|```/g, "").trim();
595
+ const parsed = JSON.parse(cleanJson);
596
+ if (failedTask.id === void 0) {
597
+ throw new Error("[Planner] Cannot execute replan tracking because the target task ID is undefined.");
598
+ }
599
+ plan.insertTask(
600
+ failedTask.id,
601
+ parsed.recoveryDescription
602
+ );
603
+ }
604
+ };
131
605
  // Annotate the CommonJS export names for ESM import in node:
132
606
  0 && (module.exports = {
133
607
  Agent,
134
608
  AgentConfig,
135
- Session
609
+ DefaultPlanner,
610
+ Plan,
611
+ Session,
612
+ Task
136
613
  });
137
614
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/entities/agent.ts","../src/entities/agentConfig.ts","../src/entities/session.ts"],"sourcesContent":["export { Agent } from './entities/agent';\nexport { AgentConfig } from './entities/agentConfig';\nexport { Session } from './entities/session';","import { Model, ModelOption, ResponseMessage, Instruction, Message, MessageType } from \"@mappies/miniwat-agent-core\";\nimport { AgentConfig } from \"./agentConfig\";\nimport { ToolDispatcher } from \"@mappies/miniwat-mcp-core\";\nimport { PassThrough, Readable } from \"stream\";\nimport { Session } from \"./session\";\n\nexport class Agent\n{\n public readonly instruction?: Instruction\n public readonly model: Model;\n public readonly toolDispatcher?: ToolDispatcher;\n\n constructor(config: AgentConfig)\n {\n this.model = config.model;\n this.instruction = config.instruction;\n this.toolDispatcher = config.toolDispatcher;\n }\n\n async invoke(prompt: string, session: Session, option?: Omit<ModelOption, 'instruction'>): Promise<ResponseMessage>\n {\n if(!session.messages)\n {\n session.messages = [];\n }\n\n session.messages.push(new Message({type: MessageType.User, content: prompt, createdTimestamp: new Date().toISOString()}));\n\n const response = await this.model.invoke(session.messages, {\n ...option,\n instruction: this.instruction\n });\n\n session.messages.push(response.message);\n\n if(option?.event?.onResponse)\n {\n await option.event.onResponse(response.message);\n }\n\n return response;\n }\n\n async stream(prompt: string, session: Session, option?: Omit<ModelOption, \"instruction\">): Promise<Readable>\n {\n if(!session.messages)\n {\n session.messages = [];\n }\n\n session.messages.push(new Message({\n type: MessageType.User,\n content: prompt,\n createdTimestamp: new Date().toISOString()\n }));\n\n const source = await this.model.stream(session.messages, {\n ...option,\n instruction: this.instruction\n });\n\n const tee = new PassThrough();\n const chunks: Buffer[] = [];\n let sourceEnded = false;\n\n let resolveCompleted!: () => void;\n let rejectCompleted!: (reason?: any) => void;\n (tee as any).promise = new Promise<void>((resolve, reject) =>\n {\n resolveCompleted = resolve;\n rejectCompleted = reject;\n });\n\n source.on(\"data\", (chunk) =>\n {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n });\n\n source.on(\"end\", async () =>\n {\n sourceEnded = true;\n \n (async ()=>\n {\n const content = Buffer.concat(chunks).toString(\"utf8\");\n\n if (content.trim().length > 0)\n {\n let responseMessage = new Message({\n type: MessageType.Agent,\n content,\n createdTimestamp: new Date().toISOString()\n });\n\n session.messages?.push(responseMessage);\n\n if(option?.event?.onResponse)\n {\n await option.event.onResponse(responseMessage);\n }\n }\n\n resolveCompleted();\n })().catch(rejectCompleted);\n });\n\n source.on(\"error\", (error) =>\n {\n rejectCompleted(error);\n tee.destroy(error);\n });\n\n tee.on(\"close\", () =>\n {\n if (!sourceEnded && !source.destroyed)\n {\n const err = new Error(\"Stream closed before completion\");\n rejectCompleted(err)\n source.destroy(err);\n }\n });\n\n source.pipe(tee);\n\n return tee;\n }\n}","import { Model, Instruction } from \"@mappies/miniwat-agent-core\";\nimport { ToolDispatcher } from \"@mappies/miniwat-mcp-core\";\n\nexport class AgentConfig \n{\n /**\n * Agent instruction\n */\n instruction?: Instruction;\n\n /**\n * The language model used by this agent.\n */\n model: Model;\n\n /**\n * Tool dispatcher for tools.\n */\n toolDispatcher?: ToolDispatcher;\n\n constructor(data:AgentConfig)\n {\n this.instruction = data.instruction;\n this.model = data.model;\n this.toolDispatcher = data.toolDispatcher;\n }\n}","import { Message } from \"@mappies/miniwat-agent-core\";\nimport { randomUUID } from \"crypto\";\n\nexport class Session\n{\n public id: string;\n public name?:string;\n public messages?: Message[];\n public createdTimestamp?: string;\n\n constructor(data?:Partial<Session>)\n {\n this.id = data?.id || randomUUID();\n this.name = data?.name;\n this.messages = data?.messages;\n this.createdTimestamp = data?.createdTimestamp;\n }\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/entities/agent.ts","../src/entities/agentConfig.ts","../src/entities/session.ts","../src/entities/planners/task.ts","../src/entities/planners/plan.ts","../src/entities/planners/defaultPlanner.ts"],"sourcesContent":["export { Agent } from './entities/agent';\nexport { AgentConfig } from './entities/agentConfig';\nexport { Session } from './entities/session';\nexport { Plan } from './entities/planners/plan';\nexport { DefaultPlanner } from './entities/planners/defaultPlanner';\nexport { Task } from './entities/planners/task';\nexport { TaskStatus } from './interfaces/taskStatus';\nexport { IPlanner } from './interfaces/iPlanner';","import { Model, ResponseMessage, Instruction, Message, MessageType, StopReason } from \"@mappies/miniwat-agent-core\";\nimport { AgentConfig } from \"./agentConfig\";\nimport { ToolDispatcher } from \"@mappies/miniwat-mcp-core\";\nimport { PassThrough, Readable } from \"stream\";\nimport { Session } from \"./session\";\nimport { IPlanner } from \"../interfaces/iPlanner\";\nimport { Plan } from \"./planners/plan\";\nimport { AgentOption } from \"./agentOption\";\n\nlet verbose = !!process.env.VERBOSE;\n\nfunction log(...data:any[])\n{\n if(verbose) console.log(data);\n}\n\nexport class Agent\n{\n public readonly instruction?: Instruction\n public readonly model: Model;\n public readonly toolDispatcher?: ToolDispatcher;\n public readonly planner?: IPlanner;\n public readonly maxToolCalls?: number;\n\n constructor(config: AgentConfig)\n {\n this.model = config.model;\n this.instruction = config.instruction;\n this.toolDispatcher = config.toolDispatcher;\n this.planner = config.planner;\n this.maxToolCalls = config.maxToolCalls;\n }\n\n async invoke(prompt: string, session: Session, option?: Omit<AgentOption, 'instruction'>): Promise<ResponseMessage>\n {\n option = {\n maxToolCalls: this.maxToolCalls,\n ...option\n };\n \n return this.planner ? this.invokeWithPlanner(this.planner, prompt, session, option)\n : this.invokeDirect(prompt, session, option);\n }\n\n\n async stream(prompt: string, session: Session, option?: Omit<AgentOption, \"instruction\">): Promise<Readable>\n {\n option = {\n maxToolCalls: this.maxToolCalls,\n ...option\n };\n \n return this.planner ? this.streamWithPlanner(this.planner, prompt, session, option)\n : this.streamDirect(prompt, session, option);\n }\n\n private async invokeDirect(prompt: string, session: Session, option?: Omit<AgentOption, 'instruction'>): Promise<ResponseMessage>\n {\n if(!session.messages)\n {\n session.messages = [];\n }\n\n session.messages.push(new Message({\n type: MessageType.User, \n content: prompt, \n createdTimestamp: new Date().toISOString()\n }));\n\n const response = await this.model.invoke(session.messages, {\n ...option,\n instruction: this.instruction\n });\n\n session.messages.push(response.message);\n\n if(option?.event?.onResponse)\n {\n await option.event.onResponse(response.message);\n }\n\n return response;\n }\n\n private async invokeWithPlanner(planner: IPlanner, prompt: string, session: Session, option?: Omit<AgentOption, 'instruction'>): Promise<ResponseMessage>\n {\n const plan = await planner.createPlan(prompt, session.messages);\n\n log(\">>>\", plan)\n\n if(!session.messages)\n {\n session.messages = [];\n }\n\n session.messages.push(new Message({\n type: MessageType.User, \n content: prompt, \n createdTimestamp: new Date().toISOString()\n }));\n\n if(plan.directAnswer)\n {\n const message = new Message({\n type: MessageType.Agent, \n content: plan.directAnswer.content,\n createdTimestamp: new Date().toISOString()\n });\n\n session.messages.push(message);\n\n return new ResponseMessage({\n message,\n stopReason: StopReason.END_TURN,\n tokenUsage: plan.directAnswer.tokenUsage \n })\n }\n\n // No direct answer. Execute plan.\n const response = await this.executePlan(planner, plan, session, option);\n\n session.messages.push(response.message);\n\n if(option?.event?.onResponse)\n {\n await option.event.onResponse(response.message);\n }\n\n return response;\n }\n\n private async streamDirect(prompt: string, session: Session, option?: Omit<AgentOption, \"instruction\">): Promise<Readable>\n {\n if(!session.messages)\n {\n session.messages = [];\n }\n\n session.messages.push(new Message({\n type: MessageType.User,\n content: prompt,\n createdTimestamp: new Date().toISOString()\n }));\n\n const source = await this.model.stream(session.messages, {\n ...option,\n instruction: this.instruction\n });\n\n const tee = new PassThrough();\n const chunks: Buffer[] = [];\n let sourceEnded = false;\n\n let resolveCompleted!: () => void;\n let rejectCompleted!: (reason?: any) => void;\n (tee as any).promise = new Promise<void>((resolve, reject) =>\n {\n resolveCompleted = resolve;\n rejectCompleted = reject;\n });\n\n source.on(\"data\", (chunk) =>\n {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n });\n\n source.on(\"end\", async () =>\n {\n sourceEnded = true;\n\n (async ()=>\n {\n const content = Buffer.concat(chunks).toString(\"utf8\");\n\n if (content.trim().length > 0)\n {\n let responseMessage = new Message({\n type: MessageType.Agent,\n content,\n createdTimestamp: new Date().toISOString()\n });\n\n session.messages?.push(responseMessage);\n\n if(option?.event?.onResponse)\n {\n await option.event.onResponse(responseMessage);\n }\n }\n\n resolveCompleted();\n })().catch(rejectCompleted);\n });\n\n source.on(\"error\", (error) =>\n {\n rejectCompleted(error);\n tee.destroy(error);\n });\n\n tee.on(\"close\", () =>\n {\n if (!sourceEnded && !source.destroyed)\n {\n const err = new Error(\"Stream closed before completion\");\n rejectCompleted(err)\n source.destroy(err);\n }\n });\n\n source.pipe(tee);\n\n return tee;\n }\n\n private async streamWithPlanner(planner: IPlanner, prompt: string, session: Session, option?: Omit<AgentOption, \"instruction\">): Promise<Readable>\n {\n const plan = await planner.createPlan(prompt, session.messages);\n\n log(\">>>\", plan)\n\n if(!session.messages)\n {\n session.messages = [];\n }\n\n session.messages.push(new Message({\n type: MessageType.User,\n content: prompt,\n createdTimestamp: new Date().toISOString()\n }));\n\n if (plan.directAnswer)\n {\n const textContent = plan.directAnswer.content;\n\n const message = new Message({\n type: MessageType.Agent,\n content: textContent,\n createdTimestamp: new Date().toISOString()\n });\n\n session.messages.push(message);\n\n if (option?.event?.onResponse)\n {\n await option.event!.onResponse!(message);\n }\n\n const resultDirectStream = new Readable({\n read() {\n this.push(Buffer.from(textContent, \"utf8\"));\n this.push(null); // Signifies the end of stream.\n }\n });\n\n (resultDirectStream as any).promise = Promise.resolve();\n return resultDirectStream;\n }\n\n // No direct answer. Execute plan.\n const source = new PassThrough();\n\n // Execute the multi-turn loop in the background, piping chunks directly into 'source'\n (async () => {\n try \n {\n await this.executePlan(planner, plan, session, option, source);\n\n source.end(); // Safely close the source once all tasks are complete\n } \n catch (err: any) {\n source.destroy(err);\n }\n })();\n\n\n const tee = new PassThrough();\n const chunks: Buffer[] = [];\n let sourceEnded = false;\n\n let resolveCompleted!: () => void;\n let rejectCompleted!: (reason?: any) => void;\n (tee as any).promise = new Promise<void>((resolve, reject) =>\n {\n resolveCompleted = resolve;\n rejectCompleted = reject;\n });\n\n source.on(\"data\", (chunk) =>\n {\n // Keep the internal buffer aggregator for session memory reconstruction intact\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));\n\n // Push the raw text token right through the pass-through stream pipeline!\n // tee.write(chunk);\n });\n\n source.on(\"end\", async () =>\n {\n sourceEnded = true;\n\n (async ()=>\n {\n const content = Buffer.concat(chunks).toString(\"utf8\");\n\n if (content.trim().length > 0)\n {\n let responseMessage = new Message({\n type: MessageType.Agent,\n content,\n createdTimestamp: new Date().toISOString()\n });\n\n session.messages?.push(responseMessage);\n\n if(option?.event?.onResponse)\n {\n await option.event.onResponse(responseMessage);\n }\n }\n\n resolveCompleted();\n })().catch(rejectCompleted);\n });\n\n source.on(\"error\", (error) =>\n {\n rejectCompleted(error);\n tee.destroy(error);\n });\n\n tee.on(\"close\", () =>\n {\n if (!sourceEnded && !source.destroyed)\n {\n const err = new Error(\"Stream closed before completion\");\n rejectCompleted(err)\n source.destroy(err);\n }\n });\n\n source.pipe(tee);\n\n return tee;\n }\n\n private async executePlan(planner: IPlanner, plan: Plan, session: Session, option?: Omit<AgentOption, 'instruction'>, outputStream?: PassThrough): Promise<ResponseMessage> \n {\n let activeTask = plan.getNextPendingTask();\n\n // Inform UI layer of initial plan setup state\n if(option?.event?.onPlanUpdated)\n {\n await option.event.onPlanUpdated(plan);\n }\n\n while (activeTask?.id) \n {\n log(`[Planner] Processing Step ${activeTask.id}: ${activeTask.description}`);\n plan.updateTaskStatus(activeTask.id, 'running');\n\n if(option?.event?.onPlanUpdated)\n {\n await option.event.onPlanUpdated(plan);\n }\n\n // 1. Build a highly focused system instruction ONLY for this active sub-task\n const stepInstruction = plan.getInstruction(activeTask);\n\n // Prepare a localized execution context for this plan only.\n const conversationContext = (session.messages ?? [])\n .slice(0, -1)\n .map(message => `${message.type}: ${message.content}`)\n .join('\\n\\n');\n\n const turnMessages = [\n new Message({ \n type: MessageType.User, \n content: `${conversationContext ? `CONVERSATION HISTORY\\n${conversationContext}\\n\\n` : ''}${plan.getExecutionContext(activeTask.id)}`\n })\n ];\n\n let turnResultText = \"\";\n\n // 2. Fork Execution based on whether we are invoking or streaming to the user\n\n // Check if this active task is the last remaining pending task in the plan\n const isLastTask = !plan.tasks?.find(t => t.id! > activeTask!.id!);\n\n if (isLastTask) \n {\n // STREAM MODE: Stream tokens directly to the user for the final step\n const stepStream = await this.model.stream(turnMessages, {\n ...option,\n toolsEnabled: true,\n instruction: { system: { value: stepInstruction } }\n });\n\n log(\"[Planner] Messages\", turnMessages)\n log(\"[Planner] SystemPrompt\", stepInstruction)\n\n for await (const chunk of stepStream) {\n const textChunk = typeof chunk === 'string' ? chunk : chunk.toString('utf8');\n turnResultText += textChunk;\n\n if (outputStream && !outputStream.destroyed) {\n outputStream.write(textChunk);\n }\n }\n } \n else\n {\n // BLOCK MODE: Silently invoke intermediate tasks without streaming to outputStream\n const taskInvoke = await this.model.invoke(turnMessages, {\n ...option,\n toolsEnabled: true,\n instruction: { system: { value: stepInstruction } }\n });\n turnResultText = taskInvoke.message.content || \"\";\n\n log(\"[Planner] Messages\", turnMessages)\n log(\"[Planner] SystemPrompt\", stepInstruction)\n log(\"[Planner] Result\", turnResultText)\n }\n\n plan.appendLogToTask(activeTask.id, turnResultText);\n\n // 3. REFLECTION PHASE: Evaluate intermediate task output before continuing.\n if (isLastTask)\n {\n plan.updateTaskStatus(activeTask.id, 'completed');\n }\n else\n {\n log(`[Reflection] Auditing output for Step ${activeTask.id}...`);\n const isSuccessful = await planner.reflect(activeTask, turnResultText);\n\n if (isSuccessful) {\n // Success path\n plan.updateTaskStatus(activeTask.id, 'completed');\n log(`[Planner] Step ${activeTask.id} passed verification.`);\n } else {\n // Failure path -> Trigger active Re-planning injection\n plan.updateTaskStatus(activeTask.id, 'failed');\n log(`[Planner] Step ${activeTask.id} failed verification. Re-planning...`);\n\n // Injects a correction step right into your Plan.tasks array natively\n await planner.replan(plan, activeTask, turnResultText);\n }\n }\n\n if(option?.event?.onPlanUpdated)\n {\n await option.event.onPlanUpdated(plan);\n }\n\n // Fetch the next task (could be a newly injected recovery task!)\n activeTask = plan.getNextPendingTask();\n }\n\n // Push final unified framework snapshot update out to listeners\n if (option?.event?.onPlanUpdated) \n {\n await option.event.onPlanUpdated(plan);\n }\n\n // Fix type mismatch by converting final output string string into structured ResponseMessage\n const finalAgentMsg = new Message({\n type: MessageType.Agent,\n content: plan.getLastCompletedOutput(),\n createdTimestamp: new Date().toISOString()\n });\n\n return new ResponseMessage({\n message: finalAgentMsg,\n stopReason: StopReason.END_TURN,\n tokenUsage: {totalTokens: 0, inputTokens: 0, outputTokens: 0}\n });\n }\n}","import { Model, Instruction } from \"@mappies/miniwat-agent-core\";\nimport { ToolDispatcher } from \"@mappies/miniwat-mcp-core\";\nimport { IPlanner } from \"../interfaces/iPlanner\";\n\nexport class AgentConfig \n{\n /**\n * Agent instruction\n */\n instruction?: Instruction;\n\n /**\n * The language model used by this agent.\n */\n model: Model;\n\n /**\n * Tool dispatcher for tools.\n */\n toolDispatcher?: ToolDispatcher;\n\n /**\n * Optional planner.\n *\n * When omitted, the agent executes prompts directly using the configured model.\n * When provided, the planner determines whether to return a direct answer or\n * execute a multi-step plan.\n */\n planner?: IPlanner;\n\n /**\n * Maximum number of tool calls allowed per model execution.\n */\n maxToolCalls?: number;\n\n constructor(data:AgentConfig)\n {\n this.instruction = data.instruction;\n this.model = data.model;\n this.toolDispatcher = data.toolDispatcher;\n this.planner = data.planner;\n this.maxToolCalls = data.maxToolCalls;\n }\n}","import { Message } from \"@mappies/miniwat-agent-core\";\nimport { randomUUID } from \"crypto\";\n\nexport class Session\n{\n public id: string;\n public name?:string;\n public messages?: Message[];\n public createdTimestamp?: string;\n\n constructor(data?:Partial<Session>)\n {\n this.id = data?.id || randomUUID();\n this.name = data?.name;\n this.messages = data?.messages;\n this.createdTimestamp = data?.createdTimestamp;\n }\n}","import { TaskStatus } from \"../../interfaces/taskStatus\";\n\nexport class Task\n{\n id?: number;\n description?: string;\n status?: TaskStatus;\n executionLogs?: string[]; \n\n constructor(task:Partial<Task>)\n {\n this.id = task.id;\n this.description = task.description;\n this.status = task.status;\n this.executionLogs = task.executionLogs;\n }\n}","import { TokenUsage } from \"@mappies/miniwat-agent-core\";\nimport { Task } from \"./task\";\nimport { TaskStatus } from \"../../interfaces/taskStatus\";\n\nexport class Plan\n{\n id?:string;\n userGoal?: string;\n tasks?: Task[];\n directAnswer?: { content: string, tokenUsage: TokenUsage }\n createdAt?: string;\n\n constructor(plan?:Partial<Plan>)\n {\n this.id = plan?.id;\n this.userGoal = plan?.userGoal;\n this.tasks = plan?.tasks;\n this.directAnswer = plan?.directAnswer;\n this.createdAt = plan?.createdAt;\n }\n\n public getInstruction(currentTask: Task): string\n {\n return `You are working on one task which is a part of a structured plan.\n\nComplete only the CURRENT TASK.\nThe current task is considered complete once you have gathered enough information to produce useful recommendations.\nDo not attempt exhaustive research.\nIf the tool-use limit is reached, stop researching and complete the task using the information already gathered.\nIf additional information would only improve completeness rather than change the recommendation, stop researching and summarize what you have.\nTreat completed task results as established context.\nDo not repeat work already completed by previous tasks unless verification is necessary.\nUse tools only for information required by the current task that is not already available.\n\nCURRENT TASK:\n${currentTask.description ?? ''}\n`;\n }\n\n public getExecutionContext(currentTaskId: number): string\n {\n const taskDirectives = (this.tasks ?? [])\n .map(t => `Step ${t.id} [${t.status || 'pending'}]: ${t.description}`)\n .join('\\n');\n\n const completedTaskResults = (this.tasks ?? [])\n .filter(t => t.id !== currentTaskId && t.status === 'completed' && (t.executionLogs?.length ?? 0) > 0)\n .map(t => `Step ${t.id}: ${t.description}\\nResult:\\n${t.executionLogs![t.executionLogs!.length - 1]}`)\n .join('\\n\\n');\n\n return `OVERALL GOAL\n${this.userGoal ?? ''}\n\nPLAN\n${taskDirectives}\n\nCOMPLETED TASK RESULTS\n${completedTaskResults || 'None.'}`;\n }\n\n public getLastCompletedOutput(): string\n {\n if(!this.tasks)\n {\n return '';\n }\n\n for(let i = this.tasks.length - 1; i >= 0; i--)\n {\n const task = this.tasks[i];\n if(task.status === 'completed' && task.executionLogs?.length)\n {\n return task.executionLogs[task.executionLogs.length - 1];\n }\n }\n\n return '';\n }\n\n public getNextPendingTask(): Task | undefined \n {\n if (!Array.isArray(this.tasks) || this.tasks.length === 0) {\n return undefined;\n }\n return this.tasks.find(task => task.status === 'pending') || undefined;\n }\n\n public updateTaskStatus(taskId: number, status: TaskStatus): void \n {\n if (!Array.isArray(this.tasks)) \n {\n throw new Error(`Could not update a task's status because tasks array is undefined.`);\n }\n\n const task = this.tasks.find(t => t.id === taskId);\n\n if (!task) \n {\n throw new Error(`Could not update a task's status because the given task ID ${taskId} could not be found.`);\n }\n\n task.status = status;\n }\n\n public appendLogToTask(taskId: number, log: string): void \n {\n if (!Array.isArray(this.tasks)) \n {\n throw new Error(`Could not update a task's status because tasks array is undefined.`);\n }\n\n const task = this.tasks.find(t => t.id === taskId);\n\n if (!task) \n {\n throw new Error(`Could not update a task's status because the given task ID ${taskId} could not be found.`);\n }\n\n if (!task.executionLogs) \n {\n task.executionLogs = [];\n }\n \n task.executionLogs.push(log);\n }\n\n public insertTask(afterStepId: number, description: string): void \n {\n if(Array.isArray(this.tasks) === false)\n {\n throw new Error(`Could not inject a task because the tasks is undefined.`)\n }\n const targetIndex = this.tasks?.findIndex(s => s.id === afterStepId);\n if (targetIndex === -1) throw new Error(`Could not inject a task because the task '${afterStepId}' could not be found.`);\n\n // Shift IDs of all subsequent steps to make room\n for (let i = targetIndex + 1; i < this.tasks.length; i++) \n {\n const task = this.tasks[i];\n\n if(task.id === undefined)\n {\n throw new Error(`Could not inject a task because the tasks is undefined.`)\n }\n\n task.id += 1;\n }\n\n // Insert a new task\n const newTask = new Task({\n id: afterStepId + 1,\n description,\n status: 'pending',\n executionLogs: []\n });\n\n this.tasks.splice(targetIndex + 1, 0, newTask);\n }\n}","import { Message, MessageType, Model, ResponseMessage } from \"@mappies/miniwat-agent-core\";\nimport { Plan } from \"./plan\";\nimport { Task } from \"./task\";\n\ninterface RawLlmPlanResponse {\n directAnswer?: string;\n tasks?: Array<{ id: number; description: string; }>;\n}\n\ninterface RawLlmReplanResponse {\n recoveryDescription: string;\n}\n\nexport class DefaultPlanner \n{\n constructor(private model: Model) {}\n\n private async callLLM(systemPrompt: string, userPrompt: string): Promise<ResponseMessage>\n {\n return this.model.invoke(\n [\n new Message({type: MessageType.User, content: userPrompt })\n ],\n {\n toolsEnabled: false,\n instruction: {\n system: { value: systemPrompt }\n }\n }\n );\n }\n\n public async createPlan(userGoal: string, conversationHistory?: Message[]): Promise<Plan> \n {\n const systemPrompt = `Current time: ${new Date().toISOString()}\\n\\nYou are a Routing and Planning Engine. \nAnalyze the input to decide if it requires multi-step tools/scripts, or if it can be directly answered. \n\nOnly give a direct answer when multi-step plan is not required.\n\nIf a plan is needed:\n\n- Do not include directAnswer.\n- Each task should represent a distinct, independently executable unit of work.\n- Keep tightly coupled retrieval and processing together when they depend on the same data.\n- When separating steps would require passing a large or structured dataset from one task to another, do not split them into separate tasks.\n- If the user explicitly requests a single workflow or single task, create exactly one task unless doing so is impossible.\n\nOutput in JSON with the following structure:\n{\n \"directAnswer\": \"String text if a direct answer can be made without a planning.\",\n \"tasks\": [\n { \"id\": 1, \"description\": \"What to do\" }\n ]\n}`;\n\n const conversationContext = (conversationHistory ?? [])\n .map(message => `${message.type}: ${message.content}`)\n .join('\\n\\n');\n\n const userPrompt = `${conversationContext ? `Conversation History:\\n${conversationContext}\\n\\n` : ''}User Goal: \"${userGoal}\"`;\n const rawResult = await this.callLLM(systemPrompt, userPrompt);\n const content = rawResult.message.content.trim();\n const cleanJson = content.replace(/```json|```/g, '').trim();\n\n let parsed: RawLlmPlanResponse;\n\n try\n {\n parsed = JSON.parse(cleanJson);\n\n if(parsed.tasks?.length)\n {\n parsed.directAnswer = undefined;\n }\n }\n catch\n {\n parsed = {\n tasks: [],\n directAnswer: content\n };\n }\n\n const taskInstances = parsed.tasks?.map(t => new Task({\n id: t.id,\n description: t.description,\n status: 'pending',\n executionLogs: []\n })) || [];\n\n return new Plan({\n id: crypto.randomUUID(),\n userGoal,\n directAnswer: parsed.directAnswer ? { \n content: parsed.directAnswer, \n tokenUsage: rawResult.tokenUsage\n } \n : undefined,\n tasks: taskInstances\n });\n }\n\n /**\n * PURE CRITIC INTERFACE\n * Cross-references an execution string block against the target task expectations.\n */\n public async reflect(task: Task, executionOutput: string): Promise<boolean>\n {\n const systemPrompt = `Current time: ${new Date().toISOString()}\\n\\nYou are a Quality Assurance Auditor.\nYour only job is to evaluate whether the task objective has been sufficiently completed for the overall plan to continue safely.\n\nCRITERIA TO MEET:\nTask Objective: ${task.description}\n\nOUTPUT FORMAT:\nIf the task is sufficiently complete for the plan to continue, output exactly: YES\nIf the task is missing or incorrect in a way that prevents the plan from continuing safely, output: NO: <brief reason describing only the missing or incorrect part>\nDo not include any other words or preamble.`;\n\n const response = await this.callLLM(systemPrompt, `Actual Agent Execution Log Output:\\n${executionOutput}`);\n \n // Clean text parsing to verify exact truth evaluations\n let result = response.message.content.trim().toUpperCase().startsWith(\"YES\");\n\n return result;\n }\n\n /**\n * CONTEXTUAL WORKFLOW PATCHING\n * Invokes an LLM strategy session to formulate an actionable patch, injecting it into the state array.\n */\n public async replan(plan: Plan, failedTask: Task, failureOutput: string): Promise<void>\n {\n const systemPrompt = `Current time: ${new Date().toISOString()}\\n\\nYou are a Master System Architect. A sub-task has failed verification.\nAnalyze the original goal and failure log to generate a single \"Recovery Task\" to resolve the issue.\n\nOUTPUT FORMAT:\nYou must respond with a raw JSON object matching this exact structure:\n{\n \"recoveryDescription\": \"What the agent needs to do from scratch to fix this explicit error state\",\n}`;\n\n const userPrompt = `\nOverall Goal: ${plan.userGoal}\nFailed Step Description: ${failedTask.description}\nActual Failed Output Received: ${failureOutput}\n`;\n\n const response = await this.callLLM(systemPrompt, userPrompt);\n const cleanJson = response.message.content.replace(/```json|```/g, '').trim();\n const parsed: RawLlmReplanResponse = JSON.parse(cleanJson);\n\n if (failedTask.id === undefined)\n {\n throw new Error(\"[Planner] Cannot execute replan tracking because the target task ID is undefined.\");\n }\n\n // Execute dynamic mutation right inside your Plan model entity!\n plan.insertTask(\n failedTask.id, \n parsed.recoveryDescription, \n );\n }\n}"],"mappings":"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","names":["log","import_miniwat_agent_core"]}