@producible/cereworker-core 26.520.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/abort.d.ts +5 -0
  3. package/dist/abort.d.ts.map +1 -0
  4. package/dist/abort.js +36 -0
  5. package/dist/abort.js.map +1 -0
  6. package/dist/context.d.ts +20 -0
  7. package/dist/context.d.ts.map +1 -0
  8. package/dist/context.js +45 -0
  9. package/dist/context.js.map +1 -0
  10. package/dist/conversation.d.ts +48 -0
  11. package/dist/conversation.d.ts.map +1 -0
  12. package/dist/conversation.js +358 -0
  13. package/dist/conversation.js.map +1 -0
  14. package/dist/discovery.d.ts +32 -0
  15. package/dist/discovery.d.ts.map +1 -0
  16. package/dist/discovery.js +165 -0
  17. package/dist/discovery.js.map +1 -0
  18. package/dist/events.d.ts +222 -0
  19. package/dist/events.d.ts.map +1 -0
  20. package/dist/events.js +25 -0
  21. package/dist/events.js.map +1 -0
  22. package/dist/http-tools.d.ts +8 -0
  23. package/dist/http-tools.d.ts.map +1 -0
  24. package/dist/http-tools.js +137 -0
  25. package/dist/http-tools.js.map +1 -0
  26. package/dist/index.d.ts +34 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +20 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/instance.d.ts +56 -0
  31. package/dist/instance.d.ts.map +1 -0
  32. package/dist/instance.js +136 -0
  33. package/dist/instance.js.map +1 -0
  34. package/dist/legacy-sqlite.d.ts +6 -0
  35. package/dist/legacy-sqlite.d.ts.map +1 -0
  36. package/dist/legacy-sqlite.js +90 -0
  37. package/dist/legacy-sqlite.js.map +1 -0
  38. package/dist/logger.d.ts +15 -0
  39. package/dist/logger.d.ts.map +1 -0
  40. package/dist/logger.js +53 -0
  41. package/dist/logger.js.map +1 -0
  42. package/dist/orchestrator.d.ts +321 -0
  43. package/dist/orchestrator.d.ts.map +1 -0
  44. package/dist/orchestrator.js +2610 -0
  45. package/dist/orchestrator.js.map +1 -0
  46. package/dist/pairing.d.ts +41 -0
  47. package/dist/pairing.d.ts.map +1 -0
  48. package/dist/pairing.js +215 -0
  49. package/dist/pairing.js.map +1 -0
  50. package/dist/plan-store.d.ts +33 -0
  51. package/dist/plan-store.d.ts.map +1 -0
  52. package/dist/plan-store.js +113 -0
  53. package/dist/plan-store.js.map +1 -0
  54. package/dist/proactive.d.ts +64 -0
  55. package/dist/proactive.d.ts.map +1 -0
  56. package/dist/proactive.js +179 -0
  57. package/dist/proactive.js.map +1 -0
  58. package/dist/sub-agent-manager.d.ts +45 -0
  59. package/dist/sub-agent-manager.d.ts.map +1 -0
  60. package/dist/sub-agent-manager.js +509 -0
  61. package/dist/sub-agent-manager.js.map +1 -0
  62. package/dist/sub-agent-tools.d.ts +4 -0
  63. package/dist/sub-agent-tools.d.ts.map +1 -0
  64. package/dist/sub-agent-tools.js +94 -0
  65. package/dist/sub-agent-tools.js.map +1 -0
  66. package/dist/system-prompt.d.ts +34 -0
  67. package/dist/system-prompt.d.ts.map +1 -0
  68. package/dist/system-prompt.js +256 -0
  69. package/dist/system-prompt.js.map +1 -0
  70. package/dist/task-schedule.d.ts +13 -0
  71. package/dist/task-schedule.d.ts.map +1 -0
  72. package/dist/task-schedule.js +201 -0
  73. package/dist/task-schedule.js.map +1 -0
  74. package/dist/task-store.d.ts +22 -0
  75. package/dist/task-store.d.ts.map +1 -0
  76. package/dist/task-store.js +141 -0
  77. package/dist/task-store.js.map +1 -0
  78. package/dist/text-store.d.ts +18 -0
  79. package/dist/text-store.d.ts.map +1 -0
  80. package/dist/text-store.js +212 -0
  81. package/dist/text-store.js.map +1 -0
  82. package/dist/tool-runtime.d.ts +76 -0
  83. package/dist/tool-runtime.d.ts.map +1 -0
  84. package/dist/tool-runtime.js +443 -0
  85. package/dist/tool-runtime.js.map +1 -0
  86. package/dist/types.d.ts +392 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +31 -0
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ export { TypedEventEmitter } from './events.js';
2
+ export { createAbortError, isAbortError, raceWithAbort, throwIfAborted } from './abort.js';
3
+ export { ensureDir, resolveStoreBasePath, readJsonFile, readJsonLines, appendJsonLine, writeTextFileAtomic, writeJsonFileAtomic, writeJsonLines, withTextStoreLock, } from './text-store.js';
4
+ export { ConversationStore } from './conversation.js';
5
+ export { Orchestrator } from './orchestrator.js';
6
+ export { ToolRuntime } from './tool-runtime.js';
7
+ export { createLogger, configureLogger } from './logger.js';
8
+ export { SubAgentManager } from './sub-agent-manager.js';
9
+ export { createSubAgentTools } from './sub-agent-tools.js';
10
+ export { estimateTokens, estimateMessageTokens, shouldCompact, buildCompactionMessages, } from './context.js';
11
+ export { buildSystemPrompt } from './system-prompt.js';
12
+ export { PairingStore, formatCode, normalizeCode } from './pairing.js';
13
+ export { createHttpTools } from './http-tools.js';
14
+ export { InstanceStore } from './instance.js';
15
+ export { DiscoveryEngine } from './discovery.js';
16
+ export { PlanStore } from './plan-store.js';
17
+ export { TaskStore } from './task-store.js';
18
+ export { normalizeTaskSchedule, formatTaskSchedule, taskScheduleToHint, getNextTaskRun, } from './task-schedule.js';
19
+ export { ProactiveController } from './proactive.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAqB5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,56 @@
1
+ export interface FineTuneRecord {
2
+ jobId: string;
3
+ method: string;
4
+ completedAt: string;
5
+ checkpointPath: string;
6
+ loss: number;
7
+ trainingPairs: number;
8
+ }
9
+ export interface InstanceProfile {
10
+ name: string;
11
+ role: string;
12
+ traits: string[];
13
+ source: 'static' | 'discovered';
14
+ }
15
+ export interface InstanceIdentity {
16
+ id: string;
17
+ createdAt: string;
18
+ lastBootAt: string;
19
+ timezone: string;
20
+ profile: InstanceProfile;
21
+ conversationCount: number;
22
+ finetuneLineage: FineTuneRecord[];
23
+ activeCheckpoint: string | null;
24
+ schemaVersion: number;
25
+ }
26
+ export declare class InstanceStore {
27
+ private filePath;
28
+ private identity;
29
+ constructor(dir?: string);
30
+ /** Load instance identity from disk. Returns null if file doesn't exist or is corrupt. */
31
+ load(): InstanceIdentity | null;
32
+ /** Create a new instance identity from a profile. */
33
+ create(profile: {
34
+ name: string;
35
+ role: string;
36
+ traits: string[];
37
+ }, source?: 'static' | 'discovered'): InstanceIdentity;
38
+ /** Get the current loaded identity (null if not loaded/created). */
39
+ get(): InstanceIdentity | null;
40
+ /** Persist identity to disk with atomic write. */
41
+ save(): void;
42
+ /** Update lastBootAt timestamp. */
43
+ updateBoot(): void;
44
+ /** Record a completed fine-tune job in the lineage. */
45
+ recordFineTune(record: FineTuneRecord): void;
46
+ /** Increment conversation counter. */
47
+ incrementConversation(): void;
48
+ /** Update the instance profile. */
49
+ updateProfile(profile: Partial<InstanceProfile>): void;
50
+ updateTimezone(timezone: string): void;
51
+ /** Set conversation count directly (used for migration). */
52
+ setConversationCount(count: number): void;
53
+ /** Migrate older schema versions to current. */
54
+ private migrate;
55
+ }
56
+ //# sourceMappingURL=instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../src/instance.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAiC;gBAErC,GAAG,CAAC,EAAE,MAAM;IAKxB,0FAA0F;IAC1F,IAAI,IAAI,gBAAgB,GAAG,IAAI;IAc/B,qDAAqD;IACrD,MAAM,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,MAAM,GAAE,QAAQ,GAAG,YAAuB,GAAG,gBAAgB;IAkB/H,oEAAoE;IACpE,GAAG,IAAI,gBAAgB,GAAG,IAAI;IAI9B,kDAAkD;IAClD,IAAI,IAAI,IAAI;IAWZ,mCAAmC;IACnC,UAAU,IAAI,IAAI;IAMlB,uDAAuD;IACvD,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAQ5C,sCAAsC;IACtC,qBAAqB,IAAI,IAAI;IAM7B,mCAAmC;IACnC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAOtD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOtC,4DAA4D;IAC5D,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMzC,gDAAgD;IAChD,OAAO,CAAC,OAAO;CA0BhB"}
@@ -0,0 +1,136 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, dirname } from 'node:path';
5
+ import { createLogger } from './logger.js';
6
+ const log = createLogger('instance');
7
+ const CURRENT_SCHEMA_VERSION = 1;
8
+ const DEFAULT_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
9
+ export class InstanceStore {
10
+ filePath;
11
+ identity = null;
12
+ constructor(dir) {
13
+ const base = dir ?? join(homedir(), '.cereworker');
14
+ this.filePath = join(base, 'instance.json');
15
+ }
16
+ /** Load instance identity from disk. Returns null if file doesn't exist or is corrupt. */
17
+ load() {
18
+ if (!existsSync(this.filePath)) {
19
+ return null;
20
+ }
21
+ try {
22
+ const raw = JSON.parse(readFileSync(this.filePath, 'utf-8'));
23
+ this.identity = this.migrate(raw);
24
+ return this.identity;
25
+ }
26
+ catch (err) {
27
+ log.warn('Failed to load instance.json, will regenerate', { error: String(err) });
28
+ return null;
29
+ }
30
+ }
31
+ /** Create a new instance identity from a profile. */
32
+ create(profile, source = 'static') {
33
+ const now = new Date().toISOString();
34
+ this.identity = {
35
+ id: randomUUID(),
36
+ createdAt: now,
37
+ lastBootAt: now,
38
+ timezone: DEFAULT_TIMEZONE,
39
+ profile: { ...profile, source },
40
+ conversationCount: 0,
41
+ finetuneLineage: [],
42
+ activeCheckpoint: null,
43
+ schemaVersion: CURRENT_SCHEMA_VERSION,
44
+ };
45
+ this.save();
46
+ log.info('Created new instance', { id: this.identity.id });
47
+ return this.identity;
48
+ }
49
+ /** Get the current loaded identity (null if not loaded/created). */
50
+ get() {
51
+ return this.identity;
52
+ }
53
+ /** Persist identity to disk with atomic write. */
54
+ save() {
55
+ if (!this.identity)
56
+ return;
57
+ const dir = dirname(this.filePath);
58
+ if (!existsSync(dir)) {
59
+ mkdirSync(dir, { recursive: true });
60
+ }
61
+ const tmpPath = this.filePath + '.tmp';
62
+ writeFileSync(tmpPath, JSON.stringify(this.identity, null, 2), 'utf-8');
63
+ renameSync(tmpPath, this.filePath);
64
+ }
65
+ /** Update lastBootAt timestamp. */
66
+ updateBoot() {
67
+ if (!this.identity)
68
+ return;
69
+ this.identity.lastBootAt = new Date().toISOString();
70
+ this.save();
71
+ }
72
+ /** Record a completed fine-tune job in the lineage. */
73
+ recordFineTune(record) {
74
+ if (!this.identity)
75
+ return;
76
+ this.identity.finetuneLineage.push(record);
77
+ this.identity.activeCheckpoint = record.checkpointPath;
78
+ this.save();
79
+ log.info('Recorded fine-tune', { jobId: record.jobId, loss: record.loss });
80
+ }
81
+ /** Increment conversation counter. */
82
+ incrementConversation() {
83
+ if (!this.identity)
84
+ return;
85
+ this.identity.conversationCount++;
86
+ this.save();
87
+ }
88
+ /** Update the instance profile. */
89
+ updateProfile(profile) {
90
+ if (!this.identity)
91
+ return;
92
+ this.identity.profile = { ...this.identity.profile, ...profile };
93
+ this.save();
94
+ log.info('Updated instance profile', { name: this.identity.profile.name });
95
+ }
96
+ updateTimezone(timezone) {
97
+ if (!this.identity)
98
+ return;
99
+ this.identity.timezone = timezone;
100
+ this.save();
101
+ log.info('Updated instance timezone', { timezone });
102
+ }
103
+ /** Set conversation count directly (used for migration). */
104
+ setConversationCount(count) {
105
+ if (!this.identity)
106
+ return;
107
+ this.identity.conversationCount = count;
108
+ this.save();
109
+ }
110
+ /** Migrate older schema versions to current. */
111
+ migrate(raw) {
112
+ const version = raw.schemaVersion ?? 0;
113
+ if (version < 1) {
114
+ // Pre-schema or v0: ensure all required fields exist
115
+ return {
116
+ id: raw.id ?? randomUUID(),
117
+ createdAt: raw.createdAt ?? new Date().toISOString(),
118
+ lastBootAt: raw.lastBootAt ?? new Date().toISOString(),
119
+ timezone: raw.timezone ?? DEFAULT_TIMEZONE,
120
+ profile: raw.profile ?? {
121
+ name: 'Cere',
122
+ role: 'general-purpose assistant',
123
+ traits: [],
124
+ source: 'static',
125
+ },
126
+ conversationCount: raw.conversationCount ?? 0,
127
+ finetuneLineage: raw.finetuneLineage ?? [],
128
+ activeCheckpoint: raw.activeCheckpoint ?? null,
129
+ schemaVersion: CURRENT_SCHEMA_VERSION,
130
+ };
131
+ }
132
+ // Current version — pass through
133
+ return raw;
134
+ }
135
+ }
136
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../src/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type LegacyMigrationSection = 'conversations' | 'pairing' | 'plans';
2
+ export declare function isLegacySqliteDatabase(path: string): boolean;
3
+ export declare function detectLegacySections(dbPath: string): LegacyMigrationSection[];
4
+ export declare function readLegacySection<T>(dbPath: string, section: LegacyMigrationSection, reader: (db: unknown) => T): T | null;
5
+ export declare function markLegacySectionMigrated(dbPath: string, section: LegacyMigrationSection): void;
6
+ //# sourceMappingURL=legacy-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-sqlite.d.ts","sourceRoot":"","sources":["../src/legacy-sqlite.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;AAgC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,EAAE,CAsB7E;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAkB1H;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAkB/F"}
@@ -0,0 +1,90 @@
1
+ import { createRequire } from 'node:module';
2
+ import { basename, dirname, join } from 'node:path';
3
+ import { existsSync, renameSync } from 'node:fs';
4
+ import { ensureDir, readFileHeader, readJsonFile, uniqueBackupPath, writeJsonFileAtomic } from './text-store.js';
5
+ const require = createRequire(import.meta.url);
6
+ function openDatabase(path) {
7
+ const { DatabaseSync } = require('node:sqlite');
8
+ return new DatabaseSync(path);
9
+ }
10
+ function getStatePath(dbPath) {
11
+ return join(dirname(dbPath), `.${basename(dbPath)}.migration.json`);
12
+ }
13
+ function readState(dbPath) {
14
+ return readJsonFile(getStatePath(dbPath), {
15
+ requiredSections: [],
16
+ migratedSections: {},
17
+ });
18
+ }
19
+ function writeState(dbPath, state) {
20
+ writeJsonFileAtomic(getStatePath(dbPath), state);
21
+ }
22
+ export function isLegacySqliteDatabase(path) {
23
+ if (!existsSync(path))
24
+ return false;
25
+ return readFileHeader(path, 16).toString('utf-8') === 'SQLite format 3\u0000';
26
+ }
27
+ export function detectLegacySections(dbPath) {
28
+ if (!isLegacySqliteDatabase(dbPath))
29
+ return [];
30
+ const db = openDatabase(dbPath);
31
+ try {
32
+ const rows = db
33
+ .prepare("SELECT name FROM sqlite_master WHERE type = 'table'")
34
+ .all();
35
+ const names = new Set(rows.map((row) => row.name));
36
+ const sections = [];
37
+ if (names.has('conversations') || names.has('messages')) {
38
+ sections.push('conversations');
39
+ }
40
+ if (names.has('pairing_requests') || names.has('approved_users')) {
41
+ sections.push('pairing');
42
+ }
43
+ if (names.has('plans')) {
44
+ sections.push('plans');
45
+ }
46
+ return sections;
47
+ }
48
+ finally {
49
+ db.close();
50
+ }
51
+ }
52
+ export function readLegacySection(dbPath, section, reader) {
53
+ if (!isLegacySqliteDatabase(dbPath))
54
+ return null;
55
+ const requiredSections = detectLegacySections(dbPath);
56
+ if (!requiredSections.includes(section))
57
+ return null;
58
+ const state = readState(dbPath);
59
+ if (state.requiredSections.length === 0) {
60
+ state.requiredSections = requiredSections;
61
+ writeState(dbPath, state);
62
+ }
63
+ if (state.migratedSections[section])
64
+ return null;
65
+ const db = openDatabase(dbPath);
66
+ try {
67
+ return reader(db);
68
+ }
69
+ finally {
70
+ db.close();
71
+ }
72
+ }
73
+ export function markLegacySectionMigrated(dbPath, section) {
74
+ const requiredSections = detectLegacySections(dbPath);
75
+ if (requiredSections.length === 0)
76
+ return;
77
+ const state = readState(dbPath);
78
+ state.requiredSections = requiredSections;
79
+ state.migratedSections[section] = true;
80
+ const allDone = requiredSections.every((required) => state.migratedSections[required]);
81
+ if (allDone && existsSync(dbPath)) {
82
+ ensureDir(dirname(dbPath));
83
+ const backupPath = uniqueBackupPath(dbPath);
84
+ renameSync(dbPath, backupPath);
85
+ state.backupPath = backupPath;
86
+ state.completedAt = new Date().toISOString();
87
+ }
88
+ writeState(dbPath, state);
89
+ }
90
+ //# sourceMappingURL=legacy-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-sqlite.js","sourceRoot":"","sources":["../src/legacy-sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export interface Logger {
3
+ debug(msg: string, data?: Record<string, unknown>): void;
4
+ info(msg: string, data?: Record<string, unknown>): void;
5
+ warn(msg: string, data?: Record<string, unknown>): void;
6
+ error(msg: string, data?: Record<string, unknown>): void;
7
+ child(name: string): Logger;
8
+ }
9
+ export declare function configureLogger(options: {
10
+ level?: LogLevel;
11
+ file?: string;
12
+ stderr?: boolean;
13
+ }): void;
14
+ export declare function createLogger(name: string): Logger;
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAOD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAUpG;AAwBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQjD"}
package/dist/logger.js ADDED
@@ -0,0 +1,53 @@
1
+ const LOG_LEVELS = {
2
+ debug: 0,
3
+ info: 1,
4
+ warn: 2,
5
+ error: 3,
6
+ };
7
+ let globalLevel = 'info';
8
+ let logFile;
9
+ let writeStream = null;
10
+ let stderrAll = false;
11
+ export function configureLogger(options) {
12
+ if (options.level)
13
+ globalLevel = options.level;
14
+ if (options.stderr !== undefined)
15
+ stderrAll = options.stderr;
16
+ if (options.file) {
17
+ logFile = options.file;
18
+ // Lazy import to avoid top-level side effects
19
+ import('node:fs').then(({ createWriteStream }) => {
20
+ writeStream = createWriteStream(logFile, { flags: 'a' });
21
+ });
22
+ }
23
+ }
24
+ function formatEntry(level, name, msg, data) {
25
+ const ts = new Date().toISOString();
26
+ const base = { ts, tz: 'UTC', level, name, msg, ...data };
27
+ return JSON.stringify(base);
28
+ }
29
+ function shouldLog(level) {
30
+ return LOG_LEVELS[level] >= LOG_LEVELS[globalLevel];
31
+ }
32
+ function writeLog(level, name, msg, data) {
33
+ if (!shouldLog(level))
34
+ return;
35
+ const entry = formatEntry(level, name, msg, data);
36
+ if (writeStream) {
37
+ writeStream.write(entry + '\n');
38
+ }
39
+ // Write to stderr only in headless mode (stderrAll), not in TUI mode
40
+ if (stderrAll) {
41
+ process.stderr.write(entry + '\n');
42
+ }
43
+ }
44
+ export function createLogger(name) {
45
+ return {
46
+ debug: (msg, data) => writeLog('debug', name, msg, data),
47
+ info: (msg, data) => writeLog('info', name, msg, data),
48
+ warn: (msg, data) => writeLog('warn', name, msg, data),
49
+ error: (msg, data) => writeLog('error', name, msg, data),
50
+ child: (childName) => createLogger(`${name}:${childName}`),
51
+ };
52
+ }
53
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAUF,IAAI,WAAW,GAAa,MAAM,CAAC;AACnC,IAAI,OAA2B,CAAC;AAChC,IAAI,WAAW,GAAsC,IAAI,CAAC;AAC1D,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,MAAM,UAAU,eAAe,CAAC,OAA8D;IAC5F,IAAI,OAAO,CAAC,KAAK;QAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;QACvB,8CAA8C;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE;YAC/C,WAAW,GAAG,iBAAiB,CAAC,OAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAe,EAAE,IAAY,EAAE,GAAW,EAAE,IAA8B;IAC7F,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,SAAS,CAAC,KAAe;IAChC,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAe,EAAE,IAAY,EAAE,GAAW,EAAE,IAA8B;IAC1F,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,qEAAqE;IACrE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACxD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACtD,IAAI,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACtD,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;QACxD,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,IAAI,IAAI,SAAS,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC"}