@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.
Files changed (203) hide show
  1. package/README.md +245 -83
  2. package/dist/scripts/cancel-duplicate-tasks.d.ts +7 -0
  3. package/dist/scripts/cancel-duplicate-tasks.d.ts.map +1 -0
  4. package/dist/scripts/cancel-duplicate-tasks.js +171 -0
  5. package/dist/scripts/cancel-duplicate-tasks.js.map +1 -0
  6. package/dist/scripts/list-linear-tasks.d.ts +6 -0
  7. package/dist/scripts/list-linear-tasks.d.ts.map +1 -0
  8. package/dist/scripts/list-linear-tasks.js +122 -0
  9. package/dist/scripts/list-linear-tasks.js.map +1 -0
  10. package/dist/scripts/merge-linear-duplicates-safe.d.ts +7 -0
  11. package/dist/scripts/merge-linear-duplicates-safe.d.ts.map +1 -0
  12. package/dist/scripts/merge-linear-duplicates-safe.js +265 -0
  13. package/dist/scripts/merge-linear-duplicates-safe.js.map +1 -0
  14. package/dist/scripts/merge-linear-duplicates.d.ts +7 -0
  15. package/dist/scripts/merge-linear-duplicates.d.ts.map +1 -0
  16. package/dist/scripts/merge-linear-duplicates.js +126 -0
  17. package/dist/scripts/merge-linear-duplicates.js.map +1 -0
  18. package/dist/scripts/show-linear-summary.d.ts +6 -0
  19. package/dist/scripts/show-linear-summary.d.ts.map +1 -0
  20. package/dist/scripts/show-linear-summary.js +117 -0
  21. package/dist/scripts/show-linear-summary.js.map +1 -0
  22. package/dist/src/cli/__tests__/index.test.d.ts +5 -0
  23. package/dist/src/cli/__tests__/index.test.d.ts.map +1 -0
  24. package/dist/src/cli/__tests__/index.test.js +726 -0
  25. package/dist/src/cli/__tests__/index.test.js.map +1 -0
  26. package/dist/src/cli/auto-detect.d.ts +61 -0
  27. package/dist/src/cli/auto-detect.d.ts.map +1 -0
  28. package/dist/src/cli/auto-detect.js +350 -0
  29. package/dist/src/cli/auto-detect.js.map +1 -0
  30. package/dist/src/cli/claude-sm.d.ts +7 -0
  31. package/dist/src/cli/claude-sm.d.ts.map +1 -0
  32. package/dist/src/cli/claude-sm.js +357 -0
  33. package/dist/src/cli/claude-sm.js.map +1 -0
  34. package/dist/src/cli/commands/context.d.ts +7 -0
  35. package/dist/src/cli/commands/context.d.ts.map +1 -0
  36. package/dist/src/cli/commands/context.js +365 -0
  37. package/dist/src/cli/commands/context.js.map +1 -0
  38. package/dist/src/cli/commands/linear-test.d.ts +6 -0
  39. package/dist/src/cli/commands/linear-test.d.ts.map +1 -0
  40. package/dist/src/cli/commands/linear-test.js +123 -0
  41. package/dist/src/cli/commands/linear-test.js.map +1 -0
  42. package/dist/src/cli/commands/linear.d.ts +6 -0
  43. package/dist/src/cli/commands/linear.d.ts.map +1 -0
  44. package/dist/src/cli/commands/linear.js +317 -0
  45. package/dist/src/cli/commands/linear.js.map +1 -0
  46. package/dist/src/cli/commands/log.d.ts +7 -0
  47. package/dist/src/cli/commands/log.d.ts.map +1 -0
  48. package/dist/src/cli/commands/log.js +168 -0
  49. package/dist/src/cli/commands/log.js.map +1 -0
  50. package/dist/src/cli/commands/onboard.d.ts +8 -0
  51. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  52. package/dist/src/cli/commands/onboard.js +363 -0
  53. package/dist/src/cli/commands/onboard.js.map +1 -0
  54. package/dist/src/cli/commands/projects.js +1 -1
  55. package/dist/src/cli/commands/projects.js.map +1 -1
  56. package/dist/src/cli/commands/search.d.ts +7 -0
  57. package/dist/src/cli/commands/search.d.ts.map +1 -0
  58. package/dist/src/cli/commands/search.js +162 -0
  59. package/dist/src/cli/commands/search.js.map +1 -0
  60. package/dist/src/cli/commands/session.d.ts +7 -0
  61. package/dist/src/cli/commands/session.d.ts.map +1 -0
  62. package/dist/src/cli/commands/session.js +222 -0
  63. package/dist/src/cli/commands/session.js.map +1 -0
  64. package/dist/src/cli/commands/tasks.d.ts +7 -0
  65. package/dist/src/cli/commands/tasks.d.ts.map +1 -0
  66. package/dist/src/cli/commands/tasks.js +229 -0
  67. package/dist/src/cli/commands/tasks.js.map +1 -0
  68. package/dist/src/cli/commands/webhook.d.ts +3 -0
  69. package/dist/src/cli/commands/webhook.d.ts.map +1 -0
  70. package/dist/src/cli/commands/webhook.js +157 -0
  71. package/dist/src/cli/commands/webhook.js.map +1 -0
  72. package/dist/src/cli/commands/worktree.d.ts +8 -0
  73. package/dist/src/cli/commands/worktree.d.ts.map +1 -0
  74. package/dist/src/cli/commands/worktree.js +339 -0
  75. package/dist/src/cli/commands/worktree.js.map +1 -0
  76. package/dist/src/cli/index.d.ts +2 -1
  77. package/dist/src/cli/index.d.ts.map +1 -1
  78. package/dist/src/cli/index.js +290 -50
  79. package/dist/src/cli/index.js.map +1 -1
  80. package/dist/src/cli/utils/viewer.d.ts.map +1 -1
  81. package/dist/src/cli/utils/viewer.js +3 -1
  82. package/dist/src/cli/utils/viewer.js.map +1 -1
  83. package/dist/src/core/context/__tests__/frame-manager.test.d.ts +5 -0
  84. package/dist/src/core/context/__tests__/frame-manager.test.d.ts.map +1 -0
  85. package/dist/src/core/context/__tests__/frame-manager.test.js +892 -0
  86. package/dist/src/core/context/__tests__/frame-manager.test.js.map +1 -0
  87. package/dist/src/core/context/auto-context.d.ts +22 -0
  88. package/dist/src/core/context/auto-context.d.ts.map +1 -0
  89. package/dist/src/core/context/auto-context.js +77 -0
  90. package/dist/src/core/context/auto-context.js.map +1 -0
  91. package/dist/src/core/context/frame-manager.d.ts +4 -0
  92. package/dist/src/core/context/frame-manager.d.ts.map +1 -1
  93. package/dist/src/core/context/frame-manager.js +350 -144
  94. package/dist/src/core/context/frame-manager.js.map +1 -1
  95. package/dist/src/core/errors/__tests__/error-handling.test.d.ts +5 -0
  96. package/dist/src/core/errors/__tests__/error-handling.test.d.ts.map +1 -0
  97. package/dist/src/core/errors/__tests__/error-handling.test.js +239 -0
  98. package/dist/src/core/errors/__tests__/error-handling.test.js.map +1 -0
  99. package/dist/src/core/errors/index.d.ts +135 -0
  100. package/dist/src/core/errors/index.d.ts.map +1 -0
  101. package/dist/src/core/errors/index.js +274 -0
  102. package/dist/src/core/errors/index.js.map +1 -0
  103. package/dist/src/core/errors/recovery.d.ts +86 -0
  104. package/dist/src/core/errors/recovery.d.ts.map +1 -0
  105. package/dist/src/core/errors/recovery.js +274 -0
  106. package/dist/src/core/errors/recovery.js.map +1 -0
  107. package/dist/src/core/projects/project-manager.d.ts.map +1 -1
  108. package/dist/src/core/projects/project-manager.js +240 -122
  109. package/dist/src/core/projects/project-manager.js.map +1 -1
  110. package/dist/src/core/session/index.d.ts +2 -0
  111. package/dist/src/core/session/index.d.ts.map +1 -0
  112. package/dist/src/core/session/index.js +2 -0
  113. package/dist/src/core/session/index.js.map +1 -0
  114. package/dist/src/core/session/session-manager.d.ts +69 -0
  115. package/dist/src/core/session/session-manager.d.ts.map +1 -0
  116. package/dist/src/core/session/session-manager.js +311 -0
  117. package/dist/src/core/session/session-manager.js.map +1 -0
  118. package/dist/src/core/utils/update-checker.d.ts.map +1 -1
  119. package/dist/src/core/utils/update-checker.js +82 -25
  120. package/dist/src/core/utils/update-checker.js.map +1 -1
  121. package/dist/src/core/worktree/worktree-manager.d.ts +110 -0
  122. package/dist/src/core/worktree/worktree-manager.d.ts.map +1 -0
  123. package/dist/src/core/worktree/worktree-manager.js +456 -0
  124. package/dist/src/core/worktree/worktree-manager.js.map +1 -0
  125. package/dist/src/features/analytics/core/analytics-service.d.ts +6 -0
  126. package/dist/src/features/analytics/core/analytics-service.d.ts.map +1 -1
  127. package/dist/src/features/analytics/core/analytics-service.js +125 -10
  128. package/dist/src/features/analytics/core/analytics-service.js.map +1 -1
  129. package/dist/src/features/analytics/queries/metrics-queries.d.ts.map +1 -1
  130. package/dist/src/features/analytics/queries/metrics-queries.js +220 -163
  131. package/dist/src/features/analytics/queries/metrics-queries.js.map +1 -1
  132. package/dist/src/features/browser/browser-mcp.d.ts.map +1 -1
  133. package/dist/src/features/browser/browser-mcp.js +3 -0
  134. package/dist/src/features/browser/browser-mcp.js.map +1 -1
  135. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts +5 -0
  136. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.d.ts.map +1 -0
  137. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js +712 -0
  138. package/dist/src/features/tasks/__tests__/pebbles-task-store.test.js.map +1 -0
  139. package/dist/src/features/tasks/pebbles-task-store.d.ts +4 -0
  140. package/dist/src/features/tasks/pebbles-task-store.d.ts.map +1 -1
  141. package/dist/src/features/tasks/pebbles-task-store.js +299 -141
  142. package/dist/src/features/tasks/pebbles-task-store.js.map +1 -1
  143. package/dist/src/integrations/linear/__tests__/auth.test.d.ts +5 -0
  144. package/dist/src/integrations/linear/__tests__/auth.test.d.ts.map +1 -0
  145. package/dist/src/integrations/linear/__tests__/auth.test.js +517 -0
  146. package/dist/src/integrations/linear/__tests__/auth.test.js.map +1 -0
  147. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts +5 -0
  148. package/dist/src/integrations/linear/__tests__/sync-service.test.d.ts.map +1 -0
  149. package/dist/src/integrations/linear/__tests__/sync-service.test.js +700 -0
  150. package/dist/src/integrations/linear/__tests__/sync-service.test.js.map +1 -0
  151. package/dist/src/integrations/linear/client.d.ts +28 -1
  152. package/dist/src/integrations/linear/client.d.ts.map +1 -1
  153. package/dist/src/integrations/linear/client.js +87 -0
  154. package/dist/src/integrations/linear/client.js.map +1 -1
  155. package/dist/src/integrations/linear/sync-service.d.ts +25 -0
  156. package/dist/src/integrations/linear/sync-service.d.ts.map +1 -0
  157. package/dist/src/integrations/linear/sync-service.js +198 -0
  158. package/dist/src/integrations/linear/sync-service.js.map +1 -0
  159. package/dist/src/integrations/linear/sync.d.ts +23 -1
  160. package/dist/src/integrations/linear/sync.d.ts.map +1 -1
  161. package/dist/src/integrations/linear/sync.js +156 -9
  162. package/dist/src/integrations/linear/sync.js.map +1 -1
  163. package/dist/src/integrations/linear/types.d.ts +75 -0
  164. package/dist/src/integrations/linear/types.d.ts.map +1 -0
  165. package/dist/src/integrations/linear/types.js +2 -0
  166. package/dist/src/integrations/linear/types.js.map +1 -0
  167. package/dist/src/integrations/linear/webhook-server.d.ts +32 -0
  168. package/dist/src/integrations/linear/webhook-server.d.ts.map +1 -0
  169. package/dist/src/integrations/linear/webhook-server.js +188 -0
  170. package/dist/src/integrations/linear/webhook-server.js.map +1 -0
  171. package/dist/src/integrations/linear/webhook.d.ts +95 -0
  172. package/dist/src/integrations/linear/webhook.d.ts.map +1 -0
  173. package/dist/src/integrations/linear/webhook.js +204 -0
  174. package/dist/src/integrations/linear/webhook.js.map +1 -0
  175. package/dist/src/integrations/mcp/__tests__/server.test.d.ts +5 -0
  176. package/dist/src/integrations/mcp/__tests__/server.test.d.ts.map +1 -0
  177. package/dist/src/integrations/mcp/__tests__/server.test.js +790 -0
  178. package/dist/src/integrations/mcp/__tests__/server.test.js.map +1 -0
  179. package/dist/src/integrations/mcp/server.d.ts +6 -0
  180. package/dist/src/integrations/mcp/server.d.ts.map +1 -1
  181. package/dist/src/integrations/mcp/server.js +490 -54
  182. package/dist/src/integrations/mcp/server.js.map +1 -1
  183. package/dist/src/servers/production/auth-middleware.d.ts +2 -2
  184. package/dist/src/servers/production/auth-middleware.d.ts.map +1 -1
  185. package/dist/src/servers/production/auth-middleware.js +1 -1
  186. package/dist/src/servers/production/auth-middleware.js.map +1 -1
  187. package/dist/src/services/config-service.d.ts +44 -0
  188. package/dist/src/services/config-service.d.ts.map +1 -0
  189. package/dist/src/services/config-service.js +61 -0
  190. package/dist/src/services/config-service.js.map +1 -0
  191. package/dist/src/services/context-service.d.ts +17 -0
  192. package/dist/src/services/context-service.d.ts.map +1 -0
  193. package/dist/src/services/context-service.js +88 -0
  194. package/dist/src/services/context-service.js.map +1 -0
  195. package/dist/src/types/task.d.ts +17 -0
  196. package/dist/src/types/task.d.ts.map +1 -0
  197. package/dist/src/types/task.js +2 -0
  198. package/dist/src/types/task.js.map +1 -0
  199. package/dist/src/utils/logger.d.ts +13 -0
  200. package/dist/src/utils/logger.d.ts.map +1 -0
  201. package/dist/src/utils/logger.js +52 -0
  202. package/dist/src/utils/logger.js.map +1 -0
  203. 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;AAcH,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;IA0ChB;;OAEG;mBACkB,kBAAkB;IAevC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAaxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAcxB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAexB;;OAEG;WACU,UAAU,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB/D"}
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
- // Silently fail - don't interrupt user workflow
48
- logger.debug('Update check failed:', { error: error.message });
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
- const output = execSync(`npm view ${this.PACKAGE_NAME} version`, {
57
- encoding: 'utf-8',
58
- stdio: ['pipe', 'pipe', 'ignore'],
59
- }).trim();
60
- return output;
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.message,
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
- const currentParts = current.split('.').map(Number);
74
- const latestParts = latest.split('.').map(Number);
75
- for (let i = 0; i < 3; i++) {
76
- if (latestParts[i] > currentParts[i])
77
- return true;
78
- if (latestParts[i] < currentParts[i])
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
- const data = readFileSync(this.CACHE_FILE, 'utf-8');
102
- return JSON.parse(data);
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.message,
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
- // Create directory if it doesn't exist
120
- execSync(`mkdir -p "${dir}"`, { stdio: 'ignore' });
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.message,
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":"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"}
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"}