@lumenflow/memory 2.11.0 → 2.13.0

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 (66) hide show
  1. package/dist/decay/access-tracking.js +1 -0
  2. package/dist/decay/access-tracking.js.map +1 -0
  3. package/dist/decay/archival.js +1 -0
  4. package/dist/decay/archival.js.map +1 -0
  5. package/dist/decay/scoring.js +1 -0
  6. package/dist/decay/scoring.js.map +1 -0
  7. package/dist/index.d.ts +17 -0
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/mem-checkpoint-core.d.ts +91 -0
  11. package/dist/mem-checkpoint-core.js +1 -0
  12. package/dist/mem-checkpoint-core.js.map +1 -0
  13. package/dist/mem-cleanup-core.d.ts +202 -0
  14. package/dist/mem-cleanup-core.js +1 -0
  15. package/dist/mem-cleanup-core.js.map +1 -0
  16. package/dist/mem-context-core.js +1 -0
  17. package/dist/mem-context-core.js.map +1 -0
  18. package/dist/mem-create-core.d.ts +93 -0
  19. package/dist/mem-create-core.js +2 -1
  20. package/dist/mem-create-core.js.map +1 -0
  21. package/dist/mem-delete-core.js +1 -0
  22. package/dist/mem-delete-core.js.map +1 -0
  23. package/dist/mem-export-core.d.ts +33 -0
  24. package/dist/mem-export-core.js +1 -0
  25. package/dist/mem-export-core.js.map +1 -0
  26. package/dist/mem-id.d.ts +91 -0
  27. package/dist/mem-id.js +1 -0
  28. package/dist/mem-id.js.map +1 -0
  29. package/dist/mem-index-core.js +1 -0
  30. package/dist/mem-index-core.js.map +1 -0
  31. package/dist/mem-init-core.d.ts +93 -0
  32. package/dist/mem-init-core.js +1 -0
  33. package/dist/mem-init-core.js.map +1 -0
  34. package/dist/mem-profile-core.js +1 -0
  35. package/dist/mem-profile-core.js.map +1 -0
  36. package/dist/mem-promote-core.js +1 -0
  37. package/dist/mem-promote-core.js.map +1 -0
  38. package/dist/mem-ready-core.d.ts +56 -0
  39. package/dist/mem-ready-core.js +1 -0
  40. package/dist/mem-ready-core.js.map +1 -0
  41. package/dist/mem-recover-core.js +1 -0
  42. package/dist/mem-recover-core.js.map +1 -0
  43. package/dist/mem-signal-core.d.ts +132 -0
  44. package/dist/mem-signal-core.js +97 -21
  45. package/dist/mem-signal-core.js.map +1 -0
  46. package/dist/mem-start-core.d.ts +76 -0
  47. package/dist/mem-start-core.js +1 -0
  48. package/dist/mem-start-core.js.map +1 -0
  49. package/dist/mem-summarize-core.d.ts +105 -0
  50. package/dist/mem-summarize-core.js +1 -0
  51. package/dist/mem-summarize-core.js.map +1 -0
  52. package/dist/mem-triage-core.d.ts +127 -0
  53. package/dist/mem-triage-core.js +1 -0
  54. package/dist/mem-triage-core.js.map +1 -0
  55. package/dist/memory-schema.d.ts +150 -0
  56. package/dist/memory-schema.js +1 -0
  57. package/dist/memory-schema.js.map +1 -0
  58. package/dist/memory-store.d.ts +108 -0
  59. package/dist/memory-store.js +1 -0
  60. package/dist/memory-store.js.map +1 -0
  61. package/dist/paths.d.ts +28 -0
  62. package/dist/paths.js +1 -0
  63. package/dist/paths.js.map +1 -0
  64. package/dist/signal-cleanup-core.js +57 -1
  65. package/dist/signal-cleanup-core.js.map +1 -0
  66. package/package.json +5 -3
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Memory ID Generator (WU-1465)
3
+ *
4
+ * Hash-based collision-free ID generation for memory nodes.
5
+ * Format: mem-[4 hex chars] derived from content hash.
6
+ * Supports hierarchical IDs (mem-a1b2.1.2) for sub-task decomposition.
7
+ *
8
+ * @see {@link tools/lib/__tests__/mem-id.test.mjs} - Tests
9
+ * @see {@link tools/lib/memory-schema.mjs} - Schema definitions
10
+ */
11
+ /**
12
+ * Regex patterns for memory ID validation
13
+ */
14
+ export declare const MEM_ID_PATTERNS: {
15
+ /**
16
+ * Base memory ID format: mem-[a-f0-9]{4}
17
+ * Only lowercase hex characters (0-9, a-f)
18
+ */
19
+ BASE_ID: RegExp;
20
+ /**
21
+ * Hierarchical memory ID format: mem-[a-f0-9]{4}(.[1-9][0-9]*)*
22
+ * Base ID followed by optional dot-separated positive integers
23
+ * Examples: mem-a1b2, mem-a1b2.1, mem-a1b2.1.2
24
+ */
25
+ HIERARCHICAL_ID: RegExp;
26
+ };
27
+ /**
28
+ * Generates a deterministic memory ID from content.
29
+ *
30
+ * Uses SHA-256 hash of the content, taking the first 4 hex characters.
31
+ * Same content always produces the same ID (deterministic).
32
+ *
33
+ * @param content - Content to hash for ID generation
34
+ * @returns Memory ID in format mem-[a-f0-9]{4}
35
+ *
36
+ * @example
37
+ * const id = generateMemId('discovered file at src/utils.mjs');
38
+ * // Returns something like 'mem-a3f2'
39
+ */
40
+ export declare function generateMemId(content: string): string;
41
+ /**
42
+ * Generates a hierarchical memory ID by appending an index to a parent ID.
43
+ *
44
+ * Used for sub-task decomposition where a parent task (mem-a1b2) has
45
+ * child tasks (mem-a1b2.1, mem-a1b2.2) and grandchildren (mem-a1b2.1.1).
46
+ *
47
+ * @param parentId - Parent memory ID (base or hierarchical)
48
+ * @param index - Positive integer index (1-based)
49
+ * @returns Hierarchical memory ID
50
+ * @throws If parentId is invalid or index is not positive
51
+ *
52
+ * @example
53
+ * generateHierarchicalId('mem-a1b2', 1); // 'mem-a1b2.1'
54
+ * generateHierarchicalId('mem-a1b2.1', 2); // 'mem-a1b2.1.2'
55
+ */
56
+ export declare function generateHierarchicalId(parentId: string, index: number): string;
57
+ /**
58
+ * Validation result from validateMemId
59
+ */
60
+ export interface MemIdValidationResult {
61
+ /** Whether the ID is valid */
62
+ valid: boolean;
63
+ /** Type of ID if valid */
64
+ type?: 'base' | 'hierarchical';
65
+ /** Base ID portion if hierarchical */
66
+ baseId?: string;
67
+ /** Hierarchical indices (empty for base IDs) */
68
+ indices: number[];
69
+ /** Error message if invalid */
70
+ error?: string;
71
+ }
72
+ /**
73
+ * Validates a memory ID and extracts its components.
74
+ *
75
+ * Returns validation result with type classification and parsed components.
76
+ * Compatible with MEMORY_PATTERNS.MEMORY_ID from memory-schema.mjs.
77
+ *
78
+ * @param id - Memory ID to validate
79
+ * @returns Validation result with parsed components
80
+ *
81
+ * @example
82
+ * validateMemId('mem-a1b2');
83
+ * // { valid: true, type: 'base', baseId: 'mem-a1b2', indices: [] }
84
+ *
85
+ * validateMemId('mem-a1b2.1.2');
86
+ * // { valid: true, type: 'hierarchical', baseId: 'mem-a1b2', indices: [1, 2] }
87
+ *
88
+ * validateMemId('invalid');
89
+ * // { valid: false, error: 'Invalid memory ID format', indices: [] }
90
+ */
91
+ export declare function validateMemId(id: string): MemIdValidationResult;
package/dist/mem-id.js CHANGED
@@ -134,3 +134,4 @@ export function validateMemId(id) {
134
134
  indices,
135
135
  };
136
136
  }
137
+ //# sourceMappingURL=mem-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-id.js","sourceRoot":"","sources":["../src/mem-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B;;;OAGG;IACH,OAAO,EAAE,mBAAmB;IAE5B;;;;OAIG;IACH,eAAe,EAAE,mCAAmC;CACrD,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAG;IACrB,UAAU,EAAE,0BAA0B;IACtC,eAAe,EAAE,+BAA+B;IAChD,aAAa,EAAE,kCAAkC;CAClD,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEzE,wCAAwC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAEhD,OAAO,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,KAAa;IACpE,qBAAqB;IACrB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,GAAG,cAAc,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,cAAc,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;AAChC,CAAC;AAkBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,+BAA+B;IAC/B,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9C,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,cAAc,CAAC,UAAU;YAChC,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO;QACL,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,cAAc;QACpB,MAAM;QACN,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -305,3 +305,4 @@ export async function indexProject(baseDir, options = {}) {
305
305
  export function getDefaultSources() {
306
306
  return [...DEFAULT_SOURCES];
307
307
  }
308
+ //# sourceMappingURL=mem-index-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-index-core.js","sourceRoot":"","sources":["../src/mem-index-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Memory Init Core (WU-1464)
3
+ *
4
+ * Core logic for initializing memory layer in a repository.
5
+ * Creates .lumenflow/memory/ directory with empty memory.jsonl and config.yaml.
6
+ *
7
+ * @see {@link tools/__tests__/mem-init.test.mjs} - Tests
8
+ * @see {@link tools/lib/memory-store.mjs} - Memory store operations
9
+ * @see {@link tools/lib/memory-schema.mjs} - Memory schema definitions
10
+ */
11
+ /**
12
+ * Memory layer file/directory paths
13
+ *
14
+ * Uses LUMENFLOW_MEMORY_PATHS from local paths.ts to avoid circular dependency.
15
+ */
16
+ export declare const MEMORY_PATHS: {
17
+ /** Memory directory relative to project root */
18
+ MEMORY_DIR: ".lumenflow/memory";
19
+ /** Memory JSONL file name */
20
+ MEMORY_FILE: string;
21
+ /** Config YAML file name */
22
+ CONFIG_FILE: string;
23
+ };
24
+ /**
25
+ * Default memory layer configuration
26
+ *
27
+ * Retention values are in seconds:
28
+ * - ephemeral: 0 (immediate discard)
29
+ * - session: 3600 (1 hour)
30
+ * - wu: 604800 (7 days)
31
+ * - project: -1 (never expire)
32
+ */
33
+ export declare const DEFAULT_CONFIG: {
34
+ /** Config schema version */
35
+ version: number;
36
+ /** Retention policy for each lifecycle */
37
+ retention: {
38
+ /** Ephemeral nodes are discarded immediately after use */
39
+ ephemeral: number;
40
+ /** Session nodes expire after 1 hour */
41
+ session: number;
42
+ /** WU nodes expire after 7 days */
43
+ wu: number;
44
+ /** Project nodes never expire (-1 = infinite) */
45
+ project: number;
46
+ };
47
+ };
48
+ /**
49
+ * Memory initialization paths
50
+ */
51
+ interface InitMemoryPaths {
52
+ memoryDir: string;
53
+ memoryJsonl: string;
54
+ configYaml: string;
55
+ }
56
+ /**
57
+ * Memory initialization created flags
58
+ */
59
+ interface InitMemoryCreated {
60
+ directory: boolean;
61
+ memoryJsonl: boolean;
62
+ configYaml: boolean;
63
+ }
64
+ /**
65
+ * Memory initialization result
66
+ */
67
+ export interface InitMemoryResult {
68
+ success: boolean;
69
+ alreadyInitialized: boolean;
70
+ paths: InitMemoryPaths;
71
+ created: InitMemoryCreated;
72
+ }
73
+ /**
74
+ * Initialize memory layer in a repository.
75
+ *
76
+ * Creates:
77
+ * - .lumenflow/memory/ directory
78
+ * - memory.jsonl (empty if not exists)
79
+ * - config.yaml (default settings if not exists)
80
+ *
81
+ * Idempotent: Running multiple times does not corrupt existing data.
82
+ *
83
+ * @param baseDir - Base directory of the repository
84
+ * @returns Result object with success, paths, and created flags
85
+ *
86
+ * @example
87
+ * const result = await initMemory(process.cwd());
88
+ * if (result.success) {
89
+ * console.log('Memory initialized at:', result.paths.memoryDir);
90
+ * }
91
+ */
92
+ export declare function initMemory(baseDir: string): Promise<InitMemoryResult>;
93
+ export {};
@@ -139,3 +139,4 @@ export async function initMemory(baseDir) {
139
139
  result.success = true;
140
140
  return result;
141
141
  }
142
+ //# sourceMappingURL=mem-init-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-init-core.js","sourceRoot":"","sources":["../src/mem-init-core.ts"],"names":[],"mappings":"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"}
@@ -182,3 +182,4 @@ export async function generateProfile(baseDir, options = {}) {
182
182
  stats,
183
183
  };
184
184
  }
185
+ //# sourceMappingURL=mem-profile-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-profile-core.js","sourceRoot":"","sources":["../src/mem-profile-core.ts"],"names":[],"mappings":"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"}
@@ -231,3 +231,4 @@ export async function promoteFromWu(baseDir, options) {
231
231
  dryRun,
232
232
  };
233
233
  }
234
+ //# sourceMappingURL=mem-promote-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-promote-core.js","sourceRoot":"","sources":["../src/mem-promote-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Memory Ready Core (WU-1468)
3
+ *
4
+ * Deterministic ready-work query for "what next?" oracle.
5
+ * Returns open nodes with no blockers, ordered by priority then createdAt.
6
+ *
7
+ * Ordering algorithm:
8
+ * 1. Priority ASC (P0 first, then P1, P2, P3; nodes without priority last)
9
+ * 2. CreatedAt ASC (oldest first for same priority)
10
+ * 3. ID ASC (stable sort for identical priority and timestamp)
11
+ *
12
+ * A node is "ready" if:
13
+ * - Linked to the specified WU
14
+ * - Not blocked by another node (no `blocks` relationship pointing to it)
15
+ * - No `metadata.blocked_by` array set
16
+ * - Lifecycle is not `ephemeral`
17
+ * - Status is not `closed` (metadata.status !== 'closed')
18
+ *
19
+ * @see {@link tools/mem-ready.mjs} - CLI implementation
20
+ * @see {@link tools/__tests__/mem-ready.test.mjs} - Tests
21
+ */
22
+ import { type MemoryNode } from './memory-schema.js';
23
+ /**
24
+ * Query options for ready nodes
25
+ */
26
+ export interface QueryOptions {
27
+ /** WU ID to query (required) */
28
+ wuId: string;
29
+ /** Filter by node type (optional) */
30
+ type?: string;
31
+ }
32
+ /**
33
+ * Query ready nodes for a WU.
34
+ *
35
+ * Returns unblocked, open nodes linked to the WU in deterministic order:
36
+ * 1. Priority (P0 first, then P1, P2, P3; nodes without priority last)
37
+ * 2. CreatedAt (oldest first for same priority)
38
+ * 3. ID (alphabetical for stable sort)
39
+ *
40
+ * @param baseDir - Base directory containing .lumenflow/memory
41
+ * @param options - Query options
42
+ * @returns Deterministically ordered ready nodes
43
+ * @throws If WU ID format is invalid or file contains malformed JSON
44
+ *
45
+ * @example
46
+ * const ready = await queryReadyNodes('/path/to/project', { wuId: 'WU-1234' });
47
+ * console.log(`${ready.length} nodes ready for processing`);
48
+ *
49
+ * @example
50
+ * // Filter by type
51
+ * const discoveries = await queryReadyNodes('/path/to/project', {
52
+ * wuId: 'WU-1234',
53
+ * type: 'discovery',
54
+ * });
55
+ */
56
+ export declare function queryReadyNodes(baseDir: string, options: QueryOptions): Promise<MemoryNode[]>;
@@ -231,3 +231,4 @@ export async function queryReadyNodes(baseDir, options) {
231
231
  // Sort deterministically
232
232
  return readyNodes.sort(compareNodes);
233
233
  }
234
+ //# sourceMappingURL=mem-ready-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-ready-core.js","sourceRoot":"","sources":["../src/mem-ready-core.ts"],"names":[],"mappings":"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"}
@@ -256,3 +256,4 @@ export async function generateRecoveryContext(options) {
256
256
  truncated,
257
257
  };
258
258
  }
259
+ //# sourceMappingURL=mem-recover-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mem-recover-core.js","sourceRoot":"","sources":["../src/mem-recover-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Memory Signal Core Logic (WU-1473)
3
+ *
4
+ * Core logic for creating coordination signals between parallel agents.
5
+ * Enables sub-100ms agent communication via JSONL append operations.
6
+ *
7
+ * Features:
8
+ * - Append-only writes for sub-100ms performance
9
+ * - WU-scoped signals for focused coordination
10
+ * - Lane-targeted signals for cross-team communication
11
+ * - Read/unread tracking for mem:inbox integration
12
+ *
13
+ * @see {@link tools/mem-signal.mjs} - CLI wrapper
14
+ * @see {@link tools/__tests__/mem-signal.test.mjs} - Tests
15
+ */
16
+ /**
17
+ * Signal file name constant
18
+ */
19
+ export declare const SIGNAL_FILE_NAME = "signals.jsonl";
20
+ /**
21
+ * Signal structure
22
+ */
23
+ export interface Signal {
24
+ /** Unique signal identifier (sig-XXXXXXXX) */
25
+ id: string;
26
+ /** Signal content/message */
27
+ message: string;
28
+ /** ISO 8601 timestamp */
29
+ created_at: string;
30
+ /** Whether signal has been read */
31
+ read: boolean;
32
+ /** Optional WU ID scope */
33
+ wu_id?: string;
34
+ /** Optional target lane */
35
+ lane?: string;
36
+ }
37
+ /**
38
+ * Result of creating a signal
39
+ */
40
+ export interface CreateSignalResult {
41
+ /** Whether signal was created successfully */
42
+ success: boolean;
43
+ /** The created signal object */
44
+ signal: Signal;
45
+ }
46
+ /**
47
+ * Options for creating a signal
48
+ */
49
+ export interface CreateSignalOptions {
50
+ /** Signal message content (required) */
51
+ message: string;
52
+ /** WU ID to scope signal to */
53
+ wuId?: string;
54
+ /** Lane to target signal to */
55
+ lane?: string;
56
+ }
57
+ /**
58
+ * Options for loading signals
59
+ */
60
+ export interface LoadSignalsOptions {
61
+ /** Filter by WU ID */
62
+ wuId?: string;
63
+ /** Filter by lane */
64
+ lane?: string;
65
+ /** Only return unread signals */
66
+ unreadOnly?: boolean;
67
+ /** Only return signals created after this time */
68
+ since?: Date | string;
69
+ }
70
+ /**
71
+ * Result of marking signals as read
72
+ */
73
+ export interface MarkAsReadResult {
74
+ /** Number of signals marked as read */
75
+ markedCount: number;
76
+ }
77
+ /**
78
+ * Creates a coordination signal between parallel agents.
79
+ *
80
+ * Signals are appended to signals.jsonl using append-only writes
81
+ * for sub-100ms performance. Signals can be scoped to a specific
82
+ * WU or targeted at a specific lane.
83
+ *
84
+ * @param {string} baseDir - Project base directory
85
+ * @param {CreateSignalOptions} options - Signal options
86
+ * @returns {Promise<CreateSignalResult>} Result with created signal
87
+ * @throws {Error} If message is missing or WU ID is invalid
88
+ *
89
+ * @example
90
+ * const result = await createSignal('/project', {
91
+ * message: 'Starting feature implementation',
92
+ * wuId: 'WU-1473',
93
+ * lane: 'Operations: Tooling',
94
+ * });
95
+ */
96
+ export declare function createSignal(baseDir: string, options: CreateSignalOptions): Promise<CreateSignalResult>;
97
+ /**
98
+ * Loads signals from the signals file with optional filtering.
99
+ *
100
+ * Signals are returned in chronological order (oldest first).
101
+ * Supports filtering by WU ID, lane, and read status.
102
+ *
103
+ * @param {string} baseDir - Project base directory
104
+ * @param {LoadSignalsOptions} [options={}] - Filter options
105
+ * @returns {Promise<Signal[]>} Array of signals matching filters
106
+ *
107
+ * @example
108
+ * // Load all signals
109
+ * const all = await loadSignals('/project');
110
+ *
111
+ * // Load unread signals for a specific WU
112
+ * const unread = await loadSignals('/project', {
113
+ * wuId: 'WU-1473',
114
+ * unreadOnly: true,
115
+ * });
116
+ */
117
+ export declare function loadSignals(baseDir: string, options?: LoadSignalsOptions): Promise<Signal[]>;
118
+ /**
119
+ * Marks signals as read by updating the signals file.
120
+ *
121
+ * Reads the entire file, updates the read status for matching IDs,
122
+ * and writes back. Only signals that were previously unread are counted.
123
+ *
124
+ * @param baseDir - Project base directory
125
+ * @param signalIds - Array of signal IDs to mark as read
126
+ * @returns Result with count of signals marked
127
+ *
128
+ * @example
129
+ * const result = await markSignalsAsRead('/project', ['sig-abc12345', 'sig-def67890']);
130
+ * console.log(result.markedCount); // 2
131
+ */
132
+ export declare function markSignalsAsRead(baseDir: string, signalIds: string[]): Promise<MarkAsReadResult>;
@@ -21,6 +21,14 @@ import { LUMENFLOW_MEMORY_PATHS } from './paths.js';
21
21
  * Signal file name constant
22
22
  */
23
23
  export const SIGNAL_FILE_NAME = 'signals.jsonl';
24
+ /**
25
+ * Signal receipts file name constant (WU-1472)
26
+ *
27
+ * Append-only file that stores read receipts for signals.
28
+ * This avoids rewriting signals.jsonl when marking signals as read,
29
+ * enabling concurrent-safe consumption by multiple agents.
30
+ */
31
+ export const SIGNAL_RECEIPTS_FILE_NAME = 'signal-receipts.jsonl';
24
32
  /**
25
33
  * WU ID validation pattern (from memory-schema.ts)
26
34
  */
@@ -71,6 +79,46 @@ function getMemoryDir(baseDir) {
71
79
  function getSignalsPath(baseDir) {
72
80
  return path.join(getMemoryDir(baseDir), SIGNAL_FILE_NAME);
73
81
  }
82
+ /**
83
+ * Gets the signal receipts file path for a project (WU-1472).
84
+ *
85
+ * @param baseDir - Project base directory
86
+ * @returns Full path to signal-receipts.jsonl
87
+ */
88
+ function getReceiptsPath(baseDir) {
89
+ return path.join(getMemoryDir(baseDir), SIGNAL_RECEIPTS_FILE_NAME);
90
+ }
91
+ /**
92
+ * Loads read receipts from the receipts file (WU-1472).
93
+ *
94
+ * Returns a Set of signal IDs that have been marked as read via receipts.
95
+ * If the file does not exist, returns an empty Set.
96
+ *
97
+ * @param baseDir - Project base directory
98
+ * @returns Set of signal IDs with read receipts
99
+ */
100
+ async function loadReceiptIds(baseDir) {
101
+ const receiptsPath = getReceiptsPath(baseDir);
102
+ let content;
103
+ try {
104
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool reads known path
105
+ content = await fs.readFile(receiptsPath, { encoding: 'utf-8' });
106
+ }
107
+ catch (err) {
108
+ const error = err;
109
+ if (error.code === 'ENOENT') {
110
+ return new Set();
111
+ }
112
+ throw error;
113
+ }
114
+ const lines = content.split('\n').filter((line) => line.trim());
115
+ const ids = new Set();
116
+ for (const line of lines) {
117
+ const receipt = JSON.parse(line);
118
+ ids.add(receipt.signal_id);
119
+ }
120
+ return ids;
121
+ }
74
122
  /**
75
123
  * Validates a WU ID format.
76
124
  *
@@ -177,6 +225,13 @@ export async function loadSignals(baseDir, options = {}) {
177
225
  // Parse JSONL content
178
226
  const lines = content.split('\n').filter((line) => line.trim());
179
227
  const signals = lines.map((line) => JSON.parse(line));
228
+ // Merge receipt-based read state (WU-1472)
229
+ const receiptIds = await loadReceiptIds(baseDir);
230
+ for (const signal of signals) {
231
+ if (!signal.read && receiptIds.has(signal.id)) {
232
+ signal.read = true;
233
+ }
234
+ }
180
235
  // Apply filters
181
236
  let filtered = signals;
182
237
  if (wuId) {
@@ -196,10 +251,14 @@ export async function loadSignals(baseDir, options = {}) {
196
251
  return filtered;
197
252
  }
198
253
  /**
199
- * Marks signals as read by updating the signals file.
254
+ * Marks signals as read by appending receipts to signal-receipts.jsonl (WU-1472).
200
255
  *
201
- * Reads the entire file, updates the read status for matching IDs,
202
- * and writes back. Only signals that were previously unread are counted.
256
+ * Instead of rewriting signals.jsonl (which causes lost updates under
257
+ * concurrency), this appends receipt records to a separate append-only file.
258
+ * The loadSignals function merges these receipts to derive effective read state.
259
+ *
260
+ * Only signals that are currently unread (no inline read:true AND no existing
261
+ * receipt) are counted in markedCount.
203
262
  *
204
263
  * @param baseDir - Project base directory
205
264
  * @param signalIds - Array of signal IDs to mark as read
@@ -212,12 +271,11 @@ export async function loadSignals(baseDir, options = {}) {
212
271
  export async function markSignalsAsRead(baseDir, signalIds) {
213
272
  const signalsPath = getSignalsPath(baseDir);
214
273
  const idSet = new Set(signalIds);
215
- let markedCount = 0;
216
- // Read file content
217
- let content;
274
+ // Read signals file to determine which IDs exist and their inline read state
275
+ let signalContent;
218
276
  try {
219
277
  // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool reads signals file
220
- content = await fs.readFile(signalsPath, { encoding: 'utf-8' });
278
+ signalContent = await fs.readFile(signalsPath, { encoding: 'utf-8' });
221
279
  }
222
280
  catch (err) {
223
281
  const error = err;
@@ -227,20 +285,38 @@ export async function markSignalsAsRead(baseDir, signalIds) {
227
285
  }
228
286
  throw error;
229
287
  }
230
- // Parse JSONL content
231
- const lines = content.split('\n').filter((line) => line.trim());
232
- const updatedLines = lines.map((line) => {
288
+ // Build map of existing signal read states
289
+ const lines = signalContent.split('\n').filter((line) => line.trim());
290
+ const inlineReadIds = new Set();
291
+ const existingIds = new Set();
292
+ for (const line of lines) {
233
293
  const signal = JSON.parse(line);
234
- if (idSet.has(signal.id) && signal.read === false) {
235
- signal.read = true;
236
- markedCount++;
294
+ existingIds.add(signal.id);
295
+ if (signal.read) {
296
+ inlineReadIds.add(signal.id);
237
297
  }
238
- return JSON.stringify(signal);
239
- });
240
- // Write back updated content
241
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes signals file
242
- await fs.writeFile(signalsPath, `${updatedLines.join('\n')}\n`, {
243
- encoding: 'utf-8',
244
- });
245
- return { markedCount };
298
+ }
299
+ // Load existing receipts to check for duplicates
300
+ const existingReceiptIds = await loadReceiptIds(baseDir);
301
+ // Determine which signals need new receipts
302
+ const now = new Date().toISOString();
303
+ const newReceipts = [];
304
+ for (const id of idSet) {
305
+ // Only create receipt if: signal exists, not already inline read, no existing receipt
306
+ if (existingIds.has(id) && !inlineReadIds.has(id) && !existingReceiptIds.has(id)) {
307
+ newReceipts.push({ signal_id: id, read_at: now });
308
+ }
309
+ }
310
+ // Append receipts (append-only for concurrent safety)
311
+ if (newReceipts.length > 0) {
312
+ const memoryDir = getMemoryDir(baseDir);
313
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool creates known directory
314
+ await fs.mkdir(memoryDir, { recursive: true });
315
+ const receiptsPath = getReceiptsPath(baseDir);
316
+ const receiptLines = newReceipts.map((r) => JSON.stringify(r)).join('\n') + '\n';
317
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- CLI tool writes receipts file
318
+ await fs.appendFile(receiptsPath, receiptLines, 'utf-8');
319
+ }
320
+ return { markedCount: newReceipts.length };
246
321
  }
322
+ //# sourceMappingURL=mem-signal-core.js.map