@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.
- package/README.md +36 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +65 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/cli.d.ts +8 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +41 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/db.d.ts +1 -1
- package/dist/lib/db.d.ts.map +1 -1
- package/dist/lib/db.js +62 -14
- package/dist/lib/db.js.map +1 -1
- package/dist/lib/diagnostics.d.ts +48 -0
- package/dist/lib/diagnostics.d.ts.map +1 -0
- package/dist/lib/diagnostics.js +92 -0
- package/dist/lib/diagnostics.js.map +1 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +4 -1
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/log.d.ts +9 -0
- package/dist/lib/log.d.ts.map +1 -0
- package/dist/lib/log.js +37 -0
- package/dist/lib/log.js.map +1 -0
- package/dist/lib/resolve.d.ts +5 -5
- package/dist/lib/resolve.d.ts.map +1 -1
- package/dist/lib/resolve.js.map +1 -1
- package/dist/lib/storage.d.ts +1 -3
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +14 -35
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/storage_filters.d.ts +1 -1
- package/dist/lib/storage_filters.d.ts.map +1 -1
- package/dist/lib/storage_filters.js +5 -2
- package/dist/lib/storage_filters.js.map +1 -1
- package/dist/lib/tool_response.d.ts +4 -2
- package/dist/lib/tool_response.d.ts.map +1 -1
- package/dist/lib/tool_response.js.map +1 -1
- package/dist/lib/types.d.ts +6 -63
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/types.js +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/schemas/inputs.d.ts +43 -225
- package/dist/schemas/inputs.d.ts.map +1 -1
- package/dist/schemas/inputs.js +18 -27
- package/dist/schemas/inputs.js.map +1 -1
- package/dist/schemas/iso_date.d.ts +3 -3
- package/dist/schemas/iso_date.d.ts.map +1 -1
- package/dist/schemas/iso_date.js +4 -2
- package/dist/schemas/iso_date.js.map +1 -1
- package/dist/schemas/outputs.d.ts +5 -23
- package/dist/schemas/outputs.d.ts.map +1 -1
- package/dist/schemas/outputs.js +2 -4
- package/dist/schemas/outputs.js.map +1 -1
- package/dist/tools/add_todo.d.ts.map +1 -1
- package/dist/tools/add_todo.js +2 -1
- package/dist/tools/add_todo.js.map +1 -1
- package/dist/tools/add_todos.d.ts.map +1 -1
- package/dist/tools/add_todos.js +2 -1
- package/dist/tools/add_todos.js.map +1 -1
- package/dist/tools/complete_todo.d.ts.map +1 -1
- package/dist/tools/complete_todo.js +2 -1
- package/dist/tools/complete_todo.js.map +1 -1
- package/dist/tools/delete_todo.d.ts.map +1 -1
- package/dist/tools/delete_todo.js +2 -1
- package/dist/tools/delete_todo.js.map +1 -1
- package/dist/tools/delete_todos.d.ts.map +1 -1
- package/dist/tools/delete_todos.js +4 -4
- package/dist/tools/delete_todos.js.map +1 -1
- package/dist/tools/list_todos.d.ts.map +1 -1
- package/dist/tools/list_todos.js +30 -25
- package/dist/tools/list_todos.js.map +1 -1
- package/dist/tools/register_tool.d.ts +14 -0
- package/dist/tools/register_tool.d.ts.map +1 -0
- package/dist/tools/register_tool.js +73 -0
- package/dist/tools/register_tool.js.map +1 -0
- package/dist/tools/update_todo.d.ts.map +1 -1
- package/dist/tools/update_todo.js +2 -1
- package/dist/tools/update_todo.js.map +1 -1
- 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
|
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
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"}
|
package/dist/lib/cli.js
ADDED
|
@@ -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
package/dist/lib/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"
|
|
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
|
|
13
|
-
return
|
|
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 (
|
|
26
|
+
if (!isRecord(error))
|
|
21
27
|
return undefined;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
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
|
|
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
|
|
146
|
-
|
|
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
|
package/dist/lib/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAa,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAE9D,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,gBAAgB,GAAG,MAAM,CAAC;
|
|
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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"}
|
package/dist/lib/errors.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/lib/errors.js
CHANGED
|
@@ -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 (!
|
|
10
|
+
if (!isRecord(error))
|
|
8
11
|
return undefined;
|
|
9
12
|
return normalizeMessage(error.message);
|
|
10
13
|
}
|
package/dist/lib/errors.js.map
CHANGED
|
@@ -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,
|
|
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"}
|