@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.
- package/LICENSE +21 -0
- package/dist/abort.d.ts +5 -0
- package/dist/abort.d.ts.map +1 -0
- package/dist/abort.js +36 -0
- package/dist/abort.js.map +1 -0
- package/dist/context.d.ts +20 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +45 -0
- package/dist/context.js.map +1 -0
- package/dist/conversation.d.ts +48 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +358 -0
- package/dist/conversation.js.map +1 -0
- package/dist/discovery.d.ts +32 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +165 -0
- package/dist/discovery.js.map +1 -0
- package/dist/events.d.ts +222 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +25 -0
- package/dist/events.js.map +1 -0
- package/dist/http-tools.d.ts +8 -0
- package/dist/http-tools.d.ts.map +1 -0
- package/dist/http-tools.js +137 -0
- package/dist/http-tools.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/instance.d.ts +56 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +136 -0
- package/dist/instance.js.map +1 -0
- package/dist/legacy-sqlite.d.ts +6 -0
- package/dist/legacy-sqlite.d.ts.map +1 -0
- package/dist/legacy-sqlite.js +90 -0
- package/dist/legacy-sqlite.js.map +1 -0
- package/dist/logger.d.ts +15 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +53 -0
- package/dist/logger.js.map +1 -0
- package/dist/orchestrator.d.ts +321 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +2610 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/pairing.d.ts +41 -0
- package/dist/pairing.d.ts.map +1 -0
- package/dist/pairing.js +215 -0
- package/dist/pairing.js.map +1 -0
- package/dist/plan-store.d.ts +33 -0
- package/dist/plan-store.d.ts.map +1 -0
- package/dist/plan-store.js +113 -0
- package/dist/plan-store.js.map +1 -0
- package/dist/proactive.d.ts +64 -0
- package/dist/proactive.d.ts.map +1 -0
- package/dist/proactive.js +179 -0
- package/dist/proactive.js.map +1 -0
- package/dist/sub-agent-manager.d.ts +45 -0
- package/dist/sub-agent-manager.d.ts.map +1 -0
- package/dist/sub-agent-manager.js +509 -0
- package/dist/sub-agent-manager.js.map +1 -0
- package/dist/sub-agent-tools.d.ts +4 -0
- package/dist/sub-agent-tools.d.ts.map +1 -0
- package/dist/sub-agent-tools.js +94 -0
- package/dist/sub-agent-tools.js.map +1 -0
- package/dist/system-prompt.d.ts +34 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +256 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/task-schedule.d.ts +13 -0
- package/dist/task-schedule.d.ts.map +1 -0
- package/dist/task-schedule.js +201 -0
- package/dist/task-schedule.js.map +1 -0
- package/dist/task-store.d.ts +22 -0
- package/dist/task-store.d.ts.map +1 -0
- package/dist/task-store.js +141 -0
- package/dist/task-store.js.map +1 -0
- package/dist/text-store.d.ts +18 -0
- package/dist/text-store.d.ts.map +1 -0
- package/dist/text-store.js +212 -0
- package/dist/text-store.js.map +1 -0
- package/dist/tool-runtime.d.ts +76 -0
- package/dist/tool-runtime.d.ts.map +1 -0
- package/dist/tool-runtime.js +443 -0
- package/dist/tool-runtime.js.map +1 -0
- package/dist/types.d.ts +392 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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"}
|
package/dist/instance.js
ADDED
|
@@ -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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAW/C,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,CACT,OAAO,CAAC,MAAM,CAAC,EACf,IAAI,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CACtC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,YAAY,CAAiB,YAAY,CAAC,MAAM,CAAC,EAAE;QACxD,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,EAAE;KACrB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,KAAqB;IACvD,mBAAmB,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,uBAAuB,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CAAC,qDAAqD,CAAC;aAC9D,GAAG,EAA6B,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAA6B,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACjE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,MAAc,EAAE,OAA+B,EAAE,MAA0B;IAC9G,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAErD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAC1C,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAc,EAAE,OAA+B;IACvF,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE1C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC1C,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAEvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvF,IAAI,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5C,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/B,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;QAC9B,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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"}
|