@hardlydifficult/logger 1.0.6 → 1.0.8

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 CHANGED
@@ -11,15 +11,15 @@ npm install @hardlydifficult/logger
11
11
  ## Quick Start
12
12
 
13
13
  ```typescript
14
- import { Logger, ConsolePlugin, FilePlugin, DiscordPlugin } from "@hardlydifficult/logger";
14
+ import { Logger, ConsolePlugin, FilePlugin } from "@hardlydifficult/logger";
15
15
 
16
16
  const logger = new Logger("info")
17
17
  .use(new ConsolePlugin())
18
18
  .use(new FilePlugin("./app.log"));
19
19
 
20
20
  logger.info("Server started", { port: 3000 });
21
- logger.warn("High memory usage", { usage: "85%" });
22
- logger.error("Request failed", { url: "/api/data", status: 500 });
21
+ // Output to console: [2025-01-15T10:30:00.000Z] INFO: Server started {"port":3000}
22
+ // Output to file: {"level":"info","message":"Server started","timestamp":"2025-01-15T10:30:00.000Z","context":{"port":3000}}
23
23
  ```
24
24
 
25
25
  ## Core Logger
@@ -79,9 +79,8 @@ The `formatEntry` function is also exported for custom formatting:
79
79
 
80
80
  ```typescript
81
81
  import { formatEntry } from "@hardlydifficult/logger";
82
- import type { LogEntry } from "@hardlydifficult/logger";
83
82
 
84
- const entry: LogEntry = {
83
+ const entry = {
85
84
  level: "warn",
86
85
  message: "High memory",
87
86
  timestamp: "2025-01-15T10:30:00.000Z",
@@ -132,11 +131,13 @@ logger.notify("Deployment complete");
132
131
 
133
132
  ### Behavior
134
133
 
135
- - Only `warn` and `error` log entries are sent (debug/info are filtered)
136
- - Warn entries use ⚠️ emoji; error entries use 🚨 emoji
137
- - Context is formatted as a JSON code block when present
138
- - `notify()` sends messages directly without level filtering
139
- - If `setSender` is not called, entries are silently dropped
134
+ | Behavior | Description |
135
+ |----------|-------------|
136
+ | Only `warn` and `error` log entries are sent (debug/info are filtered) | |
137
+ | Warn entries use ⚠️ emoji; error entries use 🚨 emoji | |
138
+ | Context is formatted as a JSON code block when present | |
139
+ | `notify()` sends messages directly without level filtering | |
140
+ | If `setSender` is not called, entries are silently dropped | |
140
141
 
141
142
  ## Custom Plugins
142
143
 
@@ -0,0 +1,38 @@
1
+ import type { SessionEntry, SessionEntryType, SessionInfo } from "./types.js";
2
+ export interface SessionTrackerOptions {
3
+ /** Directory to store session JSONL files. */
4
+ stateDirectory: string;
5
+ /** Subdirectory within stateDirectory (default: "sessions"). */
6
+ subdirectory?: string;
7
+ /** Max age of session files before cleanup, in ms (default: 7 days). */
8
+ maxAgeMs?: number;
9
+ }
10
+ /**
11
+ * Append-only session logger that writes structured entries to per-session JSONL files.
12
+ *
13
+ * Each session is stored as `{stateDirectory}/{subdirectory}/{sessionId}.jsonl`
14
+ * with one JSON object per line. Designed for debug/analysis — capture full
15
+ * AI interactions (prompts, responses, tool calls) and download via API.
16
+ */
17
+ export declare class SessionTracker {
18
+ private readonly directory;
19
+ private readonly maxAgeMs;
20
+ constructor(options: SessionTrackerOptions);
21
+ /** Append an entry to a session's JSONL file. Creates the file if needed. */
22
+ append(sessionId: string, entry: {
23
+ type: SessionEntryType;
24
+ data: Record<string, unknown>;
25
+ }): void;
26
+ /** Read all entries for a session. Returns empty array if session doesn't exist. */
27
+ read(sessionId: string): SessionEntry[];
28
+ /** List all tracked sessions with metadata, sorted by lastModifiedAt descending. */
29
+ list(): SessionInfo[];
30
+ /** Check if a session file exists. */
31
+ has(sessionId: string): boolean;
32
+ /** Delete a specific session file. Returns true if deleted. */
33
+ delete(sessionId: string): boolean;
34
+ /** Delete session files older than maxAgeMs. Returns count of deleted files. */
35
+ cleanup(): number;
36
+ private filePath;
37
+ }
38
+ //# sourceMappingURL=SessionTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionTracker.d.ts","sourceRoot":"","sources":["../src/SessionTracker.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,OAAO,EAAE,qBAAqB;IAc1C,6EAA6E;IAC7E,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAC/D,IAAI;IAcP,oFAAoF;IACpF,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAgBvC,oFAAoF;IACpF,IAAI,IAAI,WAAW,EAAE;IAkDrB,sCAAsC;IACtC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B,+DAA+D;IAC/D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAalC,gFAAgF;IAChF,OAAO,IAAI,MAAM;IA4BjB,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionTracker = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const DEFAULT_SUBDIRECTORY = "sessions";
7
+ const DEFAULT_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
8
+ const JSONL_EXTENSION = ".jsonl";
9
+ /**
10
+ * Append-only session logger that writes structured entries to per-session JSONL files.
11
+ *
12
+ * Each session is stored as `{stateDirectory}/{subdirectory}/{sessionId}.jsonl`
13
+ * with one JSON object per line. Designed for debug/analysis — capture full
14
+ * AI interactions (prompts, responses, tool calls) and download via API.
15
+ */
16
+ class SessionTracker {
17
+ directory;
18
+ maxAgeMs;
19
+ constructor(options) {
20
+ this.directory = (0, node_path_1.join)(options.stateDirectory, options.subdirectory ?? DEFAULT_SUBDIRECTORY);
21
+ this.maxAgeMs = options.maxAgeMs ?? DEFAULT_MAX_AGE_MS;
22
+ try {
23
+ (0, node_fs_1.mkdirSync)(this.directory, { recursive: true });
24
+ }
25
+ catch {
26
+ /* swallow — directory may already exist or be unwritable */
27
+ }
28
+ }
29
+ /** Append an entry to a session's JSONL file. Creates the file if needed. */
30
+ append(sessionId, entry) {
31
+ const fullEntry = {
32
+ type: entry.type,
33
+ timestamp: new Date().toISOString(),
34
+ data: entry.data,
35
+ };
36
+ const line = `${JSON.stringify(fullEntry)}\n`;
37
+ try {
38
+ (0, node_fs_1.appendFileSync)(this.filePath(sessionId), line);
39
+ }
40
+ catch {
41
+ /* swallow — same as FilePlugin */
42
+ }
43
+ }
44
+ /** Read all entries for a session. Returns empty array if session doesn't exist. */
45
+ read(sessionId) {
46
+ const fp = this.filePath(sessionId);
47
+ if (!(0, node_fs_1.existsSync)(fp)) {
48
+ return [];
49
+ }
50
+ try {
51
+ const content = (0, node_fs_1.readFileSync)(fp, "utf-8");
52
+ return content
53
+ .split("\n")
54
+ .filter((line) => line.length > 0)
55
+ .map((line) => JSON.parse(line));
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ }
61
+ /** List all tracked sessions with metadata, sorted by lastModifiedAt descending. */
62
+ list() {
63
+ if (!(0, node_fs_1.existsSync)(this.directory)) {
64
+ return [];
65
+ }
66
+ try {
67
+ const files = (0, node_fs_1.readdirSync)(this.directory).filter((f) => f.endsWith(JSONL_EXTENSION));
68
+ const sessions = [];
69
+ for (const file of files) {
70
+ const fp = (0, node_path_1.join)(this.directory, file);
71
+ try {
72
+ const stat = (0, node_fs_1.statSync)(fp);
73
+ const content = (0, node_fs_1.readFileSync)(fp, "utf-8");
74
+ const lines = content.split("\n").filter((l) => l.length > 0);
75
+ let startedAt = stat.birthtime.toISOString();
76
+ if (lines.length > 0) {
77
+ try {
78
+ const first = JSON.parse(lines[0]);
79
+ startedAt = first.timestamp;
80
+ }
81
+ catch {
82
+ /* use birthtime */
83
+ }
84
+ }
85
+ sessions.push({
86
+ sessionId: file.slice(0, -JSONL_EXTENSION.length),
87
+ sizeBytes: stat.size,
88
+ startedAt,
89
+ lastModifiedAt: stat.mtime.toISOString(),
90
+ entryCount: lines.length,
91
+ });
92
+ }
93
+ catch {
94
+ /* skip unreadable files */
95
+ }
96
+ }
97
+ sessions.sort((a, b) => new Date(b.lastModifiedAt).getTime() -
98
+ new Date(a.lastModifiedAt).getTime());
99
+ return sessions;
100
+ }
101
+ catch {
102
+ return [];
103
+ }
104
+ }
105
+ /** Check if a session file exists. */
106
+ has(sessionId) {
107
+ return (0, node_fs_1.existsSync)(this.filePath(sessionId));
108
+ }
109
+ /** Delete a specific session file. Returns true if deleted. */
110
+ delete(sessionId) {
111
+ const fp = this.filePath(sessionId);
112
+ if (!(0, node_fs_1.existsSync)(fp)) {
113
+ return false;
114
+ }
115
+ try {
116
+ (0, node_fs_1.unlinkSync)(fp);
117
+ return true;
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ /** Delete session files older than maxAgeMs. Returns count of deleted files. */
124
+ cleanup() {
125
+ if (!(0, node_fs_1.existsSync)(this.directory)) {
126
+ return 0;
127
+ }
128
+ let deleted = 0;
129
+ const cutoff = Date.now() - this.maxAgeMs;
130
+ try {
131
+ const files = (0, node_fs_1.readdirSync)(this.directory).filter((f) => f.endsWith(JSONL_EXTENSION));
132
+ for (const file of files) {
133
+ const fp = (0, node_path_1.join)(this.directory, file);
134
+ try {
135
+ const stat = (0, node_fs_1.statSync)(fp);
136
+ if (stat.mtime.getTime() < cutoff) {
137
+ (0, node_fs_1.unlinkSync)(fp);
138
+ deleted++;
139
+ }
140
+ }
141
+ catch {
142
+ /* skip */
143
+ }
144
+ }
145
+ }
146
+ catch {
147
+ /* swallow */
148
+ }
149
+ return deleted;
150
+ }
151
+ filePath(sessionId) {
152
+ return (0, node_path_1.join)(this.directory, `${sessionId}${JSONL_EXTENSION}`);
153
+ }
154
+ }
155
+ exports.SessionTracker = SessionTracker;
156
+ //# sourceMappingURL=SessionTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionTracker.js","sourceRoot":"","sources":["../src/SessionTracker.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,10 @@
1
- /** Structured logging with pluggable outputs. */
1
+ /** Structured logging with pluggable outputs and session tracking. */
2
2
  export { Logger } from "./Logger.js";
3
3
  export { ConsolePlugin, formatEntry } from "./plugins/ConsolePlugin.js";
4
4
  export { DiscordPlugin, type DiscordSender } from "./plugins/DiscordPlugin.js";
5
5
  export { FilePlugin } from "./plugins/FilePlugin.js";
6
+ export { SessionTracker } from "./SessionTracker.js";
6
7
  export type { LogLevel, LogEntry, LoggerPlugin } from "./types.js";
8
+ export type { SessionEntry, SessionEntryType, SessionInfo } from "./types.js";
9
+ export type { SessionTrackerOptions } from "./SessionTracker.js";
7
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.FilePlugin = exports.DiscordPlugin = exports.formatEntry = exports.ConsolePlugin = exports.Logger = void 0;
4
- /** Structured logging with pluggable outputs. */
3
+ exports.SessionTracker = exports.FilePlugin = exports.DiscordPlugin = exports.formatEntry = exports.ConsolePlugin = exports.Logger = void 0;
4
+ /** Structured logging with pluggable outputs and session tracking. */
5
5
  var Logger_js_1 = require("./Logger.js");
6
6
  Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return Logger_js_1.Logger; } });
7
7
  var ConsolePlugin_js_1 = require("./plugins/ConsolePlugin.js");
@@ -11,4 +11,6 @@ var DiscordPlugin_js_1 = require("./plugins/DiscordPlugin.js");
11
11
  Object.defineProperty(exports, "DiscordPlugin", { enumerable: true, get: function () { return DiscordPlugin_js_1.DiscordPlugin; } });
12
12
  var FilePlugin_js_1 = require("./plugins/FilePlugin.js");
13
13
  Object.defineProperty(exports, "FilePlugin", { enumerable: true, get: function () { return FilePlugin_js_1.FilePlugin; } });
14
+ var SessionTracker_js_1 = require("./SessionTracker.js");
15
+ Object.defineProperty(exports, "SessionTracker", { enumerable: true, get: function () { return SessionTracker_js_1.SessionTracker; } });
14
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AACf,+DAAwE;AAA/D,iHAAA,aAAa,OAAA;AAAE,+GAAA,WAAW,OAAA;AACnC,+DAA+E;AAAtE,iHAAA,aAAa,OAAA;AACtB,yDAAqD;AAA5C,2GAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,sEAAsE;AACtE,yCAAqC;AAA5B,mGAAA,MAAM,OAAA;AACf,+DAAwE;AAA/D,iHAAA,aAAa,OAAA;AAAE,+GAAA,WAAW,OAAA;AACnC,+DAA+E;AAAtE,iHAAA,aAAa,OAAA;AACtB,yDAAqD;AAA5C,2GAAA,UAAU,OAAA;AACnB,yDAAqD;AAA5C,mHAAA,cAAc,OAAA"}
package/dist/types.d.ts CHANGED
@@ -11,4 +11,20 @@ export interface LoggerPlugin {
11
11
  /** Called for notify() — out-of-band notifications. Optional. */
12
12
  notify?(message: string): void;
13
13
  }
14
+ /** Entry type discriminator for session log entries. */
15
+ export type SessionEntryType = "session_start" | "ai_request" | "ai_response" | "tool_call" | "tool_result" | "error" | "session_end" | "metadata";
16
+ /** A single entry in a debug session log (persisted as one JSONL line). */
17
+ export interface SessionEntry {
18
+ readonly type: SessionEntryType;
19
+ readonly timestamp: string;
20
+ readonly data: Record<string, unknown>;
21
+ }
22
+ /** Summary info about a persisted session file. */
23
+ export interface SessionInfo {
24
+ readonly sessionId: string;
25
+ readonly sizeBytes: number;
26
+ readonly startedAt: string;
27
+ readonly lastModifiedAt: string;
28
+ readonly entryCount: number;
29
+ }
14
30
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,iEAAiE;IACjE,MAAM,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAMD,wDAAwD;AACxD,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,YAAY,GACZ,aAAa,GACb,WAAW,GACX,aAAa,GACb,OAAO,GACP,aAAa,GACb,UAAU,CAAC;AAEf,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,mDAAmD;AACnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardlydifficult/logger",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [