@evo-dev/core 0.0.1-alpha.3 → 0.0.1-alpha.4
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/config/index.js +164 -125
- package/dist/index.js +8999 -7914
- package/package.json +1 -1
- package/src/agents/index.ts +1 -1
- package/src/code-agent-traces/index.ts +3 -10
- package/src/config/settings.ts +14 -0
- package/src/config/store.ts +1 -1
- package/src/daemon/index.ts +1 -1
- package/src/evolution/candidates/index.ts +235 -0
- package/src/evolution/control/index.ts +19 -0
- package/src/evolution/evidence/analysis.ts +529 -0
- package/src/evolution/evidence/index.ts +3 -0
- package/src/evolution/evidence/session-memory/constants.ts +12 -0
- package/src/evolution/evidence/session-memory/index.ts +4 -0
- package/src/evolution/evidence/session-memory/paths.ts +29 -0
- package/src/evolution/evidence/session-memory/policy.ts +39 -0
- package/src/evolution/evidence/session-memory/segment.ts +192 -0
- package/src/evolution/evidence/session-memory/state-machine.ts +249 -0
- package/src/evolution/evidence/session-memory/storage.ts +145 -0
- package/src/evolution/evidence/session-memory/types.ts +207 -0
- package/src/evolution/evidence/session-memory/updater.ts +184 -0
- package/src/evolution/formatters.ts +169 -0
- package/src/evolution/index.ts +12 -2827
- package/src/{knowledge → evolution/knowledge}/index.ts +7 -7
- package/src/evolution/paths.ts +41 -0
- package/src/evolution/processor/distillation.ts +436 -0
- package/src/evolution/processor/index.ts +3 -0
- package/src/evolution/processor/process.ts +306 -0
- package/src/evolution/schema.ts +522 -0
- package/src/evolution/shared.ts +677 -0
- package/src/evolution/triggers/classification.ts +102 -0
- package/src/evolution/triggers/index.ts +295 -0
- package/src/hooks/index.ts +54 -7
- package/src/index.ts +10 -2
- package/src/runtime-logs/index.ts +4 -12
- package/src/team/index.ts +1 -1
- package/src/utils/errors.ts +13 -0
- package/src/utils/fs.ts +40 -0
- package/src/utils/hash.ts +9 -0
- package/src/utils/ids.ts +12 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/parsing.ts +11 -0
- package/src/utils/text.ts +18 -0
- package/src/utils/time.ts +5 -0
- /package/src/{learning → evolution/review}/index.ts +0 -0
package/package.json
CHANGED
package/src/agents/index.ts
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
type ScopedKnowledgeContextPack,
|
|
4
4
|
createScopedKnowledgeContextPack,
|
|
5
5
|
formatScopedKnowledgePromptBlock,
|
|
6
|
-
} from "../knowledge/index.ts";
|
|
6
|
+
} from "../evolution/knowledge/index.ts";
|
|
7
7
|
import type { TaskContract, TaskExecutionMode } from "../task/index.ts";
|
|
8
8
|
|
|
9
9
|
export type AgentPersistence = "named" | "dynamic";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
1
|
import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
3
2
|
import { dirname, isAbsolute, join, normalize, relative } from "node:path";
|
|
4
3
|
import { resolveEvoDevPaths } from "../config/paths.ts";
|
|
5
4
|
import { resolveTraceSessionKey, resolveTraceTeamContext } from "../runtime-logs/index.ts";
|
|
5
|
+
import { normalizeTimestamp, sha256Short } from "../utils/index.ts";
|
|
6
6
|
|
|
7
7
|
export type CodeAgentTraceTarget = "claude" | "codex";
|
|
8
8
|
export type CodeAgentTraceRefSource =
|
|
@@ -440,7 +440,7 @@ function hasRawTraversalSegment(path: string): boolean {
|
|
|
440
440
|
|
|
441
441
|
function hashOptionalIdentifier(value: string | null): string | null {
|
|
442
442
|
if (value === null || value.trim() === "") return null;
|
|
443
|
-
return `sha256-${
|
|
443
|
+
return `sha256-${sha256Short(value)}`;
|
|
444
444
|
}
|
|
445
445
|
|
|
446
446
|
function sanitizeHashMetadata(value: string | null): string | null {
|
|
@@ -454,8 +454,7 @@ function sanitizePersistentIdentifier(value: string, prefix: string): string {
|
|
|
454
454
|
if (!SENSITIVE_IDENTIFIER_PATTERN.test(value) && !SENSITIVE_IDENTIFIER_PATTERN.test(pathSafe)) {
|
|
455
455
|
return pathSafe;
|
|
456
456
|
}
|
|
457
|
-
|
|
458
|
-
return `${prefix}-${hash}`;
|
|
457
|
+
return `${prefix}-${sha256Short(value)}`;
|
|
459
458
|
}
|
|
460
459
|
|
|
461
460
|
function sanitizeNotes(notes: string[]): string[] {
|
|
@@ -471,12 +470,6 @@ function sanitizeNote(note: string): string {
|
|
|
471
470
|
return truncated;
|
|
472
471
|
}
|
|
473
472
|
|
|
474
|
-
function normalizeTimestamp(value?: Date | string): string {
|
|
475
|
-
if (value instanceof Date) return value.toISOString();
|
|
476
|
-
if (typeof value === "string" && value.trim() !== "") return new Date(value).toISOString();
|
|
477
|
-
return new Date().toISOString();
|
|
478
|
-
}
|
|
479
|
-
|
|
480
473
|
function optionalString(value: unknown): string | null {
|
|
481
474
|
return typeof value === "string" && value.trim() !== "" ? value : null;
|
|
482
475
|
}
|
package/src/config/settings.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
+
import {
|
|
3
|
+
type SessionMemoryPolicySnapshot,
|
|
4
|
+
createDefaultSessionMemoryPolicy,
|
|
5
|
+
parseSessionMemoryPolicy,
|
|
6
|
+
} from "../evolution/evidence/session-memory/index.ts";
|
|
2
7
|
import { type HookSettings, createDefaultHookSettings, parseHookSettings } from "../hooks/index.ts";
|
|
3
8
|
import { EvoDevConfigError, describeType } from "./errors.ts";
|
|
4
9
|
import { resolveEvoDevPaths } from "./paths.ts";
|
|
@@ -14,6 +19,7 @@ export interface MemorySettings {
|
|
|
14
19
|
runtimeInjection: boolean;
|
|
15
20
|
staleReview: boolean;
|
|
16
21
|
lexicalIndex: boolean;
|
|
22
|
+
sessionMemory: SessionMemoryPolicySnapshot;
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
export interface EvoDevSettings {
|
|
@@ -115,6 +121,7 @@ export function createDefaultMemorySettings(): MemorySettings {
|
|
|
115
121
|
runtimeInjection: true,
|
|
116
122
|
staleReview: true,
|
|
117
123
|
lexicalIndex: true,
|
|
124
|
+
sessionMemory: createDefaultSessionMemoryPolicy(),
|
|
118
125
|
};
|
|
119
126
|
}
|
|
120
127
|
|
|
@@ -247,6 +254,9 @@ function parseMemorySettings(value: unknown, path: string): MemorySettings {
|
|
|
247
254
|
input.lexicalIndex === undefined
|
|
248
255
|
? defaults.lexicalIndex
|
|
249
256
|
: expectBoolean(input.lexicalIndex, `${path}.lexicalIndex`),
|
|
257
|
+
sessionMemory: parseSessionMemoryPolicy(
|
|
258
|
+
isPlainRecord(input.sessionMemory) ? input.sessionMemory : defaults.sessionMemory,
|
|
259
|
+
),
|
|
250
260
|
};
|
|
251
261
|
}
|
|
252
262
|
|
|
@@ -311,6 +321,10 @@ function expectRecord(value: unknown, path: string): Record<string, unknown> {
|
|
|
311
321
|
return value as Record<string, unknown>;
|
|
312
322
|
}
|
|
313
323
|
|
|
324
|
+
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
325
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
326
|
+
}
|
|
327
|
+
|
|
314
328
|
function isNotFoundError(error: unknown): boolean {
|
|
315
329
|
return (
|
|
316
330
|
error instanceof Error && "code" in error && (error as NodeJS.ErrnoException).code === "ENOENT"
|
package/src/config/store.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
-
import { ensureOkfKnowledgeBase } from "../knowledge/index.ts";
|
|
3
|
+
import { ensureOkfKnowledgeBase } from "../evolution/knowledge/index.ts";
|
|
4
4
|
import { EvoDevConfigError } from "./errors.ts";
|
|
5
5
|
import { type EvoDevPaths, resolveEvoDevPaths } from "./paths.ts";
|
|
6
6
|
import { type EvoDevRegistry, createDefaultRegistry, parseRegistry } from "./registry.ts";
|
package/src/daemon/index.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { randomBytes } from "node:crypto";
|
|
|
2
2
|
import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
|
|
3
3
|
import { type IncomingMessage, createServer } from "node:http";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
|
-
import { listEvolutionTriggers, processEvolutionTriggers } from "../evolution/index.ts";
|
|
5
|
+
import { listEvolutionTriggers, processEvolutionTriggers } from "../evolution/control/index.ts";
|
|
6
6
|
import { listObservabilityEvents } from "../observability/index.ts";
|
|
7
7
|
import {
|
|
8
8
|
type TeamRuntimeAdapter,
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveEvoDevPaths } from "../../config/paths.ts";
|
|
4
|
+
import { pathExists, readJsonFiles, writeJsonFile as writeJson } from "../../utils/index.ts";
|
|
5
|
+
import { resolveEvolutionPaths } from "../paths.ts";
|
|
6
|
+
import type {
|
|
7
|
+
EvolutionEvosCase,
|
|
8
|
+
EvolutionEvosCaseQueryResult,
|
|
9
|
+
EvolutionKnowledgeRecord,
|
|
10
|
+
EvolutionRepoProposal,
|
|
11
|
+
EvolutionReviewCandidate,
|
|
12
|
+
EvolutionReviewSnapshot,
|
|
13
|
+
EvolutionReviewState,
|
|
14
|
+
EvolutionTriggerRecord,
|
|
15
|
+
} from "../schema.ts";
|
|
16
|
+
import {
|
|
17
|
+
listDirectoryNames,
|
|
18
|
+
parseEvosCase,
|
|
19
|
+
parseKnowledgeRecord,
|
|
20
|
+
parseRepoProposal,
|
|
21
|
+
parseReviewCandidate,
|
|
22
|
+
parseTrigger,
|
|
23
|
+
sanitizeId,
|
|
24
|
+
sanitizeStorageId,
|
|
25
|
+
uniqueSorted,
|
|
26
|
+
validateEvolutionKnowledgeRecord,
|
|
27
|
+
} from "../shared.ts";
|
|
28
|
+
|
|
29
|
+
export async function readEvolutionReviewSnapshot(input: {
|
|
30
|
+
homeDir: string;
|
|
31
|
+
projectKey?: string;
|
|
32
|
+
}): Promise<EvolutionReviewSnapshot> {
|
|
33
|
+
const paths = resolveEvoDevPaths(input.homeDir);
|
|
34
|
+
const projectKeys =
|
|
35
|
+
input.projectKey === undefined
|
|
36
|
+
? await listEvolutionReviewProjectKeys(paths)
|
|
37
|
+
: [sanitizeStorageId("projectKey", input.projectKey)];
|
|
38
|
+
const knowledgeRecords: EvolutionKnowledgeRecord[] = [];
|
|
39
|
+
const evosCases: EvolutionEvosCase[] = [];
|
|
40
|
+
const repoProposals: EvolutionRepoProposal[] = [];
|
|
41
|
+
const reviewCandidates: EvolutionReviewCandidate[] = [];
|
|
42
|
+
const triggers: EvolutionTriggerRecord[] = [];
|
|
43
|
+
|
|
44
|
+
for (const projectKey of projectKeys) {
|
|
45
|
+
const resolved = resolveEvolutionPaths({
|
|
46
|
+
homeDir: input.homeDir,
|
|
47
|
+
projectKey,
|
|
48
|
+
runId: "review",
|
|
49
|
+
});
|
|
50
|
+
knowledgeRecords.push(
|
|
51
|
+
...(await readJsonFiles(resolved.knowledgeRecordsDir, parseKnowledgeRecord)),
|
|
52
|
+
);
|
|
53
|
+
evosCases.push(...(await readJsonFiles(resolved.evosCasesProjectDir, parseEvosCase)));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const evolutionStateDir = join(paths.stateDir, "evolution");
|
|
57
|
+
const stateProjectKeys =
|
|
58
|
+
input.projectKey === undefined
|
|
59
|
+
? await listDirectoryNames(evolutionStateDir)
|
|
60
|
+
: [sanitizeStorageId("projectKey", input.projectKey)];
|
|
61
|
+
for (const projectKey of stateProjectKeys) {
|
|
62
|
+
const projectStateDir = join(evolutionStateDir, projectKey);
|
|
63
|
+
const runIds = await listDirectoryNames(projectStateDir);
|
|
64
|
+
for (const runId of runIds) {
|
|
65
|
+
const proposalsDir = join(projectStateDir, runId, "proposals");
|
|
66
|
+
const reviewCandidatesDir = join(projectStateDir, runId, "review-candidates");
|
|
67
|
+
repoProposals.push(...(await readJsonFiles(proposalsDir, parseRepoProposal)));
|
|
68
|
+
reviewCandidates.push(...(await readJsonFiles(reviewCandidatesDir, parseReviewCandidate)));
|
|
69
|
+
triggers.push(
|
|
70
|
+
...(await readJsonFiles(join(projectStateDir, runId, "triggers"), parseTrigger)),
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
projectKey:
|
|
77
|
+
input.projectKey === undefined ? null : sanitizeStorageId("projectKey", input.projectKey),
|
|
78
|
+
knowledgeRecords,
|
|
79
|
+
evosCases,
|
|
80
|
+
repoProposals,
|
|
81
|
+
reviewCandidates,
|
|
82
|
+
triggers,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function listEvolutionReviewProjectKeys(
|
|
87
|
+
paths: ReturnType<typeof resolveEvoDevPaths>,
|
|
88
|
+
): Promise<string[]> {
|
|
89
|
+
const legacyKnowledgeProjectKeys = (
|
|
90
|
+
await Promise.all(
|
|
91
|
+
(
|
|
92
|
+
await listDirectoryNames(paths.knowledgeDir)
|
|
93
|
+
).map(async (projectKey) =>
|
|
94
|
+
(await pathExists(join(paths.knowledgeDir, projectKey, "records"))) ? projectKey : null,
|
|
95
|
+
),
|
|
96
|
+
)
|
|
97
|
+
).filter((projectKey): projectKey is string => projectKey !== null);
|
|
98
|
+
return uniqueSorted([
|
|
99
|
+
...legacyKnowledgeProjectKeys,
|
|
100
|
+
...(await listDirectoryNames(paths.evosCasesDir)),
|
|
101
|
+
]);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export async function listEvolutionKnowledgeRecords(input: {
|
|
105
|
+
homeDir: string;
|
|
106
|
+
projectKey?: string;
|
|
107
|
+
}): Promise<EvolutionKnowledgeRecord[]> {
|
|
108
|
+
return (
|
|
109
|
+
await readEvolutionReviewSnapshot({
|
|
110
|
+
homeDir: input.homeDir,
|
|
111
|
+
projectKey: input.projectKey,
|
|
112
|
+
})
|
|
113
|
+
).knowledgeRecords.sort((left, right) => left.id.localeCompare(right.id));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export async function listEvolutionEvosCases(input: {
|
|
117
|
+
homeDir: string;
|
|
118
|
+
projectKey?: string;
|
|
119
|
+
roleId?: string;
|
|
120
|
+
reviewStates?: EvolutionReviewState[];
|
|
121
|
+
}): Promise<EvolutionEvosCaseQueryResult> {
|
|
122
|
+
const paths = resolveEvoDevPaths(input.homeDir);
|
|
123
|
+
const projectKeys =
|
|
124
|
+
input.projectKey === undefined
|
|
125
|
+
? await listDirectoryNames(paths.evosCasesDir)
|
|
126
|
+
: [sanitizeStorageId("projectKey", input.projectKey)];
|
|
127
|
+
const roleId = input.roleId === undefined ? null : sanitizeId(input.roleId);
|
|
128
|
+
const reviewStates = input.reviewStates ?? ["accepted", "auto-accepted"];
|
|
129
|
+
const cases: EvolutionEvosCase[] = [];
|
|
130
|
+
const warnings: string[] = [];
|
|
131
|
+
|
|
132
|
+
for (const projectKey of projectKeys) {
|
|
133
|
+
const projectDir = join(paths.evosCasesDir, projectKey);
|
|
134
|
+
if (!(await pathExists(projectDir))) continue;
|
|
135
|
+
const entries = await readdir(projectDir, { withFileTypes: true });
|
|
136
|
+
for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {
|
|
137
|
+
if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
|
|
138
|
+
const sourceLink = `cases/${projectKey}/${entry.name}`;
|
|
139
|
+
try {
|
|
140
|
+
const value = JSON.parse(await readFile(join(projectDir, entry.name), "utf8")) as unknown;
|
|
141
|
+
const evosCase = parseEvosCase(value);
|
|
142
|
+
if (!reviewStates.includes(evosCase.reviewState)) continue;
|
|
143
|
+
if (
|
|
144
|
+
roleId !== null &&
|
|
145
|
+
evosCase.roleTags.length > 0 &&
|
|
146
|
+
!evosCase.roleTags.includes(roleId)
|
|
147
|
+
) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
cases.push(evosCase);
|
|
151
|
+
} catch {
|
|
152
|
+
warnings.push(
|
|
153
|
+
`Omitted unsafe or invalid evos case: ${sourceLink}. Run evodev knowledge lint.`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
cases: cases.sort((left, right) => {
|
|
161
|
+
const project = left.projectKey.localeCompare(right.projectKey);
|
|
162
|
+
if (project !== 0) return project;
|
|
163
|
+
return left.id.localeCompare(right.id);
|
|
164
|
+
}),
|
|
165
|
+
warnings,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export async function readEvolutionKnowledgeRecordById(input: {
|
|
170
|
+
homeDir: string;
|
|
171
|
+
knowledgeId: string;
|
|
172
|
+
projectKey?: string;
|
|
173
|
+
}): Promise<EvolutionKnowledgeRecord> {
|
|
174
|
+
const matches = (await listEvolutionKnowledgeRecords(input)).filter(
|
|
175
|
+
(record) => record.id === input.knowledgeId,
|
|
176
|
+
);
|
|
177
|
+
if (matches.length === 0) throw new Error(`Knowledge record not found: ${input.knowledgeId}`);
|
|
178
|
+
if (matches.length > 1) {
|
|
179
|
+
throw new Error(`Knowledge record id is ambiguous across projects: ${input.knowledgeId}`);
|
|
180
|
+
}
|
|
181
|
+
return matches[0] as EvolutionKnowledgeRecord;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export async function updateEvolutionKnowledgeReviewState(input: {
|
|
185
|
+
homeDir: string;
|
|
186
|
+
knowledgeId: string;
|
|
187
|
+
projectKey?: string;
|
|
188
|
+
reviewState: "accepted" | "rejected" | "deferred";
|
|
189
|
+
}): Promise<{ path: string; record: EvolutionKnowledgeRecord }> {
|
|
190
|
+
const record = await readEvolutionKnowledgeRecordById(input);
|
|
191
|
+
const next: EvolutionKnowledgeRecord = {
|
|
192
|
+
...record,
|
|
193
|
+
reviewState: input.reviewState,
|
|
194
|
+
authority: input.reviewState === "accepted" ? "reviewed" : "contextual",
|
|
195
|
+
runtime: {
|
|
196
|
+
...record.runtime,
|
|
197
|
+
canLoad: input.reviewState === "accepted",
|
|
198
|
+
hardBlocking: false,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
validateEvolutionKnowledgeRecord(next);
|
|
202
|
+
const paths = resolveEvolutionPaths({
|
|
203
|
+
homeDir: input.homeDir,
|
|
204
|
+
projectKey: next.projectKey,
|
|
205
|
+
runId: "review",
|
|
206
|
+
});
|
|
207
|
+
const path = join(paths.knowledgeRecordsDir, `${next.id}.json`);
|
|
208
|
+
await writeJson(path, next, { overwrite: true });
|
|
209
|
+
const allProjectKnowledgeRecords = await readJsonFiles(
|
|
210
|
+
paths.knowledgeRecordsDir,
|
|
211
|
+
parseKnowledgeRecord,
|
|
212
|
+
);
|
|
213
|
+
await writeJson(
|
|
214
|
+
paths.knowledgeIndexPath,
|
|
215
|
+
{
|
|
216
|
+
version: 1,
|
|
217
|
+
kind: "evolution-knowledge-index",
|
|
218
|
+
projectKey: next.projectKey,
|
|
219
|
+
updatedAt: new Date().toISOString(),
|
|
220
|
+
records: allProjectKnowledgeRecords.map((item) => ({
|
|
221
|
+
id: item.id,
|
|
222
|
+
kind: item.kind,
|
|
223
|
+
title: item.title,
|
|
224
|
+
roleTags: item.roleTags,
|
|
225
|
+
tags: item.tags,
|
|
226
|
+
reviewState: item.reviewState,
|
|
227
|
+
authority: item.authority,
|
|
228
|
+
confidence: item.confidence,
|
|
229
|
+
runtime: item.runtime,
|
|
230
|
+
})),
|
|
231
|
+
},
|
|
232
|
+
{ overwrite: true },
|
|
233
|
+
);
|
|
234
|
+
return { path, record: next };
|
|
235
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export {
|
|
2
|
+
formatEvolutionProcessResult,
|
|
3
|
+
formatEvolutionReviewSnapshot,
|
|
4
|
+
} from "../formatters.ts";
|
|
5
|
+
export { processEvolutionTriggers } from "../processor/index.ts";
|
|
6
|
+
export { readEvolutionReviewSnapshot } from "../candidates/index.ts";
|
|
7
|
+
export {
|
|
8
|
+
listEvolutionTriggers,
|
|
9
|
+
listSegmentEvolutionTriggers,
|
|
10
|
+
} from "../triggers/index.ts";
|
|
11
|
+
export type {
|
|
12
|
+
EvolutionProcessInput,
|
|
13
|
+
EvolutionProcessResult,
|
|
14
|
+
EvolutionReviewSnapshot,
|
|
15
|
+
EvolutionTriggerListInput,
|
|
16
|
+
EvolutionTriggerRecord,
|
|
17
|
+
SegmentEvolutionTriggerListInput,
|
|
18
|
+
SegmentEvolutionTriggerRecord,
|
|
19
|
+
} from "../schema.ts";
|