@j0hanz/todokit-mcp 1.0.7 → 1.0.9

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 (79) hide show
  1. package/README.md +36 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +65 -18
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/cli.d.ts +8 -0
  6. package/dist/lib/cli.d.ts.map +1 -0
  7. package/dist/lib/cli.js +41 -0
  8. package/dist/lib/cli.js.map +1 -0
  9. package/dist/lib/db.d.ts +1 -1
  10. package/dist/lib/db.d.ts.map +1 -1
  11. package/dist/lib/db.js +62 -14
  12. package/dist/lib/db.js.map +1 -1
  13. package/dist/lib/diagnostics.d.ts +48 -0
  14. package/dist/lib/diagnostics.d.ts.map +1 -0
  15. package/dist/lib/diagnostics.js +92 -0
  16. package/dist/lib/diagnostics.js.map +1 -0
  17. package/dist/lib/errors.d.ts.map +1 -1
  18. package/dist/lib/errors.js +4 -1
  19. package/dist/lib/errors.js.map +1 -1
  20. package/dist/lib/log.d.ts +9 -0
  21. package/dist/lib/log.d.ts.map +1 -0
  22. package/dist/lib/log.js +37 -0
  23. package/dist/lib/log.js.map +1 -0
  24. package/dist/lib/resolve.d.ts +5 -5
  25. package/dist/lib/resolve.d.ts.map +1 -1
  26. package/dist/lib/resolve.js.map +1 -1
  27. package/dist/lib/storage.d.ts +1 -3
  28. package/dist/lib/storage.d.ts.map +1 -1
  29. package/dist/lib/storage.js +14 -35
  30. package/dist/lib/storage.js.map +1 -1
  31. package/dist/lib/storage_filters.d.ts +1 -1
  32. package/dist/lib/storage_filters.d.ts.map +1 -1
  33. package/dist/lib/storage_filters.js +5 -2
  34. package/dist/lib/storage_filters.js.map +1 -1
  35. package/dist/lib/tool_response.d.ts +4 -2
  36. package/dist/lib/tool_response.d.ts.map +1 -1
  37. package/dist/lib/tool_response.js.map +1 -1
  38. package/dist/lib/types.d.ts +6 -63
  39. package/dist/lib/types.d.ts.map +1 -1
  40. package/dist/lib/types.js +1 -1
  41. package/dist/lib/types.js.map +1 -1
  42. package/dist/schemas/inputs.d.ts +43 -225
  43. package/dist/schemas/inputs.d.ts.map +1 -1
  44. package/dist/schemas/inputs.js +18 -27
  45. package/dist/schemas/inputs.js.map +1 -1
  46. package/dist/schemas/iso_date.d.ts +3 -3
  47. package/dist/schemas/iso_date.d.ts.map +1 -1
  48. package/dist/schemas/iso_date.js +4 -2
  49. package/dist/schemas/iso_date.js.map +1 -1
  50. package/dist/schemas/outputs.d.ts +5 -23
  51. package/dist/schemas/outputs.d.ts.map +1 -1
  52. package/dist/schemas/outputs.js +2 -4
  53. package/dist/schemas/outputs.js.map +1 -1
  54. package/dist/tools/add_todo.d.ts.map +1 -1
  55. package/dist/tools/add_todo.js +2 -1
  56. package/dist/tools/add_todo.js.map +1 -1
  57. package/dist/tools/add_todos.d.ts.map +1 -1
  58. package/dist/tools/add_todos.js +2 -1
  59. package/dist/tools/add_todos.js.map +1 -1
  60. package/dist/tools/complete_todo.d.ts.map +1 -1
  61. package/dist/tools/complete_todo.js +2 -1
  62. package/dist/tools/complete_todo.js.map +1 -1
  63. package/dist/tools/delete_todo.d.ts.map +1 -1
  64. package/dist/tools/delete_todo.js +2 -1
  65. package/dist/tools/delete_todo.js.map +1 -1
  66. package/dist/tools/delete_todos.d.ts.map +1 -1
  67. package/dist/tools/delete_todos.js +4 -4
  68. package/dist/tools/delete_todos.js.map +1 -1
  69. package/dist/tools/list_todos.d.ts.map +1 -1
  70. package/dist/tools/list_todos.js +30 -25
  71. package/dist/tools/list_todos.js.map +1 -1
  72. package/dist/tools/register_tool.d.ts +14 -0
  73. package/dist/tools/register_tool.d.ts.map +1 -0
  74. package/dist/tools/register_tool.js +73 -0
  75. package/dist/tools/register_tool.js.map +1 -0
  76. package/dist/tools/update_todo.d.ts.map +1 -1
  77. package/dist/tools/update_todo.js +2 -1
  78. package/dist/tools/update_todo.js.map +1 -1
  79. package/package.json +5 -5
package/README.md CHANGED
@@ -22,6 +22,7 @@ An MCP server for Todokit, a task management and productivity tool with JSON sto
22
22
  - Tagging: tags are normalized (trimmed, lowercase, unique) and can be added or removed.
23
23
  - Safe deletion: dry-run previews before deleting; bulk delete defaults to a safety limit.
24
24
  - JSON persistence with queued writes and atomic file writes.
25
+ - Optional diagnostics events (tool calls/results, storage, lifecycle) via Node diagnostics channels.
25
26
  - List summaries with counts (pending, completed, overdue) and pagination metadata.
26
27
 
27
28
  ## Quick Start
@@ -81,6 +82,40 @@ $env:TODOKIT_TODO_FILE = 'C:\path\to\todos.json'
81
82
  npx -y @j0hanz/todokit-mcp@latest
82
83
  ```
83
84
 
85
+ ### JSON formatting
86
+
87
+ By default, todos are written as pretty-printed JSON (2-space indentation). To write compact JSON instead, set `TODOKIT_JSON_PRETTY` to `0` or `false`.
88
+
89
+ ```bash
90
+ TODOKIT_JSON_PRETTY=0 npx -y @j0hanz/todokit-mcp@latest
91
+ ```
92
+
93
+ ### CLI options
94
+
95
+ The server accepts a few CLI flags (use `--` to forward args when running via `npx`).
96
+
97
+ ```bash
98
+ npx -y @j0hanz/todokit-mcp@latest -- --todo-file ./todos.json --diagnostics --log-level debug
99
+ ```
100
+
101
+ | Flag | Alias | Description |
102
+ | :-------------- | :---- | :------------------------------------------------------------------------- |
103
+ | `--todo-file` | `-f` | Override the todo storage path (same as `TODOKIT_TODO_FILE`). |
104
+ | `--diagnostics` | `-d` | Enable diagnostics output (JSON lines) to stderr. |
105
+ | `--log-level` | `-l` | Diagnostics log level: `error`, `warn`, `info`, `debug` (default: `info`). |
106
+
107
+ The log level is only used when diagnostics output is enabled.
108
+
109
+ ### Diagnostics
110
+
111
+ Diagnostics events are always published on Node's `diagnostics_channel` and can be subscribed to programmatically. When `--diagnostics` is set, the server attaches default subscribers and prints JSON events to **stderr** (stdout stays reserved for MCP traffic).
112
+
113
+ Channels:
114
+
115
+ - `todokit:tool` — tool call + tool result events
116
+ - `todokit:storage` — read/write/close events
117
+ - `todokit:lifecycle` — shutdown events
118
+
84
119
  ## Tools
85
120
 
86
121
  All tools return a JSON payload in both `content` (stringified) and `structuredContent`.
@@ -104,7 +139,7 @@ Error payload:
104
139
  }
105
140
  ```
106
141
 
107
- The `result` shape is tool-specific. If a `query` matches multiple todos, tools return `E_AMBIGUOUS` with preview matches and a hint to use an exact `id`.
142
+ The `result` shape is tool-specific. If a `query` matches multiple todos, most tools return `E_AMBIGUOUS` with preview matches and a hint to use an exact `id`. `delete_todo` with `dryRun: true` instead returns an ok response with `matches` and `totalMatches` for preview.
108
143
 
109
144
  ### add_todo
110
145
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAapE,wBAAgB,YAAY,IAAI,SAAS,CAWxC;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8DpE,wBAAgB,YAAY,IAAI,SAAS,CAWxC;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAepE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD"}
package/dist/index.js CHANGED
@@ -1,46 +1,81 @@
1
1
  #!/usr/bin/env node
2
- import { createRequire } from 'node:module';
3
2
  import { pathToFileURL } from 'node:url';
4
3
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
4
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import packageJson from '../package.json' with { type: 'json' };
6
+ import { parseCliArgs } from './lib/cli.js';
6
7
  import { closeDb } from './lib/db.js';
8
+ import { enableDefaultDiagnosticsSubscribers, publishLifecycleEvent, } from './lib/diagnostics.js';
9
+ import { createStderrLogger } from './lib/log.js';
7
10
  import { registerAllTools } from './tools/index.js';
8
- const require = createRequire(import.meta.url);
9
- const packageJson = require('../package.json');
10
- const SERVER_VERSION = packageJson.version ?? '0.0.0';
11
+ const SERVER_VERSION = getPackageVersion(packageJson);
12
+ function isRecord(value) {
13
+ return typeof value === 'object' && value !== null;
14
+ }
15
+ function getPackageVersion(value) {
16
+ if (!isRecord(value))
17
+ return '0.0.0';
18
+ const version = value.version;
19
+ return typeof version === 'string' && version.length > 0 ? version : '0.0.0';
20
+ }
11
21
  let shuttingDown = false;
12
22
  let activeServer = null;
13
- export function createServer() {
14
- const server = new McpServer({ name: 'todokit', version: SERVER_VERSION }, {
15
- instructions: 'Todokit to-do list manager',
16
- capabilities: { logging: {} },
17
- });
18
- registerAllTools(server);
19
- return server;
20
- }
21
- export async function shutdown(signal) {
22
- if (shuttingDown)
23
- return;
24
- shuttingDown = true;
23
+ let disableDiagnostics = null;
24
+ async function closeDbSafely() {
25
25
  try {
26
26
  await closeDb();
27
27
  }
28
28
  catch (error) {
29
29
  console.error('Error closing database:', error);
30
30
  }
31
+ }
32
+ function disableDiagnosticsSafely() {
33
+ try {
34
+ disableDiagnostics?.();
35
+ }
36
+ catch {
37
+ // Ignore.
38
+ }
39
+ finally {
40
+ disableDiagnostics = null;
41
+ }
42
+ }
43
+ async function closeServerSafely(signal) {
31
44
  if (!activeServer) {
32
45
  process.exitCode = 0;
33
46
  return;
34
47
  }
35
48
  try {
36
49
  await activeServer.close();
50
+ process.exitCode = 0;
37
51
  }
38
52
  catch (error) {
39
53
  console.error(`Shutdown error (${signal}):`, error);
40
54
  process.exitCode = 1;
41
- return;
42
55
  }
43
- process.exitCode = 0;
56
+ }
57
+ export function createServer() {
58
+ const server = new McpServer({ name: 'todokit', version: SERVER_VERSION }, {
59
+ instructions: 'Todokit to-do list manager',
60
+ capabilities: { logging: {} },
61
+ });
62
+ registerAllTools(server);
63
+ return server;
64
+ }
65
+ export async function shutdown(signal) {
66
+ if (shuttingDown)
67
+ return;
68
+ shuttingDown = true;
69
+ publishLifecycleEvent({
70
+ v: 1,
71
+ kind: 'lifecycle',
72
+ event: 'shutdown',
73
+ at: new Date().toISOString(),
74
+ signal,
75
+ });
76
+ await closeDbSafely();
77
+ disableDiagnosticsSafely();
78
+ await closeServerSafely(signal);
44
79
  }
45
80
  export async function startServer() {
46
81
  activeServer = createServer();
@@ -57,6 +92,18 @@ process.on('uncaughtException', (error) => {
57
92
  });
58
93
  const entrypoint = process.argv[1];
59
94
  if (entrypoint && import.meta.url === pathToFileURL(entrypoint).href) {
95
+ const cli = parseCliArgs(process.argv);
96
+ if (cli.todoFile) {
97
+ process.env.TODOKIT_TODO_FILE = cli.todoFile;
98
+ }
99
+ if (cli.diagnostics) {
100
+ const logger = createStderrLogger(cli.logLevel);
101
+ disableDiagnostics = enableDefaultDiagnosticsSubscribers({
102
+ logger: (line) => {
103
+ logger.debug(line);
104
+ },
105
+ });
106
+ }
60
107
  process.once('SIGINT', shutdown);
61
108
  process.once('SIGTERM', shutdown);
62
109
  startServer().catch((error) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { LogLevel } from './log.js';
2
+ export interface CliOptions {
3
+ todoFile?: string | undefined;
4
+ diagnostics: boolean;
5
+ logLevel: LogLevel;
6
+ }
7
+ export declare function parseCliArgs(argv: readonly string[]): CliOptions;
8
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/lib/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAWD,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAoChE"}
@@ -0,0 +1,41 @@
1
+ import { parseArgs } from 'node:util';
2
+ function isLogLevel(value) {
3
+ return (value === 'error' ||
4
+ value === 'warn' ||
5
+ value === 'info' ||
6
+ value === 'debug');
7
+ }
8
+ export function parseCliArgs(argv) {
9
+ const defaults = {
10
+ todoFile: undefined,
11
+ diagnostics: false,
12
+ logLevel: 'info',
13
+ };
14
+ const args = argv.slice(2);
15
+ try {
16
+ const parsed = parseArgs({
17
+ args,
18
+ strict: false,
19
+ allowPositionals: true,
20
+ options: {
21
+ 'todo-file': { type: 'string', short: 'f' },
22
+ diagnostics: { type: 'boolean', short: 'd' },
23
+ 'log-level': { type: 'string', short: 'l' },
24
+ },
25
+ });
26
+ const todoFile = parsed.values['todo-file'];
27
+ const diagnostics = parsed.values.diagnostics;
28
+ const logLevel = parsed.values['log-level'];
29
+ return {
30
+ todoFile: typeof todoFile === 'string' && todoFile.length > 0
31
+ ? todoFile
32
+ : undefined,
33
+ diagnostics: diagnostics === true,
34
+ logLevel: isLogLevel(logLevel) ? logLevel : defaults.logLevel,
35
+ };
36
+ }
37
+ catch {
38
+ return defaults;
39
+ }
40
+ }
41
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/lib/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,KAAK,KAAK,OAAO;QACjB,KAAK,KAAK,MAAM;QAChB,KAAK,KAAK,MAAM;QAChB,KAAK,KAAK,OAAO,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,MAAM,QAAQ,GAAe;QAC3B,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,KAAK;QAClB,QAAQ,EAAE,MAAM;KACjB,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,IAAI;YACJ,MAAM,EAAE,KAAK;YACb,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE;gBACP,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC3C,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBAC5C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;aAC5C;SACF,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;QAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE5C,OAAO;YACL,QAAQ,EACN,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACjD,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,SAAS;YACf,WAAW,EAAE,WAAW,KAAK,IAAI;YACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;SAC9D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
package/dist/lib/db.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type Todo } from './types.js';
2
- export declare function readTodos(): Promise<Todo[]>;
2
+ export declare function readTodos(): Promise<readonly Todo[]>;
3
3
  export declare function withTodos<T>(mutate: (todos: Todo[]) => {
4
4
  todos: Todo[];
5
5
  result: T;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,IAAI,EAAe,MAAM,YAAY,CAAC;AA0KpD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAUjD;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACtD,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7C"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,IAAI,EAAe,MAAM,YAAY,CAAC;AAiMpD,wBAAsB,SAAS,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CA8B1D;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,GACtD,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAa7C"}
package/dist/lib/db.js CHANGED
@@ -2,26 +2,34 @@ import { randomUUID } from 'node:crypto';
2
2
  import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
3
3
  import { dirname, join, resolve } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
+ import { nowMs, publishStorageEvent } from './diagnostics.js';
5
6
  import { TodosSchema } from './types.js';
6
7
  const __dirname = dirname(fileURLToPath(import.meta.url));
7
8
  const DEFAULT_TODO_FILE = join(__dirname, '../../todos.json');
8
9
  const IO_TIMEOUT_MS = 10_000;
9
10
  const WRITE_TIMEOUT_MS = 30_000;
11
+ function getJsonIndentation() {
12
+ const raw = process.env.TODOKIT_JSON_PRETTY?.trim().toLowerCase();
13
+ if (!raw)
14
+ return 2;
15
+ if (raw === '0' || raw === 'false')
16
+ return 0;
17
+ return 2;
18
+ }
10
19
  let cache = null;
11
20
  let writeQueue = Promise.resolve();
12
- function isNotFoundError(error) {
13
- return (typeof error === 'object' &&
14
- error !== null &&
15
- 'code' in error &&
16
- error.code === 'ENOENT');
21
+ function isRecord(value) {
22
+ return typeof value === 'object' && value !== null;
17
23
  }
18
24
  const TRANSIENT_ERROR_CODES = new Set(['EBUSY', 'EPERM', 'EACCES']);
19
25
  function getErrorCode(error) {
20
- if (typeof error !== 'object' || error === null)
26
+ if (!isRecord(error))
21
27
  return undefined;
22
- if (!('code' in error))
23
- return undefined;
24
- return error.code;
28
+ const code = error.code;
29
+ return typeof code === 'string' ? code : undefined;
30
+ }
31
+ function isNotFoundError(error) {
32
+ return getErrorCode(error) === 'ENOENT';
25
33
  }
26
34
  function isTransientError(error) {
27
35
  const code = getErrorCode(error);
@@ -116,15 +124,18 @@ async function tryRename(from, to) {
116
124
  function shouldRetry(error, attempt) {
117
125
  return isTransientError(error) && attempt < 2;
118
126
  }
119
- async function renameWithRetry(from, to) {
127
+ async function renameWithRetryCount(from, to) {
128
+ let retries = 0;
120
129
  for (let attempt = 0; attempt < 3; attempt++) {
121
130
  const error = await tryRename(from, to);
122
131
  if (!error)
123
- return;
132
+ return retries;
124
133
  if (!shouldRetry(error, attempt))
125
134
  throw error;
135
+ retries += 1;
126
136
  await delay(50 * (attempt + 1));
127
137
  }
138
+ return retries;
128
139
  }
129
140
  async function writeFileAtomic(path, contents) {
130
141
  await mkdir(dirname(path), { recursive: true });
@@ -135,26 +146,55 @@ async function writeFileAtomic(path, contents) {
135
146
  flush: true,
136
147
  signal: AbortSignal.timeout(WRITE_TIMEOUT_MS),
137
148
  });
138
- await renameWithRetry(tempPath, path);
149
+ return await renameWithRetryCount(tempPath, path);
139
150
  }
140
151
  finally {
141
152
  await rm(tempPath, { force: true }).catch(noop);
142
153
  }
143
154
  }
144
155
  async function saveTodos(path, todos) {
145
- const payload = `${JSON.stringify(todos, null, 2)}\n`;
146
- await writeFileAtomic(path, payload);
156
+ const start = nowMs();
157
+ const payload = `${JSON.stringify(todos, null, getJsonIndentation())}\n`;
158
+ const renameRetries = await writeFileAtomic(path, payload);
147
159
  cache = { todos, mtimeMs: await getFileMtime(path) };
160
+ publishStorageEvent({
161
+ v: 1,
162
+ kind: 'storage',
163
+ op: 'write',
164
+ at: new Date().toISOString(),
165
+ durationMs: Math.max(0, nowMs() - start),
166
+ todoCount: todos.length,
167
+ renameRetries,
168
+ });
148
169
  }
149
170
  export async function readTodos() {
171
+ const start = nowMs();
150
172
  await writeQueue;
151
173
  const path = getTodoFilePath();
152
174
  const mtimeMs = await getFileMtime(path);
153
175
  if (cache?.mtimeMs === mtimeMs) {
176
+ publishStorageEvent({
177
+ v: 1,
178
+ kind: 'storage',
179
+ op: 'read',
180
+ at: new Date().toISOString(),
181
+ durationMs: Math.max(0, nowMs() - start),
182
+ cacheHit: true,
183
+ todoCount: cache.todos.length,
184
+ });
154
185
  return cache.todos;
155
186
  }
156
187
  const todos = await loadTodos(path);
157
188
  cache = { todos, mtimeMs };
189
+ publishStorageEvent({
190
+ v: 1,
191
+ kind: 'storage',
192
+ op: 'read',
193
+ at: new Date().toISOString(),
194
+ durationMs: Math.max(0, nowMs() - start),
195
+ cacheHit: false,
196
+ todoCount: todos.length,
197
+ });
158
198
  return todos;
159
199
  }
160
200
  export async function withTodos(mutate) {
@@ -170,8 +210,16 @@ export async function withTodos(mutate) {
170
210
  });
171
211
  }
172
212
  export async function closeDb() {
213
+ const start = nowMs();
173
214
  await writeQueue;
174
215
  writeQueue = Promise.resolve();
175
216
  cache = null;
217
+ publishStorageEvent({
218
+ v: 1,
219
+ kind: 'storage',
220
+ op: 'close',
221
+ at: new Date().toISOString(),
222
+ durationMs: Math.max(0, nowMs() - start),
223
+ });
176
224
  }
177
225
  //# sourceMappingURL=db.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface ToolCallEvent {
2
+ v: 1;
3
+ kind: 'tool_call';
4
+ tool: string;
5
+ at: string;
6
+ input: {
7
+ type: string;
8
+ keys?: string[];
9
+ size?: number;
10
+ };
11
+ }
12
+ export interface ToolResultEvent {
13
+ v: 1;
14
+ kind: 'tool_result';
15
+ tool: string;
16
+ at: string;
17
+ durationMs: number;
18
+ ok: boolean;
19
+ errorCode?: string | undefined;
20
+ }
21
+ export interface StorageEvent {
22
+ v: 1;
23
+ kind: 'storage';
24
+ op: 'read' | 'write' | 'close';
25
+ at: string;
26
+ durationMs?: number | undefined;
27
+ cacheHit?: boolean | undefined;
28
+ todoCount?: number | undefined;
29
+ renameRetries?: number | undefined;
30
+ }
31
+ export interface LifecycleEvent {
32
+ v: 1;
33
+ kind: 'lifecycle';
34
+ event: 'shutdown';
35
+ at: string;
36
+ signal?: string | undefined;
37
+ }
38
+ export declare function nowMs(): number;
39
+ export declare function publishToolCall(tool: string, input: unknown): void;
40
+ export declare function publishToolResult(event: ToolResultEvent): void;
41
+ export declare function publishStorageEvent(event: StorageEvent): void;
42
+ export declare function publishLifecycleEvent(event: LifecycleEvent): void;
43
+ type Logger = (line: string) => void;
44
+ export declare function enableDefaultDiagnosticsSubscribers(options?: {
45
+ logger?: Logger | undefined;
46
+ }): () => void;
47
+ export {};
48
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/lib/diagnostics.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzD;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAyBD,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CASlE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAE7D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAEjE;AAED,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAUrC,wBAAgB,mCAAmC,CAAC,OAAO,CAAC,EAAE;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,GAAG,MAAM,IAAI,CAwCb"}
@@ -0,0 +1,92 @@
1
+ import { channel, subscribe, unsubscribe, } from 'node:diagnostics_channel';
2
+ import { performance } from 'node:perf_hooks';
3
+ const toolDiagnosticsChannel = channel('todokit:tool');
4
+ const storageDiagnosticsChannel = channel('todokit:storage');
5
+ const lifecycleDiagnosticsChannel = channel('todokit:lifecycle');
6
+ function safePublish(target, message) {
7
+ try {
8
+ target.publish(message);
9
+ }
10
+ catch {
11
+ // Diagnostics must never break tool execution.
12
+ }
13
+ }
14
+ function summarizeInput(input) {
15
+ if (Array.isArray(input)) {
16
+ return { type: 'array', size: input.length };
17
+ }
18
+ if (typeof input === 'object' && input !== null) {
19
+ const keys = Object.keys(input);
20
+ return { type: 'object', keys: keys.slice(0, 10) };
21
+ }
22
+ return { type: typeof input };
23
+ }
24
+ export function nowMs() {
25
+ return performance.now();
26
+ }
27
+ export function publishToolCall(tool, input) {
28
+ const event = {
29
+ v: 1,
30
+ kind: 'tool_call',
31
+ tool,
32
+ at: new Date().toISOString(),
33
+ input: summarizeInput(input),
34
+ };
35
+ safePublish(toolDiagnosticsChannel, event);
36
+ }
37
+ export function publishToolResult(event) {
38
+ safePublish(toolDiagnosticsChannel, event);
39
+ }
40
+ export function publishStorageEvent(event) {
41
+ safePublish(storageDiagnosticsChannel, event);
42
+ }
43
+ export function publishLifecycleEvent(event) {
44
+ safePublish(lifecycleDiagnosticsChannel, event);
45
+ }
46
+ function safeStringify(value) {
47
+ try {
48
+ return JSON.stringify(value);
49
+ }
50
+ catch {
51
+ return JSON.stringify({ v: 1, kind: 'diagnostics_error' });
52
+ }
53
+ }
54
+ export function enableDefaultDiagnosticsSubscribers(options) {
55
+ const logger = options?.logger ??
56
+ ((line) => {
57
+ console.error(line);
58
+ });
59
+ const onTool = (message) => {
60
+ try {
61
+ logger(safeStringify(message));
62
+ }
63
+ catch {
64
+ // Ignore.
65
+ }
66
+ };
67
+ const onStorage = (message) => {
68
+ try {
69
+ logger(safeStringify(message));
70
+ }
71
+ catch {
72
+ // Ignore.
73
+ }
74
+ };
75
+ const onLifecycle = (message) => {
76
+ try {
77
+ logger(safeStringify(message));
78
+ }
79
+ catch {
80
+ // Ignore.
81
+ }
82
+ };
83
+ subscribe('todokit:tool', onTool);
84
+ subscribe('todokit:storage', onStorage);
85
+ subscribe('todokit:lifecycle', onLifecycle);
86
+ return () => {
87
+ unsubscribe('todokit:tool', onTool);
88
+ unsubscribe('todokit:storage', onStorage);
89
+ unsubscribe('todokit:lifecycle', onLifecycle);
90
+ };
91
+ }
92
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/lib/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,iBAAiB,EAAE;QACjB,EAAE,EAAE,KAAK,CAAC;QACV,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,IAAI,CAAC;CACf;AAaD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,GACf,aAAa,CAWf"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,iBAAiB,EAAE;QACjB,EAAE,EAAE,KAAK,CAAC;QACV,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,IAAI,CAAC;CACf;AAgBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,OAAO,GACf,aAAa,CAWf"}
@@ -1,10 +1,13 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null;
3
+ }
1
4
  function normalizeMessage(message) {
2
5
  if (typeof message !== 'string' || message.length === 0)
3
6
  return undefined;
4
7
  return message;
5
8
  }
6
9
  function extractMessageObject(error) {
7
- if (!error || typeof error !== 'object' || !('message' in error))
10
+ if (!isRecord(error))
8
11
  return undefined;
9
12
  return normalizeMessage(error.message);
10
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAWA,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC;QAC9D,OAAO,SAAS,CAAC;IACnB,OAAO,gBAAgB,CAAE,KAA8B,CAAC,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,OAAe,EACf,MAAgB;IAEhB,MAAM,UAAU,GAAuC;QACrD,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;IACF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,iBAAiB,EAAE,UAAU;QAC7B,OAAO,EAAE,IAAa;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAWA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;IAC9B,CAAC;IACD,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IACxC,OAAO,oBAAoB,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,OAAe,EACf,MAAgB;IAEhB,MAAM,UAAU,GAAuC;QACrD,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QACxB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC;IACF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,iBAAiB,EAAE,UAAU;QAC7B,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type LogLevel = 'error' | 'warn' | 'info' | 'debug';
2
+ export interface Logger {
3
+ debug(message: string): void;
4
+ info(message: string): void;
5
+ warn(message: string): void;
6
+ error(message: string): void;
7
+ }
8
+ export declare function createStderrLogger(level: LogLevel): Logger;
9
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAiBD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAmB1D"}