@flowdot.ai/daemon 1.0.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 (85) hide show
  1. package/LICENSE +45 -0
  2. package/README.md +51 -0
  3. package/dist/goals/DependencyResolver.d.ts +54 -0
  4. package/dist/goals/DependencyResolver.js +329 -0
  5. package/dist/goals/ErrorRecovery.d.ts +133 -0
  6. package/dist/goals/ErrorRecovery.js +489 -0
  7. package/dist/goals/GoalApiClient.d.ts +81 -0
  8. package/dist/goals/GoalApiClient.js +743 -0
  9. package/dist/goals/GoalCache.d.ts +65 -0
  10. package/dist/goals/GoalCache.js +243 -0
  11. package/dist/goals/GoalCommsHandler.d.ts +150 -0
  12. package/dist/goals/GoalCommsHandler.js +378 -0
  13. package/dist/goals/GoalExporter.d.ts +164 -0
  14. package/dist/goals/GoalExporter.js +318 -0
  15. package/dist/goals/GoalImporter.d.ts +107 -0
  16. package/dist/goals/GoalImporter.js +345 -0
  17. package/dist/goals/GoalManager.d.ts +110 -0
  18. package/dist/goals/GoalManager.js +535 -0
  19. package/dist/goals/GoalReporter.d.ts +105 -0
  20. package/dist/goals/GoalReporter.js +534 -0
  21. package/dist/goals/GoalScheduler.d.ts +102 -0
  22. package/dist/goals/GoalScheduler.js +209 -0
  23. package/dist/goals/GoalValidator.d.ts +72 -0
  24. package/dist/goals/GoalValidator.js +657 -0
  25. package/dist/goals/MetaGoalEnforcer.d.ts +111 -0
  26. package/dist/goals/MetaGoalEnforcer.js +536 -0
  27. package/dist/goals/MilestoneBreaker.d.ts +74 -0
  28. package/dist/goals/MilestoneBreaker.js +348 -0
  29. package/dist/goals/PermissionBridge.d.ts +109 -0
  30. package/dist/goals/PermissionBridge.js +326 -0
  31. package/dist/goals/ProgressTracker.d.ts +113 -0
  32. package/dist/goals/ProgressTracker.js +324 -0
  33. package/dist/goals/ReviewScheduler.d.ts +106 -0
  34. package/dist/goals/ReviewScheduler.js +360 -0
  35. package/dist/goals/TaskExecutor.d.ts +116 -0
  36. package/dist/goals/TaskExecutor.js +370 -0
  37. package/dist/goals/TaskFeedback.d.ts +126 -0
  38. package/dist/goals/TaskFeedback.js +402 -0
  39. package/dist/goals/TaskGenerator.d.ts +75 -0
  40. package/dist/goals/TaskGenerator.js +329 -0
  41. package/dist/goals/TaskQueue.d.ts +84 -0
  42. package/dist/goals/TaskQueue.js +331 -0
  43. package/dist/goals/TaskSanitizer.d.ts +61 -0
  44. package/dist/goals/TaskSanitizer.js +464 -0
  45. package/dist/goals/errors.d.ts +116 -0
  46. package/dist/goals/errors.js +299 -0
  47. package/dist/goals/index.d.ts +24 -0
  48. package/dist/goals/index.js +23 -0
  49. package/dist/goals/types.d.ts +395 -0
  50. package/dist/goals/types.js +230 -0
  51. package/dist/index.d.ts +4 -0
  52. package/dist/index.js +3 -0
  53. package/dist/loop/DaemonIPC.d.ts +67 -0
  54. package/dist/loop/DaemonIPC.js +358 -0
  55. package/dist/loop/IntervalParser.d.ts +39 -0
  56. package/dist/loop/IntervalParser.js +217 -0
  57. package/dist/loop/LoopDaemon.d.ts +123 -0
  58. package/dist/loop/LoopDaemon.js +1821 -0
  59. package/dist/loop/LoopExecutor.d.ts +93 -0
  60. package/dist/loop/LoopExecutor.js +326 -0
  61. package/dist/loop/LoopManager.d.ts +79 -0
  62. package/dist/loop/LoopManager.js +476 -0
  63. package/dist/loop/LoopScheduler.d.ts +69 -0
  64. package/dist/loop/LoopScheduler.js +329 -0
  65. package/dist/loop/LoopStore.d.ts +57 -0
  66. package/dist/loop/LoopStore.js +406 -0
  67. package/dist/loop/LoopValidator.d.ts +55 -0
  68. package/dist/loop/LoopValidator.js +603 -0
  69. package/dist/loop/errors.d.ts +115 -0
  70. package/dist/loop/errors.js +312 -0
  71. package/dist/loop/index.d.ts +11 -0
  72. package/dist/loop/index.js +10 -0
  73. package/dist/loop/notifications/Notifier.d.ts +28 -0
  74. package/dist/loop/notifications/Notifier.js +78 -0
  75. package/dist/loop/notifications/SlackNotifier.d.ts +28 -0
  76. package/dist/loop/notifications/SlackNotifier.js +203 -0
  77. package/dist/loop/notifications/TerminalNotifier.d.ts +18 -0
  78. package/dist/loop/notifications/TerminalNotifier.js +72 -0
  79. package/dist/loop/notifications/WebhookNotifier.d.ts +24 -0
  80. package/dist/loop/notifications/WebhookNotifier.js +123 -0
  81. package/dist/loop/notifications/index.d.ts +24 -0
  82. package/dist/loop/notifications/index.js +109 -0
  83. package/dist/loop/types.d.ts +280 -0
  84. package/dist/loop/types.js +222 -0
  85. package/package.json +92 -0
@@ -0,0 +1,345 @@
1
+ import { EventEmitter } from 'events';
2
+ import { EXPORT_FORMAT_VERSION, } from './GoalExporter.js';
3
+ export class GoalImporter extends EventEmitter {
4
+ logger;
5
+ defaultOptions;
6
+ constructor(options = {}) {
7
+ super();
8
+ this.logger = options.logger ?? console;
9
+ this.defaultOptions = options.defaultOptions ?? {
10
+ mode: 'create',
11
+ conflictResolution: 'rename',
12
+ dryRun: false,
13
+ validateOnly: false,
14
+ importMilestones: true,
15
+ importTasks: true,
16
+ importMemories: true,
17
+ importMetaGoals: true,
18
+ resetStatus: false,
19
+ };
20
+ }
21
+ parse(data) {
22
+ let jsonData = data;
23
+ try {
24
+ if (/^[A-Za-z0-9+/=]+$/.test(data.trim())) {
25
+ jsonData = Buffer.from(data, 'base64').toString('utf-8');
26
+ }
27
+ }
28
+ catch {
29
+ }
30
+ return JSON.parse(jsonData);
31
+ }
32
+ async validate(data, dataWriter, options) {
33
+ const opts = { ...this.defaultOptions, ...options };
34
+ const errors = [];
35
+ const warnings = [];
36
+ const conflicts = [];
37
+ let pkg;
38
+ try {
39
+ pkg = typeof data === 'string' ? this.parse(data) : data;
40
+ }
41
+ catch (error) {
42
+ return {
43
+ valid: false,
44
+ errors: [`Invalid JSON: ${error instanceof Error ? error.message : String(error)}`],
45
+ warnings: [],
46
+ conflicts: [],
47
+ statistics: this.emptyValidationStatistics(),
48
+ };
49
+ }
50
+ if (!pkg.manifest) {
51
+ errors.push('Missing manifest');
52
+ }
53
+ else {
54
+ const [major] = pkg.manifest.version.split('.').map(Number);
55
+ const [currentMajor] = EXPORT_FORMAT_VERSION.split('.').map(Number);
56
+ if (major > currentMajor) {
57
+ errors.push(`Export version ${pkg.manifest.version} is newer than supported ${EXPORT_FORMAT_VERSION}`);
58
+ }
59
+ else if (major < currentMajor) {
60
+ warnings.push(`Export version ${pkg.manifest.version} is older, some features may not import`);
61
+ }
62
+ }
63
+ if (!Array.isArray(pkg.goals)) {
64
+ errors.push('Goals must be an array');
65
+ }
66
+ else {
67
+ for (const goal of pkg.goals) {
68
+ const goalErrors = this.validateGoal(goal);
69
+ errors.push(...goalErrors);
70
+ if (dataWriter.findGoalByTitle) {
71
+ const existing = await dataWriter.findGoalByTitle(goal.title);
72
+ if (existing) {
73
+ conflicts.push({
74
+ type: 'goal',
75
+ existingHash: existing.hash,
76
+ importedTitle: goal.title,
77
+ });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ const statistics = {
83
+ goalsToImport: pkg.goals?.length ?? 0,
84
+ milestonesToImport: opts.importMilestones
85
+ ? pkg.goals?.reduce((sum, g) => sum + (g.milestones?.length ?? 0), 0) ?? 0
86
+ : 0,
87
+ tasksToImport: opts.importTasks
88
+ ? pkg.goals?.reduce((sum, g) => sum + (g.tasks?.length ?? 0), 0) ?? 0
89
+ : 0,
90
+ memoriesToImport: opts.importMemories
91
+ ? pkg.goals?.reduce((sum, g) => sum + (g.memories?.length ?? 0), 0) ?? 0
92
+ : 0,
93
+ metaGoalsToImport: opts.importMetaGoals
94
+ ? pkg.metaGoals?.length ?? 0
95
+ : 0,
96
+ };
97
+ const validation = {
98
+ valid: errors.length === 0,
99
+ errors,
100
+ warnings,
101
+ conflicts,
102
+ statistics,
103
+ };
104
+ this.emit('validation:completed', validation);
105
+ return validation;
106
+ }
107
+ async import(data, dataWriter, options) {
108
+ const opts = { ...this.defaultOptions, ...options };
109
+ const errors = [];
110
+ const warnings = [];
111
+ const imported = [];
112
+ const skipped = [];
113
+ const validation = await this.validate(data, dataWriter, opts);
114
+ if (!validation.valid) {
115
+ return {
116
+ success: false,
117
+ dryRun: opts.dryRun ?? false,
118
+ imported: [],
119
+ skipped: [],
120
+ errors: validation.errors,
121
+ warnings: validation.warnings,
122
+ statistics: this.emptyStatistics(),
123
+ };
124
+ }
125
+ if (opts.validateOnly) {
126
+ return {
127
+ success: true,
128
+ dryRun: true,
129
+ imported: [],
130
+ skipped: [],
131
+ errors: [],
132
+ warnings: validation.warnings,
133
+ statistics: {
134
+ goalsImported: validation.statistics.goalsToImport,
135
+ milestonesImported: validation.statistics.milestonesToImport,
136
+ tasksImported: validation.statistics.tasksToImport,
137
+ memoriesImported: validation.statistics.memoriesToImport,
138
+ metaGoalsImported: validation.statistics.metaGoalsToImport,
139
+ },
140
+ };
141
+ }
142
+ const pkg = typeof data === 'string' ? this.parse(data) : data;
143
+ this.emit('import:started', pkg.goals.length);
144
+ let goalsImported = 0;
145
+ let milestonesImported = 0;
146
+ let tasksImported = 0;
147
+ let memoriesImported = 0;
148
+ let metaGoalsImported = 0;
149
+ for (let i = 0; i < pkg.goals.length; i++) {
150
+ const exportedGoal = pkg.goals[i];
151
+ this.emit('import:progress', i + 1, pkg.goals.length, exportedGoal.title);
152
+ try {
153
+ const conflict = validation.conflicts.find((c) => c.importedTitle === exportedGoal.title);
154
+ if (conflict) {
155
+ this.emit('import:conflict', conflict);
156
+ const resolution = opts.conflictResolution ?? 'skip';
157
+ if (resolution === 'skip') {
158
+ skipped.push(exportedGoal.title);
159
+ continue;
160
+ }
161
+ }
162
+ if (opts.dryRun) {
163
+ goalsImported++;
164
+ milestonesImported += exportedGoal.milestones?.length ?? 0;
165
+ tasksImported += exportedGoal.tasks?.length ?? 0;
166
+ memoriesImported += exportedGoal.memories?.length ?? 0;
167
+ continue;
168
+ }
169
+ const mapping = await this.importGoal(exportedGoal, dataWriter, opts, conflict);
170
+ imported.push(mapping);
171
+ goalsImported++;
172
+ milestonesImported += mapping.milestoneMapping.size;
173
+ tasksImported += mapping.taskMapping.size;
174
+ memoriesImported += mapping.memoryMapping.size;
175
+ }
176
+ catch (error) {
177
+ errors.push(`Failed to import goal "${exportedGoal.title}": ${error instanceof Error ? error.message : String(error)}`);
178
+ this.emit('warning', errors[errors.length - 1]);
179
+ }
180
+ }
181
+ if (opts.importMetaGoals && pkg.metaGoals && dataWriter.createMetaGoal) {
182
+ for (const metaGoal of pkg.metaGoals) {
183
+ try {
184
+ if (!opts.dryRun) {
185
+ await this.importMetaGoal(metaGoal, dataWriter);
186
+ }
187
+ metaGoalsImported++;
188
+ }
189
+ catch (error) {
190
+ warnings.push(`Failed to import meta-goal "${metaGoal.name}": ${error instanceof Error ? error.message : String(error)}`);
191
+ }
192
+ }
193
+ }
194
+ const result = {
195
+ success: errors.length === 0,
196
+ dryRun: opts.dryRun ?? false,
197
+ imported,
198
+ skipped,
199
+ errors,
200
+ warnings,
201
+ statistics: {
202
+ goalsImported,
203
+ milestonesImported,
204
+ tasksImported,
205
+ memoriesImported,
206
+ metaGoalsImported,
207
+ },
208
+ };
209
+ this.emit('import:completed', result);
210
+ return result;
211
+ }
212
+ async importTemplate(data, dataWriter, templateOptions) {
213
+ return this.import(data, dataWriter, {
214
+ mode: 'template',
215
+ conflictResolution: 'rename',
216
+ resetStatus: true,
217
+ prefixTitle: templateOptions?.newTitle,
218
+ });
219
+ }
220
+ validateGoal(goal) {
221
+ const errors = [];
222
+ if (!goal.hash) {
223
+ errors.push('Goal missing hash');
224
+ }
225
+ if (!goal.title) {
226
+ errors.push('Goal missing title');
227
+ }
228
+ if (!goal.status) {
229
+ errors.push('Goal missing status');
230
+ }
231
+ if (goal.milestones) {
232
+ for (let i = 0; i < goal.milestones.length; i++) {
233
+ if (!goal.milestones[i].title) {
234
+ errors.push(`Milestone ${i} missing title`);
235
+ }
236
+ }
237
+ }
238
+ if (goal.tasks) {
239
+ for (let i = 0; i < goal.tasks.length; i++) {
240
+ if (!goal.tasks[i].title) {
241
+ errors.push(`Task ${i} missing title`);
242
+ }
243
+ if (!goal.tasks[i].type) {
244
+ errors.push(`Task ${i} missing type`);
245
+ }
246
+ }
247
+ }
248
+ return errors;
249
+ }
250
+ async importGoal(exported, dataWriter, options, conflict) {
251
+ let title = exported.title;
252
+ if (options.prefixTitle) {
253
+ title = options.prefixTitle;
254
+ }
255
+ else if (conflict && options.conflictResolution === 'rename') {
256
+ title = `${exported.title} (Imported ${new Date().toLocaleDateString()})`;
257
+ }
258
+ const goalInput = {
259
+ name: title,
260
+ description: exported.description,
261
+ priority: exported.priority,
262
+ deadline: exported.deadline,
263
+ approvalMode: exported.approvalMode,
264
+ };
265
+ const newGoal = await dataWriter.createGoal(goalInput);
266
+ const milestoneMapping = new Map();
267
+ const taskMapping = new Map();
268
+ const memoryMapping = new Map();
269
+ if (options.importMilestones && exported.milestones) {
270
+ for (const milestone of exported.milestones) {
271
+ const milestoneInput = {
272
+ title: milestone.title,
273
+ description: milestone.description,
274
+ targetDate: milestone.deadline,
275
+ };
276
+ const newMilestone = await dataWriter.createMilestone(newGoal.hash, milestoneInput);
277
+ milestoneMapping.set(milestone.id, newMilestone.id);
278
+ }
279
+ }
280
+ if (options.importTasks && exported.tasks) {
281
+ for (const task of exported.tasks) {
282
+ const newMilestoneId = task.milestoneId
283
+ ? milestoneMapping.get(task.milestoneId)
284
+ : undefined;
285
+ const taskInput = {
286
+ milestoneId: newMilestoneId,
287
+ title: task.title,
288
+ description: task.description,
289
+ taskType: task.type || 'execute',
290
+ };
291
+ const newTask = await dataWriter.createTask(newGoal.hash, taskInput);
292
+ taskMapping.set(task.id, newTask.id);
293
+ }
294
+ }
295
+ if (options.importMemories && exported.memories) {
296
+ for (const memory of exported.memories) {
297
+ const memoryInput = {
298
+ content: memory.content,
299
+ memoryType: memory.category || 'conversation',
300
+ source: memory.source || 'manual',
301
+ };
302
+ const newMemory = await dataWriter.createMemory(newGoal.hash, memoryInput);
303
+ memoryMapping.set(memory.id, newMemory.id);
304
+ }
305
+ }
306
+ return {
307
+ originalHash: exported.hash,
308
+ newHash: newGoal.hash,
309
+ milestoneMapping,
310
+ taskMapping,
311
+ memoryMapping,
312
+ };
313
+ }
314
+ async importMetaGoal(exported, dataWriter) {
315
+ if (!dataWriter.createMetaGoal)
316
+ return;
317
+ const input = {
318
+ description: exported.description || '',
319
+ priority: exported.priority,
320
+ scope: exported.scope === 'global' ? 'all' : (Array.isArray(exported.scope) ? exported.scope : 'all'),
321
+ };
322
+ await dataWriter.createMetaGoal(input);
323
+ }
324
+ emptyValidationStatistics() {
325
+ return {
326
+ goalsToImport: 0,
327
+ milestonesToImport: 0,
328
+ tasksToImport: 0,
329
+ memoriesToImport: 0,
330
+ metaGoalsToImport: 0,
331
+ };
332
+ }
333
+ emptyStatistics() {
334
+ return {
335
+ goalsImported: 0,
336
+ milestonesImported: 0,
337
+ tasksImported: 0,
338
+ memoriesImported: 0,
339
+ metaGoalsImported: 0,
340
+ };
341
+ }
342
+ }
343
+ export function createGoalImporter(options) {
344
+ return new GoalImporter(options);
345
+ }
@@ -0,0 +1,110 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { Goal, GoalHash, Milestone, Task, GoalMemory, MetaGoal, GoalActionLog, GoalProgress, CreateGoalInput, UpdateGoalInput, CreateMilestoneInput, UpdateMilestoneInput, CreateTaskInput, UpdateTaskInput, CreateMemoryInput, UpdateMemoryInput, CreateMetaGoalInput, UpdateMetaGoalInput, TaskFeedbackInput, TaskFailInput, Logger } from './types.js';
3
+ import { type GoalApiClientOptions, type TokenProvider, type ApiListOptions } from './GoalApiClient.js';
4
+ import { type GoalValidationConstraints } from './GoalValidator.js';
5
+ import { type GoalCacheOptions, type CacheStats } from './GoalCache.js';
6
+ export interface GoalManagerEvents {
7
+ goalCreated: [goal: Goal];
8
+ goalUpdated: [goal: Goal];
9
+ goalPaused: [goal: Goal];
10
+ goalResumed: [goal: Goal];
11
+ goalCompleted: [goal: Goal];
12
+ goalAbandoned: [goal: Goal];
13
+ goalDeleted: [hash: GoalHash];
14
+ milestoneCreated: [goalHash: GoalHash, milestone: Milestone];
15
+ milestoneUpdated: [goalHash: GoalHash, milestone: Milestone];
16
+ milestoneCompleted: [goalHash: GoalHash, milestone: Milestone];
17
+ milestoneDeleted: [goalHash: GoalHash, milestoneId: number];
18
+ taskCreated: [goalHash: GoalHash, task: Task];
19
+ taskUpdated: [goalHash: GoalHash, task: Task];
20
+ taskStatusChanged: [goalHash: GoalHash, task: Task, previousStatus: string];
21
+ taskDeleted: [goalHash: GoalHash, taskId: number];
22
+ memoryCreated: [goalHash: GoalHash, memory: GoalMemory];
23
+ memoryUpdated: [goalHash: GoalHash, memory: GoalMemory];
24
+ memoryDeleted: [goalHash: GoalHash, memoryId: number];
25
+ metaGoalCreated: [metaGoal: MetaGoal];
26
+ metaGoalUpdated: [metaGoal: MetaGoal];
27
+ metaGoalToggled: [metaGoal: MetaGoal];
28
+ metaGoalDeleted: [id: number];
29
+ cacheInvalidated: [type: string];
30
+ error: [error: Error];
31
+ }
32
+ export interface GoalManagerOptions {
33
+ readonly baseUrl: string;
34
+ readonly tokenProvider: TokenProvider;
35
+ readonly apiOptions?: Partial<Omit<GoalApiClientOptions, 'baseUrl' | 'tokenProvider'>>;
36
+ readonly validationConstraints?: Partial<GoalValidationConstraints>;
37
+ readonly cacheOptions?: GoalCacheOptions;
38
+ readonly logger?: Logger;
39
+ }
40
+ export interface GoalManagerStats {
41
+ readonly cache: CacheStats;
42
+ readonly apiCalls: number;
43
+ readonly goalsLoaded: number;
44
+ }
45
+ export declare class GoalManager extends EventEmitter<GoalManagerEvents> {
46
+ private readonly apiClient;
47
+ private readonly validator;
48
+ private readonly cache;
49
+ private readonly logger;
50
+ private apiCallCount;
51
+ private loadedGoals;
52
+ constructor(options: GoalManagerOptions);
53
+ initialize(): Promise<void>;
54
+ listGoals(options?: ApiListOptions & {
55
+ forceRefresh?: boolean;
56
+ }): Promise<Goal[]>;
57
+ getGoal(hash: GoalHash, forceRefresh?: boolean): Promise<Goal>;
58
+ createGoal(input: CreateGoalInput): Promise<Goal>;
59
+ updateGoal(hash: GoalHash, input: UpdateGoalInput): Promise<Goal>;
60
+ deleteGoal(hash: GoalHash): Promise<void>;
61
+ pauseGoal(hash: GoalHash): Promise<Goal>;
62
+ resumeGoal(hash: GoalHash): Promise<Goal>;
63
+ completeGoal(hash: GoalHash): Promise<Goal>;
64
+ abandonGoal(hash: GoalHash): Promise<Goal>;
65
+ getGoalProgress(hash: GoalHash): Promise<GoalProgress>;
66
+ listMilestones(goalHash: GoalHash, forceRefresh?: boolean): Promise<Milestone[]>;
67
+ createMilestone(goalHash: GoalHash, input: CreateMilestoneInput): Promise<Milestone>;
68
+ getMilestone(goalHash: GoalHash, milestoneId: number): Promise<Milestone>;
69
+ updateMilestone(goalHash: GoalHash, milestoneId: number, input: UpdateMilestoneInput): Promise<Milestone>;
70
+ deleteMilestone(goalHash: GoalHash, milestoneId: number): Promise<void>;
71
+ completeMilestone(goalHash: GoalHash, milestoneId: number): Promise<Milestone>;
72
+ listTasks(goalHash: GoalHash, options?: ApiListOptions & {
73
+ forceRefresh?: boolean;
74
+ }): Promise<Task[]>;
75
+ getPendingTasks(): Promise<Task[]>;
76
+ getTasksAwaitingApproval(): Promise<Task[]>;
77
+ createTask(goalHash: GoalHash, input: CreateTaskInput): Promise<Task>;
78
+ getTask(goalHash: GoalHash, taskId: number): Promise<Task>;
79
+ updateTask(goalHash: GoalHash, taskId: number, input: UpdateTaskInput): Promise<Task>;
80
+ deleteTask(goalHash: GoalHash, taskId: number): Promise<void>;
81
+ approveTask(goalHash: GoalHash, taskId: number): Promise<Task>;
82
+ denyTask(goalHash: GoalHash, taskId: number): Promise<Task>;
83
+ startTask(goalHash: GoalHash, taskId: number): Promise<Task>;
84
+ completeTask(goalHash: GoalHash, taskId: number, result?: Record<string, unknown>): Promise<Task>;
85
+ failTask(goalHash: GoalHash, taskId: number, input: TaskFailInput): Promise<Task>;
86
+ skipTask(goalHash: GoalHash, taskId: number): Promise<Task>;
87
+ addTaskFeedback(goalHash: GoalHash, taskId: number, input: TaskFeedbackInput): Promise<Task>;
88
+ listMemories(goalHash: GoalHash, forceRefresh?: boolean): Promise<GoalMemory[]>;
89
+ getEnabledMemories(goalHash: GoalHash): Promise<GoalMemory[]>;
90
+ createMemory(goalHash: GoalHash, input: CreateMemoryInput): Promise<GoalMemory>;
91
+ updateMemory(goalHash: GoalHash, memoryId: number, input: UpdateMemoryInput): Promise<GoalMemory>;
92
+ toggleMemory(goalHash: GoalHash, memoryId: number): Promise<GoalMemory>;
93
+ deleteMemory(goalHash: GoalHash, memoryId: number): Promise<void>;
94
+ listMetaGoals(active?: boolean, forceRefresh?: boolean): Promise<MetaGoal[]>;
95
+ getMetaGoalsForGoal(goalHash: GoalHash): Promise<MetaGoal[]>;
96
+ createMetaGoal(input: CreateMetaGoalInput): Promise<MetaGoal>;
97
+ getMetaGoal(id: number): Promise<MetaGoal>;
98
+ updateMetaGoal(id: number, input: UpdateMetaGoalInput): Promise<MetaGoal>;
99
+ toggleMetaGoal(id: number): Promise<MetaGoal>;
100
+ deleteMetaGoal(id: number): Promise<void>;
101
+ getActionLogs(goalHash: GoalHash, limit?: number): Promise<GoalActionLog[]>;
102
+ clearCache(): void;
103
+ pruneCache(): number;
104
+ getCacheStats(): CacheStats;
105
+ getStats(): GoalManagerStats;
106
+ resetStats(): void;
107
+ private validateNoDependencyCycle;
108
+ private hasCycleDFS;
109
+ }
110
+ export declare function createGoalManager(options: GoalManagerOptions): GoalManager;