@assethub/cli 0.1.36 → 0.1.37
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/hooks/save.d.ts +8 -0
- package/dist/hooks/save.d.ts.map +1 -1
- package/dist/hooks/save.js +32 -6
- package/package.json +1 -1
package/dist/hooks/save.d.ts
CHANGED
|
@@ -56,6 +56,14 @@ export declare const SWEEP_LIMIT = 3;
|
|
|
56
56
|
* only be uploaded once abandoned (ABANDONED_AFTER_MS quiet, then a new session).
|
|
57
57
|
*/
|
|
58
58
|
export declare const WORKING_UPLOAD_INTERVAL_MS: number;
|
|
59
|
+
/** The shortest interval ASSETHUB_SESSION_UPLOAD_INTERVAL_MIN may set. */
|
|
60
|
+
export declare const MIN_WORKING_UPLOAD_INTERVAL_MS: number;
|
|
61
|
+
/**
|
|
62
|
+
* ASSETHUB_SESSION_UPLOAD_INTERVAL_MIN, in minutes, else WORKING_UPLOAD_INTERVAL_MS.
|
|
63
|
+
* Each upload sends a new snapshot of the whole transcript, so it is never
|
|
64
|
+
* shorter than a minute; a value that is not a positive number is ignored.
|
|
65
|
+
*/
|
|
66
|
+
export declare const workingUploadIntervalMs: (env: NodeJS.ProcessEnv) => number;
|
|
59
67
|
/**
|
|
60
68
|
* Copy + redact the transcript Claude Code keeps at `meta.transcriptPath`, and
|
|
61
69
|
* collect its images. Runs once per SessionEnd and before an upload, never per
|
package/dist/hooks/save.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/hooks/save.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAC,UAAU,EAAE,SAAS,EAAgB,WAAW,EAAC,MAAM,YAAY,CAAA;AAChF,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,aAAa,CAAA;AAE9C,eAAO,MAAM,UAAU,KAAK,CAAA;AAC5B,eAAO,MAAM,eAAe,QAAmB,CAAA;AAC/C,eAAO,MAAM,sBAAsB,KAAK,CAAA;AASxC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oCAAoC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IACvC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5D,uEAAuE;IACvE,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACpE,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CACjC,CAAA;AAYD,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,EAAE,UAAU,MAAM,KAAG,IACgC,CAAA;AAE3G,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,GAAI,YAAY,MAAM,EAAE,UAAU,MAAM,KAAG,IACP,CAAA;AAE3E,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,IAC+B,CAAA;AAErF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,CAAC,UAAU,KAAG,MAAM,GAAG,IAM/D,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EACZ,KAAK,IAAI,EACT,MAAM,MAAM,EACZ,MAAM,MAAM,KACX,OAAO,CAAC,MAAM,CAwBhB,CAAA;AAgFD,qGAAqG;AACrG,eAAO,MAAM,kBAAkB,QAAqB,CAAA;AACpD,wEAAwE;AACxE,eAAO,MAAM,WAAW,IAAI,CAAA;AAE5B;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../src/hooks/save.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/save.js
CHANGED
|
@@ -162,7 +162,24 @@ export const SWEEP_LIMIT = 3;
|
|
|
162
162
|
* stay open for days and rarely reach SessionEnd, so without this they would
|
|
163
163
|
* only be uploaded once abandoned (ABANDONED_AFTER_MS quiet, then a new session).
|
|
164
164
|
*/
|
|
165
|
-
export const WORKING_UPLOAD_INTERVAL_MS =
|
|
165
|
+
export const WORKING_UPLOAD_INTERVAL_MS = 8 * 60 * 1000;
|
|
166
|
+
/** The shortest interval ASSETHUB_SESSION_UPLOAD_INTERVAL_MIN may set. */
|
|
167
|
+
export const MIN_WORKING_UPLOAD_INTERVAL_MS = 60 * 1000;
|
|
168
|
+
/**
|
|
169
|
+
* ASSETHUB_SESSION_UPLOAD_INTERVAL_MIN, in minutes, else WORKING_UPLOAD_INTERVAL_MS.
|
|
170
|
+
* Each upload sends a new snapshot of the whole transcript, so it is never
|
|
171
|
+
* shorter than a minute; a value that is not a positive number is ignored.
|
|
172
|
+
*/
|
|
173
|
+
export const workingUploadIntervalMs = (env) => {
|
|
174
|
+
const raw = env.ASSETHUB_SESSION_UPLOAD_INTERVAL_MIN?.trim();
|
|
175
|
+
if (!raw)
|
|
176
|
+
return WORKING_UPLOAD_INTERVAL_MS;
|
|
177
|
+
const ms = Number(raw) * 60 * 1000;
|
|
178
|
+
// Finite after scaling too: a huge value would otherwise stop uploads for good.
|
|
179
|
+
if (!Number.isFinite(ms) || ms <= 0)
|
|
180
|
+
return WORKING_UPLOAD_INTERVAL_MS;
|
|
181
|
+
return Math.max(ms, MIN_WORKING_UPLOAD_INTERVAL_MS);
|
|
182
|
+
};
|
|
166
183
|
const WORKING_UPLOAD_EVENTS = new Set(['Stop', 'PreCompact']);
|
|
167
184
|
/** Events that copy and redact the transcript now; the rest only mark it changed. */
|
|
168
185
|
const FULL_SAVE_EVENTS = new Set(['SessionEnd', 'Manual']);
|
|
@@ -323,11 +340,20 @@ export const saveSession = async (options = {}) => {
|
|
|
323
340
|
const result = { sessionDir, event };
|
|
324
341
|
if (uploadOn && options.startWorkingUpload && WORKING_UPLOAD_EVENTS.has(event)) {
|
|
325
342
|
const latest = await readMeta(sessionDir);
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
343
|
+
const interval = workingUploadIntervalMs(env);
|
|
344
|
+
let claimed = false;
|
|
345
|
+
// Checked and stamped under the meta lock, before spawning, so neither the
|
|
346
|
+
// next few turns nor a hook running beside this one start another.
|
|
347
|
+
if (latest)
|
|
348
|
+
await updateMeta(sessionDir, latest, current => {
|
|
349
|
+
// Counts uploads any path started (an earlier Stop, SessionEnd, a sweep).
|
|
350
|
+
const lastStart = Math.max(Date.parse(current.lastWorkingUploadAt ?? '') || 0, Date.parse(current.lastUploadAttemptAt ?? '') || 0);
|
|
351
|
+
if (now.getTime() - lastStart < interval)
|
|
352
|
+
return current;
|
|
353
|
+
claimed = true;
|
|
354
|
+
return { ...current, lastWorkingUploadAt: now.toISOString() };
|
|
355
|
+
});
|
|
356
|
+
if (claimed) {
|
|
331
357
|
options.startWorkingUpload(sessionDir, options.upload?.profile);
|
|
332
358
|
result.uploadStarted = true;
|
|
333
359
|
}
|