@nocoo/pew 1.8.0 → 1.10.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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -22
- package/dist/cli.js.map +1 -1
- package/dist/commands/login.d.ts +14 -4
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +50 -15
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/session-sync.d.ts +3 -0
- package/dist/commands/session-sync.d.ts.map +1 -1
- package/dist/commands/session-sync.js +16 -7
- package/dist/commands/session-sync.js.map +1 -1
- package/dist/commands/session-upload.d.ts +3 -0
- package/dist/commands/session-upload.d.ts.map +1 -1
- package/dist/commands/session-upload.js +1 -1
- package/dist/commands/session-upload.js.map +1 -1
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +22 -3
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/upload-engine.d.ts +8 -0
- package/dist/commands/upload-engine.d.ts.map +1 -1
- package/dist/commands/upload-engine.js +43 -5
- package/dist/commands/upload-engine.js.map +1 -1
- package/dist/commands/upload.d.ts +3 -0
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +2 -1
- package/dist/commands/upload.js.map +1 -1
- package/dist/notifier/codex-notifier.js +81 -0
- package/dist/notifier/codex-notifier.js.map +1 -1
- package/dist/storage/base-queue.d.ts +41 -3
- package/dist/storage/base-queue.d.ts.map +1 -1
- package/dist/storage/base-queue.js +60 -14
- package/dist/storage/base-queue.js.map +1 -1
- package/dist/storage/local-queue.d.ts +2 -2
- package/dist/storage/local-queue.d.ts.map +1 -1
- package/dist/storage/local-queue.js +2 -2
- package/dist/storage/local-queue.js.map +1 -1
- package/dist/storage/session-queue.d.ts +2 -2
- package/dist/storage/session-queue.d.ts.map +1 -1
- package/dist/storage/session-queue.js +2 -2
- package/dist/storage/session-queue.js.map +1 -1
- package/package.json +1 -1
|
@@ -16,10 +16,12 @@ export class BaseQueue {
|
|
|
16
16
|
queuePath;
|
|
17
17
|
statePath;
|
|
18
18
|
dir;
|
|
19
|
-
|
|
19
|
+
onCorruptLine;
|
|
20
|
+
constructor(storeDir, queueFile, stateFile, onCorruptLine) {
|
|
20
21
|
this.dir = storeDir;
|
|
21
22
|
this.queuePath = join(storeDir, queueFile);
|
|
22
23
|
this.statePath = join(storeDir, stateFile);
|
|
24
|
+
this.onCorruptLine = onCorruptLine;
|
|
23
25
|
}
|
|
24
26
|
/** Ensure the directory exists */
|
|
25
27
|
async ensureDir() {
|
|
@@ -59,7 +61,10 @@ export class BaseQueue {
|
|
|
59
61
|
* Returns parsed records and the new offset (end of file in bytes).
|
|
60
62
|
*
|
|
61
63
|
* - Uses Buffer for slicing to correctly handle multi-byte UTF-8 characters.
|
|
62
|
-
* - Skips lines that fail JSON.parse
|
|
64
|
+
* - Skips lines that fail JSON.parse and invokes the optional onCorruptLine
|
|
65
|
+
* callback so callers can surface a warning. The offset still advances
|
|
66
|
+
* past corrupted data to prevent infinite re-reading. Source data can
|
|
67
|
+
* always be rebuilt via `pew reset`.
|
|
63
68
|
*/
|
|
64
69
|
async readFromOffset(offset) {
|
|
65
70
|
let buf;
|
|
@@ -77,29 +82,70 @@ export class BaseQueue {
|
|
|
77
82
|
try {
|
|
78
83
|
records.push(JSON.parse(line));
|
|
79
84
|
}
|
|
80
|
-
catch {
|
|
81
|
-
//
|
|
82
|
-
//
|
|
85
|
+
catch (err) {
|
|
86
|
+
// Corrupted lines are skipped to avoid blocking all subsequent records.
|
|
87
|
+
// The onCorruptLine callback lets callers surface a user-visible warning.
|
|
88
|
+
// Data is recoverable via `pew reset` which rebuilds from source files.
|
|
89
|
+
this.onCorruptLine?.(line, err);
|
|
83
90
|
}
|
|
84
91
|
}
|
|
85
92
|
const newOffset = buf.byteLength;
|
|
86
93
|
return { records, newOffset };
|
|
87
94
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
/** Load the upload byte offset. Returns 0 if not found or corrupted. */
|
|
94
|
-
async loadOffset() {
|
|
95
|
+
// -------------------------------------------------------------------------
|
|
96
|
+
// State persistence — unified { offset, dirtyKeys } object
|
|
97
|
+
// -------------------------------------------------------------------------
|
|
98
|
+
/** Load the full persisted state. Returns defaults on missing/corrupt file. */
|
|
99
|
+
async loadState() {
|
|
95
100
|
try {
|
|
96
101
|
const raw = await readFile(this.statePath, "utf-8");
|
|
97
102
|
const state = JSON.parse(raw);
|
|
98
|
-
return
|
|
103
|
+
return {
|
|
104
|
+
offset: state.offset ?? 0,
|
|
105
|
+
// Preserve undefined vs [] distinction for legacy detection
|
|
106
|
+
dirtyKeys: state.dirtyKeys,
|
|
107
|
+
};
|
|
99
108
|
}
|
|
100
109
|
catch {
|
|
101
|
-
return 0;
|
|
110
|
+
return { offset: 0 };
|
|
102
111
|
}
|
|
103
112
|
}
|
|
113
|
+
/** Atomically persist the full state object. */
|
|
114
|
+
async saveState(state) {
|
|
115
|
+
await this.ensureDir();
|
|
116
|
+
await writeFile(this.statePath, JSON.stringify(state) + "\n");
|
|
117
|
+
}
|
|
118
|
+
/** Save the upload byte offset (preserves dirtyKeys). */
|
|
119
|
+
async saveOffset(offset) {
|
|
120
|
+
const state = await this.loadState();
|
|
121
|
+
state.offset = offset;
|
|
122
|
+
await this.saveState(state);
|
|
123
|
+
}
|
|
124
|
+
/** Load the upload byte offset. Returns 0 if not found or corrupted. */
|
|
125
|
+
async loadOffset() {
|
|
126
|
+
const state = await this.loadState();
|
|
127
|
+
return state.offset;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Save dirty bucket keys (preserves offset).
|
|
131
|
+
*
|
|
132
|
+
* Pass `undefined` to remove the dirtyKeys field entirely (revert to
|
|
133
|
+
* legacy state). Pass `[]` to indicate nothing is dirty.
|
|
134
|
+
*/
|
|
135
|
+
async saveDirtyKeys(keys) {
|
|
136
|
+
const state = await this.loadState();
|
|
137
|
+
state.dirtyKeys = keys;
|
|
138
|
+
await this.saveState(state);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Load dirty bucket keys.
|
|
142
|
+
*
|
|
143
|
+
* Returns `undefined` for legacy state files (no dirtyKeys field),
|
|
144
|
+
* or the array (possibly empty) if the field exists.
|
|
145
|
+
*/
|
|
146
|
+
async loadDirtyKeys() {
|
|
147
|
+
const state = await this.loadState();
|
|
148
|
+
return state.dirtyKeys;
|
|
149
|
+
}
|
|
104
150
|
}
|
|
105
151
|
//# sourceMappingURL=base-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-queue.js","sourceRoot":"","sources":["../../src/storage/base-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"base-queue.js","sourceRoot":"","sources":["../../src/storage/base-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BaseQueue } from "./base-queue.js";
|
|
1
|
+
import { BaseQueue, type OnCorruptLine } from "./base-queue.js";
|
|
2
2
|
import type { QueueRecord } from "@pew/core";
|
|
3
3
|
/**
|
|
4
4
|
* Append-only local queue for token usage records.
|
|
5
5
|
* Thin wrapper around BaseQueue with token-specific file names.
|
|
6
6
|
*/
|
|
7
7
|
export declare class LocalQueue extends BaseQueue<QueueRecord> {
|
|
8
|
-
constructor(storeDir: string);
|
|
8
|
+
constructor(storeDir: string, onCorruptLine?: OnCorruptLine);
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=local-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-queue.d.ts","sourceRoot":"","sources":["../../src/storage/local-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"local-queue.d.ts","sourceRoot":"","sources":["../../src/storage/local-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C;;;GAGG;AACH,qBAAa,UAAW,SAAQ,SAAS,CAAC,WAAW,CAAC;gBACxC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa;CAG5D"}
|
|
@@ -4,8 +4,8 @@ import { BaseQueue } from "./base-queue.js";
|
|
|
4
4
|
* Thin wrapper around BaseQueue with token-specific file names.
|
|
5
5
|
*/
|
|
6
6
|
export class LocalQueue extends BaseQueue {
|
|
7
|
-
constructor(storeDir) {
|
|
8
|
-
super(storeDir, "queue.jsonl", "queue.state.json");
|
|
7
|
+
constructor(storeDir, onCorruptLine) {
|
|
8
|
+
super(storeDir, "queue.jsonl", "queue.state.json", onCorruptLine);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=local-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-queue.js","sourceRoot":"","sources":["../../src/storage/local-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"local-queue.js","sourceRoot":"","sources":["../../src/storage/local-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,iBAAiB,CAAC;AAGhE;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,SAAsB;IACpD,YAAY,QAAgB,EAAE,aAA6B;QACzD,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BaseQueue } from "./base-queue.js";
|
|
1
|
+
import { BaseQueue, type OnCorruptLine } from "./base-queue.js";
|
|
2
2
|
import type { SessionQueueRecord } from "@pew/core";
|
|
3
3
|
/**
|
|
4
4
|
* Append-only local queue for session records.
|
|
5
5
|
* Thin wrapper around BaseQueue with session-specific file names.
|
|
6
6
|
*/
|
|
7
7
|
export declare class SessionQueue extends BaseQueue<SessionQueueRecord> {
|
|
8
|
-
constructor(storeDir: string);
|
|
8
|
+
constructor(storeDir: string, onCorruptLine?: OnCorruptLine);
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=session-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-queue.d.ts","sourceRoot":"","sources":["../../src/storage/session-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-queue.d.ts","sourceRoot":"","sources":["../../src/storage/session-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD;;;GAGG;AACH,qBAAa,YAAa,SAAQ,SAAS,CAAC,kBAAkB,CAAC;gBACjD,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa;CAG5D"}
|
|
@@ -4,8 +4,8 @@ import { BaseQueue } from "./base-queue.js";
|
|
|
4
4
|
* Thin wrapper around BaseQueue with session-specific file names.
|
|
5
5
|
*/
|
|
6
6
|
export class SessionQueue extends BaseQueue {
|
|
7
|
-
constructor(storeDir) {
|
|
8
|
-
super(storeDir, "session-queue.jsonl", "session-queue.state.json");
|
|
7
|
+
constructor(storeDir, onCorruptLine) {
|
|
8
|
+
super(storeDir, "session-queue.jsonl", "session-queue.state.json", onCorruptLine);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=session-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-queue.js","sourceRoot":"","sources":["../../src/storage/session-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"session-queue.js","sourceRoot":"","sources":["../../src/storage/session-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,iBAAiB,CAAC;AAGhE;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,SAA6B;IAC7D,YAAY,QAAgB,EAAE,aAA6B;QACzD,KAAK,CAAC,QAAQ,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC;IACpF,CAAC;CACF"}
|