@flomatai/core 0.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 (127) hide show
  1. package/dist/agent.d.ts +92 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +137 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/cli-utils.d.ts +41 -0
  6. package/dist/cli-utils.d.ts.map +1 -0
  7. package/dist/cli-utils.js +64 -0
  8. package/dist/cli-utils.js.map +1 -0
  9. package/dist/errors.d.ts +52 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +105 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/index.d.ts +29 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +35 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/llm-provider.d.ts +29 -0
  18. package/dist/llm-provider.d.ts.map +1 -0
  19. package/dist/llm-provider.js +44 -0
  20. package/dist/llm-provider.js.map +1 -0
  21. package/dist/logger.d.ts +32 -0
  22. package/dist/logger.d.ts.map +1 -0
  23. package/dist/logger.js +75 -0
  24. package/dist/logger.js.map +1 -0
  25. package/dist/mock-llm.d.ts +70 -0
  26. package/dist/mock-llm.d.ts.map +1 -0
  27. package/dist/mock-llm.js +385 -0
  28. package/dist/mock-llm.js.map +1 -0
  29. package/dist/orchestrator-helpers.d.ts +20 -0
  30. package/dist/orchestrator-helpers.d.ts.map +1 -0
  31. package/dist/orchestrator-helpers.js +38 -0
  32. package/dist/orchestrator-helpers.js.map +1 -0
  33. package/dist/orchestrator.d.ts +124 -0
  34. package/dist/orchestrator.d.ts.map +1 -0
  35. package/dist/orchestrator.js +349 -0
  36. package/dist/orchestrator.js.map +1 -0
  37. package/dist/pipeline-registry.d.ts +120 -0
  38. package/dist/pipeline-registry.d.ts.map +1 -0
  39. package/dist/pipeline-registry.js +171 -0
  40. package/dist/pipeline-registry.js.map +1 -0
  41. package/dist/pipeline.d.ts +122 -0
  42. package/dist/pipeline.d.ts.map +1 -0
  43. package/dist/pipeline.js +152 -0
  44. package/dist/pipeline.js.map +1 -0
  45. package/dist/skill.d.ts +112 -0
  46. package/dist/skill.d.ts.map +1 -0
  47. package/dist/skill.js +12 -0
  48. package/dist/skill.js.map +1 -0
  49. package/dist/skills/io-skill.d.ts +49 -0
  50. package/dist/skills/io-skill.d.ts.map +1 -0
  51. package/dist/skills/io-skill.js +103 -0
  52. package/dist/skills/io-skill.js.map +1 -0
  53. package/dist/skills/llm-skill.d.ts +64 -0
  54. package/dist/skills/llm-skill.d.ts.map +1 -0
  55. package/dist/skills/llm-skill.js +112 -0
  56. package/dist/skills/llm-skill.js.map +1 -0
  57. package/dist/skills/transform-skill.d.ts +27 -0
  58. package/dist/skills/transform-skill.d.ts.map +1 -0
  59. package/dist/skills/transform-skill.js +32 -0
  60. package/dist/skills/transform-skill.js.map +1 -0
  61. package/dist/state/file-store.d.ts +25 -0
  62. package/dist/state/file-store.d.ts.map +1 -0
  63. package/dist/state/file-store.js +92 -0
  64. package/dist/state/file-store.js.map +1 -0
  65. package/dist/state/memory-store.d.ts +24 -0
  66. package/dist/state/memory-store.d.ts.map +1 -0
  67. package/dist/state/memory-store.js +65 -0
  68. package/dist/state/memory-store.js.map +1 -0
  69. package/dist/state/types.d.ts +40 -0
  70. package/dist/state/types.d.ts.map +1 -0
  71. package/dist/state/types.js +8 -0
  72. package/dist/state/types.js.map +1 -0
  73. package/dist/strategies/custom.d.ts +12 -0
  74. package/dist/strategies/custom.d.ts.map +1 -0
  75. package/dist/strategies/custom.js +14 -0
  76. package/dist/strategies/custom.js.map +1 -0
  77. package/dist/strategies/plan-and-execute.d.ts +27 -0
  78. package/dist/strategies/plan-and-execute.d.ts.map +1 -0
  79. package/dist/strategies/plan-and-execute.js +195 -0
  80. package/dist/strategies/plan-and-execute.js.map +1 -0
  81. package/dist/strategies/react.d.ts +27 -0
  82. package/dist/strategies/react.d.ts.map +1 -0
  83. package/dist/strategies/react.js +172 -0
  84. package/dist/strategies/react.js.map +1 -0
  85. package/dist/strategies/router.d.ts +11 -0
  86. package/dist/strategies/router.d.ts.map +1 -0
  87. package/dist/strategies/router.js +70 -0
  88. package/dist/strategies/router.js.map +1 -0
  89. package/dist/strategies/sequential.d.ts +12 -0
  90. package/dist/strategies/sequential.d.ts.map +1 -0
  91. package/dist/strategies/sequential.js +39 -0
  92. package/dist/strategies/sequential.js.map +1 -0
  93. package/dist/strategies/types.d.ts +62 -0
  94. package/dist/strategies/types.d.ts.map +1 -0
  95. package/dist/strategies/types.js +5 -0
  96. package/dist/strategies/types.js.map +1 -0
  97. package/dist/types.d.ts +83 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +5 -0
  100. package/dist/types.js.map +1 -0
  101. package/package.json +28 -0
  102. package/src/agent.ts +243 -0
  103. package/src/cli-utils.ts +73 -0
  104. package/src/errors.ts +146 -0
  105. package/src/index.ts +124 -0
  106. package/src/llm-provider.ts +88 -0
  107. package/src/logger.ts +97 -0
  108. package/src/mock-llm.ts +433 -0
  109. package/src/orchestrator-helpers.ts +40 -0
  110. package/src/orchestrator.ts +522 -0
  111. package/src/pipeline-registry.ts +253 -0
  112. package/src/pipeline.ts +265 -0
  113. package/src/skill.ts +127 -0
  114. package/src/skills/io-skill.ts +133 -0
  115. package/src/skills/llm-skill.ts +207 -0
  116. package/src/skills/transform-skill.ts +61 -0
  117. package/src/state/file-store.ts +119 -0
  118. package/src/state/memory-store.ts +82 -0
  119. package/src/state/types.ts +53 -0
  120. package/src/strategies/custom.ts +24 -0
  121. package/src/strategies/plan-and-execute.ts +268 -0
  122. package/src/strategies/react.ts +239 -0
  123. package/src/strategies/router.ts +101 -0
  124. package/src/strategies/sequential.ts +55 -0
  125. package/src/strategies/types.ts +97 -0
  126. package/src/types.ts +102 -0
  127. package/tsconfig.json +9 -0
@@ -0,0 +1,92 @@
1
+ /**
2
+ * File-based StateStore — persists data as JSON files.
3
+ * Good for development and small-scale use. No external dependencies.
4
+ */
5
+ import { existsSync } from 'fs';
6
+ import { readFile, writeFile, mkdir } from 'fs/promises';
7
+ import { join, dirname } from 'path';
8
+ export class FileStore {
9
+ dataFile;
10
+ data = { cache: {}, runs: {}, checkpoints: {} };
11
+ constructor(dataDir = '.flomatai') {
12
+ this.dataFile = join(dataDir, 'store.json');
13
+ }
14
+ async init() {
15
+ await mkdir(dirname(this.dataFile), { recursive: true });
16
+ if (existsSync(this.dataFile)) {
17
+ try {
18
+ const raw = await readFile(this.dataFile, 'utf-8');
19
+ this.data = JSON.parse(raw);
20
+ }
21
+ catch {
22
+ this.data = { cache: {}, runs: {}, checkpoints: {} };
23
+ }
24
+ }
25
+ }
26
+ async close() {
27
+ await this.flush();
28
+ }
29
+ async flush() {
30
+ await mkdir(dirname(this.dataFile), { recursive: true });
31
+ await writeFile(this.dataFile, JSON.stringify(this.data, null, 2), 'utf-8');
32
+ }
33
+ async get(key) {
34
+ const entry = this.data.cache[key];
35
+ if (!entry)
36
+ return null;
37
+ if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {
38
+ delete this.data.cache[key];
39
+ return null;
40
+ }
41
+ return entry.value;
42
+ }
43
+ async set(key, value, ttlSeconds) {
44
+ this.data.cache[key] = {
45
+ value,
46
+ expiresAt: ttlSeconds ? Date.now() + ttlSeconds * 1000 : null,
47
+ };
48
+ await this.flush();
49
+ }
50
+ async delete(key) {
51
+ delete this.data.cache[key];
52
+ await this.flush();
53
+ }
54
+ async has(key) {
55
+ const v = await this.get(key);
56
+ return v !== null;
57
+ }
58
+ async saveRun(run) {
59
+ this.data.runs[run.id] = { ...run };
60
+ await this.flush();
61
+ }
62
+ async getRun(runId) {
63
+ return this.data.runs[runId] ?? null;
64
+ }
65
+ async listRuns(filter) {
66
+ let runs = Object.values(this.data.runs).sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime());
67
+ if (filter?.pipelineName) {
68
+ runs = runs.filter((r) => r.pipelineName === filter.pipelineName);
69
+ }
70
+ if (filter?.status) {
71
+ runs = runs.filter((r) => r.status === filter.status);
72
+ }
73
+ const offset = filter?.offset ?? 0;
74
+ const limit = filter?.limit ?? 50;
75
+ return runs.slice(offset, offset + limit);
76
+ }
77
+ async saveCheckpoint(runId, stepName, data) {
78
+ this.data.checkpoints[`${runId}::${stepName}`] = data;
79
+ await this.flush();
80
+ }
81
+ async getCheckpoint(runId, stepName) {
82
+ return this.data.checkpoints[`${runId}::${stepName}`] ?? null;
83
+ }
84
+ async clearCheckpoints(runId) {
85
+ for (const key of Object.keys(this.data.checkpoints)) {
86
+ if (key.startsWith(`${runId}::`))
87
+ delete this.data.checkpoints[key];
88
+ }
89
+ await this.flush();
90
+ }
91
+ }
92
+ //# sourceMappingURL=file-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/state/file-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * In-memory StateStore — useful for testing and single-run pipelines.
3
+ * No persistence; data is lost on process exit.
4
+ */
5
+ import type { StateStore, RunFilter } from './types.js';
6
+ import type { PipelineRun } from '../types.js';
7
+ export declare class MemoryStore implements StateStore {
8
+ private cache;
9
+ private runs;
10
+ private checkpoints;
11
+ init(): Promise<void>;
12
+ close(): Promise<void>;
13
+ get<T>(key: string): Promise<T | null>;
14
+ set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
15
+ delete(key: string): Promise<void>;
16
+ has(key: string): Promise<boolean>;
17
+ saveRun(run: PipelineRun): Promise<void>;
18
+ getRun(runId: string): Promise<PipelineRun | null>;
19
+ listRuns(filter?: RunFilter): Promise<PipelineRun[]>;
20
+ saveCheckpoint(runId: string, stepName: string, data: unknown): Promise<void>;
21
+ getCheckpoint(runId: string, stepName: string): Promise<unknown | null>;
22
+ clearCheckpoints(runId: string): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../../src/state/memory-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,WAAW,CAA8B;IAE3C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAEtB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAUtC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlC,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAIlD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAapD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7E,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAIvE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKrD"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * In-memory StateStore — useful for testing and single-run pipelines.
3
+ * No persistence; data is lost on process exit.
4
+ */
5
+ export class MemoryStore {
6
+ cache = new Map();
7
+ runs = new Map();
8
+ checkpoints = new Map(); // key: `${runId}::${stepName}`
9
+ async init() { }
10
+ async close() { }
11
+ async get(key) {
12
+ const entry = this.cache.get(key);
13
+ if (!entry)
14
+ return null;
15
+ if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {
16
+ this.cache.delete(key);
17
+ return null;
18
+ }
19
+ return entry.value;
20
+ }
21
+ async set(key, value, ttlSeconds) {
22
+ this.cache.set(key, {
23
+ value,
24
+ expiresAt: ttlSeconds ? Date.now() + ttlSeconds * 1000 : null,
25
+ });
26
+ }
27
+ async delete(key) {
28
+ this.cache.delete(key);
29
+ }
30
+ async has(key) {
31
+ const v = await this.get(key);
32
+ return v !== null;
33
+ }
34
+ async saveRun(run) {
35
+ this.runs.set(run.id, { ...run });
36
+ }
37
+ async getRun(runId) {
38
+ return this.runs.get(runId) ?? null;
39
+ }
40
+ async listRuns(filter) {
41
+ let runs = [...this.runs.values()].reverse(); // newest first
42
+ if (filter?.pipelineName) {
43
+ runs = runs.filter((r) => r.pipelineName === filter.pipelineName);
44
+ }
45
+ if (filter?.status) {
46
+ runs = runs.filter((r) => r.status === filter.status);
47
+ }
48
+ const offset = filter?.offset ?? 0;
49
+ const limit = filter?.limit ?? 50;
50
+ return runs.slice(offset, offset + limit);
51
+ }
52
+ async saveCheckpoint(runId, stepName, data) {
53
+ this.checkpoints.set(`${runId}::${stepName}`, data);
54
+ }
55
+ async getCheckpoint(runId, stepName) {
56
+ return this.checkpoints.get(`${runId}::${stepName}`) ?? null;
57
+ }
58
+ async clearCheckpoints(runId) {
59
+ for (const key of this.checkpoints.keys()) {
60
+ if (key.startsWith(`${runId}::`))
61
+ this.checkpoints.delete(key);
62
+ }
63
+ }
64
+ }
65
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../../src/state/memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * StateStore — pluggable persistence interface.
3
+ *
4
+ * Adapters: @flomatai/state-file (default), @flomatai/state-sqlite,
5
+ * @flomatai/state-redis, @flomatai/state-postgres
6
+ */
7
+ import type { PipelineRun } from '../types.js';
8
+ export interface StateStore {
9
+ /** Initialize the store (open connections, create tables, etc.). */
10
+ init(): Promise<void>;
11
+ /** Tear down the store (close connections). */
12
+ close(): Promise<void>;
13
+ /** Get a value by key. Returns null if not found or expired. */
14
+ get<T>(key: string): Promise<T | null>;
15
+ /** Set a value with optional TTL (seconds). */
16
+ set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
17
+ /** Delete a key. */
18
+ delete(key: string): Promise<void>;
19
+ /** Check if a key exists. */
20
+ has(key: string): Promise<boolean>;
21
+ /** Persist a pipeline run (upsert by run.id). */
22
+ saveRun(run: PipelineRun): Promise<void>;
23
+ /** Retrieve a run by ID. */
24
+ getRun(runId: string): Promise<PipelineRun | null>;
25
+ /** List runs, newest first. */
26
+ listRuns(filter?: RunFilter): Promise<PipelineRun[]>;
27
+ /** Save a step checkpoint so a failed run can be resumed. */
28
+ saveCheckpoint(runId: string, stepName: string, data: unknown): Promise<void>;
29
+ /** Get a step checkpoint. */
30
+ getCheckpoint(runId: string, stepName: string): Promise<unknown | null>;
31
+ /** Clear all checkpoints for a run (after successful completion). */
32
+ clearCheckpoints(runId: string): Promise<void>;
33
+ }
34
+ export interface RunFilter {
35
+ pipelineName?: string;
36
+ status?: string;
37
+ limit?: number;
38
+ offset?: number;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,MAAM,WAAW,UAAU;IACzB,oEAAoE;IACpE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,+CAA+C;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAIvB,gEAAgE;IAChE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,+CAA+C;IAC/C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,oBAAoB;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,6BAA6B;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAInC,iDAAiD;IACjD,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,4BAA4B;IAC5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACnD,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAIrD,6DAA6D;IAC7D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,6BAA6B;IAC7B,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACxE,qEAAqE;IACrE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * StateStore — pluggable persistence interface.
3
+ *
4
+ * Adapters: @flomatai/state-file (default), @flomatai/state-sqlite,
5
+ * @flomatai/state-redis, @flomatai/state-postgres
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/state/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Custom strategy — user provides their own strategy function.
3
+ * Maximum flexibility.
4
+ */
5
+ import type { Skill } from '../skill.js';
6
+ import type { Strategy, AgentContext, AgentResult, CustomStrategyFn } from './types.js';
7
+ export declare class CustomStrategy implements Strategy {
8
+ private fn;
9
+ constructor(fn: CustomStrategyFn);
10
+ execute(skills: Skill[], input: unknown, ctx: AgentContext): Promise<AgentResult>;
11
+ }
12
+ //# sourceMappingURL=custom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../src/strategies/custom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAe,YAAW,QAAQ;IACjC,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,gBAAgB;IAElC,OAAO,CACX,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,WAAW,CAAC;CAGxB"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Custom strategy — user provides their own strategy function.
3
+ * Maximum flexibility.
4
+ */
5
+ export class CustomStrategy {
6
+ fn;
7
+ constructor(fn) {
8
+ this.fn = fn;
9
+ }
10
+ async execute(skills, input, ctx) {
11
+ return this.fn(skills, input, ctx);
12
+ }
13
+ }
14
+ //# sourceMappingURL=custom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom.js","sourceRoot":"","sources":["../../src/strategies/custom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,EAAoB;QAApB,OAAE,GAAF,EAAE,CAAkB;IAAG,CAAC;IAE5C,KAAK,CAAC,OAAO,CACX,MAAe,EACf,KAAc,EACd,GAAiB;QAEjB,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Plan-and-Execute strategy — LLM creates a plan upfront, then executes it.
3
+ *
4
+ * 1. LLM receives goal + skill catalog → produces ordered execution plan
5
+ * 2. Each planned step is executed
6
+ * 3. Optional: re-plan after each step based on actual outputs
7
+ */
8
+ import type { Skill } from '../skill.js';
9
+ import type { Strategy, AgentContext, AgentResult } from './types.js';
10
+ export interface PlanAndExecuteOptions {
11
+ /** Re-plan after each step based on actual output (default: false). */
12
+ replanAfterEachStep?: boolean;
13
+ /** Max number of re-plans allowed (default: 3). */
14
+ maxReplans?: number;
15
+ /** Custom planning prompt override. Receives skill catalog + goal. */
16
+ planPromptTemplate?: string;
17
+ }
18
+ export declare class PlanAndExecuteStrategy implements Strategy {
19
+ private options;
20
+ constructor(options?: PlanAndExecuteOptions);
21
+ execute(skills: Skill[], input: unknown, ctx: AgentContext): Promise<AgentResult>;
22
+ private createPlan;
23
+ private replan;
24
+ private topologicalSort;
25
+ private resolveStepInput;
26
+ }
27
+ //# sourceMappingURL=plan-and-execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-and-execute.d.ts","sourceRoot":"","sources":["../../src/strategies/plan-and-execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAevF,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,sBAAuB,YAAW,QAAQ;IACzC,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,qBAA0B;IAEjD,OAAO,CACX,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,WAAW,CAAC;YAmFT,UAAU;YAiEV,MAAM;IA0CpB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,gBAAgB;CAiBzB"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Plan-and-Execute strategy — LLM creates a plan upfront, then executes it.
3
+ *
4
+ * 1. LLM receives goal + skill catalog → produces ordered execution plan
5
+ * 2. Each planned step is executed
6
+ * 3. Optional: re-plan after each step based on actual outputs
7
+ */
8
+ export class PlanAndExecuteStrategy {
9
+ options;
10
+ constructor(options = {}) {
11
+ this.options = options;
12
+ }
13
+ async execute(skills, input, ctx) {
14
+ const trace = [];
15
+ const startMs = Date.now();
16
+ const results = new Map();
17
+ let replanCount = 0;
18
+ const maxReplans = this.options.maxReplans ?? 3;
19
+ // ── Phase 1: Plan ──────────────────────────────────────────────────────
20
+ let plan = await this.createPlan(skills, input, results, ctx);
21
+ trace.push({
22
+ type: 'plan',
23
+ content: plan,
24
+ timestamp: new Date().toISOString(),
25
+ });
26
+ ctx.logger.debug(`[plan-and-execute] Plan created: ${plan.steps.length} steps`);
27
+ // ── Phase 2: Execute ───────────────────────────────────────────────────
28
+ const sortedSteps = this.topologicalSort(plan.steps);
29
+ for (const planStep of sortedSteps) {
30
+ if (ctx.abortSignal.aborted)
31
+ throw new Error(`Agent "${ctx.agentName}" aborted`);
32
+ const skill = skills.find((s) => s.meta.name === planStep.skill);
33
+ if (!skill) {
34
+ ctx.logger.warn(`[plan-and-execute] Skill "${planStep.skill}" not found — skipping`);
35
+ continue;
36
+ }
37
+ // Derive input from previous results
38
+ const stepInput = this.resolveStepInput(planStep, input, results);
39
+ ctx.logger.debug(`[plan-and-execute] Executing step "${planStep.step_name}" with skill "${planStep.skill}"`);
40
+ const t0 = Date.now();
41
+ const output = await skill.execute(stepInput, ctx.toSkillContext());
42
+ const durationMs = Date.now() - t0;
43
+ results.set(planStep.step_name, output);
44
+ trace.push({
45
+ type: 'action',
46
+ skill: planStep.skill,
47
+ input: stepInput,
48
+ output,
49
+ timestamp: new Date().toISOString(),
50
+ content: { step: planStep.step_name, durationMs },
51
+ });
52
+ // Optional re-plan
53
+ if (this.options.replanAfterEachStep && replanCount < maxReplans) {
54
+ const newPlan = await this.replan(skills, input, results, plan, ctx);
55
+ if (JSON.stringify(newPlan.steps) !== JSON.stringify(plan.steps)) {
56
+ plan = newPlan;
57
+ replanCount++;
58
+ trace.push({
59
+ type: 'replan',
60
+ content: { plan, replanCount },
61
+ timestamp: new Date().toISOString(),
62
+ });
63
+ ctx.logger.debug(`[plan-and-execute] Replanned (${replanCount}/${maxReplans})`);
64
+ }
65
+ }
66
+ }
67
+ const finalOutput = results.size === 1
68
+ ? results.values().next().value
69
+ : Object.fromEntries(results);
70
+ trace.push({ type: 'finish', output: finalOutput, timestamp: new Date().toISOString() });
71
+ return {
72
+ output: finalOutput,
73
+ trace,
74
+ tokensUsed: ctx.totalTokens,
75
+ durationMs: Date.now() - startMs,
76
+ };
77
+ }
78
+ async createPlan(skills, input, existingResults, ctx) {
79
+ const skillCatalog = skills.map((s) => ({
80
+ name: s.meta.name,
81
+ description: s.meta.description,
82
+ tags: s.meta.tags ?? [],
83
+ }));
84
+ const completedStr = existingResults.size > 0
85
+ ? `\nALREADY COMPLETED: ${[...existingResults.keys()].join(', ')}`
86
+ : '';
87
+ const prompt = this.options.planPromptTemplate ??
88
+ `You are a planning agent. Create an execution plan to achieve the goal.
89
+
90
+ ROLE: ${ctx.agentRole}
91
+
92
+ AVAILABLE SKILLS:
93
+ ${JSON.stringify(skillCatalog, null, 2)}
94
+
95
+ GOAL INPUT:
96
+ ${JSON.stringify(input, null, 2).substring(0, 3000)}
97
+ ${completedStr}
98
+
99
+ Rules:
100
+ - Only include skills that are necessary
101
+ - You may use the same skill multiple times with different step_names
102
+ - depends_on must reference step_names defined earlier in the plan
103
+ - Keep input_description concise — it will be used to build the actual input
104
+
105
+ Respond with ONLY valid JSON:
106
+ {
107
+ "reasoning": "why this plan",
108
+ "steps": [
109
+ {
110
+ "step_name": "unique-step-id",
111
+ "skill": "skill-name",
112
+ "input_description": "what input to pass and where to get it from",
113
+ "expected_output": "what this produces",
114
+ "depends_on": ["step-name"]
115
+ }
116
+ ]
117
+ }`;
118
+ const response = await ctx.llm.chat([{ role: 'user', content: prompt }], { temperature: 0.1, responseFormat: 'json' });
119
+ ctx.addTokens(response.usage.totalTokens);
120
+ try {
121
+ return JSON.parse(response.content);
122
+ }
123
+ catch {
124
+ const match = response.content.match(/\{[\s\S]*\}/);
125
+ if (!match)
126
+ throw new Error(`Plan-and-execute failed to produce valid JSON plan`);
127
+ return JSON.parse(match[0]);
128
+ }
129
+ }
130
+ async replan(skills, input, results, currentPlan, ctx) {
131
+ const completedStr = [...results.entries()]
132
+ .map(([k, v]) => `${k}: ${JSON.stringify(v).substring(0, 200)}`)
133
+ .join('\n');
134
+ const prompt = `You are re-planning based on actual results.
135
+
136
+ ROLE: ${ctx.agentRole}
137
+
138
+ ORIGINAL GOAL: ${JSON.stringify(input).substring(0, 1000)}
139
+
140
+ ORIGINAL PLAN:
141
+ ${JSON.stringify(currentPlan.steps.map((s) => s.step_name), null, 2)}
142
+
143
+ COMPLETED STEPS AND OUTPUTS:
144
+ ${completedStr}
145
+
146
+ AVAILABLE SKILLS:
147
+ ${skills.map((s) => `${s.meta.name}: ${s.meta.description}`).join('\n')}
148
+
149
+ Do you need to adjust the remaining plan? Produce a complete updated plan (include completed steps too).
150
+ Respond with ONLY valid JSON using the same format as the original plan.`;
151
+ const response = await ctx.llm.chat([{ role: 'user', content: prompt }], { temperature: 0.1, responseFormat: 'json' });
152
+ ctx.addTokens(response.usage.totalTokens);
153
+ try {
154
+ return JSON.parse(response.content);
155
+ }
156
+ catch {
157
+ return currentPlan; // keep original on parse failure
158
+ }
159
+ }
160
+ topologicalSort(steps) {
161
+ const nameToStep = new Map(steps.map((s) => [s.step_name, s]));
162
+ const sorted = [];
163
+ const visited = new Set();
164
+ const visit = (name) => {
165
+ if (visited.has(name))
166
+ return;
167
+ const step = nameToStep.get(name);
168
+ if (!step)
169
+ return;
170
+ for (const dep of step.depends_on) {
171
+ visit(dep);
172
+ }
173
+ visited.add(name);
174
+ sorted.push(step);
175
+ };
176
+ for (const step of steps)
177
+ visit(step.step_name);
178
+ return sorted;
179
+ }
180
+ resolveStepInput(step, originalInput, results) {
181
+ // If there are dependencies, merge their outputs
182
+ if (step.depends_on.length === 0)
183
+ return originalInput;
184
+ if (step.depends_on.length === 1) {
185
+ return results.get(step.depends_on[0]) ?? originalInput;
186
+ }
187
+ // Multiple dependencies: merge all into one object
188
+ const merged = { _original: originalInput };
189
+ for (const dep of step.depends_on) {
190
+ merged[dep] = results.get(dep);
191
+ }
192
+ return merged;
193
+ }
194
+ }
195
+ //# sourceMappingURL=plan-and-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-and-execute.js","sourceRoot":"","sources":["../../src/strategies/plan-and-execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA2BH,MAAM,OAAO,sBAAsB;IACb;IAApB,YAAoB,UAAiC,EAAE;QAAnC,YAAO,GAAP,OAAO,CAA4B;IAAG,CAAC;IAE3D,KAAK,CAAC,OAAO,CACX,MAAe,EACf,KAAc,EACd,GAAiB;QAEjB,MAAM,KAAK,GAAsB,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC3C,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAEhD,0EAA0E;QAC1E,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEhF,0EAA0E;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,SAAS,WAAW,CAAC,CAAC;YAEjF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,KAAK,wBAAwB,CAAC,CAAC;gBACrF,SAAS;YACX,CAAC;YAED,qCAAqC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YAElE,GAAG,CAAC,MAAM,CAAC,KAAK,CACd,sCAAsC,QAAQ,CAAC,SAAS,iBAAiB,QAAQ,CAAC,KAAK,GAAG,CAC3F,CAAC;YAEF,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAChC,SAAgD,EAChD,GAAG,CAAC,cAAc,EAAE,CACrB,CAAC;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAEnC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAExC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,KAAK,EAAE,SAAS;gBAChB,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE;aAClD,CAAC,CAAC;YAEH,mBAAmB;YACnB,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC;gBACjE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACrE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjE,IAAI,GAAG,OAAO,CAAC;oBACf,WAAW,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;wBAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACpC,CAAC,CAAC;oBACH,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,WAAW,IAAI,UAAU,GAAG,CAAC,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC;YACpC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;YAC/B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAEhC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAEzF,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,KAAK;YACL,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;SACjC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,MAAe,EACf,KAAc,EACd,eAAqC,EACrC,GAAiB;QAEjB,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;YACjB,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW;YAC/B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;SACxB,CAAC,CAAC,CAAC;QAEJ,MAAM,YAAY,GAChB,eAAe,CAAC,IAAI,GAAG,CAAC;YACtB,CAAC,CAAC,wBAAwB,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAClE,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,MAAM,GACV,IAAI,CAAC,OAAO,CAAC,kBAAkB;YAC/B;;QAEE,GAAG,CAAC,SAAS;;;EAGnB,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAGrC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;EACjD,YAAY;;;;;;;;;;;;;;;;;;;;EAoBZ,CAAC;QAEC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CACjC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EACnC,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAC7C,CAAC;QACF,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAS,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAClF,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAS,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAClB,MAAe,EACf,KAAc,EACd,OAA6B,EAC7B,WAAiB,EACjB,GAAiB;QAEjB,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;aAC/D,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,MAAM,GAAG;;QAEX,GAAG,CAAC,SAAS;;iBAEJ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;;;EAGvD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;;;EAGlE,YAAY;;;EAGZ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;yEAGE,CAAC;QAEtE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CACjC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EACnC,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAC7C,CAAC;QACF,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAS,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,WAAW,CAAC,CAAC,iCAAiC;QACvD,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAAiB;QACvC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;YACnC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClC,KAAK,CAAC,GAAG,CAAC,CAAC;YACb,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,gBAAgB,CACtB,IAAc,EACd,aAAsB,EACtB,OAA6B;QAE7B,iDAAiD;QACjD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,aAAa,CAAC;QACvD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,IAAI,aAAa,CAAC;QAC3D,CAAC;QACD,mDAAmD;QACnD,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;QACrE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * ReAct strategy — iterative Reasoning + Acting loop.
3
+ *
4
+ * Each iteration:
5
+ * 1. THINK — LLM reasons about what to do next
6
+ * 2. ACT — execute the chosen skill
7
+ * 3. OBSERVE — feed output back to LLM
8
+ * 4. Repeat until LLM decides to FINISH
9
+ */
10
+ import type { Skill } from '../skill.js';
11
+ import type { Strategy, AgentContext, AgentResult } from './types.js';
12
+ export interface ReActOptions {
13
+ /** Maximum reasoning iterations before hard stop (default: 10). */
14
+ maxIterations?: number;
15
+ /** Reflect and self-correct every N steps (0 = disabled, default: 0). */
16
+ reflectionInterval?: number;
17
+ /** Custom system prompt additions. */
18
+ systemPromptSuffix?: string;
19
+ }
20
+ export declare class ReActStrategy implements Strategy {
21
+ private options;
22
+ constructor(options?: ReActOptions);
23
+ execute(skills: Skill[], input: unknown, ctx: AgentContext): Promise<AgentResult>;
24
+ private think;
25
+ private reflect;
26
+ }
27
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/strategies/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,WAAW,EAEZ,MAAM,YAAY,CAAC;AAUpB,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sCAAsC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,aAAc,YAAW,QAAQ;IAChC,OAAO,CAAC,OAAO;gBAAP,OAAO,GAAE,YAAiB;IAExC,OAAO,CACX,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,WAAW,CAAC;YAuGT,KAAK;YAyEL,OAAO;CAoBtB"}