atabey-shared 0.0.37 → 0.1.1-beta
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 +2 -2
- package/dist/agent-identity.d.ts +34 -0
- package/dist/agent-identity.js +77 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/api-catalog.d.ts +57 -0
- package/dist/api-catalog.js +254 -0
- package/dist/api-catalog.js.map +1 -0
- package/dist/audit-chain.d.ts +32 -3
- package/dist/audit-chain.js +187 -10
- package/dist/audit-chain.js.map +1 -1
- package/dist/audit.d.ts +8 -0
- package/dist/audit.js +44 -7
- package/dist/audit.js.map +1 -1
- package/dist/constants.d.ts +7 -9
- package/dist/constants.js +14 -18
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +1 -0
- package/dist/database.js +3 -0
- package/dist/database.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/file-lock.d.ts +5 -0
- package/dist/file-lock.js +20 -31
- package/dist/file-lock.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +32 -9
- package/dist/job-queue.js +81 -8
- package/dist/job-queue.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +33 -7
- package/dist/logger.js.map +1 -1
- package/dist/memory-prune.d.ts +18 -0
- package/dist/memory-prune.js +48 -0
- package/dist/memory-prune.js.map +1 -0
- package/dist/migrations.d.ts +69 -0
- package/dist/migrations.js +394 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +39 -0
- package/dist/otel.js +93 -0
- package/dist/otel.js.map +1 -0
- package/dist/outbound-http.d.ts +32 -0
- package/dist/outbound-http.js +88 -0
- package/dist/outbound-http.js.map +1 -0
- package/dist/pii.d.ts +1 -0
- package/dist/pii.js +82 -26
- package/dist/pii.js.map +1 -1
- package/dist/policy-gate.js +27 -3
- package/dist/policy-gate.js.map +1 -1
- package/dist/retention.d.ts +6 -1
- package/dist/retention.js +56 -9
- package/dist/retention.js.map +1 -1
- package/dist/sandbox-fs.d.ts +1 -1
- package/dist/sandbox-fs.js +31 -38
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-runtime.d.ts +22 -29
- package/dist/sandbox-runtime.js +125 -93
- package/dist/sandbox-runtime.js.map +1 -1
- package/dist/sandbox.d.ts +1 -1
- package/dist/sandbox.js +1 -1
- package/dist/secrets.d.ts +99 -0
- package/dist/secrets.js +371 -0
- package/dist/secrets.js.map +1 -0
- package/dist/storage.d.ts +67 -0
- package/dist/storage.js +291 -11
- package/dist/storage.js.map +1 -1
- package/dist/time.js +6 -2
- package/dist/time.js.map +1 -1
- package/dist/tls.d.ts +87 -0
- package/dist/tls.js +154 -0
- package/dist/tls.js.map +1 -0
- package/dist/tokenizer.d.ts +54 -0
- package/dist/tokenizer.js +272 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/worker-pool.js +19 -0
- package/dist/worker-pool.js.map +1 -1
- package/package.json +19 -7
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAEA,IAAI,QAAQ,GAA6B,IAAI,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,KAAK,CAAC,EAAqB;QACvB,QAAQ,GAAG,EAAE,CAAC;IAClB,CAAC;IACD,KAAK;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACzH,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAEA,IAAI,QAAQ,GAA6B,IAAI,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,KAAK,CAAC,EAAqB;QACvB,QAAQ,GAAG,EAAE,CAAC;IAClB,CAAC;IACD,KAAK;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mGAAmG,CAAC,CAAC;QACzH,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,KAAK;QACD,OAAO,QAAQ,KAAK,IAAI,CAAC;IAC7B,CAAC;CACJ,CAAC"}
|
package/dist/errors.d.ts
CHANGED
package/dist/errors.js
CHANGED
package/dist/file-lock.d.ts
CHANGED
|
@@ -80,6 +80,11 @@ export declare class AtomicFileLock {
|
|
|
80
80
|
reason?: string;
|
|
81
81
|
}): T;
|
|
82
82
|
private reclaimIfStale;
|
|
83
|
+
/**
|
|
84
|
+
* True when an existing lock file may be safely stolen: unparseable/empty
|
|
85
|
+
* (corrupt, e.g. crashed mid-write) or past its TTL.
|
|
86
|
+
*/
|
|
87
|
+
private isReclaimable;
|
|
83
88
|
private isExpired;
|
|
84
89
|
private readMeta;
|
|
85
90
|
private forceRemove;
|
package/dist/file-lock.js
CHANGED
|
@@ -34,7 +34,7 @@ export class AtomicFileLock {
|
|
|
34
34
|
? resource
|
|
35
35
|
: path.resolve(this.projectRoot, resource);
|
|
36
36
|
let relative = path.relative(this.projectRoot, abs);
|
|
37
|
-
if (relative.startsWith(
|
|
37
|
+
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
38
38
|
// Outside project root — hash path to avoid escaping locks dir
|
|
39
39
|
relative = `_ext/${Buffer.from(abs).toString("base64url")}`;
|
|
40
40
|
}
|
|
@@ -61,40 +61,18 @@ export class AtomicFileLock {
|
|
|
61
61
|
pid: process.pid,
|
|
62
62
|
hostname: os.hostname(),
|
|
63
63
|
};
|
|
64
|
-
let fd;
|
|
65
64
|
try {
|
|
66
|
-
// Atomic exclusive create
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
catch (writeErr) {
|
|
72
|
-
// CRITICAL: meta write failed after wx create (e.g. ENOSPC) — remove orphan lock
|
|
73
|
-
try {
|
|
74
|
-
if (fd !== undefined)
|
|
75
|
-
fs.closeSync(fd);
|
|
76
|
-
}
|
|
77
|
-
catch { /* ignore */ }
|
|
78
|
-
fd = undefined;
|
|
79
|
-
this.forceRemove(lockPath, null);
|
|
80
|
-
throw writeErr;
|
|
81
|
-
}
|
|
82
|
-
fs.closeSync(fd);
|
|
83
|
-
fd = undefined;
|
|
65
|
+
// Atomic exclusive create WITH content in one syscall sequence
|
|
66
|
+
// (writeFileSync + flag 'wx' = O_CREAT|O_EXCL|O_WRONLY): there is no
|
|
67
|
+
// window where the lock file exists empty for a reader to misread.
|
|
68
|
+
fs.writeFileSync(lockPath, JSON.stringify(meta, null, 2), { encoding: "utf8", flag: "wx" });
|
|
84
69
|
return { acquired: true, meta };
|
|
85
70
|
}
|
|
86
71
|
catch (err) {
|
|
87
|
-
if (fd !== undefined) {
|
|
88
|
-
try {
|
|
89
|
-
fs.closeSync(fd);
|
|
90
|
-
}
|
|
91
|
-
catch { /* ignore */ }
|
|
92
|
-
}
|
|
93
72
|
const code = err.code;
|
|
94
73
|
if (code === "EEXIST") {
|
|
95
|
-
//
|
|
74
|
+
// Another process holds it. Reclaim only if corrupt/empty or expired.
|
|
96
75
|
const heldBy = this.readMeta(lockPath) ?? undefined;
|
|
97
|
-
// Corrupt lock (unreadable JSON) or expired → reclaim and retry once
|
|
98
76
|
if ((!heldBy || this.isExpired(heldBy)) && _reclaimDepth < 1) {
|
|
99
77
|
this.forceRemove(lockPath, heldBy ?? null);
|
|
100
78
|
return this.tryAcquire(resource, ownerId, reason, _reclaimDepth + 1);
|
|
@@ -132,6 +110,8 @@ export class AtomicFileLock {
|
|
|
132
110
|
return true;
|
|
133
111
|
const meta = this.readMeta(lockPath);
|
|
134
112
|
if (!meta) {
|
|
113
|
+
// Corrupt/empty lock — safe to drop (atomic create means a real
|
|
114
|
+
// holder always has readable meta).
|
|
135
115
|
this.forceRemove(lockPath, null);
|
|
136
116
|
return true;
|
|
137
117
|
}
|
|
@@ -209,11 +189,20 @@ export class AtomicFileLock {
|
|
|
209
189
|
reclaimIfStale(lockPath) {
|
|
210
190
|
if (!fs.existsSync(lockPath))
|
|
211
191
|
return;
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
this.forceRemove(lockPath, meta);
|
|
192
|
+
if (this.isReclaimable(lockPath)) {
|
|
193
|
+
this.forceRemove(lockPath, this.readMeta(lockPath));
|
|
215
194
|
}
|
|
216
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* True when an existing lock file may be safely stolen: unparseable/empty
|
|
198
|
+
* (corrupt, e.g. crashed mid-write) or past its TTL.
|
|
199
|
+
*/
|
|
200
|
+
isReclaimable(lockPath) {
|
|
201
|
+
const meta = this.readMeta(lockPath);
|
|
202
|
+
if (!meta)
|
|
203
|
+
return true;
|
|
204
|
+
return this.isExpired(meta);
|
|
205
|
+
}
|
|
217
206
|
isExpired(meta) {
|
|
218
207
|
const exp = Date.parse(meta.expiresAt);
|
|
219
208
|
if (Number.isNaN(exp)) {
|
package/dist/file-lock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../src/file-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAyBxB,MAAM,OAAO,cAAc;IACN,QAAQ,CAAS;IACjB,WAAW,CAAS;IACpB,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,SAAS,CAAS;IAEnC,YAAY,UAA2B,EAAE;QACrC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ;YAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IACjD,CAAC;IAED,qDAAqD;IAC9C,WAAW,CAAC,QAAgB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YACjC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../src/file-lock.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,3 +20,12 @@ export * from "./resilience.js";
|
|
|
20
20
|
export * from "./policy-gate.js";
|
|
21
21
|
export * from "./storage.js";
|
|
22
22
|
export * from "./time.js";
|
|
23
|
+
export * from "./secrets.js";
|
|
24
|
+
export * from "./tokenizer.js";
|
|
25
|
+
export * from "./migrations.js";
|
|
26
|
+
export * from "./tls.js";
|
|
27
|
+
export * from "./outbound-http.js";
|
|
28
|
+
export * from "./api-catalog.js";
|
|
29
|
+
export * from "./agent-identity.js";
|
|
30
|
+
export * from "./memory-prune.js";
|
|
31
|
+
export * from "./otel.js";
|
package/dist/index.js
CHANGED
|
@@ -20,4 +20,13 @@ export * from "./resilience.js";
|
|
|
20
20
|
export * from "./policy-gate.js";
|
|
21
21
|
export * from "./storage.js";
|
|
22
22
|
export * from "./time.js";
|
|
23
|
+
export * from "./secrets.js";
|
|
24
|
+
export * from "./tokenizer.js";
|
|
25
|
+
export * from "./migrations.js";
|
|
26
|
+
export * from "./tls.js";
|
|
27
|
+
export * from "./outbound-http.js";
|
|
28
|
+
export * from "./api-catalog.js";
|
|
29
|
+
export * from "./agent-identity.js";
|
|
30
|
+
export * from "./memory-prune.js";
|
|
31
|
+
export * from "./otel.js";
|
|
23
32
|
//# 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,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,WAAW,CAAC"}
|
package/dist/job-queue.d.ts
CHANGED
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Job Queue — concurrency-limited async work dispatcher backed by SQLite database persistence.
|
|
3
3
|
*
|
|
4
4
|
* Prevents unbounded parallel LLM / agent work from ballooning memory
|
|
5
|
-
* or starving the main event loop.
|
|
6
|
-
*
|
|
7
|
-
* Jobs run on the calling process (async functions). Pair with WorkerPool
|
|
8
|
-
* when true thread isolation is needed for CPU-bound work.
|
|
5
|
+
* or starving the main event loop. Job lifecycles (pending, running, completed, failed)
|
|
6
|
+
* are recorded in the database when initialized, providing persistence and auditability.
|
|
9
7
|
*/
|
|
8
|
+
export type JobStatus = "pending" | "running" | "completed" | "failed";
|
|
9
|
+
export interface JobRecord {
|
|
10
|
+
id: number;
|
|
11
|
+
queue_name: string;
|
|
12
|
+
payload: string;
|
|
13
|
+
status: JobStatus;
|
|
14
|
+
retries: number;
|
|
15
|
+
max_retries: number;
|
|
16
|
+
error_message?: string | null;
|
|
17
|
+
created_at: string;
|
|
18
|
+
updated_at: string;
|
|
19
|
+
}
|
|
20
|
+
export interface EnqueueOptions {
|
|
21
|
+
/** Optional JSON-serializable payload or description of the task */
|
|
22
|
+
payload?: unknown;
|
|
23
|
+
/** Max retries before permanent failure (default: 3) */
|
|
24
|
+
maxRetries?: number;
|
|
25
|
+
}
|
|
10
26
|
export interface JobQueueOptions {
|
|
11
27
|
/** Max concurrent running jobs. Default: os.cpus().length (min 1, max 16). */
|
|
12
28
|
maxConcurrency?: number;
|
|
13
|
-
/** Optional name for diagnostics. */
|
|
29
|
+
/** Optional name for diagnostics and DB tracking. */
|
|
14
30
|
name?: string;
|
|
15
31
|
/** Called when a job fails (after the promise rejects to the caller). */
|
|
16
32
|
onError?: (error: unknown, jobId: number) => void;
|
|
@@ -23,7 +39,7 @@ export interface JobQueueStats {
|
|
|
23
39
|
completed: number;
|
|
24
40
|
failed: number;
|
|
25
41
|
}
|
|
26
|
-
export declare class
|
|
42
|
+
export declare class JobQueue {
|
|
27
43
|
private readonly maxConcurrency;
|
|
28
44
|
private readonly name;
|
|
29
45
|
private readonly onError?;
|
|
@@ -37,8 +53,13 @@ export declare class InMemoryJobQueue {
|
|
|
37
53
|
/**
|
|
38
54
|
* Enqueue an async job. Resolves/rejects with the job result.
|
|
39
55
|
* Back-pressures via wait in the queue — does not spawn unbounded work.
|
|
56
|
+
* If SQLite is initialized, records job creation in the database.
|
|
40
57
|
*/
|
|
41
|
-
enqueue<T>(fn: () => Promise<T
|
|
58
|
+
enqueue<T>(fn: () => Promise<T>, options?: EnqueueOptions): Promise<T>;
|
|
59
|
+
/** Retrieve a job record from the database by ID. */
|
|
60
|
+
getJobRecord(id: number): JobRecord | null;
|
|
61
|
+
/** Retrieve job records from the database for this queue. */
|
|
62
|
+
getQueueRecords(status?: JobStatus, limit?: number): JobRecord[];
|
|
42
63
|
/** Current queue diagnostics. */
|
|
43
64
|
getStats(): JobQueueStats;
|
|
44
65
|
/** Reject pending jobs and stop accepting new ones. In-flight jobs finish. */
|
|
@@ -48,6 +69,8 @@ export declare class InMemoryJobQueue {
|
|
|
48
69
|
private pump;
|
|
49
70
|
private execute;
|
|
50
71
|
}
|
|
51
|
-
|
|
72
|
+
/** Backward compatibility alias */
|
|
73
|
+
export { JobQueue as InMemoryJobQueue };
|
|
74
|
+
export declare function getAgentJobQueue(options?: JobQueueOptions): JobQueue;
|
|
52
75
|
/** Test helper — reset singleton. */
|
|
53
76
|
export declare function resetAgentJobQueue(): void;
|
package/dist/job-queue.js
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Job Queue — concurrency-limited async work dispatcher backed by SQLite database persistence.
|
|
3
3
|
*
|
|
4
4
|
* Prevents unbounded parallel LLM / agent work from ballooning memory
|
|
5
|
-
* or starving the main event loop.
|
|
6
|
-
*
|
|
7
|
-
* Jobs run on the calling process (async functions). Pair with WorkerPool
|
|
8
|
-
* when true thread isolation is needed for CPU-bound work.
|
|
5
|
+
* or starving the main event loop. Job lifecycles (pending, running, completed, failed)
|
|
6
|
+
* are recorded in the database when initialized, providing persistence and auditability.
|
|
9
7
|
*/
|
|
10
8
|
import os from "os";
|
|
11
|
-
|
|
9
|
+
import { databaseHolder } from "./database.js";
|
|
10
|
+
export class JobQueue {
|
|
12
11
|
maxConcurrency;
|
|
13
12
|
name;
|
|
14
13
|
onError;
|
|
@@ -28,14 +27,31 @@ export class InMemoryJobQueue {
|
|
|
28
27
|
/**
|
|
29
28
|
* Enqueue an async job. Resolves/rejects with the job result.
|
|
30
29
|
* Back-pressures via wait in the queue — does not spawn unbounded work.
|
|
30
|
+
* If SQLite is initialized, records job creation in the database.
|
|
31
31
|
*/
|
|
32
|
-
enqueue(fn) {
|
|
32
|
+
enqueue(fn, options) {
|
|
33
33
|
if (this.closed) {
|
|
34
34
|
return Promise.reject(new Error(`[JobQueue:${this.name}] Queue is closed; cannot accept new jobs.`));
|
|
35
35
|
}
|
|
36
|
+
let dbId;
|
|
37
|
+
if (databaseHolder.hasDB()) {
|
|
38
|
+
try {
|
|
39
|
+
const db = databaseHolder.getDB();
|
|
40
|
+
const payloadStr = typeof options?.payload === "string"
|
|
41
|
+
? options.payload
|
|
42
|
+
: JSON.stringify(options?.payload ?? null);
|
|
43
|
+
const res = db.prepare(`INSERT INTO job_queue (queue_name, payload, status, retries, max_retries, created_at, updated_at)
|
|
44
|
+
VALUES (?, ?, 'pending', 0, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`).run(this.name, payloadStr, options?.maxRetries ?? 3);
|
|
45
|
+
dbId = Number(res.lastInsertRowid);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Table might not exist yet if running pre-migration
|
|
49
|
+
}
|
|
50
|
+
}
|
|
36
51
|
return new Promise((resolve, reject) => {
|
|
37
52
|
const item = {
|
|
38
53
|
id: this.nextId++,
|
|
54
|
+
dbId,
|
|
39
55
|
run: fn,
|
|
40
56
|
resolve,
|
|
41
57
|
reject,
|
|
@@ -44,6 +60,33 @@ export class InMemoryJobQueue {
|
|
|
44
60
|
this.pump();
|
|
45
61
|
});
|
|
46
62
|
}
|
|
63
|
+
/** Retrieve a job record from the database by ID. */
|
|
64
|
+
getJobRecord(id) {
|
|
65
|
+
if (!databaseHolder.hasDB())
|
|
66
|
+
return null;
|
|
67
|
+
try {
|
|
68
|
+
const db = databaseHolder.getDB();
|
|
69
|
+
return db.prepare("SELECT * FROM job_queue WHERE id = ?").get(id) || null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Retrieve job records from the database for this queue. */
|
|
76
|
+
getQueueRecords(status, limit = 50) {
|
|
77
|
+
if (!databaseHolder.hasDB())
|
|
78
|
+
return [];
|
|
79
|
+
try {
|
|
80
|
+
const db = databaseHolder.getDB();
|
|
81
|
+
if (status) {
|
|
82
|
+
return db.prepare("SELECT * FROM job_queue WHERE queue_name = ? AND status = ? ORDER BY id DESC LIMIT ?").all(this.name, status, limit);
|
|
83
|
+
}
|
|
84
|
+
return db.prepare("SELECT * FROM job_queue WHERE queue_name = ? ORDER BY id DESC LIMIT ?").all(this.name, limit);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
47
90
|
/** Current queue diagnostics. */
|
|
48
91
|
getStats() {
|
|
49
92
|
return {
|
|
@@ -83,13 +126,41 @@ export class InMemoryJobQueue {
|
|
|
83
126
|
}
|
|
84
127
|
}
|
|
85
128
|
async execute(item) {
|
|
129
|
+
if (item.dbId && databaseHolder.hasDB()) {
|
|
130
|
+
try {
|
|
131
|
+
const db = databaseHolder.getDB();
|
|
132
|
+
db.prepare("UPDATE job_queue SET status = 'running', updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(item.dbId);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Ignore DB error during execution transition
|
|
136
|
+
}
|
|
137
|
+
}
|
|
86
138
|
try {
|
|
87
139
|
const result = await item.run();
|
|
88
140
|
this.completed++;
|
|
141
|
+
if (item.dbId && databaseHolder.hasDB()) {
|
|
142
|
+
try {
|
|
143
|
+
const db = databaseHolder.getDB();
|
|
144
|
+
db.prepare("UPDATE job_queue SET status = 'completed', updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(item.dbId);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Ignore DB error
|
|
148
|
+
}
|
|
149
|
+
}
|
|
89
150
|
item.resolve(result);
|
|
90
151
|
}
|
|
91
152
|
catch (error) {
|
|
92
153
|
this.failed++;
|
|
154
|
+
if (item.dbId && databaseHolder.hasDB()) {
|
|
155
|
+
try {
|
|
156
|
+
const db = databaseHolder.getDB();
|
|
157
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
158
|
+
db.prepare("UPDATE job_queue SET status = 'failed', error_message = ?, retries = retries + 1, updated_at = CURRENT_TIMESTAMP WHERE id = ?").run(errMsg, item.dbId);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Ignore DB error
|
|
162
|
+
}
|
|
163
|
+
}
|
|
93
164
|
try {
|
|
94
165
|
this.onError?.(error, item.id);
|
|
95
166
|
}
|
|
@@ -104,6 +175,8 @@ export class InMemoryJobQueue {
|
|
|
104
175
|
}
|
|
105
176
|
}
|
|
106
177
|
}
|
|
178
|
+
/** Backward compatibility alias */
|
|
179
|
+
export { JobQueue as InMemoryJobQueue };
|
|
107
180
|
/** Shared singleton for agent orchestration (lazy). */
|
|
108
181
|
let agentJobQueue = null;
|
|
109
182
|
export function getAgentJobQueue(options) {
|
|
@@ -111,7 +184,7 @@ export function getAgentJobQueue(options) {
|
|
|
111
184
|
const fromEnv = process.env.ATABEY_JOB_CONCURRENCY
|
|
112
185
|
? parseInt(process.env.ATABEY_JOB_CONCURRENCY, 10)
|
|
113
186
|
: undefined;
|
|
114
|
-
agentJobQueue = new
|
|
187
|
+
agentJobQueue = new JobQueue({
|
|
115
188
|
name: "agent",
|
|
116
189
|
maxConcurrency: options?.maxConcurrency ?? (Number.isFinite(fromEnv) ? fromEnv : undefined),
|
|
117
190
|
onError: options?.onError,
|
package/dist/job-queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../src/job-queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../src/job-queue.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.js
CHANGED
|
@@ -2,6 +2,27 @@ import chalk from "chalk";
|
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { appendFile, ensureDir } from "./fs.js";
|
|
4
4
|
import { containsPII, maskObject, maskText } from "./pii.js";
|
|
5
|
+
/** JSON.stringify that tolerates circular references instead of throwing. */
|
|
6
|
+
function safeStringify(value) {
|
|
7
|
+
const seen = new WeakSet();
|
|
8
|
+
try {
|
|
9
|
+
return JSON.stringify(value, (_key, v) => {
|
|
10
|
+
if (typeof v === "object" && v !== null) {
|
|
11
|
+
if (typeof Buffer !== "undefined" && Buffer.isBuffer(v))
|
|
12
|
+
return `<Buffer ${v.length} bytes>`;
|
|
13
|
+
if (v instanceof Uint8Array)
|
|
14
|
+
return `<bytes ${v.length}>`;
|
|
15
|
+
if (seen.has(v))
|
|
16
|
+
return "[Circular]";
|
|
17
|
+
seen.add(v);
|
|
18
|
+
}
|
|
19
|
+
return v;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return "[Unserializable]";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
5
26
|
export var LogLevel;
|
|
6
27
|
(function (LogLevel) {
|
|
7
28
|
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
@@ -15,12 +36,14 @@ export class EnterpriseLogger {
|
|
|
15
36
|
static instance;
|
|
16
37
|
constructor() {
|
|
17
38
|
const isProd = process.env.NODE_ENV === "production";
|
|
39
|
+
const isStdio = process.env.MCP_TRANSPORT === "stdio";
|
|
18
40
|
this.config = {
|
|
19
41
|
minLevel: isProd ? LogLevel.INFO : LogLevel.DEBUG,
|
|
20
|
-
enableColors: !isProd,
|
|
42
|
+
enableColors: !isProd && !isStdio,
|
|
21
43
|
jsonFormat: isProd,
|
|
22
44
|
enablePiiMasking: true, // KVKK: PII masking ON by default
|
|
23
45
|
piiWarning: true,
|
|
46
|
+
useStderr: isStdio,
|
|
24
47
|
};
|
|
25
48
|
}
|
|
26
49
|
static getInstance() {
|
|
@@ -47,12 +70,15 @@ export class EnterpriseLogger {
|
|
|
47
70
|
// [KVKK] PII masking — mask sensitive data before logging
|
|
48
71
|
const safeMessage = this.config.enablePiiMasking ? maskText(message) : message;
|
|
49
72
|
const safeMeta = this.config.enablePiiMasking && meta ? maskObject(meta) : meta;
|
|
50
|
-
// [KVKK] Warn if PII detected in production
|
|
51
|
-
if (this.config.piiWarning && (containsPII(message) || (meta && containsPII(
|
|
52
|
-
|
|
73
|
+
// [KVKK] Warn if PII detected in production (safe against circular meta)
|
|
74
|
+
if (this.config.piiWarning && (containsPII(message) || (meta !== undefined && containsPII(safeStringify(meta))))) {
|
|
75
|
+
// Only pollute stderr in non-JSON mode so structured streams stay clean.
|
|
76
|
+
if (!this.config.jsonFormat) {
|
|
77
|
+
process.stderr.write(`[PII WARNING] Potential PII detected in log at ${timestamp}\n`);
|
|
78
|
+
}
|
|
53
79
|
}
|
|
54
80
|
if (this.config.jsonFormat) {
|
|
55
|
-
return
|
|
81
|
+
return safeStringify({
|
|
56
82
|
timestamp,
|
|
57
83
|
level: LogLevel[level],
|
|
58
84
|
pid,
|
|
@@ -88,9 +114,9 @@ export class EnterpriseLogger {
|
|
|
88
114
|
if (level < this.config.minLevel)
|
|
89
115
|
return;
|
|
90
116
|
const formatted = this.formatMessage(level, message, meta);
|
|
91
|
-
// Route to stderr for ERROR/FATAL,
|
|
117
|
+
// Route to stderr for ERROR/FATAL, or when useStderr / MCP stdio transport is active.
|
|
92
118
|
// Using process.write directly here is intentional — this IS the logger.
|
|
93
|
-
if (level >= LogLevel.ERROR) {
|
|
119
|
+
if (this.config.useStderr || process.env.MCP_TRANSPORT === "stdio" || level >= LogLevel.ERROR) {
|
|
94
120
|
process.stderr.write(formatted + "\n");
|
|
95
121
|
}
|
|
96
122
|
else {
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE7D,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAChB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;IACT,yCAAS,CAAA;AACb,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Specialty memory pruning — deduplication + cap + summary.
|
|
3
|
+
*
|
|
4
|
+
* `updateSpecialtyMemory` appends raw markdown lessons forever, which bloats
|
|
5
|
+
* prompts and accumulates contradictions. This pure function deduplicates
|
|
6
|
+
* identical lessons (ignoring the timestamp) and caps the retained count,
|
|
7
|
+
* leaving a summary marker for pruned entries.
|
|
8
|
+
*/
|
|
9
|
+
export interface PruneResult {
|
|
10
|
+
content: string;
|
|
11
|
+
removed: number;
|
|
12
|
+
kept: number;
|
|
13
|
+
}
|
|
14
|
+
export interface PruneOptions {
|
|
15
|
+
/** Maximum number of lessons retained (newest kept). Default: 100. */
|
|
16
|
+
maxLessons?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function pruneSpecialtyMarkdown(content: string, options?: PruneOptions): PruneResult;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Specialty memory pruning — deduplication + cap + summary.
|
|
3
|
+
*
|
|
4
|
+
* `updateSpecialtyMemory` appends raw markdown lessons forever, which bloats
|
|
5
|
+
* prompts and accumulates contradictions. This pure function deduplicates
|
|
6
|
+
* identical lessons (ignoring the timestamp) and caps the retained count,
|
|
7
|
+
* leaving a summary marker for pruned entries.
|
|
8
|
+
*/
|
|
9
|
+
const LESSON_PREFIX = /^\s*-\s+\*\*\[/;
|
|
10
|
+
const TIMESTAMP = /\[[^\]]*\]/g;
|
|
11
|
+
export function pruneSpecialtyMarkdown(content, options = {}) {
|
|
12
|
+
const maxLessons = options.maxLessons ?? 100;
|
|
13
|
+
if (!content)
|
|
14
|
+
return { content: content ?? "", removed: 0, kept: 0 };
|
|
15
|
+
const lines = content.split(/\r?\n/);
|
|
16
|
+
const header = [];
|
|
17
|
+
const lessons = [];
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
let removed = 0;
|
|
20
|
+
for (const line of lines) {
|
|
21
|
+
if (LESSON_PREFIX.test(line)) {
|
|
22
|
+
const key = line.replace(TIMESTAMP, "").trim().toLowerCase();
|
|
23
|
+
if (seen.has(key)) {
|
|
24
|
+
removed++;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
seen.add(key);
|
|
28
|
+
lessons.push(line);
|
|
29
|
+
}
|
|
30
|
+
else if (line.trim() === "" && lessons.length > 0) {
|
|
31
|
+
// collapse blank lines between lessons
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
header.push(line);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
let kept = lessons;
|
|
39
|
+
if (lessons.length > maxLessons) {
|
|
40
|
+
const dropped = lessons.length - maxLessons;
|
|
41
|
+
removed += dropped;
|
|
42
|
+
kept = lessons.slice(-maxLessons);
|
|
43
|
+
header.push(`- _[memory-prune] ${dropped} older lesson(s) pruned to control prompt size._`);
|
|
44
|
+
}
|
|
45
|
+
const body = [...header, ...kept].join("\n").replace(/\n{3,}/g, "\n\n").trimEnd();
|
|
46
|
+
return { content: body ? `${body}\n` : "", removed, kept: kept.length };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=memory-prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-prune.js","sourceRoot":"","sources":["../src/memory-prune.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,aAAa,GAAG,gBAAgB,CAAC;AACvC,MAAM,SAAS,GAAG,aAAa,CAAC;AAEhC,MAAM,UAAU,sBAAsB,CAAC,OAAe,EAAE,UAAwB,EAAE;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAErE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAChB,OAAO,EAAE,CAAC;gBACV,SAAS;YACb,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,uCAAuC;YACvC,SAAS;QACb,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACL,CAAC;IAED,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,IAAI,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC;QAC5C,OAAO,IAAI,OAAO,CAAC;QACnB,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,kDAAkD,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAClF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC5E,CAAC"}
|