rivet-design 0.17.1 → 0.17.3

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 (72) hide show
  1. package/README.md +1 -1
  2. package/README.npm.md +1 -1
  3. package/dist/agent-variants/contracts.d.ts +124 -124
  4. package/dist/cli/browser.d.ts +19 -0
  5. package/dist/cli/browser.d.ts.map +1 -0
  6. package/dist/cli/browser.js +55 -0
  7. package/dist/cli/browser.js.map +1 -0
  8. package/dist/cli/commands/libraryOpen.d.ts.map +1 -1
  9. package/dist/cli/commands/libraryOpen.js +14 -48
  10. package/dist/cli/commands/libraryOpen.js.map +1 -1
  11. package/dist/cli/commands/open.d.ts +4 -9
  12. package/dist/cli/commands/open.d.ts.map +1 -1
  13. package/dist/cli/commands/open.js +10 -34
  14. package/dist/cli/commands/open.js.map +1 -1
  15. package/dist/cli/router.d.ts.map +1 -1
  16. package/dist/cli/router.js +1 -0
  17. package/dist/cli/router.js.map +1 -1
  18. package/dist/cli/telemetry.d.ts +7 -0
  19. package/dist/cli/telemetry.d.ts.map +1 -1
  20. package/dist/cli/telemetry.js +15 -1
  21. package/dist/cli/telemetry.js.map +1 -1
  22. package/dist/routes/library/projects.d.ts.map +1 -1
  23. package/dist/routes/library/projects.js +24 -0
  24. package/dist/routes/library/projects.js.map +1 -1
  25. package/dist/services/ProjectLibrary.d.ts +1 -0
  26. package/dist/services/ProjectLibrary.d.ts.map +1 -1
  27. package/dist/services/ProjectLibrary.js +21 -8
  28. package/dist/services/ProjectLibrary.js.map +1 -1
  29. package/dist/services/ProjectRegistry.d.ts +22 -2
  30. package/dist/services/ProjectRegistry.d.ts.map +1 -1
  31. package/dist/services/ProjectRegistry.js +31 -3
  32. package/dist/services/ProjectRegistry.js.map +1 -1
  33. package/dist/services/ProjectRuntimeService.d.ts.map +1 -1
  34. package/dist/services/ProjectRuntimeService.js +13 -4
  35. package/dist/services/ProjectRuntimeService.js.map +1 -1
  36. package/dist/services/TelemetryService.d.ts +3 -3
  37. package/dist/services/TelemetryService.d.ts.map +1 -1
  38. package/dist/services/TelemetryService.js +2 -0
  39. package/dist/services/TelemetryService.js.map +1 -1
  40. package/dist/storage/library/ProjectRecords.d.ts +17 -0
  41. package/dist/storage/library/ProjectRecords.d.ts.map +1 -1
  42. package/dist/storage/library/ProjectRecords.js +42 -0
  43. package/dist/storage/library/ProjectRecords.js.map +1 -1
  44. package/dist/storage/library/database.d.ts +2 -1
  45. package/dist/storage/library/database.d.ts.map +1 -1
  46. package/dist/storage/library/database.js +14 -6
  47. package/dist/storage/library/database.js.map +1 -1
  48. package/dist/storage/library/migrations.d.ts +3 -1
  49. package/dist/storage/library/migrations.d.ts.map +1 -1
  50. package/dist/storage/library/migrations.js +9 -2
  51. package/dist/storage/library/migrations.js.map +1 -1
  52. package/dist/storage/library/schema/registry.d.ts +32 -0
  53. package/dist/storage/library/schema/registry.d.ts.map +1 -1
  54. package/dist/storage/library/schema/registry.js +2 -0
  55. package/dist/storage/library/schema/registry.js.map +1 -1
  56. package/dist/types/project-library.d.ts +5 -0
  57. package/dist/types/project-library.d.ts.map +1 -1
  58. package/dist/types/project-library.js +2 -0
  59. package/dist/types/project-library.js.map +1 -1
  60. package/dist/utils/skills/claude-skill.d.ts +1 -1
  61. package/dist/utils/skills/claude-skill.js +1 -1
  62. package/dist/utils/skills/cli-guidance.d.ts +1 -1
  63. package/dist/utils/skills/cli-guidance.js +2 -2
  64. package/dist/utils/skills/cursor-rules.d.ts +1 -1
  65. package/dist/utils/skills/cursor-rules.js +1 -1
  66. package/package.json +1 -1
  67. package/src/ui/dist/assets/LibraryApp-PQNnarmo.js +21 -0
  68. package/src/ui/dist/assets/main-BUZjlAHd.css +1 -0
  69. package/src/ui/dist/assets/{main-BluMFKVI.js → main-C7hdsU-C.js} +70 -70
  70. package/src/ui/dist/index.html +2 -2
  71. package/src/ui/dist/assets/LibraryApp-Bkawuvcq.js +0 -16
  72. package/src/ui/dist/assets/main-DY9LzvZT.css +0 -1
@@ -17,6 +17,8 @@ export declare class ProjectRecords {
17
17
  lastOpenedAt: string;
18
18
  storageKind: "project" | "bundle";
19
19
  sourceFingerprint: string | null;
20
+ removedAt: string | null;
21
+ pinnedAt: string | null;
20
22
  }[];
21
23
  /** Reads a single project and its workspace attachment. */
22
24
  get(projectId: string): {
@@ -28,6 +30,8 @@ export declare class ProjectRecords {
28
30
  lastOpenedAt: string;
29
31
  storageKind: "project" | "bundle";
30
32
  sourceFingerprint: string | null;
33
+ removedAt: string | null;
34
+ pinnedAt: string | null;
31
35
  } | null;
32
36
  /** Finds the owner of a canonical workspace or attributed history root. */
33
37
  findByPath(canonicalPath: string): {
@@ -39,6 +43,8 @@ export declare class ProjectRecords {
39
43
  lastOpenedAt: string;
40
44
  storageKind: "project" | "bundle";
41
45
  sourceFingerprint: string | null;
46
+ removedAt: string | null;
47
+ pinnedAt: string | null;
42
48
  } | null;
43
49
  /** Inserts a project and its workspace within the caller's transaction. */
44
50
  insert(record: {
@@ -50,6 +56,17 @@ export declare class ProjectRecords {
50
56
  }): void;
51
57
  /** Records the time a registered project was opened. */
52
58
  recordOpening(projectId: string, lastOpenedAt: string): void;
59
+ /** Saves a gallery display name without changing opening order or attachments. */
60
+ rename(projectId: string, name: string): void;
61
+ /** Saves pin membership while retaining the original order of repeated pins. */
62
+ setPinned({ projectId, isPinned, }: {
63
+ projectId: string;
64
+ isPinned: boolean;
65
+ }): void;
66
+ /** Hides a project durably while retaining its storage ownership. */
67
+ remove(projectId: string): void;
68
+ /** Restores gallery visibility for an explicit project opening. */
69
+ restore(projectId: string): void;
53
70
  /** Records one explicitly attributed generated history directory. */
54
71
  attachHistoryRoot(projectId: string, canonicalPath: string): void;
55
72
  /** Lists the persisted generated history attachments for a project. */
@@ -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"}
@@ -3,7 +3,7 @@
3
3
  * `~/.claude/skills/rivet/SKILL.md` by `rivet install claude`. The version
4
4
  * marker gates rewrites so user edits are only replaced by newer guidance.
5
5
  */
6
- export declare const CLAUDE_SKILL_VERSION = 54;
6
+ export declare const CLAUDE_SKILL_VERSION = 55;
7
7
  export declare const CLAUDE_SKILL_DIR = "rivet";
8
8
  export declare const CLAUDE_SKILL_FILENAME = "SKILL.md";
9
9
  export declare const CLAUDE_SKILL_CONTENT: string;
@@ -7,7 +7,7 @@ const cli_guidance_1 = require("./cli-guidance");
7
7
  * `~/.claude/skills/rivet/SKILL.md` by `rivet install claude`. The version
8
8
  * marker gates rewrites so user edits are only replaced by newer guidance.
9
9
  */
10
- exports.CLAUDE_SKILL_VERSION = 54;
10
+ exports.CLAUDE_SKILL_VERSION = 55;
11
11
  const CLAUDE_SKILL_VERSION_MARKER = `[//]: # (rivet-skill-version: ${exports.CLAUDE_SKILL_VERSION})`;
12
12
  exports.CLAUDE_SKILL_DIR = 'rivet';
13
13
  exports.CLAUDE_SKILL_FILENAME = 'SKILL.md';
@@ -5,7 +5,7 @@
5
5
  * states the same contract — because guidance files are softer than
6
6
  * registration: an agent can ignore them.
7
7
  */
8
- export declare const CLI_GUIDANCE_VERSION = 31;
8
+ export declare const CLI_GUIDANCE_VERSION = 32;
9
9
  export declare const CLI_GUIDANCE_BODY: string;
10
10
  /** One-line description used in host frontmatter/description fields. */
11
11
  export declare const CLI_GUIDANCE_DESCRIPTION = "Rivet \u2014 explore multiple design directions for your web app (\"/rivet\", \"use rivet\", \"explore with rivet\", \"create variants of X\", \"show me options for X\", \"open rivet\", \"open the visual editor\"). Drive it with `rivet` CLI commands.";
@@ -9,7 +9,7 @@ const displayLocale_1 = require("../displayLocale");
9
9
  * states the same contract — because guidance files are softer than
10
10
  * registration: an agent can ignore them.
11
11
  */
12
- exports.CLI_GUIDANCE_VERSION = 31;
12
+ exports.CLI_GUIDANCE_VERSION = 32;
13
13
  const DISPLAY_LOCALE = (0, displayLocale_1.resolveDisplayLocale)();
14
14
  exports.CLI_GUIDANCE_BODY = `Rivet helps you **explore multiple design directions** for a web app. You drive it by running \`rivet\` CLI commands. Every command prints exactly one JSON envelope on stdout (\`{ schemaVersion, ok, command, data | error }\`), routes progress to stderr, and never prompts for input.
15
15
 
@@ -23,7 +23,7 @@ exports.CLI_GUIDANCE_BODY = `Rivet helps you **explore multiple design direction
23
23
 
24
24
  **Project path.** Prefer explicit \`--project <absolute path>\` on every command so follow-up chats attach to the same workspace. For an existing app, pass its repo/app root. For a fresh app, create or use an empty directory first, then open Rivet there and start variants with \`--fresh\`.
25
25
 
26
- **Browser behavior.** For interactive user workflows, run \`rivet open\` without \`--no-browser\` so the Rivet UI opens in the browser. Use \`--no-browser\` only for headless/background automation, CI/e2e checks, or when the user explicitly asks not to open a browser; in those cases, report the returned \`editorUrl\`.
26
+ **Browser behavior.** For interactive user workflows, run \`rivet open\` without \`--no-browser\` so the Rivet UI opens in the browser. Use \`--no-browser\` only for explicitly unattended automation, headless environments, CI/e2e checks, or when the user explicitly asks not to open a browser; in those cases, report the returned \`editorUrl\`. Background workers or a background shell command do not make an interactive user request unattended. Always report the returned \`editorUrl\`; if \`browser.action\` is \`launch_failed\`, give the user that link to open manually.
27
27
 
28
28
  **MCP tools (opt-in).** If this host has Rivet MCP tools registered (\`rivet_status\`, \`rivet_variants\`, \`rivet_design_context\`, \`rivet_login\` — the user opted in via \`rivet install --mcp\`), prefer them over shelling out for status, variants, design-context, and sign-in work: they drive the same control plane and return the same JSON envelopes, without per-call process cost. Lifecycle stays CLI-only on purpose — \`rivet open\`, \`rivet stop\`, and \`rivet wait\` have no MCP tools. There is no blocking/watch tool either: start work with \`rivet_variants\`; if the result contains \`nextAction.action="complete_host_variant_work"\`, execute it yourself with parallel subagents when available.
29
29
 
@@ -4,7 +4,7 @@
4
4
  * (project scope is where Cursor reads rules files from; the user-scope
5
5
  * install writes the command allowlist instead).
6
6
  */
7
- export declare const CURSOR_RULES_VERSION = 52;
7
+ export declare const CURSOR_RULES_VERSION = 53;
8
8
  export declare const CURSOR_RULES_FILENAME = "rivet.mdc";
9
9
  export declare const CURSOR_RULES_CONTENT: string;
10
10
  //# sourceMappingURL=cursor-rules.d.ts.map
@@ -8,7 +8,7 @@ const cli_guidance_1 = require("./cli-guidance");
8
8
  * (project scope is where Cursor reads rules files from; the user-scope
9
9
  * install writes the command allowlist instead).
10
10
  */
11
- exports.CURSOR_RULES_VERSION = 52;
11
+ exports.CURSOR_RULES_VERSION = 53;
12
12
  exports.CURSOR_RULES_FILENAME = 'rivet.mdc';
13
13
  const CURSOR_RULES_VERSION_MARKER = `rivet-rules-version: ${exports.CURSOR_RULES_VERSION}`;
14
14
  exports.CURSOR_RULES_CONTENT = `---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rivet-design",
3
- "version": "0.17.1",
3
+ "version": "0.17.3",
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-C7hdsU-C.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};