mcp-agent-foundry 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.
- package/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/cli/install-skills.d.ts +11 -0
- package/dist/cli/install-skills.d.ts.map +1 -0
- package/dist/cli/install-skills.js +143 -0
- package/dist/cli/install-skills.js.map +1 -0
- package/dist/cli/recovery-commands.d.ts +41 -0
- package/dist/cli/recovery-commands.d.ts.map +1 -0
- package/dist/cli/recovery-commands.js +241 -0
- package/dist/cli/recovery-commands.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +25 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +1417 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/test-connection.d.ts +45 -0
- package/dist/cli/test-connection.d.ts.map +1 -0
- package/dist/cli/test-connection.js +317 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli.d.ts +75 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +704 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +99 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +184 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +347 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/merger.d.ts +76 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +189 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/schema.d.ts +20 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +20 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +254 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +363 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/config/worktree-defaults.d.ts +23 -0
- package/dist/config/worktree-defaults.d.ts.map +1 -0
- package/dist/config/worktree-defaults.js +78 -0
- package/dist/config/worktree-defaults.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools/compare-agents.d.ts +25 -0
- package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
- package/dist/mcp/tools/compare-agents.js +177 -0
- package/dist/mcp/tools/compare-agents.js.map +1 -0
- package/dist/mcp/tools/critique-plan.d.ts +26 -0
- package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
- package/dist/mcp/tools/critique-plan.js +162 -0
- package/dist/mcp/tools/critique-plan.js.map +1 -0
- package/dist/mcp/tools/design-feedback.d.ts +26 -0
- package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
- package/dist/mcp/tools/design-feedback.js +216 -0
- package/dist/mcp/tools/design-feedback.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +50 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +191 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/invoke-agent.d.ts +25 -0
- package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
- package/dist/mcp/tools/invoke-agent.js +141 -0
- package/dist/mcp/tools/invoke-agent.js.map +1 -0
- package/dist/mcp/tools/review-code.d.ts +25 -0
- package/dist/mcp/tools/review-code.d.ts.map +1 -0
- package/dist/mcp/tools/review-code.js +170 -0
- package/dist/mcp/tools/review-code.js.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
- package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
- package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.js +284 -0
- package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
- package/dist/mcp/tools/tasks/index.d.ts +36 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/index.js +66 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
- package/dist/mcp/tools/worktree/index.d.ts +41 -0
- package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/index.js +69 -0
- package/dist/mcp/tools/worktree/index.js.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
- package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
- package/dist/mcp/transport/stdio.d.ts +13 -0
- package/dist/mcp/transport/stdio.d.ts.map +1 -0
- package/dist/mcp/transport/stdio.js +15 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/observability/logger.d.ts +137 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +235 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +250 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +364 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/persistence/index.d.ts +9 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +9 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/state-schema.d.ts +116 -0
- package/dist/persistence/state-schema.d.ts.map +1 -0
- package/dist/persistence/state-schema.js +28 -0
- package/dist/persistence/state-schema.js.map +1 -0
- package/dist/persistence/state-store.d.ts +111 -0
- package/dist/persistence/state-store.d.ts.map +1 -0
- package/dist/persistence/state-store.js +291 -0
- package/dist/persistence/state-store.js.map +1 -0
- package/dist/providers/anthropic.d.ts +164 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +500 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +151 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +227 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +85 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +414 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/kimi.d.ts +19 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +20 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/manager.d.ts +160 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +264 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/ollama.d.ts +83 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +453 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +96 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +457 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +19 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +20 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/router/context-manager.d.ts +2 -0
- package/dist/router/context-manager.d.ts.map +1 -0
- package/dist/router/context-manager.js +3 -0
- package/dist/router/context-manager.js.map +1 -0
- package/dist/router/engine.d.ts +169 -0
- package/dist/router/engine.d.ts.map +1 -0
- package/dist/router/engine.js +435 -0
- package/dist/router/engine.js.map +1 -0
- package/dist/router/pattern-executor.d.ts +317 -0
- package/dist/router/pattern-executor.d.ts.map +1 -0
- package/dist/router/pattern-executor.js +571 -0
- package/dist/router/pattern-executor.js.map +1 -0
- package/dist/router/role-resolver.d.ts +59 -0
- package/dist/router/role-resolver.d.ts.map +1 -0
- package/dist/router/role-resolver.js +95 -0
- package/dist/router/role-resolver.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/startup.d.ts +78 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +107 -0
- package/dist/startup.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +141 -0
- package/dist/tasks/coordinator.d.ts.map +1 -0
- package/dist/tasks/coordinator.js +331 -0
- package/dist/tasks/coordinator.js.map +1 -0
- package/dist/tasks/index.d.ts +13 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +13 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
- package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
- package/dist/tasks/persistent-state-coordinator.js +371 -0
- package/dist/tasks/persistent-state-coordinator.js.map +1 -0
- package/dist/tasks/pipeline-manager.d.ts +103 -0
- package/dist/tasks/pipeline-manager.d.ts.map +1 -0
- package/dist/tasks/pipeline-manager.js +358 -0
- package/dist/tasks/pipeline-manager.js.map +1 -0
- package/dist/tasks/state-coordinator.d.ts +79 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -0
- package/dist/tasks/state-coordinator.js +200 -0
- package/dist/tasks/state-coordinator.js.map +1 -0
- package/dist/tasks/worker-mode.d.ts +65 -0
- package/dist/tasks/worker-mode.d.ts.map +1 -0
- package/dist/tasks/worker-mode.js +208 -0
- package/dist/tasks/worker-mode.js.map +1 -0
- package/dist/translation/errors.d.ts +203 -0
- package/dist/translation/errors.d.ts.map +1 -0
- package/dist/translation/errors.js +477 -0
- package/dist/translation/errors.js.map +1 -0
- package/dist/translation/index.d.ts +12 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +32 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/messages.d.ts +295 -0
- package/dist/translation/messages.d.ts.map +1 -0
- package/dist/translation/messages.js +557 -0
- package/dist/translation/messages.js.map +1 -0
- package/dist/translation/streaming.d.ts +226 -0
- package/dist/translation/streaming.d.ts.map +1 -0
- package/dist/translation/streaming.js +520 -0
- package/dist/translation/streaming.js.map +1 -0
- package/dist/translation/tools.d.ts +209 -0
- package/dist/translation/tools.d.ts.map +1 -0
- package/dist/translation/tools.js +331 -0
- package/dist/translation/tools.js.map +1 -0
- package/dist/types.d.ts +747 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +175 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +315 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +3 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/git.d.ts +58 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +197 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge-ordering.d.ts +45 -0
- package/dist/utils/merge-ordering.d.ts.map +1 -0
- package/dist/utils/merge-ordering.js +128 -0
- package/dist/utils/merge-ordering.js.map +1 -0
- package/dist/utils/retry.d.ts +106 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +188 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/worktrees/branch-manager.d.ts +55 -0
- package/dist/worktrees/branch-manager.d.ts.map +1 -0
- package/dist/worktrees/branch-manager.js +129 -0
- package/dist/worktrees/branch-manager.js.map +1 -0
- package/dist/worktrees/conflict-handler.d.ts +72 -0
- package/dist/worktrees/conflict-handler.d.ts.map +1 -0
- package/dist/worktrees/conflict-handler.js +287 -0
- package/dist/worktrees/conflict-handler.js.map +1 -0
- package/dist/worktrees/conflict-parser.d.ts +28 -0
- package/dist/worktrees/conflict-parser.d.ts.map +1 -0
- package/dist/worktrees/conflict-parser.js +140 -0
- package/dist/worktrees/conflict-parser.js.map +1 -0
- package/dist/worktrees/index.d.ts +20 -0
- package/dist/worktrees/index.d.ts.map +1 -0
- package/dist/worktrees/index.js +20 -0
- package/dist/worktrees/index.js.map +1 -0
- package/dist/worktrees/instructions.d.ts +20 -0
- package/dist/worktrees/instructions.d.ts.map +1 -0
- package/dist/worktrees/instructions.js +84 -0
- package/dist/worktrees/instructions.js.map +1 -0
- package/dist/worktrees/manager.d.ts +76 -0
- package/dist/worktrees/manager.d.ts.map +1 -0
- package/dist/worktrees/manager.js +277 -0
- package/dist/worktrees/manager.js.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
- package/dist/worktrees/pool.d.ts +95 -0
- package/dist/worktrees/pool.d.ts.map +1 -0
- package/dist/worktrees/pool.js +271 -0
- package/dist/worktrees/pool.js.map +1 -0
- package/dist/worktrees/recovery.d.ts +94 -0
- package/dist/worktrees/recovery.d.ts.map +1 -0
- package/dist/worktrees/recovery.js +371 -0
- package/dist/worktrees/recovery.js.map +1 -0
- package/dist/worktrees/resource-manager.d.ts +74 -0
- package/dist/worktrees/resource-manager.d.ts.map +1 -0
- package/dist/worktrees/resource-manager.js +228 -0
- package/dist/worktrees/resource-manager.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema for persisted Agent Foundry state
|
|
3
|
+
*
|
|
4
|
+
* Defines the structure of state that is saved to disk and survives
|
|
5
|
+
* server restarts. All state is stored in .agent-foundry/state.json.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Persisted state for a task execution.
|
|
9
|
+
*/
|
|
10
|
+
export interface PersistedTaskState {
|
|
11
|
+
/** Claude Code task ID */
|
|
12
|
+
taskId: string;
|
|
13
|
+
/** Agent role used for execution */
|
|
14
|
+
role: string;
|
|
15
|
+
/** Current execution status */
|
|
16
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
17
|
+
/** Associated worktree ID (if using worktree isolation) */
|
|
18
|
+
worktreeId?: string;
|
|
19
|
+
/** Task creation timestamp */
|
|
20
|
+
createdAt: number;
|
|
21
|
+
/** Last update timestamp */
|
|
22
|
+
updatedAt: number;
|
|
23
|
+
/** Error message on failure */
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Persisted state for a git worktree.
|
|
28
|
+
*/
|
|
29
|
+
export interface PersistedWorktreeState {
|
|
30
|
+
/** Unique worktree identifier */
|
|
31
|
+
id: string;
|
|
32
|
+
/** Filesystem path to the worktree */
|
|
33
|
+
path: string;
|
|
34
|
+
/** Branch name in the worktree */
|
|
35
|
+
branch: string;
|
|
36
|
+
/** Base branch the worktree was created from */
|
|
37
|
+
baseBranch: string;
|
|
38
|
+
/** Current worktree status */
|
|
39
|
+
status: 'available' | 'assigned' | 'active' | 'completing' | 'conflict' | 'stale';
|
|
40
|
+
/** Associated task ID (if assigned) */
|
|
41
|
+
taskId?: string;
|
|
42
|
+
/** Agent ID using this worktree */
|
|
43
|
+
agentId?: string;
|
|
44
|
+
/** Worktree creation timestamp */
|
|
45
|
+
createdAt: number;
|
|
46
|
+
/** Last activity timestamp */
|
|
47
|
+
lastActivityAt: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Persisted state for a merge conflict.
|
|
51
|
+
*/
|
|
52
|
+
export interface PersistedConflictState {
|
|
53
|
+
/** Task ID that encountered the conflict */
|
|
54
|
+
taskId: string;
|
|
55
|
+
/** Worktree ID where conflict occurred */
|
|
56
|
+
worktreeId: string;
|
|
57
|
+
/** List of conflicted file paths */
|
|
58
|
+
files: string[];
|
|
59
|
+
/** Whether the conflict has been resolved */
|
|
60
|
+
resolved: boolean;
|
|
61
|
+
/** Resolution strategy used (if resolved) */
|
|
62
|
+
strategy?: string;
|
|
63
|
+
/** Conflict detection timestamp */
|
|
64
|
+
detectedAt: number;
|
|
65
|
+
/** Resolution timestamp (if resolved) */
|
|
66
|
+
resolvedAt?: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Persisted state for a multi-step pipeline.
|
|
70
|
+
*/
|
|
71
|
+
export interface PersistedPipelineState {
|
|
72
|
+
/** Unique pipeline execution ID */
|
|
73
|
+
pipelineId: string;
|
|
74
|
+
/** Pipeline name */
|
|
75
|
+
name: string;
|
|
76
|
+
/** Current pipeline status */
|
|
77
|
+
status: 'pending' | 'running' | 'completed' | 'failed';
|
|
78
|
+
/** List of completed step names */
|
|
79
|
+
completedSteps: string[];
|
|
80
|
+
/** Mapping from step name to worktree ID */
|
|
81
|
+
stepWorktrees: Record<string, string>;
|
|
82
|
+
/** Pipeline creation timestamp */
|
|
83
|
+
createdAt: number;
|
|
84
|
+
/** Last update timestamp */
|
|
85
|
+
updatedAt: number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Root persisted state structure.
|
|
89
|
+
* This is the complete state saved to .agent-foundry/state.json.
|
|
90
|
+
*/
|
|
91
|
+
export interface PersistedState {
|
|
92
|
+
/** State schema version for migrations */
|
|
93
|
+
version: string;
|
|
94
|
+
/** Timestamp of last save */
|
|
95
|
+
lastSavedAt: number;
|
|
96
|
+
/** SHA-256 checksum (first 16 chars) for corruption detection */
|
|
97
|
+
checksum?: string;
|
|
98
|
+
/** All persisted tasks */
|
|
99
|
+
tasks: PersistedTaskState[];
|
|
100
|
+
/** All persisted worktrees */
|
|
101
|
+
worktrees: PersistedWorktreeState[];
|
|
102
|
+
/** All persisted conflicts */
|
|
103
|
+
conflicts: PersistedConflictState[];
|
|
104
|
+
/** All persisted pipelines */
|
|
105
|
+
pipelines: PersistedPipelineState[];
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Current state schema version.
|
|
109
|
+
* Increment when making breaking changes to the schema.
|
|
110
|
+
*/
|
|
111
|
+
export declare const CURRENT_STATE_VERSION = "1.0.0";
|
|
112
|
+
/**
|
|
113
|
+
* Create an empty state object with default values.
|
|
114
|
+
*/
|
|
115
|
+
export declare function createEmptyState(): PersistedState;
|
|
116
|
+
//# sourceMappingURL=state-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-schema.d.ts","sourceRoot":"","sources":["../../src/persistence/state-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,MAAM,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAClF,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,mCAAmC;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,8BAA8B;IAC9B,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,8BAA8B;IAC9B,SAAS,EAAE,sBAAsB,EAAE,CAAC;IACpC,8BAA8B;IAC9B,SAAS,EAAE,sBAAsB,EAAE,CAAC;CACrC;AAMD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,cAAc,CASjD"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema for persisted Agent Foundry state
|
|
3
|
+
*
|
|
4
|
+
* Defines the structure of state that is saved to disk and survives
|
|
5
|
+
* server restarts. All state is stored in .agent-foundry/state.json.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Constants and Utilities
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Current state schema version.
|
|
12
|
+
* Increment when making breaking changes to the schema.
|
|
13
|
+
*/
|
|
14
|
+
export const CURRENT_STATE_VERSION = '1.0.0';
|
|
15
|
+
/**
|
|
16
|
+
* Create an empty state object with default values.
|
|
17
|
+
*/
|
|
18
|
+
export function createEmptyState() {
|
|
19
|
+
return {
|
|
20
|
+
version: CURRENT_STATE_VERSION,
|
|
21
|
+
lastSavedAt: Date.now(),
|
|
22
|
+
tasks: [],
|
|
23
|
+
worktrees: [],
|
|
24
|
+
conflicts: [],
|
|
25
|
+
pipelines: [],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=state-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-schema.js","sourceRoot":"","sources":["../../src/persistence/state-schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+HH,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,KAAK,EAAE,EAAE;QACT,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;QACb,SAAS,EAAE,EAAE;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Store - Atomic JSON file persistence
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Atomic writes (write to temp file, then rename)
|
|
6
|
+
* - Checksum validation for corruption detection
|
|
7
|
+
* - Debounced saves to avoid excessive I/O
|
|
8
|
+
* - Graceful degradation on errors
|
|
9
|
+
* - Backup file for recovery from corruption
|
|
10
|
+
*/
|
|
11
|
+
import { PersistedState } from './state-schema.js';
|
|
12
|
+
/**
|
|
13
|
+
* Configuration options for the StateStore.
|
|
14
|
+
*/
|
|
15
|
+
export interface StateStoreConfig {
|
|
16
|
+
/** Directory for state files (default: .agent-foundry/) */
|
|
17
|
+
stateDir: string;
|
|
18
|
+
/** State file name (default: state.json) */
|
|
19
|
+
filename: string;
|
|
20
|
+
/** Debounce interval in milliseconds (default: 1000) */
|
|
21
|
+
debounceMs: number;
|
|
22
|
+
/** Enable checksum validation (default: true) */
|
|
23
|
+
enableChecksum: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Manages persisted state with atomic writes and corruption detection.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const store = new StateStore({ stateDir: '.agent-foundry' });
|
|
31
|
+
* await store.initialize('/path/to/repo');
|
|
32
|
+
*
|
|
33
|
+
* store.updateState((state) => {
|
|
34
|
+
* state.tasks.push({ taskId: '123', ... });
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* await store.shutdown('/path/to/repo');
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class StateStore {
|
|
41
|
+
private config;
|
|
42
|
+
private state;
|
|
43
|
+
private saveTimer;
|
|
44
|
+
private dirty;
|
|
45
|
+
private saving;
|
|
46
|
+
private repoPath;
|
|
47
|
+
constructor(config?: Partial<StateStoreConfig>);
|
|
48
|
+
/**
|
|
49
|
+
* Get the relative path to the state file.
|
|
50
|
+
*/
|
|
51
|
+
get statePath(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Get the relative path to the temp file (used during atomic writes).
|
|
54
|
+
*/
|
|
55
|
+
get tempPath(): string;
|
|
56
|
+
/**
|
|
57
|
+
* Get the relative path to the backup file.
|
|
58
|
+
*/
|
|
59
|
+
get backupPath(): string;
|
|
60
|
+
/**
|
|
61
|
+
* Initialize the state store - load existing state or create new.
|
|
62
|
+
*
|
|
63
|
+
* @param repoPath - Absolute path to the repository root
|
|
64
|
+
*/
|
|
65
|
+
initialize(repoPath: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Load state from backup file.
|
|
68
|
+
*/
|
|
69
|
+
private loadBackup;
|
|
70
|
+
/**
|
|
71
|
+
* Migrate state from an older version to current.
|
|
72
|
+
*/
|
|
73
|
+
private migrateState;
|
|
74
|
+
/**
|
|
75
|
+
* Compute a checksum for state data.
|
|
76
|
+
*/
|
|
77
|
+
private computeChecksum;
|
|
78
|
+
/**
|
|
79
|
+
* Get current state (read-only copy).
|
|
80
|
+
*/
|
|
81
|
+
getState(): Readonly<PersistedState>;
|
|
82
|
+
/**
|
|
83
|
+
* Update state and schedule save.
|
|
84
|
+
*
|
|
85
|
+
* @param updater - Function that modifies the state in-place
|
|
86
|
+
*/
|
|
87
|
+
updateState(updater: (state: PersistedState) => void): void;
|
|
88
|
+
/**
|
|
89
|
+
* Schedule a debounced save.
|
|
90
|
+
*/
|
|
91
|
+
private scheduleSave;
|
|
92
|
+
/**
|
|
93
|
+
* Force immediate save (bypasses debounce).
|
|
94
|
+
*
|
|
95
|
+
* @param repoPath - Optional repo path (uses cached path if not provided)
|
|
96
|
+
*/
|
|
97
|
+
saveNow(repoPath?: string): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Perform atomic save.
|
|
100
|
+
*
|
|
101
|
+
* @param repoPath - Optional repo path (uses cached path if not provided)
|
|
102
|
+
*/
|
|
103
|
+
private save;
|
|
104
|
+
/**
|
|
105
|
+
* Shutdown - ensure final save.
|
|
106
|
+
*
|
|
107
|
+
* @param repoPath - Path to the repository root
|
|
108
|
+
*/
|
|
109
|
+
shutdown(repoPath: string): Promise<void>;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=state-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/persistence/state-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EACL,cAAc,EAGf,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,cAAc,EAAE,OAAO,CAAC;CACzB;AAQD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAc;gBAElB,MAAM,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAelD;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAMD;;;;OAIG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEjD;;OAEG;YACW,UAAU;IAUxB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,QAAQ,IAAI,QAAQ,CAAC,cAAc,CAAC;IAIpC;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAW3D;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;;;OAIG;IACG,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C;;;;OAIG;YACW,IAAI;IAgDlB;;;;OAIG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUhD"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Store - Atomic JSON file persistence
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Atomic writes (write to temp file, then rename)
|
|
6
|
+
* - Checksum validation for corruption detection
|
|
7
|
+
* - Debounced saves to avoid excessive I/O
|
|
8
|
+
* - Graceful degradation on errors
|
|
9
|
+
* - Backup file for recovery from corruption
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'crypto';
|
|
12
|
+
import { promises as fs } from 'fs';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
import { createLogger } from '../observability/logger.js';
|
|
15
|
+
import { CURRENT_STATE_VERSION, createEmptyState, } from './state-schema.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// StateStore Class
|
|
18
|
+
// ============================================================================
|
|
19
|
+
const logger = createLogger({ name: 'state-store' });
|
|
20
|
+
/**
|
|
21
|
+
* Manages persisted state with atomic writes and corruption detection.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const store = new StateStore({ stateDir: '.agent-foundry' });
|
|
26
|
+
* await store.initialize('/path/to/repo');
|
|
27
|
+
*
|
|
28
|
+
* store.updateState((state) => {
|
|
29
|
+
* state.tasks.push({ taskId: '123', ... });
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* await store.shutdown('/path/to/repo');
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class StateStore {
|
|
36
|
+
config;
|
|
37
|
+
state;
|
|
38
|
+
saveTimer = null;
|
|
39
|
+
dirty = false;
|
|
40
|
+
saving = false;
|
|
41
|
+
repoPath = '';
|
|
42
|
+
constructor(config = {}) {
|
|
43
|
+
this.config = {
|
|
44
|
+
stateDir: '.agent-foundry',
|
|
45
|
+
filename: 'state.json',
|
|
46
|
+
debounceMs: 1000,
|
|
47
|
+
enableChecksum: true,
|
|
48
|
+
...config,
|
|
49
|
+
};
|
|
50
|
+
this.state = createEmptyState();
|
|
51
|
+
}
|
|
52
|
+
// ==========================================================================
|
|
53
|
+
// Path Helpers
|
|
54
|
+
// ==========================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Get the relative path to the state file.
|
|
57
|
+
*/
|
|
58
|
+
get statePath() {
|
|
59
|
+
return path.join(this.config.stateDir, this.config.filename);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the relative path to the temp file (used during atomic writes).
|
|
63
|
+
*/
|
|
64
|
+
get tempPath() {
|
|
65
|
+
return path.join(this.config.stateDir, `${this.config.filename}.tmp`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the relative path to the backup file.
|
|
69
|
+
*/
|
|
70
|
+
get backupPath() {
|
|
71
|
+
return path.join(this.config.stateDir, `${this.config.filename}.backup`);
|
|
72
|
+
}
|
|
73
|
+
// ==========================================================================
|
|
74
|
+
// Initialization
|
|
75
|
+
// ==========================================================================
|
|
76
|
+
/**
|
|
77
|
+
* Initialize the state store - load existing state or create new.
|
|
78
|
+
*
|
|
79
|
+
* @param repoPath - Absolute path to the repository root
|
|
80
|
+
*/
|
|
81
|
+
async initialize(repoPath) {
|
|
82
|
+
this.repoPath = repoPath;
|
|
83
|
+
const fullStateDir = path.join(repoPath, this.config.stateDir);
|
|
84
|
+
const fullStatePath = path.join(repoPath, this.statePath);
|
|
85
|
+
// Ensure state directory exists
|
|
86
|
+
await fs.mkdir(fullStateDir, { recursive: true });
|
|
87
|
+
try {
|
|
88
|
+
const content = await fs.readFile(fullStatePath, 'utf-8');
|
|
89
|
+
const loaded = JSON.parse(content);
|
|
90
|
+
// Validate checksum if enabled
|
|
91
|
+
if (this.config.enableChecksum && loaded.checksum) {
|
|
92
|
+
const dataForChecksum = { ...loaded, checksum: undefined };
|
|
93
|
+
const expectedChecksum = this.computeChecksum(dataForChecksum);
|
|
94
|
+
if (loaded.checksum !== expectedChecksum) {
|
|
95
|
+
logger.warn('State checksum mismatch, state may be corrupted', {
|
|
96
|
+
expected: expectedChecksum,
|
|
97
|
+
actual: loaded.checksum,
|
|
98
|
+
});
|
|
99
|
+
// Try backup
|
|
100
|
+
const backupState = await this.loadBackup(repoPath);
|
|
101
|
+
if (backupState) {
|
|
102
|
+
this.state = backupState;
|
|
103
|
+
logger.info('Recovered state from backup');
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Version migration if needed
|
|
109
|
+
if (loaded.version !== CURRENT_STATE_VERSION) {
|
|
110
|
+
this.state = this.migrateState(loaded);
|
|
111
|
+
logger.info('Migrated state version', {
|
|
112
|
+
from: loaded.version,
|
|
113
|
+
to: CURRENT_STATE_VERSION,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
this.state = loaded;
|
|
118
|
+
}
|
|
119
|
+
logger.info('State loaded', {
|
|
120
|
+
tasks: this.state.tasks.length,
|
|
121
|
+
worktrees: this.state.worktrees.length,
|
|
122
|
+
pipelines: this.state.pipelines.length,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error.code === 'ENOENT') {
|
|
127
|
+
logger.info('No existing state file, starting fresh');
|
|
128
|
+
this.state = createEmptyState();
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
logger.error('Failed to load state, trying backup', {
|
|
132
|
+
error: error instanceof Error ? error : undefined,
|
|
133
|
+
});
|
|
134
|
+
const backupState = await this.loadBackup(repoPath);
|
|
135
|
+
if (backupState) {
|
|
136
|
+
this.state = backupState;
|
|
137
|
+
logger.info('Recovered state from backup');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
logger.warn('No backup available, starting fresh');
|
|
141
|
+
this.state = createEmptyState();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Load state from backup file.
|
|
148
|
+
*/
|
|
149
|
+
async loadBackup(repoPath) {
|
|
150
|
+
try {
|
|
151
|
+
const fullBackupPath = path.join(repoPath, this.backupPath);
|
|
152
|
+
const content = await fs.readFile(fullBackupPath, 'utf-8');
|
|
153
|
+
return JSON.parse(content);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Migrate state from an older version to current.
|
|
161
|
+
*/
|
|
162
|
+
migrateState(oldState) {
|
|
163
|
+
// Future: handle version migrations here
|
|
164
|
+
// For now, just update the version
|
|
165
|
+
return {
|
|
166
|
+
...oldState,
|
|
167
|
+
version: CURRENT_STATE_VERSION,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Compute a checksum for state data.
|
|
172
|
+
*/
|
|
173
|
+
computeChecksum(data) {
|
|
174
|
+
// Sort keys for consistent hashing
|
|
175
|
+
const json = JSON.stringify(data, Object.keys(data).sort());
|
|
176
|
+
return createHash('sha256').update(json).digest('hex').slice(0, 16);
|
|
177
|
+
}
|
|
178
|
+
// ==========================================================================
|
|
179
|
+
// State Access
|
|
180
|
+
// ==========================================================================
|
|
181
|
+
/**
|
|
182
|
+
* Get current state (read-only copy).
|
|
183
|
+
*/
|
|
184
|
+
getState() {
|
|
185
|
+
return this.state;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Update state and schedule save.
|
|
189
|
+
*
|
|
190
|
+
* @param updater - Function that modifies the state in-place
|
|
191
|
+
*/
|
|
192
|
+
updateState(updater) {
|
|
193
|
+
updater(this.state);
|
|
194
|
+
this.state.lastSavedAt = Date.now();
|
|
195
|
+
this.dirty = true;
|
|
196
|
+
this.scheduleSave();
|
|
197
|
+
}
|
|
198
|
+
// ==========================================================================
|
|
199
|
+
// Save Management
|
|
200
|
+
// ==========================================================================
|
|
201
|
+
/**
|
|
202
|
+
* Schedule a debounced save.
|
|
203
|
+
*/
|
|
204
|
+
scheduleSave() {
|
|
205
|
+
if (this.saveTimer) {
|
|
206
|
+
return; // Already scheduled
|
|
207
|
+
}
|
|
208
|
+
this.saveTimer = setTimeout(() => {
|
|
209
|
+
this.saveTimer = null;
|
|
210
|
+
this.save().catch((error) => {
|
|
211
|
+
logger.error('Failed to save state', {
|
|
212
|
+
error: error instanceof Error ? error : undefined,
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}, this.config.debounceMs);
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Force immediate save (bypasses debounce).
|
|
219
|
+
*
|
|
220
|
+
* @param repoPath - Optional repo path (uses cached path if not provided)
|
|
221
|
+
*/
|
|
222
|
+
async saveNow(repoPath) {
|
|
223
|
+
if (this.saveTimer) {
|
|
224
|
+
clearTimeout(this.saveTimer);
|
|
225
|
+
this.saveTimer = null;
|
|
226
|
+
}
|
|
227
|
+
await this.save(repoPath);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Perform atomic save.
|
|
231
|
+
*
|
|
232
|
+
* @param repoPath - Optional repo path (uses cached path if not provided)
|
|
233
|
+
*/
|
|
234
|
+
async save(repoPath) {
|
|
235
|
+
if (!this.dirty || this.saving) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
this.saving = true;
|
|
239
|
+
try {
|
|
240
|
+
const basePath = repoPath || this.repoPath || process.cwd();
|
|
241
|
+
const fullStatePath = path.join(basePath, this.statePath);
|
|
242
|
+
const fullTempPath = path.join(basePath, this.tempPath);
|
|
243
|
+
const fullBackupPath = path.join(basePath, this.backupPath);
|
|
244
|
+
// Prepare state with checksum
|
|
245
|
+
const stateToSave = { ...this.state };
|
|
246
|
+
if (this.config.enableChecksum) {
|
|
247
|
+
const dataForChecksum = { ...stateToSave, checksum: undefined };
|
|
248
|
+
stateToSave.checksum = this.computeChecksum(dataForChecksum);
|
|
249
|
+
}
|
|
250
|
+
const content = JSON.stringify(stateToSave, null, 2);
|
|
251
|
+
// Write to temp file first
|
|
252
|
+
await fs.writeFile(fullTempPath, content, 'utf-8');
|
|
253
|
+
// Backup existing state
|
|
254
|
+
try {
|
|
255
|
+
await fs.copyFile(fullStatePath, fullBackupPath);
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// No existing state to backup, that's fine
|
|
259
|
+
}
|
|
260
|
+
// Atomic rename
|
|
261
|
+
await fs.rename(fullTempPath, fullStatePath);
|
|
262
|
+
this.dirty = false;
|
|
263
|
+
logger.debug('State saved', {
|
|
264
|
+
tasks: this.state.tasks.length,
|
|
265
|
+
worktrees: this.state.worktrees.length,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
this.saving = false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// ==========================================================================
|
|
273
|
+
// Shutdown
|
|
274
|
+
// ==========================================================================
|
|
275
|
+
/**
|
|
276
|
+
* Shutdown - ensure final save.
|
|
277
|
+
*
|
|
278
|
+
* @param repoPath - Path to the repository root
|
|
279
|
+
*/
|
|
280
|
+
async shutdown(repoPath) {
|
|
281
|
+
if (this.saveTimer) {
|
|
282
|
+
clearTimeout(this.saveTimer);
|
|
283
|
+
this.saveTimer = null;
|
|
284
|
+
}
|
|
285
|
+
if (this.dirty) {
|
|
286
|
+
await this.save(repoPath);
|
|
287
|
+
}
|
|
288
|
+
logger.info('State store shutdown complete');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/persistence/state-store.ts"],"names":[],"mappings":"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"}
|