openpond 0.0.35 → 0.0.36

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 (118) hide show
  1. package/dist/chunks/{app-layer-GUF2CKYH.js → app-layer-4AA4YYGK.js} +3 -3
  2. package/dist/chunks/{apps-DIVHAUOV.js → apps-V2JTB5MD.js} +3 -3
  3. package/dist/chunks/{chunk-FRPL5XPX.js → chunk-3DOOLZZM.js} +1 -1
  4. package/dist/chunks/{chunk-CRFB72X2.js → chunk-3JJBNVNX.js} +3 -3
  5. package/dist/chunks/{chunk-GUGFYXFS.js → chunk-65BVQIHR.js} +4 -4
  6. package/dist/chunks/{chunk-NTRTK6C6.js → chunk-6L5WJF7T.js} +2 -2
  7. package/dist/chunks/{chunk-SECNDLPQ.js → chunk-7IPF4X3K.js} +67 -1
  8. package/dist/chunks/{chunk-ZZOTKXRD.js → chunk-CJSD5ADV.js} +2 -2
  9. package/dist/chunks/{chunk-TXJ4TIDO.js → chunk-G6WW2656.js} +1 -1
  10. package/dist/chunks/{chunk-II2ERA2H.js → chunk-GALAW74P.js} +2 -2
  11. package/dist/chunks/{chunk-4Y25BACE.js → chunk-JAS6QZ2W.js} +1 -1
  12. package/dist/chunks/{chunk-EY52SLOQ.js → chunk-MJT7EW5Q.js} +1 -1
  13. package/dist/chunks/{chunk-2GV3QBBZ.js → chunk-MSX2J653.js} +1 -1
  14. package/dist/chunks/{chunk-YPK2W34Z.js → chunk-NVTC3XOA.js} +1 -1
  15. package/dist/chunks/{chunk-XIF53VR3.js → chunk-NWQTF6O4.js} +1 -1
  16. package/dist/chunks/{chunk-RLQGMSW7.js → chunk-NWVIUBJ3.js} +2 -2
  17. package/dist/chunks/{chunk-S3VA47DG.js → chunk-TYYR7KWY.js} +3 -3
  18. package/dist/chunks/{chunk-LUA5QGQP.js → chunk-YLULZMWE.js} +33 -33
  19. package/dist/chunks/{chunk-2I5TZW66.js → chunk-YRFQKUZD.js} +40 -1
  20. package/dist/chunks/{cli-3AEIYSMD.js → cli-4JA3SIDE.js} +6 -6
  21. package/dist/chunks/{cli-HUVI6ELM.js → cli-RJHEE4FA.js} +4 -4
  22. package/dist/chunks/{core-commands-2HUTKFHQ.js → core-commands-CQSPCVC4.js} +4 -4
  23. package/dist/chunks/{extend-PAJMXYKV.js → extend-4MZ75SHV.js} +9 -9
  24. package/dist/chunks/{harness-UWAS2VAN.js → harness-YVZU42S7.js} +3 -3
  25. package/dist/chunks/{help-M7D2XAOX.js → help-6SULYXVS.js} +1 -1
  26. package/dist/chunks/{opchat-FQ2CJVM6.js → opchat-XGS4AXHA.js} +5 -5
  27. package/dist/chunks/{organizations-L5N6LJ7O.js → organizations-4GFQ3NT2.js} +4 -4
  28. package/dist/chunks/{profile-KH5IKVNY.js → profile-VWMBIHIE.js} +7 -7
  29. package/dist/chunks/{project-agent-F4NHVRGY.js → project-agent-SQ6ODALG.js} +6 -6
  30. package/dist/chunks/{sandbox-command-DDXRQNB6.js → sandbox-command-34S2V7BN.js} +4 -4
  31. package/dist/chunks/{sandbox-template-5EEEQKR5.js → sandbox-template-VP5HMGQI.js} +5 -5
  32. package/dist/chunks/{src-34FV42HE.js → src-X3R3XIJT.js} +403 -28
  33. package/dist/chunks/{src-LHZWUSD7.js → src-YHUMH6W6.js} +2 -2
  34. package/dist/chunks/{teams-bot-HFWO5GOV.js → teams-bot-EIVRNO5S.js} +3 -3
  35. package/dist/chunks/{workspaces-LO44JAC2.js → workspaces-2N52V3BI.js} +2 -2
  36. package/dist/cli.js +10 -10
  37. package/dist/web/assets/{AppDialog-T3j6O3yg.js → AppDialog-j4N-gIi3.js} +1 -1
  38. package/dist/web/assets/{AppsView-70Qqf9eJ.js → AppsView-YiK3pqNb.js} +1 -1
  39. package/dist/web/assets/{BrowserSidebar-CdBLHdNW.js → BrowserSidebar-BWFLEQ8j.js} +1 -1
  40. package/dist/web/assets/{CloudWorkView-C5-jvlOo.js → CloudWorkView-3sS_1bhN.js} +1 -1
  41. package/dist/web/assets/CommandMenu-B11OrTCq.js +1 -0
  42. package/dist/web/assets/{CommunityView-BHUJ9Hun.js → CommunityView-DXyXTWhP.js} +1 -1
  43. package/dist/web/assets/ComposerCreateImproveStrip-3NoRiJJq.js +1 -0
  44. package/dist/web/assets/{GetStartedView-CIXScviw.js → GetStartedView-CPV5lgVH.js} +1 -1
  45. package/dist/web/assets/LabsRoute-B_nsEZXy.js +3 -0
  46. package/dist/web/assets/LabsRoute-dNN-odU0.css +1 -0
  47. package/dist/web/assets/MainChatThread-Dg7p3R2O.js +2 -0
  48. package/dist/web/assets/{MakeAgentTutorialLearningPanel-r7jyZVc0.js → MakeAgentTutorialLearningPanel-C6F-kJQd.js} +2 -2
  49. package/dist/web/assets/{MarkdownText-E35C404I.js → MarkdownText-CkVkr3P1.js} +3 -3
  50. package/dist/web/assets/Messages-C7uHGoFw.js +10 -0
  51. package/dist/web/assets/{NativeSkillSidebar-Qgccncuc.js → NativeSkillSidebar-BPpoHjEW.js} +1 -1
  52. package/dist/web/assets/{NewProjectDialog-BowacUmA.js → NewProjectDialog-DBMhkTvD.js} +1 -1
  53. package/dist/web/assets/{PostTrainingLearningPanel-oJu5qaHK.js → PostTrainingLearningPanel-B1Rp7iIL.js} +2 -2
  54. package/dist/web/assets/{PostTrainingStatusPill-B9Eoc4s0.js → PostTrainingStatusPill-BGZ9h5eW.js} +1 -1
  55. package/dist/web/assets/{ProfileSettingsSection-Dnh92gDH.js → ProfileSettingsSection-2NOHEz2b.js} +1 -1
  56. package/dist/web/assets/RightChatPanelStack-CLK7_zKe.js +1 -0
  57. package/dist/web/assets/{SettingsView-Bjehxwt1.js → SettingsView-BAqea_KX.js} +4 -4
  58. package/dist/web/assets/{TeamChatView-Tn4X5cuY.js → TeamChatView-qVscSedQ.js} +2 -2
  59. package/dist/web/assets/{TerminalOverlay-DoX5LYzK.js → TerminalOverlay-Bkw7XqMy.js} +1 -1
  60. package/dist/web/assets/TrainingCreationPanel-COg1wvw8.js +1 -0
  61. package/dist/web/assets/{TrainingDraftPanel-Da6uGu9y.js → TrainingDraftPanel-BNK2znmI.js} +1 -1
  62. package/dist/web/assets/{UsageSettingsSection-DKky0p47.js → UsageSettingsSection-CUxBaohC.js} +1 -1
  63. package/dist/web/assets/WorkspaceDiffPanel-qfFj8IRq.js +14 -0
  64. package/dist/web/assets/{WorkspaceEnvironmentMenu-Ba4M8z1N.js → WorkspaceEnvironmentMenu-C0-mH7oF.js} +3 -3
  65. package/dist/web/assets/{WorkspaceGitDialogs-CSepNOb8.js → WorkspaceGitDialogs-VvC2px0X.js} +1 -1
  66. package/dist/web/assets/{WorkspaceMonacoEditor-LhFdzCRs.js → WorkspaceMonacoEditor-CUIwoHv1.js} +3 -3
  67. package/dist/web/assets/{activity-bW02ZsBD.js → activity-BhqHgkfJ.js} +1 -1
  68. package/dist/web/assets/{boxes-B1dRA1pi.js → boxes-BpqUKFIm.js} +1 -1
  69. package/dist/web/assets/{chevron-up-CySy6WNq.js → chevron-up-BTn9DVRP.js} +1 -1
  70. package/dist/web/assets/{circle-x-DY8vKAKi.js → circle-x-B9Qa8o5a.js} +1 -1
  71. package/dist/web/assets/{copy-DuHI1UZ_.js → copy-BsYs6wBI.js} +1 -1
  72. package/dist/web/assets/{create-pipeline-request-CGBcdK9r.js → create-pipeline-request-vxgKoAvv.js} +3 -3
  73. package/dist/web/assets/{credit-card-Bot0OuTl.js → credit-card-BCePAwMI.js} +1 -1
  74. package/dist/web/assets/{cssMode-BIjAothW.js → cssMode-mw8RI2fR.js} +1 -1
  75. package/dist/web/assets/{git-branch-Cm02aNWq.js → git-branch-C7qQYFIs.js} +1 -1
  76. package/dist/web/assets/{git-commit-horizontal-FYILXW0v.js → git-commit-horizontal-CbX4pTOA.js} +1 -1
  77. package/dist/web/assets/{htmlMode-zO2xLLgL.js → htmlMode-Cc4Czh_M.js} +1 -1
  78. package/dist/web/assets/index-9tbdqUau.css +1 -0
  79. package/dist/web/assets/index-B_3z_lxq.js +1 -0
  80. package/dist/web/assets/index-Cr_RZ7GD.js +177 -0
  81. package/dist/web/assets/{info-DeuEU_RO.js → info-BNGbwgtq.js} +1 -1
  82. package/dist/web/assets/{jsonMode-D2A3mj4n.js → jsonMode-CbqbqGVz.js} +1 -1
  83. package/dist/web/assets/{lspLanguageFeatures-aPSqvscU.js → lspLanguageFeatures-DKiKr5tH.js} +1 -1
  84. package/dist/web/assets/make-agent-tutorial-KKauJpB9.js +2 -0
  85. package/dist/web/assets/{monaco.contribution-KqCt1n9-.js → monaco.contribution-CNgwz_pw.js} +2 -2
  86. package/dist/web/assets/{monaco.contribution-DAq6Jihl.js → monaco.contribution-CdUAX47Q.js} +2 -2
  87. package/dist/web/assets/{monaco.contribution-Do3Jjslo.js → monaco.contribution-D_-wu578.js} +2 -2
  88. package/dist/web/assets/{monaco.contribution-CHVe9CQ9.js → monaco.contribution-Dxc4IxFM.js} +2 -2
  89. package/dist/web/assets/{monitor-DXvHWFeW.js → monitor-CNdx_GTg.js} +1 -1
  90. package/dist/web/assets/{play-BIHyH-Yu.js → play-BLRANWaV.js} +1 -1
  91. package/dist/web/assets/{python-g3mtmU2J.js → python-DYgDMu2R.js} +1 -1
  92. package/dist/web/assets/{refresh-cw-Daz0oqwK.js → refresh-cw-BFjjwYNf.js} +1 -1
  93. package/dist/web/assets/{reply-wu9DIBuK.js → reply-D012cuZl.js} +1 -1
  94. package/dist/web/assets/{rotate-cw-D7q9GgNc.js → rotate-cw-CTfjlR4G.js} +1 -1
  95. package/dist/web/assets/{save-BVFY6VTI.js → save-B1zYlRyN.js} +1 -1
  96. package/dist/web/assets/{toggleHighContrast-D9C_WUDu.js → toggleHighContrast-D9XFH7EA.js} +1 -1
  97. package/dist/web/assets/{training-1du5QD-P.css → training-BN8CALIc.css} +1 -1
  98. package/dist/web/assets/{tsMode-B4lEUN5X.js → tsMode-BU-tuKsY.js} +1 -1
  99. package/dist/web/assets/{upload-DNbYB4Rl.js → upload-DU_81jvL.js} +1 -1
  100. package/dist/web/assets/{wifi-off-C5QLifIJ.js → wifi-off-TPsBnbGW.js} +1 -1
  101. package/dist/web/assets/{workers-CV4BZb_x.js → workers-NhWySRdT.js} +1 -1
  102. package/dist/web/assets/{yaml-3ah8oX43.js → yaml-DWXa_3ZL.js} +1 -1
  103. package/dist/web/index.html +2 -2
  104. package/package.json +1 -1
  105. package/dist/web/assets/CommandMenu-B3Y4MvmT.js +0 -1
  106. package/dist/web/assets/ComposerCreateImproveStrip-DeRI5XEO.js +0 -1
  107. package/dist/web/assets/LabsRoute-CgKtVYTP.css +0 -1
  108. package/dist/web/assets/LabsRoute-Cs_R1fuu.js +0 -3
  109. package/dist/web/assets/MainChatThread-h7VSA_Rc.js +0 -2
  110. package/dist/web/assets/Messages-BANZuAnA.js +0 -10
  111. package/dist/web/assets/RightChatPanelStack-pGwbt6Wy.js +0 -1
  112. package/dist/web/assets/TrainingCreationPanel-BLSf1Bnp.js +0 -1
  113. package/dist/web/assets/WorkspaceDiffPanel-DTRtW9n8.js +0 -14
  114. package/dist/web/assets/circle-alert-DMHz5tj_.js +0 -1
  115. package/dist/web/assets/index-B5AN29EO.js +0 -177
  116. package/dist/web/assets/index-BnwYyUgT.js +0 -1
  117. package/dist/web/assets/index-COGlKIJ4.css +0 -1
  118. package/dist/web/assets/make-agent-tutorial-A2W9Ajwv.js +0 -2
@@ -28,10 +28,10 @@ import {
28
28
  truncatePatch,
29
29
  uniqueSortedPaths,
30
30
  workspaceImageContentType
31
- } from "./chunk-XIF53VR3.js";
31
+ } from "./chunk-NWQTF6O4.js";
32
32
  import {
33
33
  runOpenPondServerCli
34
- } from "./chunk-NTRTK6C6.js";
34
+ } from "./chunk-6L5WJF7T.js";
35
35
  import {
36
36
  APP_PREFERENCES_CACHE_KEY,
37
37
  APP_PREFERENCES_CACHE_TYPE,
@@ -44,7 +44,7 @@ import {
44
44
  isCliEntrypoint,
45
45
  now,
46
46
  textFromUnknown
47
- } from "./chunk-EY52SLOQ.js";
47
+ } from "./chunk-MJT7EW5Q.js";
48
48
  import {
49
49
  createOpenPondRepoApp,
50
50
  getBundledRuntimeVersion,
@@ -56,7 +56,7 @@ import {
56
56
  streamOpenPondHostedChatTurn,
57
57
  switchOpenPondAccount,
58
58
  updateOpenPondAccountConfig
59
- } from "./chunk-2GV3QBBZ.js";
59
+ } from "./chunk-MSX2J653.js";
60
60
  import {
61
61
  AccountStateSchema,
62
62
  AppPreferencesSchema,
@@ -178,6 +178,7 @@ import {
178
178
  PatchLocalAgentScheduleRequestSchema,
179
179
  PatchSessionRequestSchema,
180
180
  PatchSidebarAppPreferenceRequestSchema,
181
+ PatchSidebarFileBookmarkRequestSchema,
181
182
  PatchTaskCandidateRequestSchema,
182
183
  PersonalizationSettingsSchema,
183
184
  PreviewLocalProjectCloudSourceRequestSchema,
@@ -317,6 +318,7 @@ import {
317
318
  nextCreateImproveRunRevision,
318
319
  normalizeOpenPondGoalStatus,
319
320
  normalizeSandboxApiUrl,
321
+ normalizeSidebarFilePath,
320
322
  readProfileSkill,
321
323
  readSourceUploadCache,
322
324
  renameActiveProfileAgent,
@@ -328,9 +330,10 @@ import {
328
330
  saveGlobalConfig,
329
331
  saveProfilePushStatus,
330
332
  selectPreferredRftSignalReport,
333
+ sidebarFileBookmarkId,
331
334
  workspacePathFromLocalPathWorkspaceId,
332
335
  writeSourceUploadCache
333
- } from "./chunk-SECNDLPQ.js";
336
+ } from "./chunk-7IPF4X3K.js";
334
337
  import {
335
338
  CONNECTED_APP_PROVIDER_TOOL_NAMES,
336
339
  CONNECTED_APP_TOOL_CALL_ENDPOINT,
@@ -29420,7 +29423,7 @@ import { promises as fs6 } from "node:fs";
29420
29423
  import path8 from "node:path";
29421
29424
 
29422
29425
  // ../server/src/store/store-schema.ts
29423
- var CURRENT_SQLITE_SCHEMA_VERSION = 27;
29426
+ var CURRENT_SQLITE_SCHEMA_VERSION = 28;
29424
29427
  var SQLITE_CREATE_SCHEMA_SQL = `
29425
29428
  CREATE TABLE IF NOT EXISTS sessions (
29426
29429
  id TEXT PRIMARY KEY,
@@ -29531,6 +29534,23 @@ var SQLITE_CREATE_SCHEMA_SQL = `
29531
29534
 
29532
29535
  CREATE INDEX IF NOT EXISTS sidebar_app_preferences_scope_idx ON sidebar_app_preferences(scope);
29533
29536
 
29537
+ CREATE TABLE IF NOT EXISTS sidebar_file_bookmarks (
29538
+ scope TEXT NOT NULL,
29539
+ workspace_kind TEXT NOT NULL,
29540
+ workspace_id TEXT NOT NULL,
29541
+ workspace_name TEXT NOT NULL,
29542
+ file_path TEXT NOT NULL,
29543
+ status TEXT NOT NULL,
29544
+ sort_order INTEGER,
29545
+ source_session_id TEXT,
29546
+ created_at TEXT NOT NULL,
29547
+ updated_at TEXT NOT NULL,
29548
+ PRIMARY KEY (scope, workspace_kind, workspace_id, file_path)
29549
+ );
29550
+
29551
+ CREATE INDEX IF NOT EXISTS sidebar_file_bookmarks_scope_status_order_idx
29552
+ ON sidebar_file_bookmarks(scope, status, sort_order, updated_at);
29553
+
29534
29554
  CREATE TABLE IF NOT EXISTS insight_items (
29535
29555
  id TEXT PRIMARY KEY,
29536
29556
  scope_type TEXT NOT NULL,
@@ -30328,6 +30348,28 @@ async function createDatasetImportTables(input) {
30328
30348
  `);
30329
30349
  }
30330
30350
 
30351
+ // ../server/src/store/store-sidebar-file-bookmark-schema.ts
30352
+ async function createSidebarFileBookmarkTables(exec) {
30353
+ await exec(`
30354
+ CREATE TABLE IF NOT EXISTS sidebar_file_bookmarks (
30355
+ scope TEXT NOT NULL,
30356
+ workspace_kind TEXT NOT NULL,
30357
+ workspace_id TEXT NOT NULL,
30358
+ workspace_name TEXT NOT NULL,
30359
+ file_path TEXT NOT NULL,
30360
+ status TEXT NOT NULL,
30361
+ sort_order INTEGER,
30362
+ source_session_id TEXT,
30363
+ created_at TEXT NOT NULL,
30364
+ updated_at TEXT NOT NULL,
30365
+ PRIMARY KEY (scope, workspace_kind, workspace_id, file_path)
30366
+ );
30367
+
30368
+ CREATE INDEX IF NOT EXISTS sidebar_file_bookmarks_scope_status_order_idx
30369
+ ON sidebar_file_bookmarks(scope, status, sort_order, updated_at);
30370
+ `);
30371
+ }
30372
+
30331
30373
  // ../server/src/store/sqlite/sqlite-health.ts
30332
30374
  var SQLITE_HEALTH_RETRY_DELAYS_MS = [50, 100, 200, 400, 800];
30333
30375
  var SqliteIntegrityError = class extends Error {
@@ -30398,7 +30440,8 @@ var SQLITE_MIGRATIONS = [
30398
30440
  { version: 24, run: (store) => store.resetLegacySubagentTransportState() },
30399
30441
  { version: 25, run: (store) => store.resetLegacySubagentRuntimeEvents() },
30400
30442
  { version: 26, run: (store) => store.createDatasetImportTables() },
30401
- { version: 27, run: (store) => store.createTasksetBaselineRunTables() }
30443
+ { version: 27, run: (store) => store.createTasksetBaselineRunTables() },
30444
+ { version: 28, run: (store) => store.createSidebarFileBookmarkTables() }
30402
30445
  ];
30403
30446
 
30404
30447
  // ../server/src/store/store-subagent-migrations.ts
@@ -30605,6 +30648,9 @@ var SqliteStoreCore = class {
30605
30648
  async createSchema() {
30606
30649
  await this.exec(SQLITE_CREATE_SCHEMA_SQL);
30607
30650
  }
30651
+ async createSidebarFileBookmarkTables() {
30652
+ await createSidebarFileBookmarkTables((sql) => this.exec(sql));
30653
+ }
30608
30654
  async createHotQueryIndexes() {
30609
30655
  await this.addColumnIfMissing("turns", "provider_turn_id", "TEXT");
30610
30656
  await this.addColumnIfMissing("turns", "status", "TEXT");
@@ -32640,13 +32686,111 @@ function isTerminalCreateImproveRunState(state) {
32640
32686
  return state === "released" || state === "rejected" || state === "ready" || state === "ready_local" || state === "published_hosted" || state === "blocked" || state === "failed" || state === "cancelled";
32641
32687
  }
32642
32688
 
32689
+ // ../server/src/store/store-sidebar-file-bookmarks.ts
32690
+ var SqliteSidebarFileBookmarkStore = class extends SqliteCreateImproveStore {
32691
+ async listSidebarFileBookmarks(scope) {
32692
+ await this.ready;
32693
+ await this.writeQueue;
32694
+ const rows = await this.all(
32695
+ `SELECT workspace_kind, workspace_id, workspace_name, file_path, status, sort_order,
32696
+ source_session_id, created_at, updated_at
32697
+ FROM sidebar_file_bookmarks
32698
+ WHERE scope = ?
32699
+ ORDER BY CASE WHEN sort_order IS NULL THEN 1 ELSE 0 END, sort_order, updated_at DESC`,
32700
+ [scope]
32701
+ );
32702
+ return rows.map((row) => {
32703
+ const workspaceKind = row.workspace_kind === "sandbox" ? "sandbox" : "local";
32704
+ const status = row.status === "saved_for_later" ? "saved_for_later" : "pinned";
32705
+ return {
32706
+ id: sidebarFileBookmarkId({ workspaceKind, workspaceId: row.workspace_id, path: row.file_path }),
32707
+ workspaceKind,
32708
+ workspaceId: row.workspace_id,
32709
+ workspaceName: row.workspace_name,
32710
+ path: row.file_path,
32711
+ status,
32712
+ order: row.sort_order,
32713
+ sourceSessionId: row.source_session_id,
32714
+ available: true,
32715
+ createdAt: row.created_at,
32716
+ updatedAt: row.updated_at
32717
+ };
32718
+ });
32719
+ }
32720
+ async patchSidebarFileBookmark(scope, input) {
32721
+ await this.ready;
32722
+ if (input.status === "none") {
32723
+ const write3 = this.writeQueue.then(() => this.run(
32724
+ `DELETE FROM sidebar_file_bookmarks
32725
+ WHERE scope = ? AND workspace_kind = ? AND workspace_id = ? AND file_path = ?`,
32726
+ [scope, input.workspaceKind, input.workspaceId, input.path]
32727
+ ));
32728
+ this.writeQueue = write3.then(() => void 0, () => void 0);
32729
+ await write3;
32730
+ return null;
32731
+ }
32732
+ const status = input.status;
32733
+ let bookmark = null;
32734
+ const write2 = this.writeQueue.then(async () => {
32735
+ const timestamp2 = now();
32736
+ const existing = await this.get(
32737
+ `SELECT created_at FROM sidebar_file_bookmarks
32738
+ WHERE scope = ? AND workspace_kind = ? AND workspace_id = ? AND file_path = ?`,
32739
+ [scope, input.workspaceKind, input.workspaceId, input.path]
32740
+ );
32741
+ const createdAt = existing?.created_at ?? timestamp2;
32742
+ await this.run(
32743
+ `INSERT INTO sidebar_file_bookmarks (
32744
+ scope, workspace_kind, workspace_id, workspace_name, file_path, status,
32745
+ sort_order, source_session_id, created_at, updated_at
32746
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
32747
+ ON CONFLICT(scope, workspace_kind, workspace_id, file_path)
32748
+ DO UPDATE SET
32749
+ workspace_name = excluded.workspace_name,
32750
+ status = excluded.status,
32751
+ sort_order = excluded.sort_order,
32752
+ source_session_id = COALESCE(excluded.source_session_id, sidebar_file_bookmarks.source_session_id),
32753
+ updated_at = excluded.updated_at`,
32754
+ [
32755
+ scope,
32756
+ input.workspaceKind,
32757
+ input.workspaceId,
32758
+ input.workspaceName,
32759
+ input.path,
32760
+ status,
32761
+ input.order ?? null,
32762
+ input.sourceSessionId ?? null,
32763
+ createdAt,
32764
+ timestamp2
32765
+ ]
32766
+ );
32767
+ bookmark = {
32768
+ id: sidebarFileBookmarkId(input),
32769
+ workspaceKind: input.workspaceKind,
32770
+ workspaceId: input.workspaceId,
32771
+ workspaceName: input.workspaceName,
32772
+ path: input.path,
32773
+ status,
32774
+ order: input.order ?? null,
32775
+ sourceSessionId: input.sourceSessionId ?? null,
32776
+ available: true,
32777
+ createdAt,
32778
+ updatedAt: timestamp2
32779
+ };
32780
+ });
32781
+ this.writeQueue = write2.catch(() => void 0);
32782
+ await write2;
32783
+ return bookmark;
32784
+ }
32785
+ };
32786
+
32643
32787
  // ../server/src/store/store.ts
32644
32788
  var NON_TERMINAL_SUBAGENT_STATUSES = [
32645
32789
  "queued",
32646
32790
  "running",
32647
32791
  "needs_resume"
32648
32792
  ];
32649
- var SqliteStore = class extends SqliteCreateImproveStore {
32793
+ var SqliteStore = class extends SqliteSidebarFileBookmarkStore {
32650
32794
  async snapshot() {
32651
32795
  await this.ready;
32652
32796
  await this.writeQueue;
@@ -36719,6 +36863,7 @@ async function loadCodexHistoryThreads(options = {}) {
36719
36863
  updatedAt: latestIso([tailStatus.latestMessageAt, updatedAt]),
36720
36864
  status: tailStatus.status,
36721
36865
  pinned: false,
36866
+ savedForLater: false,
36722
36867
  archived: file.archived,
36723
36868
  order
36724
36869
  }
@@ -37903,6 +38048,7 @@ function applyCodexHistorySidebarPreference(session, preferences) {
37903
38048
  return {
37904
38049
  ...session,
37905
38050
  ...typeof preference.pinned === "boolean" ? { pinned: preference.pinned } : {},
38051
+ ...typeof preference.savedForLater === "boolean" ? { savedForLater: preference.savedForLater } : {},
37906
38052
  ...typeof preference.archived === "boolean" ? { archived: preference.archived } : {},
37907
38053
  ...typeof preference.order === "number" ? { order: preference.order } : {},
37908
38054
  ...preference.title ? { title: preference.title } : {}
@@ -37911,11 +38057,20 @@ function applyCodexHistorySidebarPreference(session, preferences) {
37911
38057
  function mergePreferencePatch(existing, input) {
37912
38058
  const next2 = { ...existing };
37913
38059
  if (typeof input.pinned === "boolean") next2.pinned = input.pinned;
38060
+ if (typeof input.savedForLater === "boolean") next2.savedForLater = input.savedForLater;
37914
38061
  if (typeof input.archived === "boolean") next2.archived = input.archived;
37915
38062
  if (typeof input.order === "number") next2.order = input.order;
37916
38063
  if (typeof input.title === "string") next2.title = input.title;
37917
- if (input.pinned === true) next2.archived = false;
37918
- if (input.archived === true) next2.pinned = false;
38064
+ if (input.archived === true) {
38065
+ next2.pinned = false;
38066
+ next2.savedForLater = false;
38067
+ } else if (input.savedForLater === true) {
38068
+ next2.pinned = false;
38069
+ next2.archived = false;
38070
+ } else if (input.pinned === true) {
38071
+ next2.savedForLater = false;
38072
+ next2.archived = false;
38073
+ }
37919
38074
  return next2;
37920
38075
  }
37921
38076
  function normalizePreference(value) {
@@ -37923,7 +38078,8 @@ function normalizePreference(value) {
37923
38078
  const input = value;
37924
38079
  const preference = {};
37925
38080
  if (typeof input.pinned === "boolean") preference.pinned = input.pinned;
37926
- if (typeof input.archived === "boolean") preference.archived = input.pinned === true ? false : input.archived;
38081
+ if (typeof input.savedForLater === "boolean") preference.savedForLater = input.savedForLater;
38082
+ if (typeof input.archived === "boolean") preference.archived = input.archived;
37927
38083
  if (typeof input.order === "number" && Number.isFinite(input.order)) preference.order = input.order;
37928
38084
  if (typeof input.title === "string") {
37929
38085
  const title = input.title.trim();
@@ -37932,7 +38088,14 @@ function normalizePreference(value) {
37932
38088
  if (typeof input.updatedAt === "string" && Number.isFinite(Date.parse(input.updatedAt))) {
37933
38089
  preference.updatedAt = input.updatedAt;
37934
38090
  }
37935
- if (preference.archived === true) preference.pinned = false;
38091
+ if (preference.archived === true) {
38092
+ preference.pinned = false;
38093
+ preference.savedForLater = false;
38094
+ } else if (preference.savedForLater === true) {
38095
+ preference.pinned = false;
38096
+ } else if (preference.pinned === true) {
38097
+ preference.savedForLater = false;
38098
+ }
37936
38099
  return preference;
37937
38100
  }
37938
38101
 
@@ -45921,7 +46084,10 @@ function createServerPayloads(deps) {
45921
46084
  ]);
45922
46085
  const linkedLocalProjects = await inferLocalProjectOpenPondLinks(localProjects, openPond.apps);
45923
46086
  const scope = openPondCacheScope(openPond.account);
45924
- const sidebarAppPreferences = await store.getSidebarAppPreferences(scope);
46087
+ const [sidebarAppPreferences, sidebarFileBookmarks] = await Promise.all([
46088
+ store.getSidebarAppPreferences(scope),
46089
+ listSidebarFileBookmarksForScope(scope)
46090
+ ]);
45925
46091
  const payload = {
45926
46092
  server: {
45927
46093
  id: serverId,
@@ -45947,6 +46113,7 @@ function createServerPayloads(deps) {
45947
46113
  )
45948
46114
  ),
45949
46115
  sidebarAppPreferences,
46116
+ sidebarFileBookmarks,
45950
46117
  appsError: openPond.appsError,
45951
46118
  appsMeta: openPond.appsMeta,
45952
46119
  accountMeta: openPond.accountMeta,
@@ -46645,6 +46812,42 @@ Uploaded from OpenPond Desktop.
46645
46812
  const context = await loadOpenPondAccountContext();
46646
46813
  return openPondCacheScope(context.accountState);
46647
46814
  }
46815
+ async function resolveSidebarFileAvailability(item2) {
46816
+ try {
46817
+ if (item2.workspaceKind === "local") {
46818
+ await workspacePayloads.workspaceFilePayload(item2.workspaceId, item2.path);
46819
+ } else {
46820
+ await sandboxRequestPayload({
46821
+ type: "stat_file",
46822
+ sandboxId: item2.workspaceId,
46823
+ payload: { path: item2.path }
46824
+ });
46825
+ }
46826
+ return true;
46827
+ } catch {
46828
+ return false;
46829
+ }
46830
+ }
46831
+ async function listSidebarFileBookmarksForScope(scope) {
46832
+ const items = await store.listSidebarFileBookmarks(scope);
46833
+ return Promise.all(items.map(async (item2) => ({
46834
+ ...item2,
46835
+ available: await resolveSidebarFileAvailability(item2)
46836
+ })));
46837
+ }
46838
+ async function listSidebarFileBookmarksPayload() {
46839
+ return { items: await listSidebarFileBookmarksForScope(await currentSidebarScope()) };
46840
+ }
46841
+ async function patchSidebarFileBookmarkPayload(payload) {
46842
+ const parsed = PatchSidebarFileBookmarkRequestSchema.parse(payload);
46843
+ const input = {
46844
+ ...parsed,
46845
+ path: normalizeSidebarFilePath(parsed.path)
46846
+ };
46847
+ const scope = await currentSidebarScope();
46848
+ await store.patchSidebarFileBookmark(scope, input);
46849
+ return { items: await listSidebarFileBookmarksForScope(scope) };
46850
+ }
46648
46851
  async function patchSidebarAppPreference(appId, payload) {
46649
46852
  const input = PatchSidebarAppPreferenceRequestSchema.parse(payload);
46650
46853
  return store.patchSidebarAppPreference(await currentSidebarScope(), appId, input);
@@ -46786,6 +46989,8 @@ Uploaded from OpenPond Desktop.
46786
46989
  openCloudWorkItemPayload,
46787
46990
  applyCloudWorkItemLocalPatchPayload,
46788
46991
  patchSidebarAppPreference,
46992
+ listSidebarFileBookmarksPayload,
46993
+ patchSidebarFileBookmarkPayload,
46789
46994
  reorderSidebarApps,
46790
46995
  refreshOpenPondPayload,
46791
46996
  loadMoreOpenPondAppsPayload,
@@ -48338,6 +48543,7 @@ function createSessionStore(deps) {
48338
48543
  updatedAt: createdAt,
48339
48544
  status: "idle",
48340
48545
  pinned: false,
48546
+ savedForLater: false,
48341
48547
  archived: false,
48342
48548
  order: sessionCount
48343
48549
  };
@@ -48357,11 +48563,14 @@ function createSessionStore(deps) {
48357
48563
  const input = PatchSessionRequestSchema.parse(payload);
48358
48564
  const updated = await store.updateSession(
48359
48565
  sessionId,
48360
- (session) => normalizeSessionCommandAccess({
48361
- ...session,
48362
- ...input,
48363
- updatedAt: session.updatedAt
48364
- })
48566
+ (session) => normalizeSession(
48567
+ {
48568
+ ...session,
48569
+ ...input,
48570
+ updatedAt: session.updatedAt
48571
+ },
48572
+ input
48573
+ )
48365
48574
  );
48366
48575
  if (!updated) throw new Error("Session not found");
48367
48576
  return updated;
@@ -48369,12 +48578,12 @@ function createSessionStore(deps) {
48369
48578
  async function getSession(sessionId) {
48370
48579
  const session = await store.getSession(sessionId);
48371
48580
  if (!session) throw new Error("Session not found");
48372
- return normalizeSessionCommandAccess(session);
48581
+ return normalizeSession(session);
48373
48582
  }
48374
48583
  async function updateSession(sessionId, patch) {
48375
48584
  const updated = await store.updateSession(
48376
48585
  sessionId,
48377
- (session) => normalizeSessionCommandAccess({
48586
+ (session) => normalizeSession({
48378
48587
  ...session,
48379
48588
  ...patch,
48380
48589
  updatedAt: now()
@@ -48456,13 +48665,37 @@ function createSessionStore(deps) {
48456
48665
  interruptTurn
48457
48666
  };
48458
48667
  }
48459
- function normalizeSessionCommandAccess(session) {
48668
+ function normalizeSession(session, sidebarPatch) {
48460
48669
  const parsed = OpenPondCommandAccessModeSchema.safeParse(
48461
48670
  session.openPondCommandAccessMode
48462
48671
  );
48672
+ let pinned = Boolean(session.pinned);
48673
+ let savedForLater = Boolean(session.savedForLater);
48674
+ let archived = Boolean(session.archived);
48675
+ if (sidebarPatch?.archived === true) {
48676
+ pinned = false;
48677
+ savedForLater = false;
48678
+ archived = true;
48679
+ } else if (sidebarPatch?.savedForLater === true) {
48680
+ pinned = false;
48681
+ savedForLater = true;
48682
+ archived = false;
48683
+ } else if (sidebarPatch?.pinned === true) {
48684
+ pinned = true;
48685
+ savedForLater = false;
48686
+ archived = false;
48687
+ } else if (archived) {
48688
+ pinned = false;
48689
+ savedForLater = false;
48690
+ } else if (savedForLater) {
48691
+ pinned = false;
48692
+ }
48463
48693
  return {
48464
48694
  ...session,
48465
- openPondCommandAccessMode: parsed.success ? parsed.data : DEFAULT_OPENPOND_COMMAND_ACCESS_MODE
48695
+ openPondCommandAccessMode: parsed.success ? parsed.data : DEFAULT_OPENPOND_COMMAND_ACCESS_MODE,
48696
+ pinned,
48697
+ savedForLater,
48698
+ archived
48466
48699
  };
48467
48700
  }
48468
48701
 
@@ -52072,6 +52305,8 @@ async function handleWorkspaceRoutes({ deps, request, requestUrl, response }) {
52072
52305
  restartWorkspaceLspPayload,
52073
52306
  reorderSidebarApps,
52074
52307
  patchSidebarAppPreference,
52308
+ listSidebarFileBookmarksPayload,
52309
+ patchSidebarFileBookmarkPayload,
52075
52310
  workspaceStatePayload,
52076
52311
  createWorkspaceBranchPayload,
52077
52312
  checkoutWorkspaceBranchPayload,
@@ -52098,6 +52333,14 @@ async function handleWorkspaceRoutes({ deps, request, requestUrl, response }) {
52098
52333
  sendJson(response, 200, await reorderSidebarApps(await readJson(request)));
52099
52334
  return true;
52100
52335
  }
52336
+ if (request.method === "GET" && requestUrl.pathname === "/v1/sidebar/files") {
52337
+ sendJson(response, 200, await listSidebarFileBookmarksPayload());
52338
+ return true;
52339
+ }
52340
+ if (request.method === "PATCH" && requestUrl.pathname === "/v1/sidebar/files") {
52341
+ sendJson(response, 200, await patchSidebarFileBookmarkPayload(await readJson(request)));
52342
+ return true;
52343
+ }
52101
52344
  const sidebarAppPatchMatch = /^\/v1\/sidebar\/apps\/([^/]+)$/.exec(requestUrl.pathname);
52102
52345
  if (request.method === "PATCH" && sidebarAppPatchMatch) {
52103
52346
  sendJson(
@@ -59757,6 +60000,34 @@ function createOpenPondCapabilityModelToolDefinitions(deps) {
59757
60000
  }
59758
60001
  }
59759
60002
  ];
60003
+ if (deps.manageSidebarFile) {
60004
+ definitions.push({
60005
+ name: "manage_sidebar_file",
60006
+ description: "Pin, save for later, remove, or list workspace files in the user's sidebar. Use only when the user explicitly asks to manage a file in the sidebar.",
60007
+ parameters: {
60008
+ type: "object",
60009
+ additionalProperties: false,
60010
+ properties: {
60011
+ action: {
60012
+ type: "string",
60013
+ enum: ["pin", "save_for_later", "remove", "list"],
60014
+ description: "The sidebar file action to perform."
60015
+ },
60016
+ path: {
60017
+ type: "string",
60018
+ minLength: 1,
60019
+ description: "Workspace-relative file path. Required unless action is list."
60020
+ }
60021
+ },
60022
+ required: ["action"]
60023
+ },
60024
+ execute: async (context) => {
60025
+ const input = manageSidebarFileToolInput(context.args);
60026
+ const result = await deps.manageSidebarFile(context, input);
60027
+ return manageSidebarFileToolResult(context.callId, result);
60028
+ }
60029
+ });
60030
+ }
59760
60031
  if (deps.startSubagent) {
59761
60032
  definitions.push({
59762
60033
  name: "openpond_subagent_start",
@@ -60012,6 +60283,33 @@ function goalControlToolInput(args) {
60012
60283
  reason: stringArg3(args, "reason")
60013
60284
  };
60014
60285
  }
60286
+ function manageSidebarFileToolInput(args) {
60287
+ const action = args.action;
60288
+ if (action !== "pin" && action !== "save_for_later" && action !== "remove" && action !== "list") {
60289
+ throw new Error("action must be pin, save_for_later, remove, or list");
60290
+ }
60291
+ const path76 = optionalStringArg(args, "path");
60292
+ if (action !== "list" && !path76) throw new Error("path is required for this action");
60293
+ return { action, ...path76 ? { path: path76 } : {} };
60294
+ }
60295
+ function manageSidebarFileToolResult(callId, result) {
60296
+ return {
60297
+ toolCallId: callId,
60298
+ name: "manage_sidebar_file",
60299
+ ok: true,
60300
+ contentText: JSON.stringify(
60301
+ {
60302
+ ok: true,
60303
+ action: "manage_sidebar_file",
60304
+ output: result.nextStep,
60305
+ data: result
60306
+ },
60307
+ null,
60308
+ 2
60309
+ ),
60310
+ data: result
60311
+ };
60312
+ }
60015
60313
  function goalControlToolResult(callId, result) {
60016
60314
  return {
60017
60315
  toolCallId: callId,
@@ -60250,6 +60548,7 @@ function createCapabilityCatalogRuntime(deps) {
60250
60548
  const handlers = {
60251
60549
  startCreateImprove: deps.handlers.startCreateImprove,
60252
60550
  startGoalControl: deps.handlers.startGoalControl,
60551
+ ...deps.handlers.manageSidebarFile ? { manageSidebarFile: deps.handlers.manageSidebarFile } : {},
60253
60552
  ...deps.handlers.startProfileSkillGoal ? { startProfileSkillGoal: deps.handlers.startProfileSkillGoal } : {},
60254
60553
  ...deps.subagentToolsAvailable() && options.subagentToolsEnabled !== false ? {
60255
60554
  startSubagent: deps.handlers.startSubagent,
@@ -64919,7 +65218,7 @@ function uniqueEvidence(run, evidence) {
64919
65218
  }
64920
65219
  async function verifyAppliedProfileCommit(input) {
64921
65220
  const command = input.command ?? (async (name, args, cwd, env) => {
64922
- const { runWorkspaceCommand } = await import("./workspaces-LO44JAC2.js");
65221
+ const { runWorkspaceCommand } = await import("./workspaces-2N52V3BI.js");
64923
65222
  return runWorkspaceCommand(name, args, cwd, env);
64924
65223
  });
64925
65224
  const result = await command("git", ["rev-parse", "HEAD"], input.repoPath);
@@ -70038,6 +70337,7 @@ function createTurnRunner(deps) {
70038
70337
  executeWebSearch,
70039
70338
  executeConnectedAppTool,
70040
70339
  browserToolExecutor,
70340
+ manageSidebarFile,
70041
70341
  listIntegrationConnections,
70042
70342
  loadPersonalizationSoul,
70043
70343
  loadAppPreferences = async () => AppPreferencesSchema.parse({}),
@@ -70452,7 +70752,14 @@ function createTurnRunner(deps) {
70452
70752
  joinSubagent: joinSubagentFromModelTool,
70453
70753
  cancelSubagent: cancelSubagentFromModelTool,
70454
70754
  followupSubagent: followupSubagentFromModelTool,
70455
- sendSubagentMessage: sendSubagentMessageFromModelTool
70755
+ sendSubagentMessage: sendSubagentMessageFromModelTool,
70756
+ ...manageSidebarFile ? {
70757
+ manageSidebarFile: (context, input) => manageSidebarFile({
70758
+ session: context.session,
70759
+ action: input.action,
70760
+ path: input.path
70761
+ })
70762
+ } : {}
70456
70763
  },
70457
70764
  subagentToolsAvailable,
70458
70765
  hostedToolFlags,
@@ -82612,8 +82919,9 @@ function createTaskCreatorService(deps) {
82612
82919
  for (const snapshot of snapshots) {
82613
82920
  if (!["planning", "materializing", "validating"].includes(snapshot.state)) continue;
82614
82921
  if ((snapshot.state === "materializing" || snapshot.state === "validating") && snapshot.proposal) {
82615
- const tasksetId = safeTasksetId(snapshot.proposal.name, snapshot.id);
82616
- if (await deps.store.getTaskset(tasksetId)) {
82922
+ const tasksetId = materializedTasksetId(snapshot, snapshot.proposal);
82923
+ const taskset = await deps.store.getTaskset(tasksetId);
82924
+ if (taskset?.metadata.creationSnapshotId === snapshot.id) {
82617
82925
  await persist({
82618
82926
  ...snapshot,
82619
82927
  state: "ready",
@@ -82690,6 +82998,17 @@ function createTaskCreatorService(deps) {
82690
82998
  return estimates;
82691
82999
  }
82692
83000
  async function start(input) {
83001
+ if (input.resourceIntent === "dataset" && input.targetIntent?.operation === "improve") {
83002
+ const targetId = input.targetIntent.id;
83003
+ if (!targetId) {
83004
+ throw new Error("Editing a Dataset requires its existing Dataset ID.");
83005
+ }
83006
+ const target = await deps.store.getTaskset(targetId);
83007
+ if (!target) throw new Error(`Dataset ${targetId} was not found.`);
83008
+ if (target.profileId !== input.profileId) {
83009
+ throw new Error("Dataset profile does not match the active Profile.");
83010
+ }
83011
+ }
82693
83012
  const sources = await requireSources(input.profileId, input.sourceIds);
82694
83013
  assertSourcesEligible(sources);
82695
83014
  const timestamp2 = now();
@@ -82916,10 +83235,15 @@ function createTaskCreatorService(deps) {
82916
83235
  const tasks = taskRecords(proposal, sources);
82917
83236
  const agentTarget = snapshot.request.targetIntent.kind === "agent";
82918
83237
  const timestamp2 = now();
82919
- const tasksetId = safeTasksetId(proposal.name, snapshot.id);
83238
+ const tasksetId = materializedTasksetId(snapshot, proposal);
83239
+ const existingTaskset = snapshot.request.resourceIntent === "dataset" && snapshot.request.targetIntent.operation === "improve" ? await deps.store.getTaskset(tasksetId) : null;
83240
+ if (snapshot.request.resourceIntent === "dataset" && snapshot.request.targetIntent.operation === "improve" && !existingTaskset) {
83241
+ throw new Error(`Dataset ${tasksetId} was not found.`);
83242
+ }
82920
83243
  const draft = {
82921
83244
  schemaVersion: "openpond.taskset.v1",
82922
83245
  id: tasksetId,
83246
+ revision: existingTaskset ? existingTaskset.revision + 1 : 1,
82923
83247
  profileId: snapshot.request.profileId,
82924
83248
  createImproveRunId: snapshot.request.createImproveRunId,
82925
83249
  name: proposal.name,
@@ -82988,10 +83312,14 @@ function createTaskCreatorService(deps) {
82988
83312
  authoringProvenance: { schemaVersion: "openpond.taskAuthoringProvenance.v1", model: snapshot.request.analysisModel, modelConfig: snapshot.request.analysisReasoningEffort ? { reasoningEffort: snapshot.request.analysisReasoningEffort } : {}, skillHash: deps.authoringSkillHash, promptTemplateVersion: "task-authoring.v2", evidenceHashes: sources.map((source) => source.sourceHash), tasksetSdkVersion: "0.0.1", sourceCommit: profile.git?.head ?? null, repairHistory: snapshot.repairHistory, createdAt: timestamp2 },
82989
83313
  readiness: null,
82990
83314
  contentHash: "",
82991
- createdAt: timestamp2,
83315
+ createdAt: existingTaskset?.createdAt ?? timestamp2,
82992
83316
  updatedAt: timestamp2,
82993
83317
  metadata: {
82994
83318
  creationSnapshotId: snapshot.id,
83319
+ ...existingTaskset ? {
83320
+ previousRevision: existingTaskset.revision,
83321
+ previousContentHash: existingTaskset.contentHash
83322
+ } : {},
82995
83323
  resourceIntent: snapshot.request.resourceIntent,
82996
83324
  targetIntent: snapshot.request.targetIntent,
82997
83325
  privateMaterialManaged: true,
@@ -83297,6 +83625,15 @@ function conciseName(objective) {
83297
83625
  "Training Taskset"
83298
83626
  );
83299
83627
  }
83628
+ function materializedTasksetId(snapshot, proposal) {
83629
+ if (snapshot.request.resourceIntent === "dataset" && snapshot.request.targetIntent.operation === "improve") {
83630
+ if (!snapshot.request.targetIntent.id) {
83631
+ throw new Error("Editing a Dataset requires its existing Dataset ID.");
83632
+ }
83633
+ return snapshot.request.targetIntent.id;
83634
+ }
83635
+ return safeTasksetId(proposal.name, snapshot.id);
83636
+ }
83300
83637
  function safeTasksetId(name, snapshotId) {
83301
83638
  const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 48) || "taskset";
83302
83639
  return `${slug}-${contentHash(snapshotId).slice(0, 8)}`;
@@ -103375,6 +103712,8 @@ async function createOpenPondServer(options = {}) {
103375
103712
  openCloudWorkItemPayload,
103376
103713
  applyCloudWorkItemLocalPatchPayload,
103377
103714
  patchSidebarAppPreference,
103715
+ listSidebarFileBookmarksPayload,
103716
+ patchSidebarFileBookmarkPayload,
103378
103717
  reorderSidebarApps,
103379
103718
  refreshOpenPondPayload,
103380
103719
  loadMoreOpenPondAppsPayload,
@@ -103896,6 +104235,40 @@ ${grader.rubric}`
103896
104235
  executeWebSearch: executeWebSearch ?? void 0,
103897
104236
  executeConnectedAppTool,
103898
104237
  browserToolExecutor: browserControlQueue.executor,
104238
+ manageSidebarFile: async ({ session, action, path: requestedPath }) => {
104239
+ if (action === "list") {
104240
+ const response2 = await listSidebarFileBookmarksPayload();
104241
+ return {
104242
+ ...response2,
104243
+ changed: null,
104244
+ nextStep: response2.items.length === 0 ? "There are no pinned or saved files." : `Listed ${response2.items.length} sidebar file${response2.items.length === 1 ? "" : "s"}.`
104245
+ };
104246
+ }
104247
+ const path76 = normalizeSidebarFilePath(requestedPath ?? "");
104248
+ const workspaceId = session.workspaceId ?? session.localProjectId ?? session.appId;
104249
+ if (!workspaceId) {
104250
+ throw new Error("This chat is not attached to a workspace, so it cannot manage a workspace file.");
104251
+ }
104252
+ const workspaceKind = session.workspaceKind === "local_project" ? "local" : "sandbox";
104253
+ const workspaceName = session.workspaceName ?? session.appName ?? session.title ?? workspaceId;
104254
+ const response = await patchSidebarFileBookmarkPayload({
104255
+ workspaceKind,
104256
+ workspaceId,
104257
+ workspaceName,
104258
+ path: path76,
104259
+ status: action === "pin" ? "pinned" : action === "save_for_later" ? "saved_for_later" : "none",
104260
+ sourceSessionId: session.id
104261
+ });
104262
+ const changed = response.items.find(
104263
+ (item2) => item2.workspaceKind === workspaceKind && item2.workspaceId === workspaceId && item2.path === path76
104264
+ ) ?? null;
104265
+ const verb = action === "pin" ? "Pinned" : action === "save_for_later" ? "Saved" : "Removed";
104266
+ return {
104267
+ ...response,
104268
+ changed,
104269
+ nextStep: `${verb} ${path76}${action === "save_for_later" ? " for later" : ""}.`
104270
+ };
104271
+ },
103899
104272
  listIntegrationConnections: listSandboxIntegrationConnections,
103900
104273
  loadPersonalizationSoul: async () => (await loadPersonalizationSettings(store, storeDir)).soul,
103901
104274
  loadAppPreferences,
@@ -104512,6 +104885,8 @@ ${grader.rubric}`
104512
104885
  updatePersonalizationPayload,
104513
104886
  reorderSidebarApps,
104514
104887
  patchSidebarAppPreference,
104888
+ listSidebarFileBookmarksPayload,
104889
+ patchSidebarFileBookmarkPayload,
104515
104890
  workspaceStatePayload,
104516
104891
  createWorkspaceBranchPayload,
104517
104892
  checkoutWorkspaceBranchPayload,