@crypto512/jicon-mcp 0.7.0 → 0.7.1
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 +81 -62
- package/dist/utils/content-buffer.d.ts +12 -0
- package/dist/utils/content-buffer.d.ts.map +1 -1
- package/dist/utils/content-buffer.js +29 -12
- package/dist/utils/content-buffer.js.map +1 -1
- package/package.json +1 -1
- package/CLAUDE.md +0 -947
- package/CONTRIBUTING.md +0 -371
- package/DEVELOPMENT.md +0 -400
- package/JIRA_API_ANALYSIS.md +0 -275
package/README.md
CHANGED
|
@@ -109,7 +109,7 @@ Buffered tools return:
|
|
|
109
109
|
|
|
110
110
|
### Buffer Management
|
|
111
111
|
|
|
112
|
-
- **TTL**: Buffers expire after 10 minutes
|
|
112
|
+
- **TTL**: Buffers expire after 10 minutes by default; edited buffers reset to 1 day TTL
|
|
113
113
|
- **List Buffers**: Use `buffer_list` to see active buffers
|
|
114
114
|
- **Clear Buffers**: Use `buffer_clear` to free memory
|
|
115
115
|
|
|
@@ -187,14 +187,14 @@ Use `buffer_edit` to perform find/replace on buffered content:
|
|
|
187
187
|
|
|
188
188
|
## Configuration
|
|
189
189
|
|
|
190
|
-
### Configuration with `.jicon.json`
|
|
190
|
+
### Configuration with `.jicon.json`
|
|
191
191
|
|
|
192
192
|
Jicon supports a flexible configuration hierarchy with permission control:
|
|
193
193
|
|
|
194
194
|
**Configuration Priority:**
|
|
195
195
|
1. `.jicon.json` (project root) - **Highest priority**
|
|
196
196
|
2. `$HOME/.config/jicon/jicon.json` (user config) - Medium priority
|
|
197
|
-
3. Environment variables - Lowest priority
|
|
197
|
+
3. Environment variables - Lowest priority
|
|
198
198
|
|
|
199
199
|
**Create `.jicon.json` in your project root:**
|
|
200
200
|
|
|
@@ -216,6 +216,8 @@ Jicon supports a flexible configuration hierarchy with permission control:
|
|
|
216
216
|
}
|
|
217
217
|
```
|
|
218
218
|
|
|
219
|
+
**Note:** Tempo uses the same Jira URL and credentials - no separate configuration needed.
|
|
220
|
+
|
|
219
221
|
**⚠️ Important:** Add `.jicon.json` to your `.gitignore` to avoid committing credentials!
|
|
220
222
|
|
|
221
223
|
### Permission Modes
|
|
@@ -302,11 +304,24 @@ Simplify configuration with **virtual actions** that group related tools:
|
|
|
302
304
|
|
|
303
305
|
See [`.jicon.json.example`](.jicon.json.example), [`.jicon.json.readonly`](.jicon.json.readonly), and [`.jicon.json.custom`](.jicon.json.custom) for more examples.
|
|
304
306
|
|
|
305
|
-
### Environment Variables
|
|
307
|
+
### Environment Variables
|
|
308
|
+
|
|
309
|
+
All configuration options can be set via environment variables:
|
|
310
|
+
|
|
311
|
+
| Variable | Description |
|
|
312
|
+
|----------|-------------|
|
|
313
|
+
| `JIRA_URL` | Jira instance URL |
|
|
314
|
+
| `JIRA_USERNAME` | Username/email (omit for Bearer auth) |
|
|
315
|
+
| `JIRA_API_TOKEN` | API token or PAT |
|
|
316
|
+
| `JIRA_AUTH_TYPE` | `basic` (default) or `bearer` |
|
|
317
|
+
| `CONFLUENCE_URL` | Confluence instance URL |
|
|
318
|
+
| `CONFLUENCE_USERNAME` | Username/email (omit for Bearer auth) |
|
|
319
|
+
| `CONFLUENCE_API_TOKEN` | API token or PAT |
|
|
320
|
+
| `CONFLUENCE_AUTH_TYPE` | `basic` (default) or `bearer` |
|
|
306
321
|
|
|
307
|
-
|
|
322
|
+
### Claude Desktop
|
|
308
323
|
|
|
309
|
-
|
|
324
|
+
Add to `claude_desktop_config.json`:
|
|
310
325
|
|
|
311
326
|
```json
|
|
312
327
|
{
|
|
@@ -327,6 +342,50 @@ For Claude Desktop, add to config file:
|
|
|
327
342
|
}
|
|
328
343
|
```
|
|
329
344
|
|
|
345
|
+
### Claude Code
|
|
346
|
+
|
|
347
|
+
Add to `~/.claude/settings.json` or project `.mcp.json`:
|
|
348
|
+
|
|
349
|
+
```json
|
|
350
|
+
{
|
|
351
|
+
"mcpServers": {
|
|
352
|
+
"jicon": {
|
|
353
|
+
"command": "npx",
|
|
354
|
+
"args": ["-y", "@crypto512/jicon-mcp"],
|
|
355
|
+
"env": {
|
|
356
|
+
"JIRA_URL": "https://jira.example.com",
|
|
357
|
+
"JIRA_USERNAME": "your-email@example.com",
|
|
358
|
+
"JIRA_API_TOKEN": "your-api-token"
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### OpenCode
|
|
366
|
+
|
|
367
|
+
For [OpenCode](https://opencode.ai) 1.0+, add to `opencode.jsonc` in your project root or `~/.config/opencode/opencode.jsonc`:
|
|
368
|
+
|
|
369
|
+
```jsonc
|
|
370
|
+
{
|
|
371
|
+
"$schema": "https://opencode.ai/config.json",
|
|
372
|
+
"mcp": {
|
|
373
|
+
"jicon": {
|
|
374
|
+
"type": "local",
|
|
375
|
+
"command": ["npx", "-y", "@crypto512/jicon-mcp"],
|
|
376
|
+
"environment": {
|
|
377
|
+
"JIRA_URL": "https://jira.example.com",
|
|
378
|
+
"JIRA_USERNAME": "your-email@example.com",
|
|
379
|
+
"JIRA_API_TOKEN": "your-api-token",
|
|
380
|
+
"CONFLUENCE_URL": "https://confluence.example.com",
|
|
381
|
+
"CONFLUENCE_USERNAME": "your-email@example.com",
|
|
382
|
+
"CONFLUENCE_API_TOKEN": "your-api-token"
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
330
389
|
## Example Usage
|
|
331
390
|
|
|
332
391
|
Once configured, you can ask Claude to:
|
|
@@ -340,12 +399,6 @@ Once configured, you can ask Claude to:
|
|
|
340
399
|
- *"Show me my worklogs for this week"*
|
|
341
400
|
- *"Get team worklogs for the development team"*
|
|
342
401
|
|
|
343
|
-
## Documentation
|
|
344
|
-
|
|
345
|
-
- **[CLAUDE.md](CLAUDE.md)** - Complete functional specification
|
|
346
|
-
- **[TOOL_LIST.md](TOOL_LIST.md)** - Comprehensive tool reference with examples
|
|
347
|
-
- **[API Documentation](docs/api.md)** - Detailed API documentation (coming soon)
|
|
348
|
-
|
|
349
402
|
## Tool Categories
|
|
350
403
|
|
|
351
404
|
### Jira Tools
|
|
@@ -402,17 +455,29 @@ Once configured, you can ask Claude to:
|
|
|
402
455
|
|
|
403
456
|
## Authentication
|
|
404
457
|
|
|
405
|
-
### Jira/Confluence Cloud
|
|
458
|
+
### Jira/Confluence Cloud (Basic Auth)
|
|
406
459
|
Generate an API token from your Atlassian account:
|
|
407
460
|
1. Go to https://id.atlassian.com/manage-profile/security/api-tokens
|
|
408
461
|
2. Create a new API token
|
|
409
|
-
3. Use your email as username and the token as
|
|
462
|
+
3. Use your email as `username` and the token as `token`
|
|
410
463
|
|
|
411
|
-
### Jira/Confluence Data Center
|
|
412
|
-
|
|
464
|
+
### Jira/Confluence Data Center (Bearer Auth)
|
|
465
|
+
For Data Center 8.14+, use Personal Access Tokens (PAT):
|
|
413
466
|
1. Go to your profile settings
|
|
414
467
|
2. Navigate to "Personal Access Tokens"
|
|
415
468
|
3. Create a new token with required permissions
|
|
469
|
+
4. Omit `username` or set `authType: "bearer"` to use Bearer authentication
|
|
470
|
+
|
|
471
|
+
**Data Center `.jicon.json` example:**
|
|
472
|
+
```json
|
|
473
|
+
{
|
|
474
|
+
"jira": {
|
|
475
|
+
"url": "https://jira.example.com",
|
|
476
|
+
"token": "your-personal-access-token",
|
|
477
|
+
"authType": "bearer"
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
```
|
|
416
481
|
|
|
417
482
|
## Security Best Practices
|
|
418
483
|
|
|
@@ -422,52 +487,6 @@ Generate a Personal Access Token (PAT):
|
|
|
422
487
|
- ✅ Never commit credentials to version control
|
|
423
488
|
- ✅ Use read-only tokens for search/read operations
|
|
424
489
|
|
|
425
|
-
## Development Status
|
|
426
|
-
|
|
427
|
-
- ✅ **Specification Complete** - Functional spec and tool list defined
|
|
428
|
-
- ✅ **Implementation Complete** - All 52 tools implemented
|
|
429
|
-
- ✅ **Testing** - 157 tests passing
|
|
430
|
-
- ✅ **Configuration System** - Flexible .jicon.json with permissions
|
|
431
|
-
- ✅ **Content Buffering** - In-memory pagination for large responses
|
|
432
|
-
- 📦 **Publishing** - Ready for npm publish
|
|
433
|
-
|
|
434
|
-
## Roadmap
|
|
435
|
-
|
|
436
|
-
### Phase 1: Core Implementation ✅ **COMPLETED**
|
|
437
|
-
- ✅ Project setup and structure
|
|
438
|
-
- ✅ Jira API client implementation (19 tools)
|
|
439
|
-
- ✅ Confluence API client implementation (14 tools)
|
|
440
|
-
- ✅ Tempo API client implementation (12 tools)
|
|
441
|
-
- ✅ Workload utility tools implementation (2 tools)
|
|
442
|
-
- ✅ Buffer tools implementation (5 tools)
|
|
443
|
-
- ✅ MCP server implementation
|
|
444
|
-
- ✅ Basic testing (157 tests, 100% pass rate)
|
|
445
|
-
- ✅ Configuration system (.jicon.json with hierarchy)
|
|
446
|
-
- ✅ Permission system (full, readonly, custom modes)
|
|
447
|
-
- ✅ Virtual actions (jira_read, jira_all, confluence_read, tempo_all, etc.)
|
|
448
|
-
- ✅ Content buffering with pagination support
|
|
449
|
-
- ✅ Development and contributing guides
|
|
450
|
-
|
|
451
|
-
### Phase 2: Enhancement (In Progress)
|
|
452
|
-
- ✅ Advanced error handling (implemented)
|
|
453
|
-
- [ ] Rate limiting and caching
|
|
454
|
-
- [ ] Integration tests with mock servers
|
|
455
|
-
- ✅ Documentation examples (DEVELOPMENT.md added)
|
|
456
|
-
- [ ] CI/CD pipeline
|
|
457
|
-
- [ ] npm package publishing
|
|
458
|
-
|
|
459
|
-
### Phase 3: Advanced Features (Planned)
|
|
460
|
-
- [ ] Bulk operations
|
|
461
|
-
- [ ] Custom field templates
|
|
462
|
-
- [ ] Webhook support
|
|
463
|
-
- [ ] Multi-instance support
|
|
464
|
-
- [ ] CLI tool for configuration testing
|
|
465
|
-
- [ ] Performance optimizations
|
|
466
|
-
|
|
467
|
-
## Contributing
|
|
468
|
-
|
|
469
|
-
Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.
|
|
470
|
-
|
|
471
490
|
## License
|
|
472
491
|
|
|
473
492
|
MIT License - see [LICENSE](LICENSE) file for details.
|
|
@@ -8,6 +8,7 @@ export interface BufferEntry {
|
|
|
8
8
|
content: string;
|
|
9
9
|
totalSize: number;
|
|
10
10
|
createdAt: number;
|
|
11
|
+
modifiedAt?: number;
|
|
11
12
|
ttl: number;
|
|
12
13
|
metadata?: Record<string, unknown>;
|
|
13
14
|
}
|
|
@@ -72,13 +73,24 @@ export interface EditError {
|
|
|
72
73
|
export declare class ContentBuffer {
|
|
73
74
|
private buffers;
|
|
74
75
|
private defaultTTL;
|
|
76
|
+
private modifiedTTL;
|
|
75
77
|
private cleanupInterval;
|
|
76
78
|
private defaultChunkSize;
|
|
77
79
|
constructor(options?: {
|
|
78
80
|
defaultTTL?: number;
|
|
81
|
+
modifiedTTL?: number;
|
|
79
82
|
defaultChunkSize?: number;
|
|
80
83
|
cleanupIntervalMs?: number;
|
|
81
84
|
});
|
|
85
|
+
/**
|
|
86
|
+
* Check if a buffer entry is expired
|
|
87
|
+
* Modified buffers use modifiedAt as the reference time
|
|
88
|
+
*/
|
|
89
|
+
private isExpired;
|
|
90
|
+
/**
|
|
91
|
+
* Get the expiration timestamp for a buffer entry
|
|
92
|
+
*/
|
|
93
|
+
private getExpiresAt;
|
|
82
94
|
/**
|
|
83
95
|
* Store content in the buffer and return a unique buffer ID
|
|
84
96
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-buffer.d.ts","sourceRoot":"","sources":["../../src/utils/content-buffer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAGD,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,IAAI,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,gBAAgB,CAAS;gBAErB,OAAO,CAAC,EAAE;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;
|
|
1
|
+
{"version":3,"file":"content-buffer.d.ts","sourceRoot":"","sources":["../../src/utils/content-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,13 @@ import { randomBytes } from "crypto";
|
|
|
8
8
|
export class ContentBuffer {
|
|
9
9
|
buffers;
|
|
10
10
|
defaultTTL;
|
|
11
|
+
modifiedTTL;
|
|
11
12
|
cleanupInterval = null;
|
|
12
13
|
defaultChunkSize;
|
|
13
14
|
constructor(options) {
|
|
14
15
|
this.buffers = new Map();
|
|
15
16
|
this.defaultTTL = options?.defaultTTL ?? 10 * 60 * 1000; // 10 minutes
|
|
17
|
+
this.modifiedTTL = options?.modifiedTTL ?? 24 * 60 * 60 * 1000; // 1 day for modified buffers
|
|
16
18
|
this.defaultChunkSize = options?.defaultChunkSize ?? 5000;
|
|
17
19
|
// Start periodic cleanup
|
|
18
20
|
const cleanupMs = options?.cleanupIntervalMs ?? 60 * 1000; // 1 minute
|
|
@@ -22,6 +24,21 @@ export class ContentBuffer {
|
|
|
22
24
|
this.cleanupInterval.unref();
|
|
23
25
|
}
|
|
24
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if a buffer entry is expired
|
|
29
|
+
* Modified buffers use modifiedAt as the reference time
|
|
30
|
+
*/
|
|
31
|
+
isExpired(entry) {
|
|
32
|
+
const referenceTime = entry.modifiedAt ?? entry.createdAt;
|
|
33
|
+
return Date.now() - referenceTime > entry.ttl;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get the expiration timestamp for a buffer entry
|
|
37
|
+
*/
|
|
38
|
+
getExpiresAt(entry) {
|
|
39
|
+
const referenceTime = entry.modifiedAt ?? entry.createdAt;
|
|
40
|
+
return referenceTime + entry.ttl;
|
|
41
|
+
}
|
|
25
42
|
/**
|
|
26
43
|
* Store content in the buffer and return a unique buffer ID
|
|
27
44
|
*/
|
|
@@ -46,7 +63,7 @@ export class ContentBuffer {
|
|
|
46
63
|
return null;
|
|
47
64
|
}
|
|
48
65
|
// Check if expired
|
|
49
|
-
if (
|
|
66
|
+
if (this.isExpired(entry)) {
|
|
50
67
|
this.buffers.delete(bufferId);
|
|
51
68
|
return null;
|
|
52
69
|
}
|
|
@@ -71,7 +88,7 @@ export class ContentBuffer {
|
|
|
71
88
|
if (!entry) {
|
|
72
89
|
return false;
|
|
73
90
|
}
|
|
74
|
-
if (
|
|
91
|
+
if (this.isExpired(entry)) {
|
|
75
92
|
this.buffers.delete(bufferId);
|
|
76
93
|
return false;
|
|
77
94
|
}
|
|
@@ -85,7 +102,7 @@ export class ContentBuffer {
|
|
|
85
102
|
if (!entry) {
|
|
86
103
|
return null;
|
|
87
104
|
}
|
|
88
|
-
if (
|
|
105
|
+
if (this.isExpired(entry)) {
|
|
89
106
|
this.buffers.delete(bufferId);
|
|
90
107
|
return null;
|
|
91
108
|
}
|
|
@@ -93,7 +110,7 @@ export class ContentBuffer {
|
|
|
93
110
|
bufferId,
|
|
94
111
|
totalSize: entry.totalSize,
|
|
95
112
|
createdAt: entry.createdAt,
|
|
96
|
-
expiresAt:
|
|
113
|
+
expiresAt: this.getExpiresAt(entry),
|
|
97
114
|
metadata: entry.metadata,
|
|
98
115
|
};
|
|
99
116
|
}
|
|
@@ -101,10 +118,9 @@ export class ContentBuffer {
|
|
|
101
118
|
* List all active buffers
|
|
102
119
|
*/
|
|
103
120
|
list() {
|
|
104
|
-
const now = Date.now();
|
|
105
121
|
const result = [];
|
|
106
122
|
for (const [bufferId, entry] of this.buffers.entries()) {
|
|
107
|
-
if (
|
|
123
|
+
if (this.isExpired(entry)) {
|
|
108
124
|
this.buffers.delete(bufferId);
|
|
109
125
|
continue;
|
|
110
126
|
}
|
|
@@ -112,7 +128,7 @@ export class ContentBuffer {
|
|
|
112
128
|
bufferId,
|
|
113
129
|
totalSize: entry.totalSize,
|
|
114
130
|
createdAt: entry.createdAt,
|
|
115
|
-
expiresAt:
|
|
131
|
+
expiresAt: this.getExpiresAt(entry),
|
|
116
132
|
metadata: entry.metadata,
|
|
117
133
|
});
|
|
118
134
|
}
|
|
@@ -143,7 +159,7 @@ export class ContentBuffer {
|
|
|
143
159
|
return null;
|
|
144
160
|
}
|
|
145
161
|
// Check if expired
|
|
146
|
-
if (
|
|
162
|
+
if (this.isExpired(entry)) {
|
|
147
163
|
this.buffers.delete(bufferId);
|
|
148
164
|
return null;
|
|
149
165
|
}
|
|
@@ -226,7 +242,7 @@ export class ContentBuffer {
|
|
|
226
242
|
return null;
|
|
227
243
|
}
|
|
228
244
|
// Check if expired
|
|
229
|
-
if (
|
|
245
|
+
if (this.isExpired(entry)) {
|
|
230
246
|
this.buffers.delete(bufferId);
|
|
231
247
|
return null;
|
|
232
248
|
}
|
|
@@ -268,9 +284,11 @@ export class ContentBuffer {
|
|
|
268
284
|
newContent = content.replace(oldString, newString);
|
|
269
285
|
replacements = 1;
|
|
270
286
|
}
|
|
271
|
-
// Update buffer in place
|
|
287
|
+
// Update buffer in place and reset TTL to 1 day
|
|
272
288
|
entry.content = newContent;
|
|
273
289
|
entry.totalSize = newContent.length;
|
|
290
|
+
entry.modifiedAt = Date.now();
|
|
291
|
+
entry.ttl = this.modifiedTTL;
|
|
274
292
|
return {
|
|
275
293
|
bufferId,
|
|
276
294
|
success: true,
|
|
@@ -284,9 +302,8 @@ export class ContentBuffer {
|
|
|
284
302
|
* Clean up expired buffers
|
|
285
303
|
*/
|
|
286
304
|
cleanup() {
|
|
287
|
-
const now = Date.now();
|
|
288
305
|
for (const [bufferId, entry] of this.buffers.entries()) {
|
|
289
|
-
if (
|
|
306
|
+
if (this.isExpired(entry)) {
|
|
290
307
|
this.buffers.delete(bufferId);
|
|
291
308
|
}
|
|
292
309
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-buffer.js","sourceRoot":"","sources":["../../src/utils/content-buffer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"content-buffer.js","sourceRoot":"","sources":["../../src/utils/content-buffer.ts"],"names":[],"mappings":"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"}
|