rivet-design 0.17.1 → 0.17.2

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.
Files changed (41) hide show
  1. package/dist/routes/library/projects.d.ts.map +1 -1
  2. package/dist/routes/library/projects.js +24 -0
  3. package/dist/routes/library/projects.js.map +1 -1
  4. package/dist/services/ProjectLibrary.d.ts +1 -0
  5. package/dist/services/ProjectLibrary.d.ts.map +1 -1
  6. package/dist/services/ProjectLibrary.js +21 -8
  7. package/dist/services/ProjectLibrary.js.map +1 -1
  8. package/dist/services/ProjectRegistry.d.ts +22 -2
  9. package/dist/services/ProjectRegistry.d.ts.map +1 -1
  10. package/dist/services/ProjectRegistry.js +31 -3
  11. package/dist/services/ProjectRegistry.js.map +1 -1
  12. package/dist/services/TelemetryService.d.ts +1 -1
  13. package/dist/services/TelemetryService.d.ts.map +1 -1
  14. package/dist/services/TelemetryService.js.map +1 -1
  15. package/dist/storage/library/ProjectRecords.d.ts +17 -0
  16. package/dist/storage/library/ProjectRecords.d.ts.map +1 -1
  17. package/dist/storage/library/ProjectRecords.js +42 -0
  18. package/dist/storage/library/ProjectRecords.js.map +1 -1
  19. package/dist/storage/library/database.d.ts +2 -1
  20. package/dist/storage/library/database.d.ts.map +1 -1
  21. package/dist/storage/library/database.js +14 -6
  22. package/dist/storage/library/database.js.map +1 -1
  23. package/dist/storage/library/migrations.d.ts +3 -1
  24. package/dist/storage/library/migrations.d.ts.map +1 -1
  25. package/dist/storage/library/migrations.js +9 -2
  26. package/dist/storage/library/migrations.js.map +1 -1
  27. package/dist/storage/library/schema/registry.d.ts +32 -0
  28. package/dist/storage/library/schema/registry.d.ts.map +1 -1
  29. package/dist/storage/library/schema/registry.js +2 -0
  30. package/dist/storage/library/schema/registry.js.map +1 -1
  31. package/dist/types/project-library.d.ts +5 -0
  32. package/dist/types/project-library.d.ts.map +1 -1
  33. package/dist/types/project-library.js +2 -0
  34. package/dist/types/project-library.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/ui/dist/assets/LibraryApp-DXPBLgDE.js +21 -0
  37. package/src/ui/dist/assets/main-BUZjlAHd.css +1 -0
  38. package/src/ui/dist/assets/{main-BluMFKVI.js → main-CQ8l2PxN.js} +2 -2
  39. package/src/ui/dist/index.html +2 -2
  40. package/src/ui/dist/assets/LibraryApp-Bkawuvcq.js +0 -16
  41. package/src/ui/dist/assets/main-DY9LzvZT.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectRecords.d.ts","sourceRoot":"","sources":["../../../src/storage/library/ProjectRecords.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,oFAAoF;AACpF,qBAAa,cAAc;IACL,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP,yEAAyE;WAC5D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IASxD,qEAAqE;IACrE,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;IAIrC,+DAA+D;IAC/D,IAAI;;;;;;;;;;IASJ,2DAA2D;IAC3D,GAAG,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;IAWrB,2EAA2E;IAC3E,UAAU,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;IAoBhC,2EAA2E;IAC3E,MAAM,CAAC,MAAM,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAoBR,wDAAwD;IACxD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQ5D,qEAAqE;IACrE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQjE,uEAAuE;IACvE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IASzC,uEAAuE;IACvE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQtD,qFAAqF;IACrF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUzE,wCAAwC;IACxC,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"ProjectRecords.d.ts","sourceRoot":"","sources":["../../../src/storage/library/ProjectRecords.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,oFAAoF;AACpF,qBAAa,cAAc;IACL,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP,yEAAyE;WAC5D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUxD,qEAAqE;IACrE,WAAW,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC;IAIrC,+DAA+D;IAC/D,IAAI;;;;;;;;;;;;IAUJ,2DAA2D;IAC3D,GAAG,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;;;IAWrB,2EAA2E;IAC3E,UAAU,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;;;IAoBhC,2EAA2E;IAC3E,MAAM,CAAC,MAAM,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,IAAI;IAoBR,wDAAwD;IACxD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQ5D,kFAAkF;IAClF,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ7C,gFAAgF;IAChF,SAAS,CAAC,EACR,SAAS,EACT,QAAQ,GACT,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC;KACnB,GAAG,IAAI;IAYR,qEAAqE;IACrE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAU/B,mEAAmE;IACnE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQhC,qEAAqE;IACrE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQjE,uEAAuE;IACvE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IASzC,uEAAuE;IACvE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAQtD,qFAAqF;IACrF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUzE,wCAAwC;IACxC,KAAK,IAAI,IAAI;CAGd"}
@@ -18,6 +18,8 @@ const projectFields = {
18
18
  lastOpenedAt: registry_1.projects.lastOpenedAt,
19
19
  storageKind: registry_1.projects.storageKind,
20
20
  sourceFingerprint: registry_1.projects.sourceFingerprint,
21
+ removedAt: registry_1.projects.removedAt,
22
+ pinnedAt: registry_1.projects.pinnedAt,
21
23
  };
22
24
  /** Persists project identities and their machine-specific workspace attachments. */
23
25
  class ProjectRecords {
@@ -30,6 +32,7 @@ class ProjectRecords {
30
32
  return new ProjectRecords(await (0, database_1.openDurableDatabase)({
31
33
  databasePath: path_1.default.join(root, 'registry.sqlite'),
32
34
  schema: migrations_1.REGISTRY_SCHEMA,
35
+ migrations: migrations_1.REGISTRY_MIGRATIONS,
33
36
  }));
34
37
  }
35
38
  /** Runs related reads and writes under one immediate transaction. */
@@ -42,6 +45,7 @@ class ProjectRecords {
42
45
  .select(projectFields)
43
46
  .from(registry_1.projects)
44
47
  .innerJoin(registry_1.workspaces, (0, drizzle_orm_1.eq)(registry_1.workspaces.projectId, registry_1.projects.id))
48
+ .where((0, drizzle_orm_1.isNull)(registry_1.projects.removedAt))
45
49
  .orderBy((0, drizzle_orm_1.desc)(registry_1.projects.lastOpenedAt), registry_1.projects.id)
46
50
  .all();
47
51
  }
@@ -95,6 +99,44 @@ class ProjectRecords {
95
99
  .where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
96
100
  .run();
97
101
  }
102
+ /** Saves a gallery display name without changing opening order or attachments. */
103
+ rename(projectId, name) {
104
+ this.db
105
+ .update(registry_1.projects)
106
+ .set({ name })
107
+ .where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
108
+ .run();
109
+ }
110
+ /** Saves pin membership while retaining the original order of repeated pins. */
111
+ setPinned({ projectId, isPinned, }) {
112
+ this.db
113
+ .update(registry_1.projects)
114
+ .set({
115
+ pinnedAt: isPinned
116
+ ? (0, drizzle_orm_1.sql) `coalesce(${registry_1.projects.pinnedAt}, ${new Date().toISOString()})`
117
+ : null,
118
+ })
119
+ .where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
120
+ .run();
121
+ }
122
+ /** Hides a project durably while retaining its storage ownership. */
123
+ remove(projectId) {
124
+ this.db
125
+ .update(registry_1.projects)
126
+ .set({
127
+ removedAt: (0, drizzle_orm_1.sql) `coalesce(${registry_1.projects.removedAt}, ${new Date().toISOString()})`,
128
+ })
129
+ .where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
130
+ .run();
131
+ }
132
+ /** Restores gallery visibility for an explicit project opening. */
133
+ restore(projectId) {
134
+ this.db
135
+ .update(registry_1.projects)
136
+ .set({ removedAt: null })
137
+ .where((0, drizzle_orm_1.eq)(registry_1.projects.id, projectId))
138
+ .run();
139
+ }
98
140
  /** Records one explicitly attributed generated history directory. */
99
141
  attachHistoryRoot(projectId, canonicalPath) {
100
142
  this.db
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectRecords.js","sourceRoot":"","sources":["../../../src/storage/library/ProjectRecords.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectRecords.js","sourceRoot":"","sources":["../../../src/storage/library/ProjectRecords.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,12 @@ import { drizzle } from 'drizzle-orm/node-sqlite';
2
2
  interface OpenDatabaseOptions {
3
3
  databasePath: string;
4
4
  schema: string;
5
+ migrations?: readonly string[];
5
6
  }
6
7
  /** Releases a typed database's underlying SQLite connection. */
7
8
  export declare const closeDatabase: (db: ReturnType<typeof drizzle>) => void;
8
9
  /** Opens durable user data without deleting or recreating unreadable databases. */
9
- export declare const openDurableDatabase: ({ databasePath, schema, }: OpenDatabaseOptions) => Promise<ReturnType<typeof drizzle>>;
10
+ export declare const openDurableDatabase: ({ databasePath, schema, migrations, }: OpenDatabaseOptions) => Promise<ReturnType<typeof drizzle>>;
10
11
  /** Commits a short metadata mutation or rolls back every statement on failure. */
11
12
  export declare const transaction: <T>(db: ReturnType<typeof drizzle>, operation: () => T) => T;
12
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/storage/library/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,UAAU,mBAAmB;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,gEAAgE;AAChE,eAAO,MAAM,aAAa,GAAI,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,KAAG,IAE9D,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,GAAU,2BAGvC,mBAAmB,KAAG,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CAqC1D,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,EAC9B,WAAW,MAAM,CAAC,KACjB,CAYF,CAAC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/storage/library/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAGlD,UAAU,mBAAmB;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAKD,gEAAgE;AAChE,eAAO,MAAM,aAAa,GAAI,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,KAAG,IAE9D,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,GAAU,uCAIvC,mBAAmB,KAAG,OAAO,CAAC,UAAU,CAAC,OAAO,OAAO,CAAC,CA4C1D,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC,EAC9B,WAAW,MAAM,CAAC,KACjB,CAYF,CAAC"}
@@ -41,7 +41,7 @@ const drizzle_orm_1 = require("drizzle-orm");
41
41
  const fs_1 = __importDefault(require("fs"));
42
42
  const node_sqlite_1 = require("drizzle-orm/node-sqlite");
43
43
  const path_1 = __importDefault(require("path"));
44
- const SCHEMA_VERSION = 1;
44
+ const INITIAL_SCHEMA_VERSION = 1;
45
45
  const BUSY_TIMEOUT_MS = 5_000;
46
46
  /** Releases a typed database's underlying SQLite connection. */
47
47
  const closeDatabase = (db) => {
@@ -49,7 +49,8 @@ const closeDatabase = (db) => {
49
49
  };
50
50
  exports.closeDatabase = closeDatabase;
51
51
  /** Opens durable user data without deleting or recreating unreadable databases. */
52
- const openDurableDatabase = async ({ databasePath, schema, }) => {
52
+ const openDurableDatabase = async ({ databasePath, schema, migrations = [], }) => {
53
+ const supportedVersion = INITIAL_SCHEMA_VERSION + migrations.length;
53
54
  const { DatabaseSync } = await Promise.resolve().then(() => __importStar(require('node:sqlite')));
54
55
  fs_1.default.mkdirSync(path_1.default.dirname(databasePath), { recursive: true, mode: 0o700 });
55
56
  const db = new DatabaseSync(databasePath);
@@ -57,17 +58,24 @@ const openDurableDatabase = async ({ databasePath, schema, }) => {
57
58
  db.exec(`PRAGMA busy_timeout = ${BUSY_TIMEOUT_MS}`);
58
59
  const version = () => Number(db.prepare('PRAGMA user_version').get()?.user_version);
59
60
  const assertSupported = () => {
60
- if (version() > SCHEMA_VERSION)
61
- throw new Error(`Unsupported database schema ${version()} (supported: ${SCHEMA_VERSION}); leaving ${databasePath} untouched`);
61
+ if (version() > supportedVersion)
62
+ throw new Error(`Unsupported database schema ${version()} (supported: ${supportedVersion}); leaving ${databasePath} untouched`);
62
63
  };
63
64
  assertSupported();
64
- if (version() === 0) {
65
+ if (version() < supportedVersion) {
65
66
  db.exec('BEGIN IMMEDIATE');
66
67
  try {
67
68
  assertSupported();
68
69
  if (version() === 0) {
69
70
  db.exec(schema);
70
- db.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
71
+ db.exec(`PRAGMA user_version = ${supportedVersion}`);
72
+ }
73
+ else {
74
+ while (version() < supportedVersion) {
75
+ const currentVersion = version();
76
+ db.exec(migrations[currentVersion - INITIAL_SCHEMA_VERSION]);
77
+ db.exec(`PRAGMA user_version = ${currentVersion + 1}`);
78
+ }
71
79
  }
72
80
  db.exec('COMMIT');
73
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/storage/library/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/storage/library/database.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  /** Durable metadata; artifact bodies remain in the bundle's files and Git store. */
2
2
  export declare const BUNDLE_SCHEMA = "\n CREATE TABLE project (\n singleton INTEGER PRIMARY KEY CHECK(singleton = 1),\n id TEXT NOT NULL UNIQUE, name TEXT NOT NULL,\n created_at TEXT NOT NULL, updated_at TEXT NOT NULL\n );\n CREATE TABLE sessions (\n id TEXT PRIMARY KEY, initial_prompt TEXT NOT NULL,\n project_kind TEXT NOT NULL, source_workspace_id TEXT,\n created_at TEXT NOT NULL, context_path TEXT, details_json TEXT NOT NULL\n );\n CREATE TABLE batches (\n id TEXT NOT NULL, session_id TEXT NOT NULL REFERENCES sessions(id),\n request_id TEXT, label TEXT, instruction TEXT, created_at TEXT NOT NULL,\n context_path TEXT, PRIMARY KEY(session_id, id)\n );\n CREATE TABLE snapshots (\n id TEXT PRIMARY KEY, git_ref TEXT NOT NULL, commit_sha TEXT NOT NULL,\n tree_sha TEXT, created_at TEXT NOT NULL\n );\n CREATE TABLE variants (\n session_id TEXT NOT NULL REFERENCES sessions(id), variant_id TEXT NOT NULL,\n batch_id TEXT NOT NULL, label TEXT NOT NULL, brief TEXT NOT NULL,\n status TEXT NOT NULL, created_at TEXT NOT NULL, status_changed_at TEXT NOT NULL,\n snapshot_id TEXT REFERENCES snapshots(id), base_snapshot_id TEXT REFERENCES snapshots(id),\n parent_snapshot_id TEXT REFERENCES snapshots(id),\n parent_session_id TEXT, parent_variant_id TEXT,\n changed_files_count INTEGER NOT NULL, artifact_path TEXT, details_json TEXT NOT NULL,\n PRIMARY KEY(session_id, variant_id),\n FOREIGN KEY(session_id, batch_id) REFERENCES batches(session_id, id)\n );\n CREATE INDEX variants_created_at ON variants(created_at DESC);\n CREATE INDEX variants_status ON variants(status);\n CREATE TABLE presentation (\n key TEXT PRIMARY KEY, value_json TEXT NOT NULL, updated_at TEXT NOT NULL\n );\n";
3
- export declare const REGISTRY_SCHEMA = "\n CREATE TABLE projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n last_opened_at TEXT NOT NULL,\n storage_kind TEXT NOT NULL DEFAULT 'project' CHECK(storage_kind IN ('project', 'bundle')),\n source_fingerprint TEXT\n );\n CREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL UNIQUE REFERENCES projects(id),\n canonical_path TEXT NOT NULL UNIQUE\n );\n CREATE TABLE history_roots (\n canonical_path TEXT PRIMARY KEY, project_id TEXT NOT NULL REFERENCES projects(id)\n );\n";
3
+ export declare const REGISTRY_SCHEMA = "\n CREATE TABLE projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL,\n last_opened_at TEXT NOT NULL,\n storage_kind TEXT NOT NULL DEFAULT 'project' CHECK(storage_kind IN ('project', 'bundle')),\n source_fingerprint TEXT,\n removed_at TEXT,\n pinned_at TEXT\n );\n CREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL UNIQUE REFERENCES projects(id),\n canonical_path TEXT NOT NULL UNIQUE\n );\n CREATE TABLE history_roots (\n canonical_path TEXT PRIMARY KEY, project_id TEXT NOT NULL REFERENCES projects(id)\n );\n";
4
4
  export declare const COORDINATOR_SCHEMA = "CREATE TABLE coordinator(singleton INTEGER PRIMARY KEY CHECK(singleton=1), pid INTEGER NOT NULL, token TEXT NOT NULL, port INTEGER)";
5
+ /** Ordered registry upgrades after version 1; artifact databases have separate versions. */
6
+ export declare const REGISTRY_MIGRATIONS: readonly ["ALTER TABLE projects ADD COLUMN removed_at TEXT", "ALTER TABLE projects ADD COLUMN pinned_at TEXT"];
5
7
  //# sourceMappingURL=migrations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/storage/library/migrations.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,eAAO,MAAM,aAAa,osDAoCzB,CAAC;AAEF,eAAO,MAAM,eAAe,2jBAiB3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,wIACwG,CAAC"}
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/storage/library/migrations.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,eAAO,MAAM,aAAa,osDAoCzB,CAAC;AAEF,eAAO,MAAM,eAAe,smBAmB3B,CAAC;AAEF,eAAO,MAAM,kBAAkB,wIACwG,CAAC;AAExI,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,gHAGtB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.COORDINATOR_SCHEMA = exports.REGISTRY_SCHEMA = exports.BUNDLE_SCHEMA = void 0;
3
+ exports.REGISTRY_MIGRATIONS = exports.COORDINATOR_SCHEMA = exports.REGISTRY_SCHEMA = exports.BUNDLE_SCHEMA = void 0;
4
4
  /** Durable metadata; artifact bodies remain in the bundle's files and Git store. */
5
5
  exports.BUNDLE_SCHEMA = `
6
6
  CREATE TABLE project (
@@ -46,7 +46,9 @@ exports.REGISTRY_SCHEMA = `
46
46
  created_at TEXT NOT NULL,
47
47
  last_opened_at TEXT NOT NULL,
48
48
  storage_kind TEXT NOT NULL DEFAULT 'project' CHECK(storage_kind IN ('project', 'bundle')),
49
- source_fingerprint TEXT
49
+ source_fingerprint TEXT,
50
+ removed_at TEXT,
51
+ pinned_at TEXT
50
52
  );
51
53
  CREATE TABLE workspaces (
52
54
  id TEXT PRIMARY KEY,
@@ -58,4 +60,9 @@ exports.REGISTRY_SCHEMA = `
58
60
  );
59
61
  `;
60
62
  exports.COORDINATOR_SCHEMA = 'CREATE TABLE coordinator(singleton INTEGER PRIMARY KEY CHECK(singleton=1), pid INTEGER NOT NULL, token TEXT NOT NULL, port INTEGER)';
63
+ /** Ordered registry upgrades after version 1; artifact databases have separate versions. */
64
+ exports.REGISTRY_MIGRATIONS = [
65
+ 'ALTER TABLE projects ADD COLUMN removed_at TEXT',
66
+ 'ALTER TABLE projects ADD COLUMN pinned_at TEXT',
67
+ ];
61
68
  //# sourceMappingURL=migrations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/storage/library/migrations.ts"],"names":[],"mappings":";;;AAAA,oFAAoF;AACvE,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;CAiB9B,CAAC;AAEW,QAAA,kBAAkB,GAC7B,qIAAqI,CAAC"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/storage/library/migrations.ts"],"names":[],"mappings":";;;AAAA,oFAAoF;AACvE,QAAA,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5B,CAAC;AAEW,QAAA,eAAe,GAAG;;;;;;;;;;;;;;;;;;;CAmB9B,CAAC;AAEW,QAAA,kBAAkB,GAC7B,qIAAqI,CAAC;AAExI,4FAA4F;AAC/E,QAAA,mBAAmB,GAAG;IACjC,iDAAiD;IACjD,gDAAgD;CACxC,CAAC"}
@@ -98,6 +98,38 @@ export declare const projects: import("drizzle-orm/sqlite-core").SQLiteTableWith
98
98
  identity: undefined;
99
99
  generated: undefined;
100
100
  }, {}>;
101
+ removedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
102
+ name: string;
103
+ tableName: "projects";
104
+ dataType: "string";
105
+ data: string;
106
+ driverParam: string;
107
+ notNull: false;
108
+ hasDefault: false;
109
+ isPrimaryKey: false;
110
+ isAutoincrement: false;
111
+ hasRuntimeDefault: false;
112
+ enumValues: [string, ...string[]];
113
+ baseColumn: never;
114
+ identity: undefined;
115
+ generated: undefined;
116
+ }, {}>;
117
+ pinnedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
118
+ name: string;
119
+ tableName: "projects";
120
+ dataType: "string";
121
+ data: string;
122
+ driverParam: string;
123
+ notNull: false;
124
+ hasDefault: false;
125
+ isPrimaryKey: false;
126
+ isAutoincrement: false;
127
+ hasRuntimeDefault: false;
128
+ enumValues: [string, ...string[]];
129
+ baseColumn: never;
130
+ identity: undefined;
131
+ generated: undefined;
132
+ }, {}>;
101
133
  };
102
134
  dialect: "sqlite";
103
135
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/storage/library/schema/registry.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBpB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOrB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvB,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/storage/library/schema/registry.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBpB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOrB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvB,CAAC"}
@@ -12,6 +12,8 @@ exports.projects = (0, sqlite_core_1.sqliteTable)('projects', {
12
12
  .notNull()
13
13
  .default('project'),
14
14
  sourceFingerprint: (0, sqlite_core_1.text)('source_fingerprint'),
15
+ removedAt: (0, sqlite_core_1.text)('removed_at'),
16
+ pinnedAt: (0, sqlite_core_1.text)('pinned_at'),
15
17
  }, (table) => [
16
18
  (0, sqlite_core_1.check)('projects_storage_kind', (0, drizzle_orm_1.sql) `${table.storageKind} IN ('project', 'bundle')`),
17
19
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/storage/library/schema/registry.ts"],"names":[],"mappings":";;;AAAA,6CAAkC;AAClC,yDAAmE;AAEtD,QAAA,QAAQ,GAAG,IAAA,yBAAW,EACjC,UAAU,EACV;IACE,EAAE,EAAE,IAAA,kBAAI,GAAE,CAAC,UAAU,EAAE;IACvB,IAAI,EAAE,IAAA,kBAAI,GAAE,CAAC,OAAO,EAAE;IACtB,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,YAAY,EAAE,IAAA,kBAAI,EAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,IAAA,kBAAI,EAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;SAC/D,OAAO,EAAE;SACT,OAAO,CAAC,SAAS,CAAC;IACrB,iBAAiB,EAAE,IAAA,kBAAI,EAAC,oBAAoB,CAAC;CAC9C,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,IAAA,mBAAK,EACH,uBAAuB,EACvB,IAAA,iBAAG,EAAA,GAAG,KAAK,CAAC,WAAW,2BAA2B,CACnD;CACF,CACF,CAAC;AAEW,QAAA,UAAU,GAAG,IAAA,yBAAW,EAAC,YAAY,EAAE;IAClD,EAAE,EAAE,IAAA,kBAAI,GAAE,CAAC,UAAU,EAAE;IACvB,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC;SAC1B,OAAO,EAAE;SACT,MAAM,EAAE;SACR,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAQ,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE,IAAA,kBAAI,EAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;CACzD,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,IAAA,yBAAW,EAAC,eAAe,EAAE;IACvD,aAAa,EAAE,IAAA,kBAAI,EAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE;IAClD,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC;SAC1B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAQ,CAAC,EAAE,CAAC;CACjC,CAAC,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/storage/library/schema/registry.ts"],"names":[],"mappings":";;;AAAA,6CAAkC;AAClC,yDAAmE;AAEtD,QAAA,QAAQ,GAAG,IAAA,yBAAW,EACjC,UAAU,EACV;IACE,EAAE,EAAE,IAAA,kBAAI,GAAE,CAAC,UAAU,EAAE;IACvB,IAAI,EAAE,IAAA,kBAAI,GAAE,CAAC,OAAO,EAAE;IACtB,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,YAAY,EAAE,IAAA,kBAAI,EAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,IAAA,kBAAI,EAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;SAC/D,OAAO,EAAE;SACT,OAAO,CAAC,SAAS,CAAC;IACrB,iBAAiB,EAAE,IAAA,kBAAI,EAAC,oBAAoB,CAAC;IAC7C,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC;IAC7B,QAAQ,EAAE,IAAA,kBAAI,EAAC,WAAW,CAAC;CAC5B,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,IAAA,mBAAK,EACH,uBAAuB,EACvB,IAAA,iBAAG,EAAA,GAAG,KAAK,CAAC,WAAW,2BAA2B,CACnD;CACF,CACF,CAAC;AAEW,QAAA,UAAU,GAAG,IAAA,yBAAW,EAAC,YAAY,EAAE;IAClD,EAAE,EAAE,IAAA,kBAAI,GAAE,CAAC,UAAU,EAAE;IACvB,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC;SAC1B,OAAO,EAAE;SACT,MAAM,EAAE;SACR,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAQ,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE,IAAA,kBAAI,EAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;CACzD,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,IAAA,yBAAW,EAAC,eAAe,EAAE;IACvD,aAAa,EAAE,IAAA,kBAAI,EAAC,gBAAgB,CAAC,CAAC,UAAU,EAAE;IAClD,SAAS,EAAE,IAAA,kBAAI,EAAC,YAAY,CAAC;SAC1B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAQ,CAAC,EAAE,CAAC;CACjC,CAAC,CAAC"}
@@ -1,10 +1,15 @@
1
+ export declare const PROJECT_NAME_MAX_LENGTH = 200;
1
2
  export interface LibraryProject {
2
3
  id: string;
3
4
  name: string;
5
+ pinnedAt?: string | null;
6
+ lastOpenedAt: string;
4
7
  projectPath: string;
5
8
  isAvailable: boolean;
6
9
  storageKind: 'project' | 'bundle';
7
10
  issue?: string;
11
+ /** Present only when saved history could not be read. */
12
+ historyIssue?: string;
8
13
  }
9
14
  export interface LibraryProjectPreview {
10
15
  dataUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"project-library.d.ts","sourceRoot":"","sources":["../../src/types/project-library.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B"}
1
+ {"version":3,"file":"project-library.d.ts","sourceRoot":"","sources":["../../src/types/project-library.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,SAAS,GAAG,QAAQ,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B"}
@@ -1,3 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROJECT_NAME_MAX_LENGTH = void 0;
4
+ exports.PROJECT_NAME_MAX_LENGTH = 200;
3
5
  //# sourceMappingURL=project-library.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-library.js","sourceRoot":"","sources":["../../src/types/project-library.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"project-library.js","sourceRoot":"","sources":["../../src/types/project-library.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG,GAAG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rivet-design",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
4
4
  "description": "Local visual web development tool with AI-powered code modification",
5
5
  "main": "dist/index.js",
6
6
  "workspaces": [
@@ -0,0 +1,21 @@
1
+ var Ie=i=>{throw TypeError(i)};var ve=(i,t,r)=>t.has(i)||Ie("Cannot "+r);var l=(i,t,r)=>(ve(i,t,"read from private field"),r?r.call(i):t.get(i)),I=(i,t,r)=>t.has(i)?Ie("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(i):t.set(i,r),C=(i,t,r,n)=>(ve(i,t,"write to private field"),n?n.call(i,r):t.set(i,r),r),O=(i,t,r)=>(ve(i,t,"access private method"),r);import{S as $e,s as ze,h as Ae,g as Ze,n as ne,r as et,Q as Ue,u as me,a as tt,b as st,c as b,e as rt,d as it,f as nt,i as He,j as Me,k as at,l as ot,m as ct,o as pe,p as Ke,q as lt,t as e,B as Z,v as we,R as dt,T as ut,P as ht,C as mt,w as pt,X as ft,D as bt,x as xt,y as vt,z as wt,A as yt,E as jt,F as gt,G as kt,H as St,I as q,J as Te,K as ue,L as Pt,M as Nt,N as Ct,O as Rt,U as Et}from"./main-CQ8l2PxN.js";var W,J,M,V,K,re,ye,Fe,_t=(Fe=class extends $e{constructor(t,r){super();I(this,K);I(this,W);I(this,J);I(this,M);I(this,V);C(this,W,t),this.setOptions(r),this.bindMethods(),O(this,K,re).call(this)}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(t){var n;const r=this.options;this.options=l(this,W).defaultMutationOptions(t),ze(this.options,r)||l(this,W).getMutationCache().notify({type:"observerOptionsUpdated",mutation:l(this,M),observer:this}),r!=null&&r.mutationKey&&this.options.mutationKey&&Ae(r.mutationKey)!==Ae(this.options.mutationKey)?this.reset():((n=l(this,M))==null?void 0:n.state.status)==="pending"&&l(this,M).setOptions(this.options)}onSubscribe(){this.listeners.size===1&&l(this,M)&&(l(this,M).addObserver(this),O(this,K,re).call(this))}onUnsubscribe(){var t;this.hasListeners()||(t=l(this,M))==null||t.removeObserver(this)}onMutationUpdate(t){O(this,K,re).call(this),O(this,K,ye).call(this,t)}getCurrentResult(){return l(this,J)}reset(){var t;(t=l(this,M))==null||t.removeObserver(this),C(this,M,void 0),O(this,K,re).call(this),O(this,K,ye).call(this)}mutate(t,r){var n;return C(this,V,r),(n=l(this,M))==null||n.removeObserver(this),C(this,M,l(this,W).getMutationCache().build(l(this,W),this.options)),l(this,M).addObserver(this),l(this,M).execute(t)}},W=new WeakMap,J=new WeakMap,M=new WeakMap,V=new WeakMap,K=new WeakSet,re=function(){var r;const t=((r=l(this,M))==null?void 0:r.state)??Ze();C(this,J,{...t,isPending:t.status==="pending",isSuccess:t.status==="success",isError:t.status==="error",isIdle:t.status==="idle",mutate:this.mutate,reset:this.reset})},ye=function(t){ne.batch(()=>{var r,n,c,o,s,d,w,k;if(l(this,V)&&this.hasListeners()){const S=l(this,J).variables,u=l(this,J).context,p={client:l(this,W),meta:this.options.meta,mutationKey:this.options.mutationKey};if((t==null?void 0:t.type)==="success"){try{(n=(r=l(this,V)).onSuccess)==null||n.call(r,t.data,S,u,p)}catch(v){Promise.reject(v)}try{(o=(c=l(this,V)).onSettled)==null||o.call(c,t.data,null,S,u,p)}catch(v){Promise.reject(v)}}else if((t==null?void 0:t.type)==="error"){try{(d=(s=l(this,V)).onError)==null||d.call(s,t.error,S,u,p)}catch(v){Promise.reject(v)}try{(k=(w=l(this,V)).onSettled)==null||k.call(w,void 0,t.error,S,u,p)}catch(v){Promise.reject(v)}}}this.listeners.forEach(S=>{S(l(this,J))})})},Fe);function Le(i,t){const r=new Set(t);return i.filter(n=>!r.has(n))}var ee,L,te,G,F,X,ae,oe,ce,le,E,je,ge,Be,ke,Se,Pe,Qe,Ot=(Qe=class extends $e{constructor(t,r,n){super();I(this,E);I(this,ee);I(this,L);I(this,te);I(this,G);I(this,F);I(this,X);I(this,ae);I(this,oe);I(this,ce);I(this,le,[]);C(this,ee,t),C(this,G,n),C(this,te,[]),C(this,F,[]),C(this,L,[]),this.setQueries(r)}onSubscribe(){this.listeners.size===1&&l(this,F).forEach(t=>{t.subscribe(r=>{O(this,E,Se).call(this,t,r)})})}onUnsubscribe(){this.listeners.size||this.destroy()}destroy(){this.listeners=new Set,l(this,F).forEach(t=>{t.destroy()})}setQueries(t,r){C(this,te,t),C(this,G,r),ne.batch(()=>{const n=l(this,F),c=O(this,E,ke).call(this,l(this,te));c.forEach(u=>u.observer.setOptions(u.defaultedQueryOptions));const o=c.map(u=>u.observer),s=o.map(u=>u.getCurrentResult()),d=n.length!==o.length,w=o.some((u,p)=>u!==n[p]),k=d||w,S=k?!0:s.some((u,p)=>{const v=l(this,L)[p];return!v||!ze(u,v)});!k&&!S||(k&&(C(this,le,c),C(this,F,o)),C(this,L,s),this.hasListeners()&&(k&&(Le(n,o).forEach(u=>{u.destroy()}),Le(o,n).forEach(u=>{u.subscribe(p=>{O(this,E,Se).call(this,u,p)})})),O(this,E,Pe).call(this)))})}getCurrentResult(){return l(this,L)}getQueries(){return l(this,F).map(t=>t.getCurrentQuery())}getObservers(){return l(this,F)}getOptimisticResult(t,r){const n=O(this,E,ke).call(this,t),c=n.map(s=>s.observer.getOptimisticResult(s.defaultedQueryOptions)),o=n.map(s=>s.defaultedQueryOptions.queryHash);return[c,s=>O(this,E,ge).call(this,s??c,r,o),()=>O(this,E,je).call(this,c,n)]}},ee=new WeakMap,L=new WeakMap,te=new WeakMap,G=new WeakMap,F=new WeakMap,X=new WeakMap,ae=new WeakMap,oe=new WeakMap,ce=new WeakMap,le=new WeakMap,E=new WeakSet,je=function(t,r){const n=new Set;return r.map((c,o)=>{const s=t[o];return c.defaultedQueryOptions.notifyOnChangeProps?s:c.observer.trackResult(s,d=>{n.has(d)||(n.add(d),r.forEach(w=>{w.observer.trackProp(d)}))})})},ge=function(t,r,n){if(r){const c=l(this,ce),o=n!==void 0&&c!==void 0&&(c.length!==n.length||n.some((s,d)=>s!==c[d]));return(l(this,L)!==l(this,oe)||o||r!==l(this,ae))&&(C(this,ae,r),C(this,oe,l(this,L)),n!==void 0&&C(this,ce,n),C(this,X,et(l(this,X),r(t)))),l(this,X)}return t},Be=function(){var t;return!((t=l(this,G))!=null&&t.combine)||l(this,F).some((r,n)=>{var c;return r.options.suspense&&((c=l(this,L)[n])==null?void 0:c.data)===void 0})},ke=function(t){const r=new Map;l(this,F).forEach(c=>{const o=c.options.queryHash;if(!o)return;const s=r.get(o);s?s.push(c):r.set(o,[c])});const n=[];return t.forEach(c=>{var d;const o=l(this,ee).defaultQueryOptions(c),s=((d=r.get(o.queryHash))==null?void 0:d.shift())??new Ue(l(this,ee),o);n.push({defaultedQueryOptions:o,observer:s})}),n},Se=function(t,r){const n=l(this,F).indexOf(t);n!==-1&&(C(this,L,l(this,L).slice()),l(this,L)[n]=r,O(this,E,Pe).call(this))},Pe=function(){var t;if(this.hasListeners()){const r=O(this,E,Be).call(this),n=l(this,X),c=r?n:O(this,E,ge).call(this,O(this,E,je).call(this,l(this,L),l(this,le)),(t=l(this,G))==null?void 0:t.combine);(r||n!==c)&&ne.batch(()=>{this.listeners.forEach(o=>{o(l(this,L))})})}},Qe);function It({queries:i,...t},r){const n=me(),c=tt(),o=st(),s=t.subscribed!==!1,d=b.useMemo(()=>i.map(j=>{const g=n.defaultQueryOptions(j);return g._optimisticResults=c?"isRestoring":s?"optimistic":void 0,g}),[i,n,c,s]);d.forEach(j=>{rt(j);const g=n.getQueryCache().get(j.queryHash);it(j,o,g)}),nt(o);const[w]=b.useState(()=>new Ot(n,d,t)),[k,S,u]=w.getOptimisticResult(d,t.combine),p=!c&&s;b.useSyncExternalStore(b.useCallback(j=>p?w.subscribe(ne.batchCalls(j)):He,[w,p]),()=>w.getCurrentResult(),()=>w.getCurrentResult()),b.useEffect(()=>{w.setQueries(d,t)},[d,t,w]);const v=k.some((j,g)=>Me(d[g],j))?k.flatMap((j,g)=>{const y=d[g];if(y&&Me(y,j)){const B=new Ue(n,y);return at(y,B,o)}return[]}):[];if(v.length>0)throw Promise.all(v);const R=k.find((j,g)=>{const y=d[g];return y&&ot({result:j,errorResetBoundary:o,throwOnError:y.throwOnError,query:n.getQueryCache().get(y.queryHash),suspense:y.suspense})});if(R)throw R.error;return S(u())}function ie(i,t){const r=me(),[n]=b.useState(()=>new _t(r,i));b.useEffect(()=>{n.setOptions(i)},[n,i]);const c=b.useSyncExternalStore(b.useCallback(s=>n.subscribe(ne.batchCalls(s)),[n]),()=>n.getCurrentResult(),()=>n.getCurrentResult()),o=b.useCallback((...s)=>{n.mutate(s[0],s[1]).catch(He)},[n]);if(c.error&&ct(n.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:o,mutateAsync:c.mutate}}/**
2
+ * @license lucide-react v1.47.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const We={name:"arrow-up-right",size:24,node:[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]]};We.node;const At=pe(We);/**
7
+ * @license lucide-react v1.47.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const Ve={name:"ellipsis",size:24,node:[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],aliases:["more-horizontal"]};Ve.node;const Mt=pe(Ve);/**
12
+ * @license lucide-react v1.47.0 - ISC
13
+ *
14
+ * This source code is licensed under the ISC license.
15
+ * See the LICENSE file in the root directory of this source tree.
16
+ */const Ye={name:"folder-open",size:24,node:[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]]};Ye.node;const De=pe(Ye);/**
17
+ * @license lucide-react v1.47.0 - ISC
18
+ *
19
+ * This source code is licensed under the ISC license.
20
+ * See the LICENSE file in the root directory of this source tree.
21
+ */const Je={name:"loader-circle",size:24,node:[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],aliases:["loader-2"]};Je.node;const Tt=pe(Je),Lt=200,Dt=({project:i,onRename:t,onRemove:r,onSetPinned:n})=>{const c=Ke(),o=b.useRef(null),s=b.useRef(null),d=b.useRef(null),[w,k]=b.useState(!1),[S,u]=b.useState(!1),p=!!i.pinnedAt,[v,R]=b.useState(null),[j,g]=b.useState(i.name),[y,B]=b.useState(!1),[x,P]=b.useState(null),{containerRef:D,onKeyDown:_}=lt();let U=v==="rename"?"Save name":"Remove from projects";y&&(U="Saving…"),b.useEffect(()=>{var T;if(S||!d.current)return;const m=d.current==="button"?s:o;d.current=null,(T=m.current)==null||T.focus()},[S]);const Q=m=>{k(m),c==null||c.capture(m?"library_project_menu_opened":"library_project_menu_closed")},f=async m=>{if(!S){d.current=m,u(!0),c==null||c.capture("library_project_pin_clicked",{is_pinning:!p,method:m});try{await n(i.id,!p)}catch(T){gt.error(T instanceof Error?T.message:"Could not save pin. Try again.")}finally{u(!1)}}},$=m=>{Q(!1),g(i.name),P(null),R(m),c==null||c.capture("library_project_action_opened",{action:m})},z=m=>{c==null||c.capture("library_project_action_closed",{action:v,outcome:m}),R(null)},Y=async()=>{if(!(y||!v||v==="rename"&&!j.trim())){B(!0),P(null);try{v==="rename"?await t(i.id,j.trim()):await r(i.id),z("completed")}catch(m){P(m instanceof Error?m.message:"Could not save changes. Try again.")}finally{B(!1)}}};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:`flex items-center gap-0.5 group-hover/project:pointer-events-auto group-hover/project:opacity-100 has-[:focus-visible]:pointer-events-auto has-[:focus-visible]:opacity-100 [@media(hover:none)]:pointer-events-auto [@media(hover:none)]:opacity-100 ${w?"pointer-events-auto opacity-100":"pointer-events-none opacity-0"}`,children:[e.jsx(Z,{ref:s,type:"button",variant:"ghost",size:"icon-compact",title:p?"Unpin project":"Pin project","aria-label":`${p?"Unpin":"Pin"} ${i.name}`,"aria-pressed":p,disabled:S,onClick:()=>{f("button")},children:e.jsx(we,{weight:p?"fill":"bold",size:16,"aria-hidden":!0})}),e.jsxs(dt,{open:w,onOpenChange:Q,children:[e.jsx(ut,{asChild:!0,children:e.jsx(Z,{ref:o,type:"button",variant:"ghost",size:"icon-compact","aria-label":`Actions for ${i.name}`,children:e.jsx(Mt,{size:16,"aria-hidden":!0})})}),e.jsx(ht,{children:e.jsxs(mt,{"data-rivet-private":!0,ref:D,onKeyDown:_,role:"menu","aria-label":"Project actions",align:"start",sideOffset:4,onCloseAutoFocus:m=>{v&&m.preventDefault()},className:"ph-no-capture bg-surface-2 text-content z-ui-primary min-w-44 rounded-lg p-1 shadow-lg",children:[e.jsxs("button",{type:"button",role:"menuitem","data-menu-item":!0,disabled:S,onClick:()=>{Q(!1),f("menu")},className:"hover:bg-hover focus:bg-hover flex w-full items-center gap-2 rounded-md px-3 py-2 text-xs focus:outline-none disabled:opacity-50",children:[e.jsx(we,{size:14,weight:p?"fill":"bold","aria-hidden":!0}),p?"Unpin":"Pin"]}),e.jsxs("button",{type:"button",role:"menuitem","data-menu-item":!0,onClick:()=>$("rename"),className:"hover:bg-hover focus:bg-hover flex w-full items-center gap-2 rounded-md px-3 py-2 text-xs focus:outline-none",children:[e.jsx(pt,{size:14,"aria-hidden":!0}),"Rename"]}),e.jsxs("button",{type:"button",role:"menuitem","data-menu-item":!0,onClick:()=>$("remove"),className:"hover:bg-hover focus:bg-hover flex w-full items-center gap-2 rounded-md px-3 py-2 text-xs focus:outline-none",children:[e.jsx(ft,{size:14,"aria-hidden":!0}),"Remove from projects"]})]})})]})]}),e.jsx(bt,{open:v!==null,onOpenChange:m=>{!m&&!y&&z("cancelled")},children:e.jsxs(xt,{children:[e.jsx(vt,{className:"z-modal fixed inset-0 bg-black/60"}),e.jsxs(wt,{"data-rivet-private":!0,onCloseAutoFocus:m=>{var T;m.preventDefault(),(T=o.current)==null||T.focus()},className:"ph-no-capture bg-surface-2 text-content z-ui-secondary fixed top-1/2 left-1/2 w-[calc(100%-2rem)] max-w-sm -translate-x-1/2 -translate-y-1/2 rounded-xl p-6 shadow-lg",children:[e.jsx(yt,{className:"text-base font-medium break-words",children:v==="rename"?"Rename project":`Remove “${i.name}” from projects?`}),e.jsx(jt,{className:"mt-2 text-sm leading-6 text-white/60",children:v==="rename"?"Choose a display name for this project. Its folder name will stay the same.":"Your folders and saved variants will remain on this computer. Open the project again to restore it."}),e.jsxs("form",{onSubmit:m=>{m.preventDefault(),Y()},children:[v==="rename"?e.jsxs("label",{className:"mt-5 block text-xs text-white/70",children:["Project name",e.jsx("input",{autoFocus:!0,value:j,onChange:m=>g(m.target.value),maxLength:Lt,disabled:y,className:"mt-2 w-full rounded-lg border border-white/15 bg-white/5 px-3 py-2 text-sm text-white outline-none focus:border-white/50"})]}):null,x?e.jsx("p",{role:"alert",className:"mt-4 text-xs text-red-300",children:x}):null,e.jsxs("div",{className:"mt-6 flex justify-end gap-2",children:[e.jsx(Z,{type:"button",variant:"ghost",disabled:y,onClick:()=>z("cancelled"),children:"Cancel"}),e.jsx(Z,{type:"submit",variant:"secondary",disabled:y||v==="rename"&&!j.trim(),children:U})]})]})]})]})})]})},Ge=6e4,Xe=60*Ge,fe=24*Xe,qt=7*fe,Ft=30*fe,Qt=365*fe,$t=[["year",Qt],["month",Ft],["week",qt],["day",fe],["hour",Xe],["minute",Ge]],zt=new Intl.RelativeTimeFormat("en",{numeric:"always"}),Ut=i=>{const t=new Map;for(const r of i??[]){const n=Date.parse(r.createdAt);if(!Number.isFinite(n))continue;const c=t.get(r.projectId);(c===void 0||n>c)&&t.set(r.projectId,n)}return t},Ht=({projects:i,latestEdits:t})=>[...i].sort((r,n)=>{if(r.pinnedAt&&!n.pinnedAt)return-1;if(n.pinnedAt&&!r.pinnedAt)return 1;if(r.pinnedAt&&n.pinnedAt)return r.pinnedAt.localeCompare(n.pinnedAt)||r.id.localeCompare(n.id);const c=t.get(r.id),o=t.get(n.id);return c===void 0&&o!==void 0?1:o===void 0&&c!==void 0?-1:(o??0)-(c??0)||r.name.localeCompare(n.name)||r.id.localeCompare(n.id)}),Kt=({editedAt:i,now:t})=>{const r=Math.max(0,t-i);for(const[n,c]of $t)if(r>=c)return`Edited ${zt.format(-Math.floor(r/c),n)}`;return"Edited just now"},Bt=({projects:i,variants:t,historyError:r,onRetryHistory:n,projectPreviews:c={},selectedProjectId:o,onSelectProject:s,onBrowseLibrary:d,onOpenProject:w,onRenameProject:k,onRemoveProject:S,onSetProjectPinned:u,isOpeningProject:p=!1,projectOpenError:v,onSearchCompleted:R,accountMenu:j,children:g})=>{const[y,B]=b.useState(""),x=b.useRef(null),P=Ut(t),D=Date.now(),_=i.find(f=>f.id===o),U=new Map;if(t)for(const f of i)f.historyIssue||U.set(f.id,0);for(const{projectId:f}of t??[]){const $=U.get(f);$!==void 0&&U.set(f,$+1)}const Q=Ht({projects:i.filter(f=>f.name.toLowerCase().includes(y.toLowerCase())),latestEdits:P});return e.jsx("div",{className:"ph-no-capture bg-background text-foreground flex h-screen min-h-0","data-rivet-private":!0,children:e.jsxs("main",{className:"relative flex min-w-0 flex-1 flex-col overflow-hidden",children:[v?e.jsx("p",{role:"alert",className:"px-10 pt-5 text-xs text-red-200",children:v}):null,g!==void 0?g:e.jsxs("div",{className:"min-h-0 flex-1 overflow-y-auto px-10 py-10 max-sm:px-5",children:[e.jsxs("div",{className:"mb-10 flex items-center justify-between",children:[e.jsx("button",{onClick:d,"aria-label":"Projects",className:"flex items-center",children:e.jsx("img",{src:kt,alt:"","aria-hidden":!0,draggable:!1,className:"h-8 w-8"})}),e.jsx(Z,{onClick:()=>w(),variant:"secondary",disabled:p,leadingIcon:De,children:"Open project…"})]}),e.jsxs("header",{className:"mb-9 flex flex-wrap items-end justify-between gap-5",children:[e.jsx("div",{children:e.jsx("h1",{ref:x,tabIndex:-1,className:"text-[26px] font-medium tracking-[-0.035em] outline-none",children:"Projects"})}),e.jsx("div",{className:"flex flex-wrap items-center gap-3",children:e.jsxs("label",{className:"flex w-64 items-center gap-2 rounded-lg border border-white/[0.08] bg-white/[0.02] px-3 py-2.5 text-white/35",children:[e.jsx(St,{size:14,"aria-hidden":!0}),e.jsx("input",{onBlur:()=>R==null?void 0:R(y.length),type:"search","aria-label":"Search projects",placeholder:"Search projects…",value:y,onChange:f=>B(f.target.value),className:"min-w-0 flex-1 bg-transparent text-xs text-white outline-none placeholder:text-white/30 [&::-webkit-search-cancel-button]:hidden"})]})})]}),r?e.jsxs("div",{role:"alert",className:"mb-6 flex items-center gap-3 text-xs text-white/60",children:[e.jsx("span",{children:r}),e.jsx("button",{onClick:n,className:"shrink-0 underline underline-offset-4",children:"Retry history"})]}):null,_!=null&&_.issue?e.jsx("p",{role:"alert",className:"mb-6 rounded-lg border border-amber-200/10 bg-amber-200/[0.03] p-4 text-xs leading-6 text-white/70",children:_.issue}):null,_&&!_.isAvailable?e.jsxs("div",{className:"mb-6 flex items-center justify-between gap-4 rounded-lg border border-amber-200/10 bg-amber-200/[0.03] p-4 text-xs text-white/60",children:[e.jsxs("span",{children:["Locate ",_.name,"’s working folder to open its workspace."]}),e.jsx("button",{disabled:p,onClick:()=>w(_.id),className:"shrink-0 text-white underline decoration-white/30 underline-offset-4",children:"Locate folder"})]}):null,e.jsxs("div",{className:"grid items-start gap-x-6 gap-y-8 sm:grid-cols-2",children:[Q.map(f=>{const $=U.get(f.id);let z="Loading variants…";$!==void 0?z=`${$.toLocaleString()} ${$===1?"variant":"variants"}`:(r||f.historyIssue)&&(z="Variants unavailable");const Y=P.get(f.id);let m="No edits yet";r||f.historyIssue?m="Edit history unavailable":t===void 0?m="Loading edits…":$&&(m="Edit date unavailable");const T=c[f.id];return e.jsxs("div",{className:"group/project grid min-w-0",children:[e.jsxs("button",{onClick:()=>{B(""),s(f.id)},className:"group col-start-1 row-span-2 row-start-1 -m-2 grid w-[calc(100%+1rem)] min-w-0 grid-rows-subgrid rounded-2xl p-2 text-left hover:bg-white/[0.06] focus-visible:bg-white/[0.06] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white/60",children:[e.jsx("span",{className:"group-hover:border-border relative block aspect-video overflow-hidden rounded-xl border border-white/[0.08] bg-white/[0.02]",children:T?e.jsx("img",{src:T.dataUrl,alt:`${f.name} — ${T.label}`,draggable:!1,className:"h-full w-full object-cover object-top"}):null}),e.jsxs("span",{className:"mt-3 block pr-16",children:[e.jsxs("span",{className:"flex min-w-0 items-center gap-1.5 text-sm font-medium",children:[f.pinnedAt?e.jsx(we,{size:12,weight:"fill","aria-hidden":!0,className:"text-content-muted shrink-0"}):null,e.jsx("span",{className:"truncate",children:f.name})]}),e.jsxs("span",{className:"mt-2 flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs text-white/40 group-hover:text-white/65 group-focus-visible:text-white/65",children:[Y!==void 0?e.jsx("time",{dateTime:new Date(Y).toISOString(),title:new Date(Y).toLocaleString(),children:Kt({editedAt:Y,now:D})}):e.jsx("span",{children:m}),e.jsx("span",{className:"shrink-0",children:z})]}),f.isAvailable?null:e.jsx("span",{className:"mt-2 block text-xs text-amber-200/65",children:"Folder unavailable"})]})]}),e.jsx("div",{className:"z-content col-start-1 row-start-2 mt-3 self-center justify-self-end",children:e.jsx(Dt,{project:f,onRename:k,onSetPinned:u,onRemove:async de=>{var se;await S(de),(se=x.current)==null||se.focus()}})})]},f.id)}),Q.length===0?e.jsxs("div",{className:"col-span-full flex min-h-80 flex-col items-center justify-center rounded-xl border border-dashed border-white/10 px-8 text-center",children:[e.jsx(De,{size:26,className:"mb-5 text-white/25"}),e.jsx("h2",{className:"text-sm font-medium",children:y?"No matching projects":"Your projects start here"}),e.jsx("p",{className:"mt-2 max-w-sm text-xs leading-6 text-white/40",children:y?"Try another project name.":"Open an existing project once to bring its saved explorations here. Projects you open or create with Rivet appear automatically after that."}),y?null:e.jsx(Z,{onClick:()=>w(),variant:"secondary",disabled:p,className:"mt-5",children:"Open project"})]}):null]})]}),(o===null||g===void 0)&&j?e.jsx("footer",{className:"border-main-border bg-main-light shrink-0 border-t px-2.5 py-2.5",children:j}):null]})})},Wt=()=>{const i=me(),t=async o=>{await i.cancelQueries({queryKey:["project-library"]}),i.setQueryData(["project-library","projects"],s=>s&&{projects:o(s.projects)}),i.setQueriesData({queryKey:["project-library","history"]},s=>{if(!s)return s;const d=o(s.projects),w=new Set(d.map(({id:k})=>k));return{projects:d,variants:s.variants.filter(({projectId:k})=>w.has(k))}}),i.invalidateQueries({queryKey:["project-library"]})},r=ie({mutationFn:({projectId:o,name:s})=>q(`/projects/${encodeURIComponent(o)}`,{method:"PATCH",body:{name:s}}),onSuccess:({project:o})=>t(s=>s.map(d=>d.id===o.id?{...d,name:o.name}:d))}),n=ie({mutationFn:({projectId:o,isPinned:s})=>q(`/projects/${encodeURIComponent(o)}/pin`,{method:s?"PUT":"DELETE"}),onSuccess:({project:o})=>t(s=>s.map(d=>d.id===o.id?{...d,pinnedAt:o.pinnedAt}:d))}),c=ie({mutationFn:o=>q(`/projects/${encodeURIComponent(o)}`,{method:"DELETE"}),onSuccess:async(o,s)=>{await t(d=>d.filter(({id:w})=>w!==s)),await i.cancelQueries({queryKey:["library-project-preview",s]}),i.removeQueries({queryKey:["library-project-preview",s]})}});return{setProjectPinned:async(o,s)=>{await n.mutateAsync({projectId:o,isPinned:s})},renameProject:async(o,s)=>{await r.mutateAsync({projectId:o,name:s})},removeProject:async o=>{await c.mutateAsync(o)}}},qe=2500,Vt=500,Yt=6e4,Jt=[],Gt=[],he=({error:i,retry:t})=>e.jsxs("div",{className:"m-auto max-w-md px-8 text-center",children:[e.jsx("p",{className:"text-sm text-white/70",children:i.message}),e.jsx("button",{onClick:t,className:"mt-5 rounded-lg border border-white/15 px-4 py-2 text-xs text-white/70",children:"Try again"})]}),es=()=>{var Ne,Ce,Re,Ee,_e,Oe;const i=Ke(),t=me(),{renameProject:r,removeProject:n,setProjectPinned:c}=Wt(),o=b.useRef(),[s,d]=b.useState(()=>Te(new URL(window.location.href))),[w]=b.useState(()=>crypto.randomUUID()),k=b.useRef(0),S=b.useRef(null),u=ue({queryKey:["project-library","projects"],queryFn:({signal:a})=>q("/projects",{signal:a}),refetchInterval:qe,retry:!1}),p=((Ne=u.data)==null?void 0:Ne.projects)??Jt,v=p.map(({id:a,projectPath:h})=>({id:a,projectPath:h})).sort((a,h)=>a.id.localeCompare(h.id)),R=ue({queryKey:["project-library","history",v],queryFn:({signal:a})=>q("",{signal:a}),placeholderData:a=>{if(!a)return;const h=new Map(a.projects.map(({id:A,projectPath:H})=>[A,H]));if(!p.every(({id:A,projectPath:H})=>h.get(A)===H))return;const N=new Set(p.map(({id:A})=>A));return{projects:a.projects.filter(({id:A})=>N.has(A)),variants:a.variants.filter(({projectId:A})=>N.has(A))}},enabled:p.length>0,refetchInterval:qe,retry:!1}),j=new Map((Ce=R.data)==null?void 0:Ce.projects.map(a=>[a.id,a])),g=p.map(a=>{const h=j.get(a.id);return{...a,issue:h?h.issue:a.issue,historyIssue:h?h.historyIssue:a.historyIssue}}),y=((Re=R.data)==null?void 0:Re.variants)??Gt,B=It({queries:g.map(a=>({queryKey:["library-project-preview",a.id,a.projectPath],queryFn:({signal:h})=>q(`/projects/${a.id}/thumbnail`,{signal:h}),enabled:s.kind==="library",refetchInterval:Yt,retry:!1}))}),x=g.find(a=>a.id===s.projectId),P=y.find(a=>a.projectId===s.projectId&&a.sessionId===s.sessionId&&a.variantId===s.variantId),D=b.useCallback(a=>{window.history.pushState(null,"",Pt(a)),d(a)},[]);b.useEffect(()=>{x?o.current=x.id:u.isSuccess&&!u.isFetching&&s.projectId===o.current&&s.projectId&&(o.current=void 0,D({kind:"library"}))},[x,s.projectId,u.isSuccess,u.isFetching,D]),b.useEffect(()=>{const a=()=>d(Te(new URL(window.location.href)));return window.addEventListener("popstate",a),()=>window.removeEventListener("popstate",a)},[]),b.useEffect(()=>{const a=new AbortController;let h;const N=async()=>{try{const A=await q(`/views/${w}`,{method:"PUT",body:{isFocused:document.visibilityState==="visible"&&document.hasFocus()},signal:a.signal});for(const H of A.navigations){if(a.signal.aborted)return;if(H.sequence>k.current){let xe="library";H.projectId&&(xe="workspace"),H.variantId&&(xe="preview"),D({...H,kind:xe}),k.current=H.sequence}await q(`/views/${w}/acknowledgements`,{method:"POST",body:{sequence:H.sequence},signal:a.signal})}}catch{}a.signal.aborted||(h=setTimeout(()=>{N()},Vt))};return N(),()=>{a.abort(),clearTimeout(h)}},[w,D]);const _=ue({queryKey:["library-workspace",s.projectId],queryFn:()=>q(`/projects/${s.projectId}/runtime`,{method:"POST"}),enabled:s.kind==="workspace"&&!!s.projectId&&(x==null?void 0:x.isAvailable)===!0,retry:!1,refetchOnWindowFocus:!1}),U=_.data?new URL(_.data.editorUrl).origin:null;b.useEffect(()=>{if(s.kind!=="workspace"||!U)return;const a=h=>{!S.current||h.source!==S.current.contentWindow||h.origin!==U||h.data!==Et||(i==null||i.capture("library_view_changed",{view:"projects"}),D({kind:"library"}))};return window.addEventListener("message",a),()=>window.removeEventListener("message",a)},[s.kind,U,D,i]);const Q=ue({queryKey:["library-preview",s.projectId,s.sessionId,s.variantId],queryFn:()=>q(`/projects/${s.projectId}/variants/${s.sessionId}/${s.variantId}/preview`,{method:"POST"}),enabled:s.kind==="preview"&&!!(P!=null&&P.hasStaticPreview),retry:!1,refetchOnWindowFocus:!1}),f=ie({mutationFn:a=>q(`/projects/${s.projectId}/variants/${s.sessionId}/${s.variantId}`,{method:"PATCH",body:{label:a}}),onSuccess:()=>t.invalidateQueries({queryKey:["project-library"]})}),$=a=>{const h=g.find(N=>N.id===a);i==null||i.capture("library_project_selected",{project_id:a,workspace_available:(h==null?void 0:h.isAvailable)??!1}),D({kind:"workspace",projectId:a})},z=ie({mutationFn:async a=>{const{projectPath:h}=await q("/folder-selections",{method:"POST"});return h===null?null:q(a?`/projects/${a}/workspace`:"/projects",{method:a?"PATCH":"POST",body:{projectPath:h}})},onSuccess:a=>{a&&(t.invalidateQueries({queryKey:["project-library"]}),i==null||i.capture("library_project_selected",{project_id:a.project.id,workspace_available:a.project.isAvailable}),D({kind:"workspace",projectId:a.project.id}))},onSettled:(a,h,N)=>{i==null||i.capture("library_open_project_closed",{is_relink:!!N})}}),Y=a=>{z.isPending||(i==null||i.capture("library_open_project_opened",{is_relink:!!a}),z.mutate(a))},m=()=>{i==null||i.capture("library_view_changed",{view:"projects"}),D({kind:"library"})},T=()=>{i==null||i.capture("library_view_changed",{view:"workspace"}),D({...s,kind:"workspace"})},de=()=>{i==null||i.capture("library_history_retry"),R.refetch()};let se;if(s.kind!=="library"&&(x==null?void 0:x.isAvailable)!==!1||s.kind==="preview"){let a=!1,h=e.jsxs("div",{className:"m-auto flex items-center gap-2 text-xs text-white/40",children:[e.jsx(Tt,{size:14,className:"animate-spin"}),"Opening ",(x==null?void 0:x.name)??"project","…"]});if(u.data&&!x||R.data&&s.variantId&&!P)h=e.jsx("div",{className:"m-auto text-sm text-white/60",children:"This project or direction is no longer in your library."});else if(s.kind==="preview"&&R.error&&!R.data)h=e.jsx(he,{error:R.error,retry:de});else if(s.kind==="workspace"&&_.error)h=e.jsx(he,{error:_.error,retry:()=>{_.refetch()}});else if(s.kind==="workspace"&&_.data){a=!0;const N=new URL(_.data.editorUrl);N.searchParams.set("library","1"),N.searchParams.set("libraryOrigin",window.location.origin),s.sessionId&&s.variantId&&(N.searchParams.set("historySession",s.sessionId),N.searchParams.set("historyVariant",s.variantId)),h=e.jsx("iframe",{ref:S,title:`${(x==null?void 0:x.name)??"Project"} workspace`,src:N.toString(),className:"min-h-0 w-full flex-1 border-0",allow:"clipboard-write"},N.toString())}else s.kind==="preview"&&Q.error?h=e.jsx(he,{error:Q.error,retry:()=>{Q.refetch()}}):s.kind==="preview"&&Q.data?h=e.jsx("iframe",{title:`${(P==null?void 0:P.label)??"Saved direction"} preview`,src:Q.data.url,sandbox:"allow-scripts allow-same-origin allow-forms allow-popups",className:"min-h-0 w-full flex-1 border-0 bg-white"}):s.kind==="preview"&&P&&!P.hasStaticPreview&&(h=e.jsxs("div",{className:"m-auto max-w-sm text-center",children:[e.jsx("p",{className:"text-sm",children:P.hasInteractivePreview?"Open this direction in its workspace":"This direction contains saved code changes"}),e.jsx("p",{className:"mt-2 text-xs leading-6 text-white/40",children:P.hasInteractivePreview?"Rivet will start the preview with this project’s dependencies and configuration.":"Open the project to continue working with its saved history."}),e.jsx("button",{onClick:T,disabled:(x==null?void 0:x.isAvailable)===!1,className:"mt-5 rounded-lg bg-white px-4 py-2.5 text-xs font-medium text-black disabled:opacity-30",children:"Open workspace"})]}));se=e.jsxs(e.Fragment,{children:[s.kind==="preview"?e.jsxs("header",{className:"flex h-14 shrink-0 items-center gap-3 border-b border-white/[0.07] px-5",children:[e.jsx("button",{"aria-label":"Back to projects",onClick:m,className:"rounded p-1.5 text-white/45 hover:bg-white/5",children:e.jsx(Nt,{size:15})}),e.jsx("span",{className:"text-xs text-white/40",children:x==null?void 0:x.name}),P?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"text-white/20",children:"/"}),e.jsxs("form",{onSubmit:N=>{N.preventDefault();const A=new FormData(N.currentTarget);f.mutate(String(A.get("label")))},className:"flex min-w-0 flex-1 gap-2",children:[e.jsx("input",{name:"label","aria-label":"Direction name",defaultValue:P.label,className:"max-w-xs min-w-0 flex-1 bg-transparent text-xs text-white/80 outline-none"}),e.jsx("button",{disabled:f.isPending,className:"text-[10px] text-white/30 hover:text-white",children:"Rename"})]},`${P.projectId}:${P.variantId}`)]}):e.jsx("span",{className:"flex-1"}),s.kind==="preview"?e.jsxs("button",{onClick:T,disabled:(x==null?void 0:x.isAvailable)===!1,className:"flex items-center gap-1.5 rounded-md border border-white/10 px-3 py-1.5 text-[11px] text-white/70 disabled:opacity-30",children:["Edit in project",e.jsx(At,{size:12})]}):null]}):null,s.kind==="workspace"&&!a?e.jsx("button",{onClick:m,className:"absolute top-5 left-5 rounded px-2 py-1 text-xs text-white/50 hover:bg-white/5 hover:text-white",children:"Projects"}):null,f.error?e.jsx("p",{role:"alert",className:"px-5 py-2 text-xs text-red-200",children:f.error.message}):null,h]})}let be=se;return u.error&&!u.data?be=e.jsx(he,{error:u.error,retry:()=>{u.refetch()}}):u.isPending&&(be=e.jsx("div",{role:"status",className:"m-auto text-xs text-white/40",children:"Loading projects…"})),e.jsxs(e.Fragment,{children:[e.jsx(Bt,{projects:g,variants:(Ee=R.data)==null?void 0:Ee.variants,historyError:(_e=R.error)==null?void 0:_e.message,onRetryHistory:de,projectPreviews:Object.fromEntries(g.map((a,h)=>{var N,A;return[a.id,(A=(N=B[h])==null?void 0:N.data)==null?void 0:A.preview]})),selectedProjectId:s.projectId??null,onSelectProject:$,onBrowseLibrary:m,onOpenProject:Y,onRenameProject:r,onRemoveProject:n,onSetProjectPinned:c,accountMenu:e.jsx(Ct,{side:"top",align:"start"}),isOpeningProject:z.isPending,projectOpenError:(Oe=z.error)==null?void 0:Oe.message,onSearchCompleted:a=>i==null?void 0:i.capture("library_search_completed",{query_length:a}),children:be}),e.jsx(Rt,{position:"bottom-right",theme:"dark"})]})};export{es as default};