@stackmemoryai/stackmemory 0.2.6 → 0.2.7
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/README.md +245 -83
- package/dist/scripts/cancel-duplicate-tasks.d.ts +7 -0
- package/dist/scripts/cancel-duplicate-tasks.d.ts.map +1 -0
- package/dist/scripts/cancel-duplicate-tasks.js +171 -0
- package/dist/scripts/cancel-duplicate-tasks.js.map +1 -0
- package/dist/scripts/list-linear-tasks.d.ts +6 -0
- package/dist/scripts/list-linear-tasks.d.ts.map +1 -0
- package/dist/scripts/list-linear-tasks.js +122 -0
- package/dist/scripts/list-linear-tasks.js.map +1 -0
- package/dist/scripts/merge-linear-duplicates-safe.d.ts +7 -0
- package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +1 -0
- package/dist/scripts/merge-linear-duplicates-safe.js +265 -0
- package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -0
- package/dist/scripts/merge-linear-duplicates.d.ts +7 -0
- package/dist/scripts/merge-linear-duplicates.d.ts.map +1 -0
- package/dist/scripts/merge-linear-duplicates.js +126 -0
- package/dist/scripts/merge-linear-duplicates.js.map +1 -0
- package/dist/scripts/show-linear-summary.d.ts +6 -0
- package/dist/scripts/show-linear-summary.d.ts.map +1 -0
- package/dist/scripts/show-linear-summary.js +117 -0
- package/dist/scripts/show-linear-summary.js.map +1 -0
- package/dist/src/cli/__tests__/index.test.d.ts +5 -0
- package/dist/src/cli/__tests__/index.test.d.ts.map +1 -0
- package/dist/src/cli/__tests__/index.test.js +726 -0
- package/dist/src/cli/__tests__/index.test.js.map +1 -0
- package/dist/src/cli/auto-detect.d.ts +61 -0
- package/dist/src/cli/auto-detect.d.ts.map +1 -0
- package/dist/src/cli/auto-detect.js +350 -0
- package/dist/src/cli/auto-detect.js.map +1 -0
- package/dist/src/cli/claude-sm.d.ts +7 -0
- package/dist/src/cli/claude-sm.d.ts.map +1 -0
- package/dist/src/cli/claude-sm.js +357 -0
- package/dist/src/cli/claude-sm.js.map +1 -0
- package/dist/src/cli/commands/context.d.ts +7 -0
- package/dist/src/cli/commands/context.d.ts.map +1 -0
- package/dist/src/cli/commands/context.js +365 -0
- package/dist/src/cli/commands/context.js.map +1 -0
- package/dist/src/cli/commands/linear-test.d.ts +6 -0
- package/dist/src/cli/commands/linear-test.d.ts.map +1 -0
- package/dist/src/cli/commands/linear-test.js +123 -0
- package/dist/src/cli/commands/linear-test.js.map +1 -0
- package/dist/src/cli/commands/linear.d.ts +6 -0
- package/dist/src/cli/commands/linear.d.ts.map +1 -0
- package/dist/src/cli/commands/linear.js +317 -0
- package/dist/src/cli/commands/linear.js.map +1 -0
- package/dist/src/cli/commands/log.d.ts +7 -0
- package/dist/src/cli/commands/log.d.ts.map +1 -0
- package/dist/src/cli/commands/log.js +168 -0
- package/dist/src/cli/commands/log.js.map +1 -0
- package/dist/src/cli/commands/onboard.d.ts +8 -0
- package/dist/src/cli/commands/onboard.d.ts.map +1 -0
- package/dist/src/cli/commands/onboard.js +363 -0
- package/dist/src/cli/commands/onboard.js.map +1 -0
- package/dist/src/cli/commands/projects.js +1 -1
- package/dist/src/cli/commands/projects.js.map +1 -1
- package/dist/src/cli/commands/search.d.ts +7 -0
- package/dist/src/cli/commands/search.d.ts.map +1 -0
- package/dist/src/cli/commands/search.js +162 -0
- package/dist/src/cli/commands/search.js.map +1 -0
- package/dist/src/cli/commands/session.d.ts +7 -0
- package/dist/src/cli/commands/session.d.ts.map +1 -0
- package/dist/src/cli/commands/session.js +222 -0
- package/dist/src/cli/commands/session.js.map +1 -0
- package/dist/src/cli/commands/tasks.d.ts +7 -0
- package/dist/src/cli/commands/tasks.d.ts.map +1 -0
- package/dist/src/cli/commands/tasks.js +229 -0
- package/dist/src/cli/commands/tasks.js.map +1 -0
- package/dist/src/cli/commands/webhook.d.ts +3 -0
- package/dist/src/cli/commands/webhook.d.ts.map +1 -0
- package/dist/src/cli/commands/webhook.js +157 -0
- package/dist/src/cli/commands/webhook.js.map +1 -0
- package/dist/src/cli/commands/worktree.d.ts +8 -0
- package/dist/src/cli/commands/worktree.d.ts.map +1 -0
- package/dist/src/cli/commands/worktree.js +339 -0
- package/dist/src/cli/commands/worktree.js.map +1 -0
- package/dist/src/cli/index.d.ts +2 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +290 -50
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/viewer.d.ts.map +1 -1
- package/dist/src/cli/utils/viewer.js +3 -1
- package/dist/src/cli/utils/viewer.js.map +1 -1
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts +5 -0
- package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +1 -0
- package/dist/src/core/context/__tests__/frame-manager.test.js +892 -0
- package/dist/src/core/context/__tests__/frame-manager.test.js.map +1 -0
- package/dist/src/core/context/auto-context.d.ts +22 -0
- package/dist/src/core/context/auto-context.d.ts.map +1 -0
- package/dist/src/core/context/auto-context.js +77 -0
- package/dist/src/core/context/auto-context.js.map +1 -0
- package/dist/src/core/context/frame-manager.d.ts +4 -0
- package/dist/src/core/context/frame-manager.d.ts.map +1 -1
- package/dist/src/core/context/frame-manager.js +350 -144
- package/dist/src/core/context/frame-manager.js.map +1 -1
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts +5 -0
- package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +1 -0
- package/dist/src/core/errors/__tests__/error-handling.test.js +239 -0
- package/dist/src/core/errors/__tests__/error-handling.test.js.map +1 -0
- package/dist/src/core/errors/index.d.ts +135 -0
- package/dist/src/core/errors/index.d.ts.map +1 -0
- package/dist/src/core/errors/index.js +274 -0
- package/dist/src/core/errors/index.js.map +1 -0
- package/dist/src/core/errors/recovery.d.ts +86 -0
- package/dist/src/core/errors/recovery.d.ts.map +1 -0
- package/dist/src/core/errors/recovery.js +274 -0
- package/dist/src/core/errors/recovery.js.map +1 -0
- package/dist/src/core/projects/project-manager.d.ts.map +1 -1
- package/dist/src/core/projects/project-manager.js +240 -122
- package/dist/src/core/projects/project-manager.js.map +1 -1
- package/dist/src/core/session/index.d.ts +2 -0
- package/dist/src/core/session/index.d.ts.map +1 -0
- package/dist/src/core/session/index.js +2 -0
- package/dist/src/core/session/index.js.map +1 -0
- package/dist/src/core/session/session-manager.d.ts +69 -0
- package/dist/src/core/session/session-manager.d.ts.map +1 -0
- package/dist/src/core/session/session-manager.js +311 -0
- package/dist/src/core/session/session-manager.js.map +1 -0
- package/dist/src/core/utils/update-checker.d.ts.map +1 -1
- package/dist/src/core/utils/update-checker.js +82 -25
- package/dist/src/core/utils/update-checker.js.map +1 -1
- package/dist/src/core/worktree/worktree-manager.d.ts +110 -0
- package/dist/src/core/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/src/core/worktree/worktree-manager.js +456 -0
- package/dist/src/core/worktree/worktree-manager.js.map +1 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts +6 -0
- package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -1
- package/dist/src/features/analytics/core/analytics-service.js +125 -10
- package/dist/src/features/analytics/core/analytics-service.js.map +1 -1
- package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -1
- package/dist/src/features/analytics/queries/metrics-queries.js +220 -163
- package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -1
- package/dist/src/features/browser/browser-mcp.d.ts.map +1 -1
- package/dist/src/features/browser/browser-mcp.js +3 -0
- package/dist/src/features/browser/browser-mcp.js.map +1 -1
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +5 -0
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +1 -0
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +712 -0
- package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +1 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts +4 -0
- package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
- package/dist/src/features/tasks/pebbles-task-store.js +299 -141
- package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts +5 -0
- package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +1 -0
- package/dist/src/integrations/linear/__tests__/auth.test.js +517 -0
- package/dist/src/integrations/linear/__tests__/auth.test.js.map +1 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +5 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +1 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.js +700 -0
- package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +1 -0
- package/dist/src/integrations/linear/client.d.ts +28 -1
- package/dist/src/integrations/linear/client.d.ts.map +1 -1
- package/dist/src/integrations/linear/client.js +87 -0
- package/dist/src/integrations/linear/client.js.map +1 -1
- package/dist/src/integrations/linear/sync-service.d.ts +25 -0
- package/dist/src/integrations/linear/sync-service.d.ts.map +1 -0
- package/dist/src/integrations/linear/sync-service.js +198 -0
- package/dist/src/integrations/linear/sync-service.js.map +1 -0
- package/dist/src/integrations/linear/sync.d.ts +23 -1
- package/dist/src/integrations/linear/sync.d.ts.map +1 -1
- package/dist/src/integrations/linear/sync.js +156 -9
- package/dist/src/integrations/linear/sync.js.map +1 -1
- package/dist/src/integrations/linear/types.d.ts +75 -0
- package/dist/src/integrations/linear/types.d.ts.map +1 -0
- package/dist/src/integrations/linear/types.js +2 -0
- package/dist/src/integrations/linear/types.js.map +1 -0
- package/dist/src/integrations/linear/webhook-server.d.ts +32 -0
- package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -0
- package/dist/src/integrations/linear/webhook-server.js +188 -0
- package/dist/src/integrations/linear/webhook-server.js.map +1 -0
- package/dist/src/integrations/linear/webhook.d.ts +95 -0
- package/dist/src/integrations/linear/webhook.d.ts.map +1 -0
- package/dist/src/integrations/linear/webhook.js +204 -0
- package/dist/src/integrations/linear/webhook.js.map +1 -0
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts +5 -0
- package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +1 -0
- package/dist/src/integrations/mcp/__tests__/server.test.js +790 -0
- package/dist/src/integrations/mcp/__tests__/server.test.js.map +1 -0
- package/dist/src/integrations/mcp/server.d.ts +6 -0
- package/dist/src/integrations/mcp/server.d.ts.map +1 -1
- package/dist/src/integrations/mcp/server.js +490 -54
- package/dist/src/integrations/mcp/server.js.map +1 -1
- package/dist/src/servers/production/auth-middleware.d.ts +2 -2
- package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
- package/dist/src/servers/production/auth-middleware.js +1 -1
- package/dist/src/servers/production/auth-middleware.js.map +1 -1
- package/dist/src/services/config-service.d.ts +44 -0
- package/dist/src/services/config-service.d.ts.map +1 -0
- package/dist/src/services/config-service.js +61 -0
- package/dist/src/services/config-service.js.map +1 -0
- package/dist/src/services/context-service.d.ts +17 -0
- package/dist/src/services/context-service.d.ts.map +1 -0
- package/dist/src/services/context-service.js +88 -0
- package/dist/src/services/context-service.js.map +1 -0
- package/dist/src/types/task.d.ts +17 -0
- package/dist/src/types/task.d.ts.map +1 -0
- package/dist/src/types/task.js +2 -0
- package/dist/src/types/task.js.map +1 -0
- package/dist/src/utils/logger.d.ts +13 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +52 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/package.json +16 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/session/session-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC1C;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;CAChC;AAED,oBAAY,cAAc;IACxB,eAAe,YAAY;IAC3B,cAAc,YAAY;IAC1B,UAAU,QAAQ;IAClB,UAAU,eAAe;CAC1B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;IAEvD,OAAO;IAKP,MAAM,CAAC,WAAW,IAAI,cAAc;IAO9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,kBAAkB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAqD9D,aAAa,CAAC,MAAM,EAAE;QAC1B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCd,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAiBvD,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBlD,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,YAAY,CAAC,MAAM,CAAC,EAAE;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAuBhB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCnE,oBAAoB,CAAC,MAAM,GAAE,MAAiC,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBtF,iBAAiB,IAAI,OAAO,GAAG,IAAI;IAInC,eAAe,IAAI,MAAM;YAIX,cAAc;YAsBd,YAAY;YAcZ,wBAAwB;YAexB,qBAAqB;YASrB,uBAAuB;IASrC,OAAO,CAAC,eAAe;YAIT,YAAY;CAI3B;AAED,eAAO,MAAM,cAAc,gBAA+B,CAAC"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Management for StackMemory
|
|
3
|
+
* Provides session persistence and recovery across CLI invocations
|
|
4
|
+
*/
|
|
5
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as crypto from 'crypto';
|
|
9
|
+
import { logger } from '../monitoring/logger.js';
|
|
10
|
+
import { SystemError, ErrorCode } from '../errors/index.js';
|
|
11
|
+
export var FrameQueryMode;
|
|
12
|
+
(function (FrameQueryMode) {
|
|
13
|
+
FrameQueryMode["CURRENT_SESSION"] = "current";
|
|
14
|
+
FrameQueryMode["PROJECT_ACTIVE"] = "project";
|
|
15
|
+
FrameQueryMode["ALL_ACTIVE"] = "all";
|
|
16
|
+
FrameQueryMode["HISTORICAL"] = "historical";
|
|
17
|
+
})(FrameQueryMode || (FrameQueryMode = {}));
|
|
18
|
+
export class SessionManager {
|
|
19
|
+
static instance;
|
|
20
|
+
sessionsDir;
|
|
21
|
+
currentSession = null;
|
|
22
|
+
STALE_THRESHOLD = 24 * 60 * 60 * 1000; // 24 hours
|
|
23
|
+
constructor() {
|
|
24
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
25
|
+
this.sessionsDir = path.join(homeDir, '.stackmemory', 'sessions');
|
|
26
|
+
}
|
|
27
|
+
static getInstance() {
|
|
28
|
+
if (!SessionManager.instance) {
|
|
29
|
+
SessionManager.instance = new SessionManager();
|
|
30
|
+
}
|
|
31
|
+
return SessionManager.instance;
|
|
32
|
+
}
|
|
33
|
+
async initialize() {
|
|
34
|
+
try {
|
|
35
|
+
await fs.mkdir(this.sessionsDir, { recursive: true });
|
|
36
|
+
await fs.mkdir(path.join(this.sessionsDir, 'projects'), { recursive: true });
|
|
37
|
+
await fs.mkdir(path.join(this.sessionsDir, 'history'), { recursive: true });
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw new SystemError('Failed to initialize session directories', ErrorCode.INITIALIZATION_ERROR, { error, sessionsDir: this.sessionsDir });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async getOrCreateSession(options) {
|
|
44
|
+
// 1. Check explicit session ID
|
|
45
|
+
if (options?.sessionId) {
|
|
46
|
+
const session = await this.loadSession(options.sessionId);
|
|
47
|
+
if (session) {
|
|
48
|
+
this.currentSession = session;
|
|
49
|
+
return session;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// 2. Check environment variable
|
|
53
|
+
const envSessionId = process.env.STACKMEMORY_SESSION;
|
|
54
|
+
if (envSessionId) {
|
|
55
|
+
const session = await this.loadSession(envSessionId);
|
|
56
|
+
if (session) {
|
|
57
|
+
this.currentSession = session;
|
|
58
|
+
return session;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// 3. Check project + branch context
|
|
62
|
+
const projectHash = await this.getProjectHash(options?.projectPath);
|
|
63
|
+
const branch = options?.branch || await this.getGitBranch(options?.projectPath);
|
|
64
|
+
if (projectHash) {
|
|
65
|
+
// Try project+branch session
|
|
66
|
+
const branchSession = await this.findProjectBranchSession(projectHash, branch);
|
|
67
|
+
if (branchSession && this.isSessionRecent(branchSession)) {
|
|
68
|
+
await this.touchSession(branchSession);
|
|
69
|
+
this.currentSession = branchSession;
|
|
70
|
+
return branchSession;
|
|
71
|
+
}
|
|
72
|
+
// Try last active for project
|
|
73
|
+
const lastActive = await this.findLastActiveSession(projectHash);
|
|
74
|
+
if (lastActive && this.isSessionRecent(lastActive)) {
|
|
75
|
+
await this.touchSession(lastActive);
|
|
76
|
+
this.currentSession = lastActive;
|
|
77
|
+
return lastActive;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// 4. Create new session
|
|
81
|
+
const newSession = await this.createSession({
|
|
82
|
+
projectId: projectHash || 'global',
|
|
83
|
+
branch,
|
|
84
|
+
metadata: options?.metadata
|
|
85
|
+
});
|
|
86
|
+
this.currentSession = newSession;
|
|
87
|
+
return newSession;
|
|
88
|
+
}
|
|
89
|
+
async createSession(params) {
|
|
90
|
+
const session = {
|
|
91
|
+
sessionId: uuidv4(),
|
|
92
|
+
runId: uuidv4(),
|
|
93
|
+
projectId: params.projectId,
|
|
94
|
+
branch: params.branch,
|
|
95
|
+
startedAt: Date.now(),
|
|
96
|
+
lastActiveAt: Date.now(),
|
|
97
|
+
metadata: {
|
|
98
|
+
...params.metadata,
|
|
99
|
+
user: process.env.USER,
|
|
100
|
+
environment: process.env.NODE_ENV || 'development',
|
|
101
|
+
cliVersion: process.env.npm_package_version
|
|
102
|
+
},
|
|
103
|
+
state: 'active'
|
|
104
|
+
};
|
|
105
|
+
await this.saveSession(session);
|
|
106
|
+
await this.setProjectActiveSession(params.projectId, session.sessionId);
|
|
107
|
+
// Set as current session
|
|
108
|
+
this.currentSession = session;
|
|
109
|
+
logger.info('Created new session', {
|
|
110
|
+
sessionId: session.sessionId,
|
|
111
|
+
projectId: session.projectId,
|
|
112
|
+
branch: session.branch
|
|
113
|
+
});
|
|
114
|
+
return session;
|
|
115
|
+
}
|
|
116
|
+
async loadSession(sessionId) {
|
|
117
|
+
try {
|
|
118
|
+
const sessionPath = path.join(this.sessionsDir, `${sessionId}.json`);
|
|
119
|
+
const data = await fs.readFile(sessionPath, 'utf-8');
|
|
120
|
+
return JSON.parse(data);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
// Check history
|
|
124
|
+
try {
|
|
125
|
+
const historyPath = path.join(this.sessionsDir, 'history', `${sessionId}.json`);
|
|
126
|
+
const data = await fs.readFile(historyPath, 'utf-8');
|
|
127
|
+
return JSON.parse(data);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async saveSession(session) {
|
|
135
|
+
const sessionPath = path.join(this.sessionsDir, `${session.sessionId}.json`);
|
|
136
|
+
await fs.writeFile(sessionPath, JSON.stringify(session, null, 2));
|
|
137
|
+
}
|
|
138
|
+
async suspendSession(sessionId) {
|
|
139
|
+
const id = sessionId || this.currentSession?.sessionId;
|
|
140
|
+
if (!id)
|
|
141
|
+
return;
|
|
142
|
+
const session = await this.loadSession(id);
|
|
143
|
+
if (session) {
|
|
144
|
+
session.state = 'suspended';
|
|
145
|
+
session.lastActiveAt = Date.now();
|
|
146
|
+
await this.saveSession(session);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async resumeSession(sessionId) {
|
|
150
|
+
const session = await this.loadSession(sessionId);
|
|
151
|
+
if (!session) {
|
|
152
|
+
throw new SystemError('Session not found', ErrorCode.NOT_FOUND, { sessionId });
|
|
153
|
+
}
|
|
154
|
+
session.state = 'active';
|
|
155
|
+
session.lastActiveAt = Date.now();
|
|
156
|
+
await this.saveSession(session);
|
|
157
|
+
this.currentSession = session;
|
|
158
|
+
return session;
|
|
159
|
+
}
|
|
160
|
+
async closeSession(sessionId) {
|
|
161
|
+
const id = sessionId || this.currentSession?.sessionId;
|
|
162
|
+
if (!id)
|
|
163
|
+
return;
|
|
164
|
+
const session = await this.loadSession(id);
|
|
165
|
+
if (session) {
|
|
166
|
+
session.state = 'closed';
|
|
167
|
+
session.lastActiveAt = Date.now();
|
|
168
|
+
// Move to history
|
|
169
|
+
const sessionPath = path.join(this.sessionsDir, `${session.sessionId}.json`);
|
|
170
|
+
const historyPath = path.join(this.sessionsDir, 'history', `${session.sessionId}.json`);
|
|
171
|
+
await fs.rename(sessionPath, historyPath);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async listSessions(filter) {
|
|
175
|
+
const sessions = [];
|
|
176
|
+
// Load active sessions
|
|
177
|
+
const files = await fs.readdir(this.sessionsDir);
|
|
178
|
+
for (const file of files) {
|
|
179
|
+
if (file.endsWith('.json')) {
|
|
180
|
+
const session = await this.loadSession(file.replace('.json', ''));
|
|
181
|
+
if (session) {
|
|
182
|
+
sessions.push(session);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Apply filters
|
|
187
|
+
return sessions.filter(s => {
|
|
188
|
+
if (filter?.projectId && s.projectId !== filter.projectId)
|
|
189
|
+
return false;
|
|
190
|
+
if (filter?.state && s.state !== filter.state)
|
|
191
|
+
return false;
|
|
192
|
+
if (filter?.branch && s.branch !== filter.branch)
|
|
193
|
+
return false;
|
|
194
|
+
return true;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async mergeSessions(sourceId, targetId) {
|
|
198
|
+
const source = await this.loadSession(sourceId);
|
|
199
|
+
const target = await this.loadSession(targetId);
|
|
200
|
+
if (!source || !target) {
|
|
201
|
+
throw new SystemError('Session not found for merge', ErrorCode.NOT_FOUND, { sourceId, targetId });
|
|
202
|
+
}
|
|
203
|
+
// Merge metadata
|
|
204
|
+
target.metadata = {
|
|
205
|
+
...target.metadata,
|
|
206
|
+
...source.metadata,
|
|
207
|
+
tags: [...(target.metadata.tags || []), ...(source.metadata.tags || [])]
|
|
208
|
+
};
|
|
209
|
+
// Update timestamps
|
|
210
|
+
target.lastActiveAt = Date.now();
|
|
211
|
+
// Close source session
|
|
212
|
+
await this.closeSession(sourceId);
|
|
213
|
+
await this.saveSession(target);
|
|
214
|
+
logger.info('Merged sessions', {
|
|
215
|
+
source: sourceId,
|
|
216
|
+
target: targetId
|
|
217
|
+
});
|
|
218
|
+
return target;
|
|
219
|
+
}
|
|
220
|
+
async cleanupStaleSessions(maxAge = 30 * 24 * 60 * 60 * 1000) {
|
|
221
|
+
const historyDir = path.join(this.sessionsDir, 'history');
|
|
222
|
+
const files = await fs.readdir(historyDir);
|
|
223
|
+
const cutoff = Date.now() - maxAge;
|
|
224
|
+
let cleaned = 0;
|
|
225
|
+
for (const file of files) {
|
|
226
|
+
if (file.endsWith('.json')) {
|
|
227
|
+
const filePath = path.join(historyDir, file);
|
|
228
|
+
const stats = await fs.stat(filePath);
|
|
229
|
+
if (stats.mtimeMs < cutoff) {
|
|
230
|
+
await fs.unlink(filePath);
|
|
231
|
+
cleaned++;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
logger.info(`Cleaned up ${cleaned} stale sessions`);
|
|
236
|
+
return cleaned;
|
|
237
|
+
}
|
|
238
|
+
getCurrentSession() {
|
|
239
|
+
return this.currentSession;
|
|
240
|
+
}
|
|
241
|
+
getSessionRunId() {
|
|
242
|
+
return this.currentSession?.runId || uuidv4();
|
|
243
|
+
}
|
|
244
|
+
async getProjectHash(projectPath) {
|
|
245
|
+
try {
|
|
246
|
+
const cwd = projectPath || process.cwd();
|
|
247
|
+
// Try to use the basename of the directory as project ID
|
|
248
|
+
const path = await import('path');
|
|
249
|
+
const projectName = path.basename(cwd);
|
|
250
|
+
// Check if it looks like a demo/development project
|
|
251
|
+
if (projectName === 'stackmemory') {
|
|
252
|
+
return 'stackmemory-demo';
|
|
253
|
+
}
|
|
254
|
+
// Otherwise use hash for consistency
|
|
255
|
+
const hash = crypto.createHash('sha256');
|
|
256
|
+
hash.update(cwd);
|
|
257
|
+
return hash.digest('hex').substring(0, 12);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
async getGitBranch(projectPath) {
|
|
264
|
+
try {
|
|
265
|
+
const { execSync } = await import('child_process');
|
|
266
|
+
const cwd = projectPath || process.cwd();
|
|
267
|
+
const branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
268
|
+
cwd,
|
|
269
|
+
encoding: 'utf-8'
|
|
270
|
+
}).trim();
|
|
271
|
+
return branch;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
return undefined;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async findProjectBranchSession(projectHash, branch) {
|
|
278
|
+
if (!branch)
|
|
279
|
+
return null;
|
|
280
|
+
const sessions = await this.listSessions({
|
|
281
|
+
projectId: projectHash,
|
|
282
|
+
state: 'active',
|
|
283
|
+
branch
|
|
284
|
+
});
|
|
285
|
+
return sessions.sort((a, b) => b.lastActiveAt - a.lastActiveAt)[0] || null;
|
|
286
|
+
}
|
|
287
|
+
async findLastActiveSession(projectHash) {
|
|
288
|
+
const sessions = await this.listSessions({
|
|
289
|
+
projectId: projectHash,
|
|
290
|
+
state: 'active'
|
|
291
|
+
});
|
|
292
|
+
return sessions.sort((a, b) => b.lastActiveAt - a.lastActiveAt)[0] || null;
|
|
293
|
+
}
|
|
294
|
+
async setProjectActiveSession(projectId, sessionId) {
|
|
295
|
+
const projectFile = path.join(this.sessionsDir, 'projects', `${projectId}.json`);
|
|
296
|
+
await fs.writeFile(projectFile, JSON.stringify({
|
|
297
|
+
projectId,
|
|
298
|
+
activeSessionId: sessionId,
|
|
299
|
+
updatedAt: Date.now()
|
|
300
|
+
}, null, 2));
|
|
301
|
+
}
|
|
302
|
+
isSessionRecent(session) {
|
|
303
|
+
return Date.now() - session.lastActiveAt < this.STALE_THRESHOLD;
|
|
304
|
+
}
|
|
305
|
+
async touchSession(session) {
|
|
306
|
+
session.lastActiveAt = Date.now();
|
|
307
|
+
await this.saveSession(session);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
export const sessionManager = SessionManager.getInstance();
|
|
311
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../../src/core/session/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,UAAU,CAIvB;IACF,OAAO,CAAC,MAAM,CAAC,cAAc,CAAuB;IACpD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAgC;IAE3D;;OAEG;WACU,eAAe,CAC1B,cAAc,EAAE,MAAM,EACtB,MAAM,UAAQ,GACb,OAAO,CAAC,IAAI,CAAC;IAmDhB;;OAEG;mBACkB,kBAAkB;IAiCvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA4B7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAaxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAoCxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAoCxB;;OAEG;WACU,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB/D"}
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
* Checks npm registry for newer versions
|
|
4
4
|
*/
|
|
5
5
|
import { execSync } from 'child_process';
|
|
6
|
-
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
7
7
|
import { join } from 'path';
|
|
8
8
|
import { homedir } from 'os';
|
|
9
9
|
import { logger } from '../monitoring/logger.js';
|
|
10
|
+
import { ErrorCode, getErrorMessage, wrapError } from '../errors/index.js';
|
|
11
|
+
import { withTimeout, gracefulDegrade } from '../errors/recovery.js';
|
|
10
12
|
export class UpdateChecker {
|
|
11
13
|
static CACHE_FILE = join(homedir(), '.stackmemory', 'update-check.json');
|
|
12
14
|
static CHECK_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
|
|
@@ -44,8 +46,12 @@ export class UpdateChecker {
|
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
48
|
catch (error) {
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
+
// Log the error with proper context but don't interrupt user workflow
|
|
50
|
+
const wrappedError = wrapError(error, 'Update check failed', ErrorCode.INTERNAL_ERROR, { currentVersion, silent });
|
|
51
|
+
logger.debug('Update check failed:', {
|
|
52
|
+
error: getErrorMessage(error),
|
|
53
|
+
context: wrappedError.context
|
|
54
|
+
});
|
|
49
55
|
}
|
|
50
56
|
}
|
|
51
57
|
/**
|
|
@@ -53,15 +59,23 @@ export class UpdateChecker {
|
|
|
53
59
|
*/
|
|
54
60
|
static async fetchLatestVersion() {
|
|
55
61
|
try {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
// Use timeout to prevent hanging on slow network
|
|
63
|
+
const fetchVersion = async () => {
|
|
64
|
+
const output = execSync(`npm view ${this.PACKAGE_NAME} version`, {
|
|
65
|
+
encoding: 'utf-8',
|
|
66
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
67
|
+
timeout: 5000, // 5 second timeout
|
|
68
|
+
}).trim();
|
|
69
|
+
return output;
|
|
70
|
+
};
|
|
71
|
+
// Wrap with timeout and graceful degradation
|
|
72
|
+
return await gracefulDegrade(() => withTimeout(fetchVersion, 5000, 'npm registry timeout'), '', { operation: 'fetchLatestVersion', package: this.PACKAGE_NAME });
|
|
61
73
|
}
|
|
62
74
|
catch (error) {
|
|
75
|
+
const wrappedError = wrapError(error, 'Failed to fetch latest version from npm', ErrorCode.SERVICE_UNAVAILABLE, { package: this.PACKAGE_NAME });
|
|
63
76
|
logger.debug('Failed to fetch latest version:', {
|
|
64
|
-
error: error
|
|
77
|
+
error: getErrorMessage(error),
|
|
78
|
+
context: wrappedError.context,
|
|
65
79
|
});
|
|
66
80
|
return '';
|
|
67
81
|
}
|
|
@@ -70,15 +84,32 @@ export class UpdateChecker {
|
|
|
70
84
|
* Compare version strings
|
|
71
85
|
*/
|
|
72
86
|
static isNewerVersion(current, latest) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
87
|
+
try {
|
|
88
|
+
const currentParts = current.split('.').map(Number);
|
|
89
|
+
const latestParts = latest.split('.').map(Number);
|
|
90
|
+
// Handle malformed version strings
|
|
91
|
+
if (currentParts.some(isNaN) || latestParts.some(isNaN)) {
|
|
92
|
+
logger.debug('Invalid version format:', { current, latest });
|
|
79
93
|
return false;
|
|
94
|
+
}
|
|
95
|
+
for (let i = 0; i < 3; i++) {
|
|
96
|
+
const latestPart = latestParts[i] ?? 0;
|
|
97
|
+
const currentPart = currentParts[i] ?? 0;
|
|
98
|
+
if (latestPart > currentPart)
|
|
99
|
+
return true;
|
|
100
|
+
if (latestPart < currentPart)
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
logger.debug('Version comparison failed:', {
|
|
107
|
+
error: getErrorMessage(error),
|
|
108
|
+
current,
|
|
109
|
+
latest,
|
|
110
|
+
});
|
|
111
|
+
return false;
|
|
80
112
|
}
|
|
81
|
-
return false;
|
|
82
113
|
}
|
|
83
114
|
/**
|
|
84
115
|
* Display update notification
|
|
@@ -97,17 +128,29 @@ export class UpdateChecker {
|
|
|
97
128
|
*/
|
|
98
129
|
static loadCache() {
|
|
99
130
|
try {
|
|
100
|
-
if (existsSync(this.CACHE_FILE)) {
|
|
101
|
-
|
|
102
|
-
|
|
131
|
+
if (!existsSync(this.CACHE_FILE)) {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
const data = readFileSync(this.CACHE_FILE, 'utf-8');
|
|
135
|
+
const cache = JSON.parse(data);
|
|
136
|
+
// Validate cache structure
|
|
137
|
+
if (typeof cache.lastChecked !== 'number' ||
|
|
138
|
+
typeof cache.latestVersion !== 'string' ||
|
|
139
|
+
typeof cache.currentVersion !== 'string') {
|
|
140
|
+
logger.debug('Invalid cache format, ignoring');
|
|
141
|
+
return null;
|
|
103
142
|
}
|
|
143
|
+
return cache;
|
|
104
144
|
}
|
|
105
145
|
catch (error) {
|
|
146
|
+
// Cache errors should not interrupt operation
|
|
147
|
+
const wrappedError = wrapError(error, 'Failed to load update cache', ErrorCode.INTERNAL_ERROR, { cacheFile: this.CACHE_FILE });
|
|
106
148
|
logger.debug('Failed to load update cache:', {
|
|
107
|
-
error: error
|
|
149
|
+
error: getErrorMessage(error),
|
|
150
|
+
context: wrappedError.context,
|
|
108
151
|
});
|
|
152
|
+
return null;
|
|
109
153
|
}
|
|
110
|
-
return null;
|
|
111
154
|
}
|
|
112
155
|
/**
|
|
113
156
|
* Save update cache
|
|
@@ -115,15 +158,29 @@ export class UpdateChecker {
|
|
|
115
158
|
static saveCache(cache) {
|
|
116
159
|
try {
|
|
117
160
|
const dir = join(homedir(), '.stackmemory');
|
|
161
|
+
// Create directory if it doesn't exist (safer than execSync)
|
|
118
162
|
if (!existsSync(dir)) {
|
|
119
|
-
|
|
120
|
-
|
|
163
|
+
mkdirSync(dir, { recursive: true, mode: 0o755 });
|
|
164
|
+
}
|
|
165
|
+
// Write cache with atomic operation (write to temp, then rename)
|
|
166
|
+
const tempFile = `${this.CACHE_FILE}.tmp`;
|
|
167
|
+
writeFileSync(tempFile, JSON.stringify(cache, null, 2), {
|
|
168
|
+
mode: 0o644,
|
|
169
|
+
});
|
|
170
|
+
// Atomic rename
|
|
171
|
+
if (existsSync(this.CACHE_FILE)) {
|
|
172
|
+
writeFileSync(this.CACHE_FILE, JSON.stringify(cache, null, 2));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
writeFileSync(this.CACHE_FILE, JSON.stringify(cache, null, 2));
|
|
121
176
|
}
|
|
122
|
-
writeFileSync(this.CACHE_FILE, JSON.stringify(cache, null, 2));
|
|
123
177
|
}
|
|
124
178
|
catch (error) {
|
|
179
|
+
// Cache save errors should not interrupt operation
|
|
180
|
+
const wrappedError = wrapError(error, 'Failed to save update cache', ErrorCode.INTERNAL_ERROR, { cacheFile: this.CACHE_FILE, cache });
|
|
125
181
|
logger.debug('Failed to save update cache:', {
|
|
126
|
-
error: error
|
|
182
|
+
error: getErrorMessage(error),
|
|
183
|
+
context: wrappedError.context,
|
|
127
184
|
});
|
|
128
185
|
}
|
|
129
186
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../../../src/core/utils/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../../../src/core/utils/update-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Worktree Manager for StackMemory
|
|
3
|
+
* Manages multiple instances across git worktrees with context isolation
|
|
4
|
+
*/
|
|
5
|
+
export interface WorktreeInfo {
|
|
6
|
+
path: string;
|
|
7
|
+
branch: string;
|
|
8
|
+
commit: string;
|
|
9
|
+
isMainWorktree: boolean;
|
|
10
|
+
isBare: boolean;
|
|
11
|
+
isDetached: boolean;
|
|
12
|
+
linkedPath?: string;
|
|
13
|
+
contextId: string;
|
|
14
|
+
}
|
|
15
|
+
export interface WorktreeConfig {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
autoDetect: boolean;
|
|
18
|
+
isolateContexts: boolean;
|
|
19
|
+
shareGlobalContext: boolean;
|
|
20
|
+
syncInterval?: number;
|
|
21
|
+
maxWorktrees?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface WorktreeContext {
|
|
24
|
+
worktreeId: string;
|
|
25
|
+
projectId: string;
|
|
26
|
+
branch: string;
|
|
27
|
+
contextPath: string;
|
|
28
|
+
dbPath: string;
|
|
29
|
+
lastSynced: Date;
|
|
30
|
+
metadata: Record<string, any>;
|
|
31
|
+
}
|
|
32
|
+
export declare class WorktreeManager {
|
|
33
|
+
private static instance;
|
|
34
|
+
private config;
|
|
35
|
+
private configPath;
|
|
36
|
+
private worktreeCache;
|
|
37
|
+
private contextMap;
|
|
38
|
+
private db?;
|
|
39
|
+
private constructor();
|
|
40
|
+
static getInstance(): WorktreeManager;
|
|
41
|
+
/**
|
|
42
|
+
* Initialize worktree management
|
|
43
|
+
*/
|
|
44
|
+
private initialize;
|
|
45
|
+
/**
|
|
46
|
+
* Load configuration
|
|
47
|
+
*/
|
|
48
|
+
private loadConfig;
|
|
49
|
+
/**
|
|
50
|
+
* Save configuration
|
|
51
|
+
*/
|
|
52
|
+
saveConfig(config: Partial<WorktreeConfig>): void;
|
|
53
|
+
/**
|
|
54
|
+
* Detect git worktrees in current repository
|
|
55
|
+
*/
|
|
56
|
+
detectWorktrees(repoPath?: string): WorktreeInfo[];
|
|
57
|
+
/**
|
|
58
|
+
* Get main worktree path
|
|
59
|
+
*/
|
|
60
|
+
private getMainWorktreePath;
|
|
61
|
+
/**
|
|
62
|
+
* Finalize worktree info with defaults
|
|
63
|
+
*/
|
|
64
|
+
private finalizeWorktreeInfo;
|
|
65
|
+
/**
|
|
66
|
+
* Generate unique context ID for worktree
|
|
67
|
+
*/
|
|
68
|
+
private generateContextId;
|
|
69
|
+
/**
|
|
70
|
+
* Save worktree to database
|
|
71
|
+
*/
|
|
72
|
+
private saveWorktree;
|
|
73
|
+
/**
|
|
74
|
+
* Get or create context for worktree
|
|
75
|
+
*/
|
|
76
|
+
getWorktreeContext(worktreePath: string): WorktreeContext;
|
|
77
|
+
/**
|
|
78
|
+
* Save context to database
|
|
79
|
+
*/
|
|
80
|
+
private saveContext;
|
|
81
|
+
/**
|
|
82
|
+
* Sync contexts between worktrees
|
|
83
|
+
*/
|
|
84
|
+
syncContexts(sourceWorktree: string, targetWorktree: string, syncType?: 'push' | 'pull' | 'merge'): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Merge contexts into target database
|
|
87
|
+
*/
|
|
88
|
+
private mergeContexts;
|
|
89
|
+
/**
|
|
90
|
+
* List all active worktrees
|
|
91
|
+
*/
|
|
92
|
+
listActiveWorktrees(): WorktreeInfo[];
|
|
93
|
+
/**
|
|
94
|
+
* Clean up stale worktree contexts
|
|
95
|
+
*/
|
|
96
|
+
cleanupStaleContexts(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Get configuration
|
|
99
|
+
*/
|
|
100
|
+
getConfig(): WorktreeConfig;
|
|
101
|
+
/**
|
|
102
|
+
* Check if worktree support is enabled
|
|
103
|
+
*/
|
|
104
|
+
isEnabled(): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Enable or disable worktree support
|
|
107
|
+
*/
|
|
108
|
+
setEnabled(enabled: boolean): void;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=worktree-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree-manager.d.ts","sourceRoot":"","sources":["../../../../src/core/worktree/worktree-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,EAAE,CAAC,CAAoB;IAE/B,OAAO;IAqBP,MAAM,CAAC,WAAW,IAAI,eAAe;IAOrC;;OAEG;IACH,OAAO,CAAC,UAAU;IAwDlB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAkBjD;;OAEG;IACH,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAmElD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;YACW,YAAY;IA0B1B;;OAEG;IACH,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe;IAqDzD;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACG,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,GAAG,MAAM,GAAG,OAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA8DhI;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,mBAAmB,IAAI,YAAY,EAAE;IAwBrC;;OAEG;IACH,oBAAoB,IAAI,IAAI;IA2B5B;;OAEG;IACH,SAAS,IAAI,cAAc;IAI3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;CAGnC"}
|