@legdev/tkxr 1.1.11

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 (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/commands/comments.d.ts +10 -0
  4. package/dist/cli/commands/comments.d.ts.map +1 -0
  5. package/dist/cli/commands/comments.js +81 -0
  6. package/dist/cli/commands/comments.js.map +1 -0
  7. package/dist/cli/commands/create.d.ts +11 -0
  8. package/dist/cli/commands/create.d.ts.map +1 -0
  9. package/dist/cli/commands/create.js +74 -0
  10. package/dist/cli/commands/create.js.map +1 -0
  11. package/dist/cli/commands/delete.d.ts +7 -0
  12. package/dist/cli/commands/delete.d.ts.map +1 -0
  13. package/dist/cli/commands/delete.js +61 -0
  14. package/dist/cli/commands/delete.js.map +1 -0
  15. package/dist/cli/commands/list.d.ts +16 -0
  16. package/dist/cli/commands/list.d.ts.map +1 -0
  17. package/dist/cli/commands/list.js +239 -0
  18. package/dist/cli/commands/list.js.map +1 -0
  19. package/dist/cli/commands/mcp.d.ts +8 -0
  20. package/dist/cli/commands/mcp.d.ts.map +1 -0
  21. package/dist/cli/commands/mcp.js +52 -0
  22. package/dist/cli/commands/mcp.js.map +1 -0
  23. package/dist/cli/commands/serve.d.ts +8 -0
  24. package/dist/cli/commands/serve.d.ts.map +1 -0
  25. package/dist/cli/commands/serve.js +505 -0
  26. package/dist/cli/commands/serve.js.map +1 -0
  27. package/dist/cli/commands/show.d.ts +7 -0
  28. package/dist/cli/commands/show.d.ts.map +1 -0
  29. package/dist/cli/commands/show.js +84 -0
  30. package/dist/cli/commands/show.js.map +1 -0
  31. package/dist/cli/commands/sprint.d.ts +11 -0
  32. package/dist/cli/commands/sprint.d.ts.map +1 -0
  33. package/dist/cli/commands/sprint.js +114 -0
  34. package/dist/cli/commands/sprint.js.map +1 -0
  35. package/dist/cli/commands/sprints.d.ts +10 -0
  36. package/dist/cli/commands/sprints.d.ts.map +1 -0
  37. package/dist/cli/commands/sprints.js +64 -0
  38. package/dist/cli/commands/sprints.js.map +1 -0
  39. package/dist/cli/commands/status.d.ts +6 -0
  40. package/dist/cli/commands/status.d.ts.map +1 -0
  41. package/dist/cli/commands/status.js +48 -0
  42. package/dist/cli/commands/status.js.map +1 -0
  43. package/dist/cli/commands/user.d.ts +8 -0
  44. package/dist/cli/commands/user.d.ts.map +1 -0
  45. package/dist/cli/commands/user.js +61 -0
  46. package/dist/cli/commands/user.js.map +1 -0
  47. package/dist/cli/commands/users.d.ts +7 -0
  48. package/dist/cli/commands/users.d.ts.map +1 -0
  49. package/dist/cli/commands/users.js +28 -0
  50. package/dist/cli/commands/users.js.map +1 -0
  51. package/dist/cli/commands/version.d.ts +7 -0
  52. package/dist/cli/commands/version.d.ts.map +1 -0
  53. package/dist/cli/commands/version.js +94 -0
  54. package/dist/cli/commands/version.js.map +1 -0
  55. package/dist/cli/index.d.ts +3 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +146 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/core/notifier.d.ts +51 -0
  60. package/dist/core/notifier.d.ts.map +1 -0
  61. package/dist/core/notifier.js +118 -0
  62. package/dist/core/notifier.js.map +1 -0
  63. package/dist/core/storage.d.ts +41 -0
  64. package/dist/core/storage.d.ts.map +1 -0
  65. package/dist/core/storage.js +383 -0
  66. package/dist/core/storage.js.map +1 -0
  67. package/dist/core/test_getAllTickets.d.ts +2 -0
  68. package/dist/core/test_getAllTickets.d.ts.map +1 -0
  69. package/dist/core/test_getAllTickets.js +7 -0
  70. package/dist/core/test_getAllTickets.js.map +1 -0
  71. package/dist/core/types.d.ts +67 -0
  72. package/dist/core/types.d.ts.map +1 -0
  73. package/dist/core/types.js +2 -0
  74. package/dist/core/types.js.map +1 -0
  75. package/dist/index.d.ts +3 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +3 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/mcp/server.d.ts +25 -0
  80. package/dist/mcp/server.d.ts.map +1 -0
  81. package/dist/mcp/server.js +489 -0
  82. package/dist/mcp/server.js.map +1 -0
  83. package/dist/web/_app/immutable/assets/0.47dd68fd.css +1 -0
  84. package/dist/web/_app/immutable/assets/2.3f11c9a4.css +1 -0
  85. package/dist/web/_app/immutable/assets/_layout.47e0a118.css +1 -0
  86. package/dist/web/_app/immutable/assets/_page.3f11c9a4.css +1 -0
  87. package/dist/web/_app/immutable/chunks/index.23b89654.js +1 -0
  88. package/dist/web/_app/immutable/chunks/index.f094d695.js +1 -0
  89. package/dist/web/_app/immutable/chunks/scheduler.81694808.js +1 -0
  90. package/dist/web/_app/immutable/chunks/singletons.9c246a72.js +1 -0
  91. package/dist/web/_app/immutable/chunks/stores.48058fce.js +1 -0
  92. package/dist/web/_app/immutable/entry/app.fea83d45.js +1 -0
  93. package/dist/web/_app/immutable/entry/start.3fd90366.js +3 -0
  94. package/dist/web/_app/immutable/nodes/0.e605bf9a.js +1 -0
  95. package/dist/web/_app/immutable/nodes/1.e3ce54f6.js +1 -0
  96. package/dist/web/_app/immutable/nodes/2.04dfac64.js +13 -0
  97. package/dist/web/_app/version.json +1 -0
  98. package/dist/web/favicon.png +3 -0
  99. package/dist/web/favicon.svg +10 -0
  100. package/dist/web/index.html +37 -0
  101. package/package.json +60 -0
@@ -0,0 +1,146 @@
1
+ #!/usr/bin/env node
2
+ import minimist from 'minimist';
3
+ import chalk from 'chalk';
4
+ import { readFileSync } from 'fs';
5
+ import { dirname, join } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { createTicket } from './commands/create.js';
8
+ import { listTickets } from './commands/list.js';
9
+ import { showTicket } from './commands/show.js';
10
+ import { deleteTicket } from './commands/delete.js';
11
+ import { updateTicketStatus } from './commands/status.js';
12
+ import { startServer } from './commands/serve.js';
13
+ import { listUsers } from './commands/users.js';
14
+ import { manageUser } from './commands/user.js';
15
+ import { listSprints } from './commands/sprints.js';
16
+ import { manageSprint } from './commands/sprint.js';
17
+ import { startMCPServer } from './commands/mcp.js';
18
+ import { manageComments } from './commands/comments.js';
19
+ import { manageVersion } from './commands/version.js';
20
+ const commands = {
21
+ create: createTicket,
22
+ list: listTickets,
23
+ show: showTicket,
24
+ delete: deleteTicket,
25
+ status: updateTicketStatus,
26
+ serve: startServer,
27
+ users: listUsers,
28
+ user: manageUser,
29
+ sprints: listSprints,
30
+ sprint: manageSprint,
31
+ comments: manageComments,
32
+ mcp: startMCPServer,
33
+ version: manageVersion,
34
+ new: createTicket, // Alias for create
35
+ };
36
+ function showHelp() {
37
+ console.log(chalk.blue.bold('tkxr - In-repo ticket management system'));
38
+ console.log();
39
+ console.log(chalk.green('Usage:'));
40
+ console.log(' tkxr <command> [options]');
41
+ console.log();
42
+ console.log(chalk.green('Ticket Commands:'));
43
+ console.log(' create <type> <title> Create a new ticket (task, bug)');
44
+ console.log(' new <type> <title> Alias for create');
45
+ console.log(' list [type] List tickets (optionally filter by type)');
46
+ console.log(' show <id> Show detailed ticket information');
47
+ console.log(' Options:');
48
+ console.log(' --search, -s <term> Search tickets by title, description, or ID');
49
+ console.log(' --sort-by <field> Sort by: title, status, priority, created, updated');
50
+ console.log(' --order <order> Sort order: asc, desc (default: desc)');
51
+ console.log(' --status <status> Filter by status: todo, progress, done');
52
+ console.log(' --assignee <id> Filter by assignee ID');
53
+ console.log(' --sprint <id> Filter by sprint ID');
54
+ console.log(' --verbose, -v Show assignee and sprint names');
55
+ console.log(' delete <id> Delete a ticket');
56
+ console.log(' status <id> <status> Update ticket status (todo, progress, done)');
57
+ console.log(' comments <id> List comments for a ticket');
58
+ console.log(' comments <id> --add Add a comment to a ticket');
59
+ console.log(' --author <author-id> Author of the comment (user ID or username)');
60
+ console.log(' --content <text> Comment content');
61
+ console.log();
62
+ console.log(chalk.green('User Commands:'));
63
+ console.log(' users List all users');
64
+ console.log(' user create <username> <name> Create a new user');
65
+ console.log();
66
+ console.log(chalk.green('Sprint Commands:'));
67
+ console.log(' sprints List all sprints');
68
+ console.log(' sprint create <name> Create a new sprint');
69
+ console.log(' sprint status <id> <status> Update sprint status');
70
+ console.log();
71
+ console.log(chalk.green('Server Commands:'));
72
+ console.log(' serve Start web interface server');
73
+ console.log(' Options:');
74
+ console.log(' --port <number> Server port (default: 8080)');
75
+ console.log(' --host <string> Server host (default: localhost)');
76
+ console.log(' mcp Start MCP server for AI integration');
77
+ console.log();
78
+ console.log(chalk.green('Version Commands:'));
79
+ console.log(' version Show current version');
80
+ console.log(' version --bump <type> Bump version (patch, minor, major)');
81
+ console.log();
82
+ console.log(chalk.green('Examples:'));
83
+ console.log(' tkxr new task "Fix login bug"');
84
+ console.log(' tkxr new bug "Dashboard crash"');
85
+ console.log(' tkxr user create johndoe "John Doe"');
86
+ console.log(' tkxr sprint create "Sprint 1"');
87
+ console.log(' tkxr sprint status spr-123 active');
88
+ console.log(' tkxr list tasks');
89
+ console.log(' tkxr list --search "login"');
90
+ console.log(' tkxr list --sort-by priority --order desc');
91
+ console.log(' tkxr list --status progress --sort-by created');
92
+ console.log(' tkxr status task-123 done');
93
+ console.log(' tkxr comments tas-123');
94
+ console.log(' tkxr comments tas-123 --add --author johndoe --content "Fixed the issue"');
95
+ console.log(' tkxr serve --port 3000');
96
+ console.log(' tkxr mcp');
97
+ }
98
+ function showVersion() {
99
+ try {
100
+ const __filename = fileURLToPath(import.meta.url);
101
+ const __dirname = dirname(__filename);
102
+ const packageJsonPath = join(__dirname, '../../package.json');
103
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
104
+ console.log(`tkxr v${packageJson.version}`);
105
+ }
106
+ catch (error) {
107
+ console.log('tkxr v1.0.0'); // Fallback version
108
+ }
109
+ }
110
+ async function main() {
111
+ const args = minimist(process.argv.slice(2));
112
+ if (args.help || args.h) {
113
+ showHelp();
114
+ return;
115
+ }
116
+ if (args.version || args.v) {
117
+ showVersion();
118
+ return;
119
+ }
120
+ const command = args._[0];
121
+ if (!command) {
122
+ console.log(chalk.red('Error: No command specified'));
123
+ console.log('Run "tkxr --help" for usage information');
124
+ process.exit(1);
125
+ }
126
+ const commandFn = commands[command];
127
+ if (!commandFn) {
128
+ console.log(chalk.red(`Error: Unknown command "${command}"`));
129
+ console.log('Run "tkxr --help" for available commands');
130
+ process.exit(1);
131
+ }
132
+ try {
133
+ await commandFn(args);
134
+ }
135
+ catch (error) {
136
+ console.log(chalk.red(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
137
+ process.exit(1);
138
+ }
139
+ }
140
+ // Handle uncaught errors
141
+ process.on('unhandledRejection', (error) => {
142
+ console.log(chalk.red(`Unhandled error: ${error}`));
143
+ process.exit(1);
144
+ });
145
+ main();
146
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Simple notification client for sending updates from CLI to web server
3
+ */
4
+ export declare class NotificationClient {
5
+ private serverUrl;
6
+ private timeout;
7
+ constructor(serverUrl?: string, timeout?: number);
8
+ /**
9
+ * Update the server URL (useful when server starts on different port)
10
+ */
11
+ setServerUrl(url: string): void;
12
+ /**
13
+ * Attempt to notify the web server of a change
14
+ * Fails silently if server is not running
15
+ */
16
+ private notify;
17
+ /**
18
+ * Notify server that a ticket was created
19
+ */
20
+ notifyTicketCreated(ticket: any): Promise<void>;
21
+ /**
22
+ * Notify server that a ticket was updated
23
+ */
24
+ notifyTicketUpdated(ticket: any): Promise<void>;
25
+ /**
26
+ * Notify server that a ticket was deleted
27
+ */
28
+ notifyTicketDeleted(id: string): Promise<void>;
29
+ /**
30
+ * Notify server that a sprint was created
31
+ */
32
+ notifySprintCreated(sprint: any): Promise<void>;
33
+ /**
34
+ * Notify server that a sprint was updated
35
+ */
36
+ notifySprintUpdated(sprint: any): Promise<void>;
37
+ /**
38
+ * Notify server that a user was created
39
+ */
40
+ notifyUserCreated(user: any): Promise<void>;
41
+ /**
42
+ * Notify server that a comment was created
43
+ */
44
+ notifyCommentCreated(comment: any): Promise<void>;
45
+ /**
46
+ * Notify server that a comment was deleted
47
+ */
48
+ notifyCommentDeleted(commentId: string, ticketId: string): Promise<void>;
49
+ }
50
+ export declare const notifier: NotificationClient;
51
+ //# sourceMappingURL=notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/core/notifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;gBADP,SAAS,GAAE,MAAgC,EAC3C,OAAO,GAAE,MAAa;IAGhC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;;OAGG;YACW,MAAM;IA4BpB;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/E;AAwBD,eAAO,MAAM,QAAQ,oBAAgD,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Simple notification client for sending updates from CLI to web server
3
+ */
4
+ export class NotificationClient {
5
+ serverUrl;
6
+ timeout;
7
+ constructor(serverUrl = 'http://localhost:8080', timeout = 5000 // Increased timeout
8
+ ) {
9
+ this.serverUrl = serverUrl;
10
+ this.timeout = timeout;
11
+ }
12
+ /**
13
+ * Update the server URL (useful when server starts on different port)
14
+ */
15
+ setServerUrl(url) {
16
+ this.serverUrl = url;
17
+ }
18
+ /**
19
+ * Attempt to notify the web server of a change
20
+ * Fails silently if server is not running
21
+ */
22
+ async notify(endpoint, data) {
23
+ try {
24
+ const controller = new AbortController();
25
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
26
+ const response = await fetch(`${this.serverUrl}${endpoint}`, {
27
+ method: 'POST',
28
+ headers: {
29
+ 'Content-Type': 'application/json',
30
+ },
31
+ body: data ? JSON.stringify(data) : undefined,
32
+ signal: controller.signal,
33
+ });
34
+ clearTimeout(timeoutId);
35
+ // Don't throw on HTTP errors, just log for debugging
36
+ if (!response.ok) {
37
+ console.log(`⚠️ Notification failed: ${response.status} - ${endpoint}`);
38
+ }
39
+ else {
40
+ console.log(`✓ Notification sent successfully: ${endpoint}`);
41
+ }
42
+ }
43
+ catch (error) {
44
+ // Silently fail - server might not be running
45
+ console.log(`⚠️ Server notification failed for ${endpoint}:`, error instanceof Error ? error.message : 'Unknown error');
46
+ }
47
+ }
48
+ /**
49
+ * Notify server that a ticket was created
50
+ */
51
+ async notifyTicketCreated(ticket) {
52
+ await this.notify('/api/cli-notifications/ticket-created', ticket);
53
+ }
54
+ /**
55
+ * Notify server that a ticket was updated
56
+ */
57
+ async notifyTicketUpdated(ticket) {
58
+ await this.notify('/api/cli-notifications/ticket-updated', ticket);
59
+ }
60
+ /**
61
+ * Notify server that a ticket was deleted
62
+ */
63
+ async notifyTicketDeleted(id) {
64
+ await this.notify('/api/cli-notifications/ticket-deleted', { id });
65
+ }
66
+ /**
67
+ * Notify server that a sprint was created
68
+ */
69
+ async notifySprintCreated(sprint) {
70
+ await this.notify('/api/cli-notifications/sprint-created', sprint);
71
+ }
72
+ /**
73
+ * Notify server that a sprint was updated
74
+ */
75
+ async notifySprintUpdated(sprint) {
76
+ await this.notify('/api/cli-notifications/sprint-updated', sprint);
77
+ }
78
+ /**
79
+ * Notify server that a user was created
80
+ */
81
+ async notifyUserCreated(user) {
82
+ await this.notify('/api/cli-notifications/user-created', user);
83
+ }
84
+ /**
85
+ * Notify server that a comment was created
86
+ */
87
+ async notifyCommentCreated(comment) {
88
+ await this.notify('/api/cli-notifications/comment-created', comment);
89
+ }
90
+ /**
91
+ * Notify server that a comment was deleted
92
+ */
93
+ async notifyCommentDeleted(commentId, ticketId) {
94
+ await this.notify('/api/cli-notifications/comment-deleted', { id: commentId, ticketId });
95
+ }
96
+ }
97
+ import { existsSync, readFileSync } from 'fs';
98
+ /**
99
+ * Try to read server config from .tkxr-server file
100
+ */
101
+ function getDefaultServerUrl() {
102
+ try {
103
+ const configPath = './.tkxr-server';
104
+ if (existsSync(configPath)) {
105
+ const config = JSON.parse(readFileSync(configPath, 'utf8'));
106
+ return config.url || `http://localhost:${config.port || 8080}`;
107
+ }
108
+ }
109
+ catch (error) {
110
+ // Ignore errors, fall back to defaults
111
+ console.debug('Could not read server config:', error);
112
+ }
113
+ // Fallback to environment or default
114
+ return process.env.TKXR_SERVER_URL || `http://localhost:${process.env.TKXR_PORT || 8080}`;
115
+ }
116
+ // Global instance - can be reconfigured at runtime
117
+ export const notifier = new NotificationClient(getDefaultServerUrl());
118
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/core/notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Ticket, Sprint, User, TicketType, TicketComment } from './types.js';
2
+ export declare class ProjectStorage {
3
+ private ticketsDir;
4
+ private commentsDir;
5
+ private sprintsPath;
6
+ private usersPath;
7
+ constructor(basePath?: string);
8
+ private generateId;
9
+ createUser(username: string, displayName: string, options?: Partial<User>): Promise<User>;
10
+ getUsers(): Promise<User[]>;
11
+ deleteUser(userId: string): Promise<boolean>;
12
+ updateUser(id: string, updates: Partial<Pick<User, 'username' | 'displayName' | 'email'>>): Promise<User | null>;
13
+ createSprint(name: string, options?: Partial<Sprint>): Promise<Sprint>;
14
+ getSprints(): Promise<Sprint[]>;
15
+ updateSprintStatus(id: string, status: Sprint['status']): Promise<Sprint | null>;
16
+ updateSprint(id: string, updates: Partial<Pick<Sprint, 'name' | 'description' | 'goal'>>): Promise<Sprint | null>;
17
+ deleteSprint(sprintId: string): Promise<boolean>;
18
+ private getTicketChunkFiles;
19
+ createTicket(type: TicketType, title: string, options?: Partial<Ticket>): Promise<Ticket>;
20
+ getAllTickets(): Promise<Ticket[]>;
21
+ getTicketsByType(type: TicketType): Promise<Ticket[]>;
22
+ private getCommentChunkFiles;
23
+ createComment(ticketId: string, author: string, content: string): Promise<TicketComment>;
24
+ getComments(ticketId: string): Promise<TicketComment[]>;
25
+ findTicket(ticketId: string): Promise<{
26
+ ticket: Ticket;
27
+ } | null>;
28
+ findEntity(id: string): Promise<{
29
+ entity: any;
30
+ type: string;
31
+ } | null>;
32
+ deleteComment(commentId: string): Promise<boolean>;
33
+ deleteEntity(entityType: string, id: string): Promise<boolean>;
34
+ deleteTicket(ticketId: string): Promise<boolean>;
35
+ updateTicket(id: string, updates: Partial<Ticket>): Promise<Ticket | null>;
36
+ updateTicketStatus(id: string, status: Ticket['status']): Promise<Ticket | null>;
37
+ getArchivedSprints(): Promise<string[]>;
38
+ loadProject(): Promise<void>;
39
+ }
40
+ export declare const createStorage: () => Promise<ProjectStorage>;
41
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/core/storage.ts"],"names":[],"mappings":"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"}