@infinite-room-labs/claudesync-core 0.4.0 → 0.4.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/sync/fetch.d.ts +34 -0
- package/dist/sync/fetch.d.ts.map +1 -0
- package/dist/sync/fetch.js +55 -0
- package/dist/sync/fetch.js.map +1 -0
- package/dist/sync/incremental.d.ts +2 -0
- package/dist/sync/incremental.d.ts.map +1 -1
- package/dist/sync/incremental.js +15 -46
- package/dist/sync/incremental.js.map +1 -1
- package/dist/util/naming.d.ts +19 -0
- package/dist/util/naming.d.ts.map +1 -0
- package/dist/util/naming.js +30 -0
- package/dist/util/naming.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -22,4 +22,7 @@ export { diffConversation } from "./sync/diff.js";
|
|
|
22
22
|
export { CHANGELOG_FILENAME, renderChangelogSection, appendChangelog, } from "./sync/changelog.js";
|
|
23
23
|
export type { ExportFormat, SyncConversationOptions, SyncConversationResult, } from "./sync/incremental.js";
|
|
24
24
|
export { syncConversation, isSameByListMetadata, } from "./sync/incremental.js";
|
|
25
|
+
export type { FetchAndBuildOptions, FetchAndBuildResult, } from "./sync/fetch.js";
|
|
26
|
+
export { fetchAndBuild } from "./sync/fetch.js";
|
|
27
|
+
export { slugify, safeSlug, displayName } from "./util/naming.js";
|
|
25
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,OAAO,EACP,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE,YAAY,EACV,SAAS,EACT,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,OAAO,EACP,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAGxE,YAAY,EACV,SAAS,EACT,aAAa,EACb,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -15,4 +15,7 @@ export { STATE_FILENAME, SyncStateSchema, readSyncState, writeSyncState, } from
|
|
|
15
15
|
export { diffConversation } from "./sync/diff.js";
|
|
16
16
|
export { CHANGELOG_FILENAME, renderChangelogSection, appendChangelog, } from "./sync/changelog.js";
|
|
17
17
|
export { syncConversation, isSameByListMetadata, } from "./sync/incremental.js";
|
|
18
|
+
export { fetchAndBuild } from "./sync/fetch.js";
|
|
19
|
+
// Naming helpers
|
|
20
|
+
export { slugify, safeSlug, displayName } from "./util/naming.js";
|
|
18
21
|
//# 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":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,SAAS;AACT,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oBAAoB;AACpB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAoB7B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAQxE,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,SAAS;AACT,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oBAAoB;AACpB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,0BAA0B,EAC1B,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAoB7B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,cAAc,GACf,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAQxE,OAAO,EACL,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,iBAAiB;AACjB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ClaudeSyncClient } from "../client/client.js";
|
|
2
|
+
import type { ArtifactListResponse, Conversation, ConversationSummary } from "../models/types.js";
|
|
3
|
+
import type { GitBundle } from "../export/types.js";
|
|
4
|
+
export interface FetchAndBuildOptions {
|
|
5
|
+
authorName: string;
|
|
6
|
+
authorEmail: string;
|
|
7
|
+
/** Don't fetch artifacts (faster). */
|
|
8
|
+
skipArtifacts?: boolean;
|
|
9
|
+
/** Pass-through to buildGitBundle. Default true so all sync paths preserve
|
|
10
|
+
* branches uniformly. */
|
|
11
|
+
multiBranch?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface FetchAndBuildResult {
|
|
14
|
+
conversation: Conversation;
|
|
15
|
+
artifacts: ArtifactListResponse;
|
|
16
|
+
artifactContents: Map<string, string | Uint8Array>;
|
|
17
|
+
bundle: GitBundle;
|
|
18
|
+
/** Human-readable label for log lines. Falls back to `<unnamed <uuid>>`. */
|
|
19
|
+
displayName: string;
|
|
20
|
+
/** Filesystem-safe slug. Falls back to `unnamed-<uuid>`. */
|
|
21
|
+
slug: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Single source of truth for "fetch a conversation, fetch its artifacts, and
|
|
25
|
+
* build the bundle". Both the standalone-conversation orchestrator and the
|
|
26
|
+
* project-export loop go through this so name/slug fallbacks, tree fetching,
|
|
27
|
+
* and artifact handling stay consistent.
|
|
28
|
+
*
|
|
29
|
+
* This function does no I/O against the local filesystem -- it is a pure
|
|
30
|
+
* fetch+build. Persistence (state file, changelog, swap, ref management) is
|
|
31
|
+
* the caller's job.
|
|
32
|
+
*/
|
|
33
|
+
export declare function fetchAndBuild(client: ClaudeSyncClient, orgId: string, summary: ConversationSummary, options: FetchAndBuildOptions): Promise<FetchAndBuildResult>;
|
|
34
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/sync/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;8BAC0B;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,oBAAoB,CAAC;IAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;IACnD,MAAM,EAAE,SAAS,CAAC;IAClB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA+C9B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { buildGitBundle } from "../export/bundle-builder.js";
|
|
2
|
+
import { safeSlug, displayName } from "../util/naming.js";
|
|
3
|
+
/**
|
|
4
|
+
* Single source of truth for "fetch a conversation, fetch its artifacts, and
|
|
5
|
+
* build the bundle". Both the standalone-conversation orchestrator and the
|
|
6
|
+
* project-export loop go through this so name/slug fallbacks, tree fetching,
|
|
7
|
+
* and artifact handling stay consistent.
|
|
8
|
+
*
|
|
9
|
+
* This function does no I/O against the local filesystem -- it is a pure
|
|
10
|
+
* fetch+build. Persistence (state file, changelog, swap, ref management) is
|
|
11
|
+
* the caller's job.
|
|
12
|
+
*/
|
|
13
|
+
export async function fetchAndBuild(client, orgId, summary, options) {
|
|
14
|
+
const conversation = await client.getConversation(orgId, summary.uuid, {
|
|
15
|
+
tree: true,
|
|
16
|
+
});
|
|
17
|
+
const empty = {
|
|
18
|
+
success: true,
|
|
19
|
+
files: [],
|
|
20
|
+
files_metadata: [],
|
|
21
|
+
};
|
|
22
|
+
let artifacts = empty;
|
|
23
|
+
const artifactContents = new Map();
|
|
24
|
+
if (!options.skipArtifacts) {
|
|
25
|
+
try {
|
|
26
|
+
artifacts = await client.listArtifacts(orgId, summary.uuid);
|
|
27
|
+
for (const meta of artifacts.files_metadata) {
|
|
28
|
+
try {
|
|
29
|
+
const content = await client.downloadArtifact(orgId, summary.uuid, meta.path);
|
|
30
|
+
artifactContents.set(meta.path, content);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Per-artifact failure is non-fatal: keep going with what we have.
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Some conversations don't support the wiggle filesystem at all.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const bundle = buildGitBundle(conversation, artifacts, artifactContents, {
|
|
42
|
+
authorName: options.authorName,
|
|
43
|
+
authorEmail: options.authorEmail,
|
|
44
|
+
multiBranch: options.multiBranch ?? true,
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
conversation,
|
|
48
|
+
artifacts,
|
|
49
|
+
artifactContents,
|
|
50
|
+
bundle,
|
|
51
|
+
displayName: displayName(summary.name, summary.uuid),
|
|
52
|
+
slug: safeSlug(summary.name, summary.uuid),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/sync/fetch.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAuB1D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAwB,EACxB,KAAa,EACb,OAA4B,EAC5B,OAA6B;IAE7B,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE;QACrE,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,KAAK,GAAyB;QAClC,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,EAAE;QACT,cAAc,EAAE,EAAE;KACnB,CAAC;IACF,IAAI,SAAS,GAAyB,KAAK,CAAC;IAC5C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEhE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5D,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAC3C,KAAK,EACL,OAAO,CAAC,IAAI,EACZ,IAAI,CAAC,IAAI,CACV,CAAC;oBACF,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC3C,CAAC;gBAAC,MAAM,CAAC;oBACP,mEAAmE;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE;QACvE,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;KACzC,CAAC,CAAC;IAEH,OAAO;QACL,YAAY;QACZ,SAAS;QACT,gBAAgB;QAChB,MAAM;QACN,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;QACpD,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -17,6 +17,8 @@ export interface SyncConversationResult {
|
|
|
17
17
|
action: "skipped" | "skipped-existing" | "full" | "incremental";
|
|
18
18
|
reason?: string;
|
|
19
19
|
changelogWritten: boolean;
|
|
20
|
+
/** Human-readable label (falls back to `<unnamed <uuid>>` for nameless conversations). */
|
|
21
|
+
displayName: string;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
24
|
* Cheap predicate for --skip-same. Returns true when the list-endpoint summary
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/sync/incremental.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/sync/incremental.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAKpB,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iEAAiE;IACjE,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,GAAG,kBAAkB,GAAG,MAAM,GAAG,aAAa,CAAC;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,2BAA2B,CAAC,EAC9E,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,OAAO,CAMT;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAmGjC"}
|
package/dist/sync/incremental.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { rmSync } from "node:fs";
|
|
4
|
-
import { buildGitBundle } from "../export/bundle-builder.js";
|
|
5
4
|
import { exportToGit, appendToGit } from "../export/git-exporter.js";
|
|
6
5
|
import { diffConversation } from "./diff.js";
|
|
7
6
|
import { appendChangelog, renderChangelogSection, CHANGELOG_FILENAME, } from "./changelog.js";
|
|
8
7
|
import { readSyncState, writeSyncState, STATE_FILENAME, } from "./state.js";
|
|
9
8
|
import { buildMessageTree, findLeafMessages } from "../tree/message-tree.js";
|
|
9
|
+
import { fetchAndBuild } from "./fetch.js";
|
|
10
|
+
import { displayName as toDisplayName } from "../util/naming.js";
|
|
10
11
|
/**
|
|
11
12
|
* Cheap predicate for --skip-same. Returns true when the list-endpoint summary
|
|
12
13
|
* matches what the sidecar state file recorded on the previous sync. Caller
|
|
@@ -33,6 +34,8 @@ export async function syncConversation(client, orgId, summary, outputPath, optio
|
|
|
33
34
|
const stateDir = options.format === "json"
|
|
34
35
|
? path.dirname(outputPath)
|
|
35
36
|
: outputPath;
|
|
37
|
+
// Pre-compute display label so even early-return code paths can include it.
|
|
38
|
+
const prelimDisplayName = toDisplayName(summary.name, summary.uuid);
|
|
36
39
|
// --skip-existing: legacy, dumb existence check.
|
|
37
40
|
if (options.skipExisting) {
|
|
38
41
|
const target = options.format === "json" ? outputPath + ".json" : outputPath;
|
|
@@ -41,6 +44,7 @@ export async function syncConversation(client, orgId, summary, outputPath, optio
|
|
|
41
44
|
action: "skipped-existing",
|
|
42
45
|
reason: "output exists",
|
|
43
46
|
changelogWritten: false,
|
|
47
|
+
displayName: prelimDisplayName,
|
|
44
48
|
};
|
|
45
49
|
}
|
|
46
50
|
}
|
|
@@ -60,36 +64,29 @@ export async function syncConversation(client, orgId, summary, outputPath, optio
|
|
|
60
64
|
action: "skipped",
|
|
61
65
|
reason: "unchanged since last sync",
|
|
62
66
|
changelogWritten: false,
|
|
67
|
+
displayName: prelimDisplayName,
|
|
63
68
|
};
|
|
64
69
|
}
|
|
65
|
-
//
|
|
66
|
-
const
|
|
67
|
-
|
|
70
|
+
// Single source of truth for fetch + build.
|
|
71
|
+
const built = await fetchAndBuild(client, orgId, summary, {
|
|
72
|
+
authorName: options.authorName,
|
|
73
|
+
authorEmail: options.authorEmail,
|
|
74
|
+
skipArtifacts: options.skipArtifacts,
|
|
75
|
+
multiBranch: true,
|
|
68
76
|
});
|
|
69
|
-
const { artifacts,
|
|
77
|
+
const { conversation, artifacts, bundle } = built;
|
|
70
78
|
const diff = diffConversation(prevState, conversation, artifacts);
|
|
71
79
|
// For json mode: bundle is the full snapshot, written as a single JSON file.
|
|
72
80
|
if (options.format === "json") {
|
|
73
|
-
const bundle = buildGitBundle(conversation, artifacts, artifactContents, {
|
|
74
|
-
authorName: options.authorName,
|
|
75
|
-
authorEmail: options.authorEmail,
|
|
76
|
-
multiBranch: true,
|
|
77
|
-
});
|
|
78
81
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
79
82
|
fs.writeFileSync(outputPath + ".json", JSON.stringify(bundle, null, 2), "utf-8");
|
|
80
|
-
// For json mode, write state file to the directory containing the json file.
|
|
81
83
|
writeStateFile(stateDir, summary, conversation, artifacts, prevState ? "incremental" : "full");
|
|
82
84
|
return {
|
|
83
85
|
action: prevState ? "incremental" : "full",
|
|
84
86
|
changelogWritten: false,
|
|
87
|
+
displayName: built.displayName,
|
|
85
88
|
};
|
|
86
89
|
}
|
|
87
|
-
// For files / git mode: build a multi-branch bundle.
|
|
88
|
-
const bundle = buildGitBundle(conversation, artifacts, artifactContents, {
|
|
89
|
-
authorName: options.authorName,
|
|
90
|
-
authorEmail: options.authorEmail,
|
|
91
|
-
multiBranch: true,
|
|
92
|
-
});
|
|
93
90
|
const isFresh = !fs.existsSync(outputPath);
|
|
94
91
|
if (options.format === "git") {
|
|
95
92
|
if (isFresh) {
|
|
@@ -100,10 +97,8 @@ export async function syncConversation(client, orgId, summary, outputPath, optio
|
|
|
100
97
|
}
|
|
101
98
|
}
|
|
102
99
|
else {
|
|
103
|
-
// files mode: stage in tmp, swap.
|
|
104
100
|
await writeFilesMode(bundle, outputPath);
|
|
105
101
|
}
|
|
106
|
-
// After successful swap: write CHANGELOG, .gitignore (git only), state file.
|
|
107
102
|
let changelogWritten = false;
|
|
108
103
|
const section = renderChangelogSection(diff, new Date());
|
|
109
104
|
if (section) {
|
|
@@ -117,35 +112,9 @@ export async function syncConversation(client, orgId, summary, outputPath, optio
|
|
|
117
112
|
return {
|
|
118
113
|
action: prevState ? "incremental" : "full",
|
|
119
114
|
changelogWritten,
|
|
115
|
+
displayName: built.displayName,
|
|
120
116
|
};
|
|
121
117
|
}
|
|
122
|
-
async function fetchArtifacts(client, orgId, convId, enabled) {
|
|
123
|
-
const empty = {
|
|
124
|
-
success: true,
|
|
125
|
-
files: [],
|
|
126
|
-
files_metadata: [],
|
|
127
|
-
};
|
|
128
|
-
if (!enabled)
|
|
129
|
-
return { artifacts: empty, artifactContents: new Map() };
|
|
130
|
-
let artifacts = empty;
|
|
131
|
-
const artifactContents = new Map();
|
|
132
|
-
try {
|
|
133
|
-
artifacts = await client.listArtifacts(orgId, convId);
|
|
134
|
-
for (const meta of artifacts.files_metadata) {
|
|
135
|
-
try {
|
|
136
|
-
const content = await client.downloadArtifact(orgId, convId, meta.path);
|
|
137
|
-
artifactContents.set(meta.path, content);
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
// Skip failed artifact downloads.
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
// Some conversations don't support artifacts.
|
|
146
|
-
}
|
|
147
|
-
return { artifacts, artifactContents };
|
|
148
|
-
}
|
|
149
118
|
/**
|
|
150
119
|
* Files mode: replay bundle into outputPath via the same tmp+swap pattern as
|
|
151
120
|
* exportToGit, but strip .git at the end.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/sync/incremental.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAOjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/sync/incremental.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem-safe slug from a free-text name. Lowercases, strips anything
|
|
3
|
+
* non-alphanumeric to dashes, trims edges, caps at 60 chars. Returns "" for
|
|
4
|
+
* empty/null input -- callers should pair with `safeSlug()` if they need a
|
|
5
|
+
* fallback.
|
|
6
|
+
*/
|
|
7
|
+
export declare function slugify(name: string | null | undefined): string;
|
|
8
|
+
/**
|
|
9
|
+
* Slug guaranteed non-empty. If `name` slugifies to "", returns
|
|
10
|
+
* `unnamed-<uuid>`. Use this anywhere a path segment must be unique even when
|
|
11
|
+
* the source object has no name.
|
|
12
|
+
*/
|
|
13
|
+
export declare function safeSlug(name: string | null | undefined, uuid: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Human-readable label. Returns the trimmed name when present, else
|
|
16
|
+
* `<unnamed <uuid>>`. For log lines and progress output.
|
|
17
|
+
*/
|
|
18
|
+
export declare function displayName(name: string | null | undefined, uuid: string): string;
|
|
19
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/util/naming.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filesystem-safe slug from a free-text name. Lowercases, strips anything
|
|
3
|
+
* non-alphanumeric to dashes, trims edges, caps at 60 chars. Returns "" for
|
|
4
|
+
* empty/null input -- callers should pair with `safeSlug()` if they need a
|
|
5
|
+
* fallback.
|
|
6
|
+
*/
|
|
7
|
+
export function slugify(name) {
|
|
8
|
+
return (name ?? "")
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
11
|
+
.replace(/^-|-$/g, "")
|
|
12
|
+
.slice(0, 60);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Slug guaranteed non-empty. If `name` slugifies to "", returns
|
|
16
|
+
* `unnamed-<uuid>`. Use this anywhere a path segment must be unique even when
|
|
17
|
+
* the source object has no name.
|
|
18
|
+
*/
|
|
19
|
+
export function safeSlug(name, uuid) {
|
|
20
|
+
return slugify(name) || `unnamed-${uuid}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Human-readable label. Returns the trimmed name when present, else
|
|
24
|
+
* `<unnamed <uuid>>`. For log lines and progress output.
|
|
25
|
+
*/
|
|
26
|
+
export function displayName(name, uuid) {
|
|
27
|
+
const trimmed = (name ?? "").trim();
|
|
28
|
+
return trimmed || `<unnamed ${uuid}>`;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/util/naming.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAA+B;IACrD,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;SAChB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAA+B,EAAE,IAAY;IACpE,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,WAAW,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAA+B,EAAE,IAAY;IACvE,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,OAAO,OAAO,IAAI,YAAY,IAAI,GAAG,CAAC;AACxC,CAAC"}
|