dorkos 0.88.0 → 0.89.0

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 (104) hide show
  1. package/core-extensions/linear-issues/index.ts +1 -1
  2. package/dist/bin/cli.js +610 -48
  3. package/dist/client/assets/{AboutPage-xqba6OSc.js → AboutPage-BXOwVTO0.js} +1 -1
  4. package/dist/client/assets/{AdapterIcon-BfxdKjYz.js → AdapterIcon-Bs0C7eSH.js} +1 -1
  5. package/dist/client/assets/{AppearancePage-MXRyK6j4.js → AppearancePage-C0FZ72U0.js} +1 -1
  6. package/dist/client/assets/{BaseTanStackRouterDevtoolsPanel-B-iktbLX-D6lj5D9_.js → BaseTanStackRouterDevtoolsPanel-B-iktbLX-BRr08I-_.js} +3 -3
  7. package/dist/client/assets/{BlintzCanvas-BmTo8WiT.js → BlintzCanvas-DCLSn9jx.js} +23 -23
  8. package/dist/client/assets/{CanvasCsvContent-C57uDWEL.js → CanvasCsvContent-CGQsl4FY.js} +1 -1
  9. package/dist/client/assets/{CanvasFileContent-1qt_NtYW.js → CanvasFileContent-CqLAG04I.js} +2 -2
  10. package/dist/client/assets/{CanvasModel3dContent-CJ2bwQjt.js → CanvasModel3dContent-DkPwdlTD.js} +2 -2
  11. package/dist/client/assets/{CodeMirrorDiff-6LU4OiJj.js → CodeMirrorDiff-BkTLxJoa.js} +1 -1
  12. package/dist/client/assets/{CodeMirrorEditor-Jq49Np0j.js → CodeMirrorEditor-CIgTB7Sa.js} +1 -1
  13. package/dist/client/assets/ConnectionAccessLists-BNgZnsD7.js +1 -0
  14. package/dist/client/assets/{ConnectionsPage-BAcGLK2V.js → ConnectionsPage-BlE8iku_.js} +2 -2
  15. package/dist/client/assets/{ConventionPage-DdKmGIcU.js → ConventionPage-DQZsWbi1.js} +3 -3
  16. package/dist/client/assets/{FloatingTanStackRouterDevtools-CqogiFob-9LderCq4.js → FloatingTanStackRouterDevtools-CqogiFob-De2qH2l6.js} +1 -1
  17. package/dist/client/assets/HandlePage-BXDfRIy3.js +1 -0
  18. package/dist/client/assets/{LexicalField-DsPLNKLN.js → LexicalField-C_3WYQGQ.js} +1 -1
  19. package/dist/client/assets/{ManagesPage-C34dzjEv.js → ManagesPage-DFFt9mh7.js} +1 -1
  20. package/dist/client/assets/{Model3dViewer-PXpUR_oW.js → Model3dViewer-CqkgfgBg.js} +1 -1
  21. package/dist/client/assets/NamePage-Qtv820fs.js +1 -0
  22. package/dist/client/assets/{NotificationsPage-CTPdo_E9.js → NotificationsPage-CX4b6MCK.js} +1 -1
  23. package/dist/client/assets/{PermissionsPage-Ij8O_uFN.js → PermissionsPage-B7CCInRo.js} +1 -1
  24. package/dist/client/assets/{PersonalityPopover-D0pS2YVR.js → PersonalityPopover-BOphzXEY.js} +1 -1
  25. package/dist/client/assets/PhotoPage-DgXAydiI.js +1 -0
  26. package/dist/client/assets/{RoomsPage-C_jMQGJC.js → RoomsPage-_DIjKTpi.js} +1 -1
  27. package/dist/client/assets/RunsOnPopover-DOsGV_7l.js +1 -0
  28. package/dist/client/assets/SessionsPage-BOsRKUqZ.js +6 -0
  29. package/dist/client/assets/{SkillsPage-CSUclnmu.js → SkillsPage-seFT2etr.js} +1 -1
  30. package/dist/client/assets/{TasksPage-COCsTj5k.js → TasksPage-Imt9oPoi.js} +1 -1
  31. package/dist/client/assets/{ToolsPage-CIgwvhZM.js → ToolsPage-CGM0Jiil.js} +2 -2
  32. package/dist/client/assets/{TopologyGraph-BOcP_UPd.js → TopologyGraph-vhFyjSzJ.js} +1 -1
  33. package/dist/client/assets/{agent-browser-Cm6bXvCt.js → agent-browser-B6WqW-og.js} +1 -1
  34. package/dist/client/assets/airtable-B7_XMoPM.png +0 -0
  35. package/dist/client/assets/{highlighted-body-KPVGNVTW-CmLzbGDT.js → highlighted-body-KPVGNVTW-DkoFzbOS.js} +1 -1
  36. package/dist/client/assets/hubspot-BQJQ5DfV.png +0 -0
  37. package/dist/client/assets/{index-C7jBVjvK.js → index-BFoejqZA.js} +1 -1
  38. package/dist/client/assets/{index-BndjtRZA.js → index-BMUNBDCe.js} +1 -1
  39. package/dist/client/assets/index-BY3yxmfx.js +1 -0
  40. package/dist/client/assets/index-BiDsr32v.js +1 -0
  41. package/dist/client/assets/{index-Cd9I6lUD.js → index-BmbhktM1.js} +1 -1
  42. package/dist/client/assets/{index-CQzyikQJ.js → index-Br_-H83G.js} +1 -1
  43. package/dist/client/assets/{index-D1Y7OlGq.js → index-BsXXogDR.js} +2 -2
  44. package/dist/client/assets/{index-DArP7LVM.js → index-C55PP6X5.js} +1 -1
  45. package/dist/client/assets/{index-CLJKvTfN.js → index-C79__bWb.js} +1 -1
  46. package/dist/client/assets/{index-wIEie2VH.js → index-CCelL1vs.js} +1 -1
  47. package/dist/client/assets/{index-CRom-Nt5.js → index-CMh3FD3Q.js} +1 -1
  48. package/dist/client/assets/{index-B5b98af8.js → index-CbAiJmOw.js} +1 -1
  49. package/dist/client/assets/{index-r8MCK2Zn.js → index-Ciuu1JwG.js} +1 -1
  50. package/dist/client/assets/{index-D_3Gtukh.js → index-CmezFzDD.js} +1 -1
  51. package/dist/client/assets/{index-CqP01Nbn.js → index-D-IcFrZb.js} +1 -1
  52. package/dist/client/assets/{index-B9kyvuKW.js → index-D0Q-sDBn.js} +1 -1
  53. package/dist/client/assets/{index-DOZ6l8Os.js → index-D7L3s5xT.js} +1 -1
  54. package/dist/client/assets/{index-mHL0gmHU.js → index-D8qzXtVa.js} +3 -3
  55. package/dist/client/assets/{index-D6Noae7w.js → index-DA2x36Z1.js} +1 -1
  56. package/dist/client/assets/{index-DrRfKYSH.js → index-DAogWPwG.js} +1 -1
  57. package/dist/client/assets/{index-DIAn8UxO.js → index-DBI4lgHw.js} +1 -1
  58. package/dist/client/assets/index-DDftPKpL.js +1 -0
  59. package/dist/client/assets/{index-Gs10j_MB.js → index-D_qmPmef.js} +1 -1
  60. package/dist/client/assets/{index-wpJKx9Mi.js → index-DcrgiH5I.js} +1 -1
  61. package/dist/client/assets/{index-_1qDsPCM.js → index-DgM6zNKn.js} +426 -435
  62. package/dist/client/assets/{index-vlk24smC.js → index-Dj4UMRJj.js} +1 -1
  63. package/dist/client/assets/index-DmX9plz6.js +38 -0
  64. package/dist/client/assets/{index-BxfmjO0b.js → index-Dt1n757u.js} +1 -1
  65. package/dist/client/assets/{index-DpN4Unzc.js → index-DwX-1WZf.js} +1 -1
  66. package/dist/client/assets/{index-C4GR43mL.js → index-DxBAUxqG.js} +1 -1
  67. package/dist/client/assets/{index-noUdLKRN.js → index-Dzt17e2e.js} +1 -1
  68. package/dist/client/assets/{index-rEcs1cWl.js → index-GqFxPMLJ.js} +1 -1
  69. package/dist/client/assets/{index-DWOxbvGH.js → index-HGlT1rGv.js} +1 -1
  70. package/dist/client/assets/index-fh0Br4xv.js +17 -0
  71. package/dist/client/assets/{index-BvuOztsk.js → index-mnHv12yO.js} +1 -1
  72. package/dist/client/assets/index-ojjbEHz5.css +1 -0
  73. package/dist/client/assets/{index-20DQ0WIE.js → index-yQNEOaWT.js} +1 -1
  74. package/dist/client/assets/linear-BihyrT6v.svg +1 -0
  75. package/dist/client/assets/notion-egi6fb2a.png +0 -0
  76. package/dist/client/assets/room-files-source-Cyx8H6V6.js +6 -0
  77. package/dist/client/assets/{soul-file-BWnNRUqb.js → soul-file-DUY5SyDc.js} +1 -1
  78. package/dist/client/assets/{use-personality-commit-CKnXk3oQ.js → use-personality-commit-D1Go4jUE.js} +1 -1
  79. package/dist/client/index.html +2 -2
  80. package/dist/drizzle/0118_session_context.sql +6 -0
  81. package/dist/drizzle/0119_session_continue.sql +5 -0
  82. package/dist/drizzle/0120_session_limit_history.sql +24 -0
  83. package/dist/drizzle/0121_session_auto_resume.sql +1 -0
  84. package/dist/drizzle/meta/0118_snapshot.json +9264 -0
  85. package/dist/drizzle/meta/0119_snapshot.json +9299 -0
  86. package/dist/drizzle/meta/0120_snapshot.json +9430 -0
  87. package/dist/drizzle/meta/0121_snapshot.json +9437 -0
  88. package/dist/drizzle/meta/_journal.json +28 -0
  89. package/dist/server/index.js +181119 -172125
  90. package/dist/server/index.js.map +2 -2
  91. package/package.json +4 -4
  92. package/dist/client/assets/ConnectionAccessLists-uBJL31Ay.js +0 -1
  93. package/dist/client/assets/HandlePage-C6lAHsBo.js +0 -1
  94. package/dist/client/assets/NamePage-C0Mhnk4v.js +0 -1
  95. package/dist/client/assets/PhotoPage-DK8jrI66.js +0 -1
  96. package/dist/client/assets/RunsOnPopover-Dj0c45ua.js +0 -1
  97. package/dist/client/assets/SessionsPage-BMABy-lt.js +0 -6
  98. package/dist/client/assets/index-CV_tZl11.js +0 -1
  99. package/dist/client/assets/index-D5zhwLA1.js +0 -1
  100. package/dist/client/assets/index-DBrS_qK1.js +0 -1
  101. package/dist/client/assets/index-DtWF2VPM.css +0 -1
  102. package/dist/client/assets/index-GxKQ7usg.js +0 -33
  103. package/dist/client/assets/index-irBM12M1.js +0 -17
  104. package/dist/client/assets/room-files-source-Tt08gsJM.js +0 -6
package/dist/bin/cli.js CHANGED
@@ -21350,7 +21350,7 @@ function settleLegacyAccountAlias(merged, patch) {
21350
21350
  const block = merged?.runtimes?.claudeCode;
21351
21351
  if (block && typeof block === "object") delete block.activeAccount;
21352
21352
  }
21353
- function classifyClaudeAccountRows(value) {
21353
+ function classifyClaudeAccountRows(value, noun = "Claude account") {
21354
21354
  const minted = backfillMissingAccountIds(value);
21355
21355
  if (!Array.isArray(minted)) return { rows: [], warnings: [] };
21356
21356
  const warnings = [];
@@ -21360,7 +21360,7 @@ function classifyClaudeAccountRows(value) {
21360
21360
  warnings.push({
21361
21361
  code: "row-invalid",
21362
21362
  index: index2,
21363
- message: `Claude account ${index2 + 1} is not an object, so it was skipped.`
21363
+ message: `${noun} ${index2 + 1} is not an object, so it was skipped.`
21364
21364
  });
21365
21365
  return { index: index2, row: null, listed: false };
21366
21366
  }
@@ -21370,7 +21370,7 @@ function classifyClaudeAccountRows(value) {
21370
21370
  warnings.push({
21371
21371
  code: "path-invalid",
21372
21372
  index: index2,
21373
- message: `Claude account "${id}" has no absolute path, so it was skipped.`
21373
+ message: `${noun} "${id}" has no absolute path, so it was skipped.`
21374
21374
  });
21375
21375
  return { index: index2, row, listed: false };
21376
21376
  }
@@ -21378,7 +21378,7 @@ function classifyClaudeAccountRows(value) {
21378
21378
  warnings.push({
21379
21379
  code: "id-duplicate",
21380
21380
  index: index2,
21381
- message: `Claude account "${id}" repeats an earlier account's id, so it was skipped.`
21381
+ message: `${noun} "${id}" repeats an earlier account's id, so it was skipped.`
21382
21382
  });
21383
21383
  return { index: index2, row, listed: false };
21384
21384
  }
@@ -21393,7 +21393,7 @@ function configuredRuntimes(read) {
21393
21393
  if (read("runtimes.opencode.enabled") !== false) runtimes.push("opencode");
21394
21394
  return runtimes;
21395
21395
  }
21396
- var CommunityNavigationRefSchema, ExtensionApprovedSourceSchema, CommunityInstallationPathSchema, CommunityInstallationSearchScalarSchema, CommunityInstallationSearchValueSchema, CommunityInstallationDestinationSchema, CommunityNavigationDestinationSchema, CommunityNavigationOwnerPrefsSchema, CommunityNavigationPrefsSchema, ROOM_TURN_LIMIT_BOUNDS, MAX_TOTAL_TURNS_PER_HOUR_BOUNDS, ROOM_TURN_LIMIT_DEFAULTS, MAX_CONCURRENT_TURNS_PER_AGENT_BOUNDS, MAX_CONCURRENT_TURNS_PER_AGENT_DEFAULT, RELAY_TURN_CEILING_BOUNDS, RELAY_TURN_CEILING_DEFAULTS, SENSITIVE_CONFIG_KEYS, CREDENTIAL_REF_PATTERN, CredentialReferenceSchema, ONBOARDING_STEPS, OnboardingStepSchema, OnboardingStateSchema, ToursStateSchema, TOURS_DEFAULTS, DisplayNameSourceSchema, UserProfileSchema, USER_PROFILE_DEFAULTS, SidebarDisplayFilterSchema, SidebarItemRefSchema, SmartGroupRulesSchema, SidebarGroupShapeSchema, SidebarGroupSchema, SidebarSectionIdSchema, SidebarSectionPrefsSchema, SIDEBAR_SECTION_IDS, SidebarSectionsSchema, SidebarPrefsSchema, SIDEBAR_PREFS_DEFAULTS, ShapeUserPrefsSchema, SHAPE_USER_PREFS_DEFAULTS, StatusBarPinSchema, STATUS_BAR_PIN_KEYS, StatusBarPrefsSchema, STATUS_BAR_PREFS_DEFAULTS, ComposerPrefsSchema, COMPOSER_PREFS_DEFAULTS, EscalationDelaySchema, NotificationPrefsSchema, NOTIFICATION_PREFS_DEFAULTS, DEFAULT_AGENTS_DIRECTORY, RawMcpServerConfigSchema, ClaudeCodeAccountSchema, ClaudeCodeAccountsSchema, ClaudeAccountsSeenSchema, CLAUDE_ACCOUNTS_SEEN_KEY, DefaultModelSchema, DefaultEffortSchema, DefaultTrustStopSchema, ClaudeCodeSettingsSchema, LoggingConfigSchema, PermissionConfigStateSchema, UserConfigSchema, LOG_LEVEL_MAP, USER_CONFIG_DEFAULTS;
21396
+ var CommunityNavigationRefSchema, ExtensionApprovedSourceSchema, CommunityInstallationPathSchema, CommunityInstallationSearchScalarSchema, CommunityInstallationSearchValueSchema, CommunityInstallationDestinationSchema, CommunityNavigationDestinationSchema, CommunityNavigationOwnerPrefsSchema, CommunityNavigationPrefsSchema, ROOM_TURN_LIMIT_BOUNDS, MAX_TOTAL_TURNS_PER_HOUR_BOUNDS, ROOM_TURN_LIMIT_DEFAULTS, MAX_CONCURRENT_TURNS_PER_AGENT_BOUNDS, MAX_CONCURRENT_TURNS_PER_AGENT_DEFAULT, RELAY_TURN_CEILING_BOUNDS, RELAY_TURN_CEILING_DEFAULTS, SENSITIVE_CONFIG_KEYS, CREDENTIAL_REF_PATTERN, CredentialReferenceSchema, ONBOARDING_STEPS, OnboardingStepSchema, OnboardingStateSchema, ToursStateSchema, TOURS_DEFAULTS, DisplayNameSourceSchema, UserProfileSchema, USER_PROFILE_DEFAULTS, SidebarDisplayFilterSchema, SidebarItemRefSchema, SmartGroupRulesSchema, SidebarGroupShapeSchema, SidebarGroupSchema, SidebarSectionIdSchema, SidebarSectionPrefsSchema, SIDEBAR_SECTION_IDS, SidebarSectionsSchema, SidebarPrefsSchema, SIDEBAR_PREFS_DEFAULTS, ShapeUserPrefsSchema, SHAPE_USER_PREFS_DEFAULTS, StatusBarPinSchema, STATUS_BAR_PIN_KEYS, StatusBarPrefsSchema, STATUS_BAR_PREFS_DEFAULTS, ComposerPrefsSchema, COMPOSER_PREFS_DEFAULTS, EscalationDelaySchema, NotificationPrefsSchema, NOTIFICATION_PREFS_DEFAULTS, DEFAULT_AGENTS_DIRECTORY, RawMcpServerConfigSchema, ClaudeCodeAccountSchema, ClaudeCodeAccountsSchema, ClaudeAccountsSeenSchema, CLAUDE_ACCOUNTS_SEEN_KEY, DefaultModelSchema, DefaultEffortSchema, DefaultTrustStopSchema, DefaultAccountColorSchema, ClaudeCodeSettingsSchema, LoggingConfigSchema, PermissionConfigStateSchema, UserConfigSchema, LOG_LEVEL_MAP, USER_CONFIG_DEFAULTS;
21397
21397
  var init_config_schema = __esm({
21398
21398
  "../shared/src/config-schema.ts"() {
21399
21399
  init_zod();
@@ -21886,6 +21886,7 @@ var init_config_schema = __esm({
21886
21886
  DefaultModelSchema = external_exports.string().min(1).nullable().default(null);
21887
21887
  DefaultEffortSchema = external_exports.enum(EFFORT_LEVELS).nullable().default(null);
21888
21888
  DefaultTrustStopSchema = external_exports.enum(["ask", "act", "autonomy"]).nullable().default(null);
21889
+ DefaultAccountColorSchema = external_exports.union([external_exports.string().regex(ACCOUNT_COLOR_PATTERN), external_exports.literal("")]).nullable();
21889
21890
  ClaudeCodeSettingsSchema = external_exports.object({
21890
21891
  /**
21891
21892
  * Absolute path of the Claude config directory a NEW session runs and
@@ -21916,10 +21917,27 @@ var init_config_schema = __esm({
21916
21917
  /**
21917
21918
  * The Claude accounts DorkOS knows about — what lets it show which
21918
21919
  * client a session belongs to. The operator registers these: DorkOS
21919
- * never globs `~/.claude*`, because that guess sweeps up directories
21920
- * that are not accounts at all (D4).
21920
+ * never registers a `~/.claude*` folder on its own, because that guess
21921
+ * sweeps up directories that are not accounts at all (D4). Settings may
21922
+ * OFFER the folders it finds (spec `claude-account-ui` §6.9), and nothing
21923
+ * lands here until a person clicks Add.
21921
21924
  */
21922
21925
  accounts: ClaudeCodeAccountsSchema.default(() => []),
21926
+ /**
21927
+ * The color the standalone default account is drawn in, or `null` for the
21928
+ * default for its position. Ignored while a registered row has the default
21929
+ * folder: that row's own color wins. See {@link DefaultAccountColorSchema}.
21930
+ */
21931
+ defaultAccountColor: DefaultAccountColorSchema.default(null).catch(null),
21932
+ /**
21933
+ * Account folders a person dismissed from Settings' "Found on this
21934
+ * computer" list, so they stay hidden across restarts (spec
21935
+ * `claude-account-ui` §7.4). Stored in comparable form (the real path).
21936
+ * Written only by `POST /api/runtimes/claude-code/accounts/found/dismiss`,
21937
+ * which appends in one read-modify-write; a `PATCH /api/config` would
21938
+ * replace the array, and the screen never sees it.
21939
+ */
21940
+ dismissedFolders: external_exports.array(external_exports.string()).max(200).default([]),
21923
21941
  /** Model a new claude-code session starts on. See {@link DefaultModelSchema}. */
21924
21942
  defaultModel: DefaultModelSchema,
21925
21943
  /** Effort a new claude-code session starts at. See {@link DefaultEffortSchema}. */
@@ -22989,6 +23007,8 @@ var init_config_schema = __esm({
22989
23007
  claudeCode: external_exports.preprocess(healClaudeAccountRename, ClaudeCodeSettingsSchema).default(() => ({
22990
23008
  defaultAccount: null,
22991
23009
  accounts: [],
23010
+ defaultAccountColor: null,
23011
+ dismissedFolders: [],
22992
23012
  defaultModel: null,
22993
23013
  defaultEffort: null,
22994
23014
  defaultTrustStop: null,
@@ -23070,6 +23090,8 @@ var init_config_schema = __esm({
23070
23090
  claudeCode: {
23071
23091
  defaultAccount: null,
23072
23092
  accounts: [],
23093
+ defaultAccountColor: null,
23094
+ dismissedFolders: [],
23073
23095
  defaultModel: null,
23074
23096
  defaultEffort: null,
23075
23097
  defaultTrustStop: null,
@@ -25729,7 +25751,7 @@ import path2 from "path";
25729
25751
  import { fileURLToPath } from "url";
25730
25752
  function resolveVersion() {
25731
25753
  if (env2.DORKOS_VERSION_OVERRIDE) return env2.DORKOS_VERSION_OVERRIDE;
25732
- if (true) return "0.88.0";
25754
+ if (true) return "0.89.0";
25733
25755
  const pkgPath = path2.join(path2.dirname(fileURLToPath(import.meta.url)), "../../package.json");
25734
25756
  return JSON.parse(readFileSync(pkgPath, "utf-8")).version;
25735
25757
  }
@@ -26435,7 +26457,9 @@ __export(config_manager_exports, {
26435
26457
  retireToolOnlyReplies: () => retireToolOnlyReplies,
26436
26458
  scrubRetiredOnboardingSteps: () => scrubRetiredOnboardingSteps,
26437
26459
  seedA2aDisabled: () => seedA2aDisabled,
26460
+ seedClaudeDismissedFolders: () => seedClaudeDismissedFolders,
26438
26461
  seedCommunityNavigationPrefs: () => seedCommunityNavigationPrefs,
26462
+ seedDefaultAccountColor: () => seedDefaultAccountColor,
26439
26463
  seedDisplayNameSourceDefault: () => seedDisplayNameSourceDefault,
26440
26464
  seedExtensionsApprovedSources: () => seedExtensionsApprovedSources,
26441
26465
  seedFullPowerDecision: () => seedFullPowerDecision,
@@ -27276,6 +27300,28 @@ function renameReservedClaudeAccountIds(store) {
27276
27300
  claudeCode: { ...block, accounts: next }
27277
27301
  });
27278
27302
  }
27303
+ function seedDefaultAccountColor(store) {
27304
+ const runtimes = store.get("runtimes");
27305
+ if (!runtimes || typeof runtimes !== "object" || Array.isArray(runtimes)) return;
27306
+ const block = runtimes.claudeCode;
27307
+ if (!block || typeof block !== "object" || Array.isArray(block)) return;
27308
+ if ("defaultAccountColor" in block) return;
27309
+ store.set("runtimes", {
27310
+ ...runtimes,
27311
+ claudeCode: { ...block, defaultAccountColor: null }
27312
+ });
27313
+ }
27314
+ function seedClaudeDismissedFolders(store) {
27315
+ const runtimes = store.get("runtimes");
27316
+ if (!runtimes || typeof runtimes !== "object" || Array.isArray(runtimes)) return;
27317
+ const block = runtimes.claudeCode;
27318
+ if (!block || typeof block !== "object" || Array.isArray(block)) return;
27319
+ if (Array.isArray(block.dismissedFolders)) return;
27320
+ store.set("runtimes", {
27321
+ ...runtimes,
27322
+ claudeCode: { ...block, dismissedFolders: [] }
27323
+ });
27324
+ }
27279
27325
  function seedFullPowerDecision(store) {
27280
27326
  const ui = store.get("ui");
27281
27327
  if (ui == null || typeof ui !== "object") return;
@@ -27503,6 +27549,10 @@ function tolerateLegacyClaudeAccountEncoding(ctx) {
27503
27549
  const properties = ctx.jsonSchema.properties;
27504
27550
  if (!properties) return;
27505
27551
  properties.activeAccount = { anyOf: [{ type: "string" }, { type: "null" }] };
27552
+ properties.defaultAccountColor = {
27553
+ anyOf: [{ type: "string" }, { type: "null" }],
27554
+ default: null
27555
+ };
27506
27556
  return;
27507
27557
  }
27508
27558
  if (ctx.zodSchema !== ClaudeCodeAccountSchema) return;
@@ -28111,6 +28161,30 @@ and your settings stay in the file you renamed.`;
28111
28161
  // every other field and row.
28112
28162
  "0.87.0": (store) => {
28113
28163
  renameReservedClaudeAccountIds(store);
28164
+ },
28165
+ // 0.90.0 was the next free key when this merged (0.88.0 was the newest tag).
28166
+ // `'0.89.0'` is intentionally unused: the branch that had reserved it moved to
28167
+ // `'0.91.0'` once this merged first, because a key below one an install has
28168
+ // already run would never run there. Frozen from merge, not from the release
28169
+ // bump, for the reason `'0.60.0'` above states.
28170
+ //
28171
+ // Disjoint from every other key here: it adds one nested leaf under
28172
+ // `runtimes.claudeCode` that nothing above names, and keeps every member
28173
+ // `'0.65.0'` and `'0.87.0'` write there.
28174
+ "0.90.0": (store) => {
28175
+ seedDefaultAccountColor(store);
28176
+ },
28177
+ // 0.90.0 has merged (the standalone default account's color, DOR-2492) and
28178
+ // v0.88.0 is the newest tag, so 0.91.0 is the next key: keys must rise in
28179
+ // merge order, because an install that already ran 0.90.0 would never run a
28180
+ // lower key added after it. Frozen from merge, not from the release bump, for
28181
+ // the reason `'0.60.0'` above states; anything further opens `'0.92.0'`.
28182
+ //
28183
+ // Disjoint from every other key here: it adds one nested leaf under
28184
+ // `runtimes.claudeCode`, beside `accounts`, which `'0.65.0'` and `'0.87.0'`
28185
+ // write and this body preserves.
28186
+ "0.91.0": (store) => {
28187
+ seedClaudeDismissedFolders(store);
28114
28188
  }
28115
28189
  };
28116
28190
  jsonSchemaFull = external_exports.toJSONSchema(UserConfigSchema, {
@@ -38241,7 +38315,7 @@ var init_mesh_schemas = __esm({
38241
38315
  });
38242
38316
 
38243
38317
  // ../shared/src/additional-context.ts
38244
- var GitStatusDataSchema, EnvDataSchema, RelayContextDataSchema, RoomContextOriginSchema, RoomContextAuthorSchema, RoomContextMemberSchema, RoomContextEntrySchema, RoomContextAcknowledgmentSchema, RoomContextFilesSchema, RoomContextDataSchema, SeedContextDataSchema, StagedContextDataSchema, AccountsAccessDataSchema, ApprovalVerdictDataSchema, AdditionalContextEntrySchema, AdditionalContextSchema, ClientContextSchema;
38318
+ var GitStatusDataSchema, EnvDataSchema, RelayContextDataSchema, RoomContextOriginSchema, RoomContextAuthorSchema, RoomContextMemberSchema, RoomContextEntrySchema, RoomContextAcknowledgmentSchema, MainMovedSchema, WorktreeRefreshOutcomeSchema, RoomContextFilesSchema, RoomContextDataSchema, SeedContextDataSchema, StagedContextDataSchema, AccountsAccessDataSchema, ApprovalVerdictDataSchema, AdditionalContextEntrySchema, AdditionalContextSchema, ClientContextSchema;
38245
38319
  var init_additional_context = __esm({
38246
38320
  "../shared/src/additional-context.ts"() {
38247
38321
  "use strict";
@@ -38317,12 +38391,41 @@ var init_additional_context = __esm({
38317
38391
  entryAt: external_exports.string(),
38318
38392
  entryExcerpt: external_exports.string()
38319
38393
  });
38394
+ MainMovedSchema = external_exports.object({
38395
+ commits: external_exports.array(
38396
+ external_exports.object({
38397
+ sha: external_exports.string(),
38398
+ who: external_exports.string().nullable(),
38399
+ subject: external_exports.string(),
38400
+ kind: external_exports.enum(["merge", "person", "other"]),
38401
+ files: external_exports.array(external_exports.string()),
38402
+ fileCount: external_exports.number().int().nonnegative()
38403
+ })
38404
+ ),
38405
+ overflow: external_exports.number().int().nonnegative(),
38406
+ overlap: external_exports.array(external_exports.string())
38407
+ });
38408
+ WorktreeRefreshOutcomeSchema = external_exports.discriminatedUnion("kind", [
38409
+ external_exports.object({ kind: external_exports.literal("current") }),
38410
+ external_exports.object({
38411
+ kind: external_exports.literal("refreshed"),
38412
+ from: external_exports.string(),
38413
+ to: external_exports.string(),
38414
+ paths: external_exports.array(external_exports.string())
38415
+ }),
38416
+ external_exports.object({
38417
+ kind: external_exports.literal("held"),
38418
+ reason: external_exports.enum(["busy", "changes", "ahead", "off-branch", "unreadable", "unsafe-config"]),
38419
+ moved: MainMovedSchema.nullable()
38420
+ })
38421
+ ]);
38320
38422
  RoomContextFilesSchema = external_exports.object({
38321
38423
  worktreePath: external_exports.string(),
38322
38424
  branch: external_exports.string(),
38323
38425
  repoPath: external_exports.string(),
38324
38426
  behind: external_exports.number().int().nonnegative().nullable(),
38325
- ahead: external_exports.number().int().nonnegative().nullable()
38427
+ ahead: external_exports.number().int().nonnegative().nullable(),
38428
+ refresh: WorktreeRefreshOutcomeSchema.optional()
38326
38429
  });
38327
38430
  RoomContextDataSchema = external_exports.object({
38328
38431
  room: external_exports.object({
@@ -38652,7 +38755,7 @@ var init_account_usage_codex = __esm({
38652
38755
  });
38653
38756
 
38654
38757
  // ../shared/src/account-usage.ts
38655
- var LEDGER_RUNTIMES, LEDGER_SOURCES, RateLimitStatusSchema, ISO_TIME_PATTERN, IsoTimeSchema, LedgerSourceSchema, LedgerEntrySchema, WINDOW_KEY_PATTERN, LedgerPlanSchema, LedgerCreditsSchema, LedgerSpendSchema, UsageLedgerSchema, MINUTE_MS, HOUR_MS, FIVE_HOUR_MS, SEVEN_DAY_MS, MAX_FUTURE_SKEW_MS, AccountUsageSchema;
38758
+ var LEDGER_RUNTIMES, LEDGER_SOURCES, RateLimitStatusSchema, ISO_TIME_PATTERN, IsoTimeSchema, LedgerSourceSchema, LedgerEntrySchema, WINDOW_KEY_PATTERN, LedgerPlanSchema, LedgerCreditsSchema, LedgerSpendSchema, UsageLedgerSchema, MINUTE_MS, HOUR_MS, FIVE_HOUR_MS, SEVEN_DAY_MS, MAX_FUTURE_SKEW_MS, AccountUsageSchema, LimitResolutionSchema, LimitHistoryEntrySchema, LimitHistoryResponseSchema, FoundClaudeFolderSchema, DismissFoundFolderRequestSchema;
38656
38759
  var init_account_usage = __esm({
38657
38760
  "../shared/src/account-usage.ts"() {
38658
38761
  init_zod();
@@ -38679,14 +38782,14 @@ var init_account_usage = __esm({
38679
38782
  IsoTimeSchema = external_exports.string().regex(ISO_TIME_PATTERN).refine((value) => !Number.isNaN(Date.parse(value)), { message: "Not a real time" });
38680
38783
  LedgerSourceSchema = external_exports.enum(LEDGER_SOURCES);
38681
38784
  LedgerEntrySchema = external_exports.object({
38682
- /** Share of the window used, 0 to 100, or `null` when the source gave none. */
38683
- usedPct: external_exports.number().min(0).max(100).nullable(),
38684
- /** When the window resets, ISO-8601, or `null` when unknown. */
38685
- resetsAt: IsoTimeSchema.nullable(),
38785
+ /** Share of the window used, 0 to 100, or `null` when the source gave none (omitted reads as `null`). */
38786
+ usedPct: external_exports.number().min(0).max(100).nullable().default(null),
38787
+ /** When the window resets, ISO-8601, or `null` when unknown (omitted reads as `null`). */
38788
+ resetsAt: IsoTimeSchema.nullable().default(null),
38686
38789
  /** The window's length in minutes, when the source names it: an integer of 1 or more. */
38687
38790
  windowMinutes: external_exports.number().int().min(1).optional(),
38688
- /** The status the source reported, or `null` when it reported none. */
38689
- status: RateLimitStatusSchema.nullable(),
38791
+ /** The status the source reported, or `null` when it reported none (omitted reads as `null`). */
38792
+ status: RateLimitStatusSchema.nullable().default(null),
38690
38793
  /** When the source observed this reading, ISO-8601 with an explicit zone. */
38691
38794
  observedAt: IsoTimeSchema,
38692
38795
  /** Which source produced the reading. */
@@ -38812,6 +38915,61 @@ var init_account_usage = __esm({
38812
38915
  /** The ledger's last write, or `null` when there is no ledger. */
38813
38916
  updatedAt: external_exports.string().nullable()
38814
38917
  }).openapi("AccountUsage");
38918
+ LimitResolutionSchema = external_exports.enum(["moved", "resumed-reset", "resumed-model", "resumed-early"]).openapi("LimitResolution");
38919
+ LimitHistoryEntrySchema = external_exports.object({
38920
+ /** Row id (a uuid). */
38921
+ id: external_exports.string(),
38922
+ /** The session the limit hit. */
38923
+ sessionId: external_exports.string(),
38924
+ /** When the limit was hit, ISO-8601. */
38925
+ since: external_exports.string(),
38926
+ /** The runtime the session ran on. */
38927
+ runtime: external_exports.string(),
38928
+ /** The registry id of the account that ran out, or `null` when unregistered. */
38929
+ accountId: external_exports.string().nullable(),
38930
+ /** The ledger window key that rejected work, such as `five_hour`. */
38931
+ window: external_exports.string(),
38932
+ /** Whether the whole account ran out or only one model on it. */
38933
+ scope: external_exports.string(),
38934
+ /** When that window resets, ISO-8601, or `null` when unknown. */
38935
+ resetsAt: external_exports.string().nullable(),
38936
+ /** How the episode ended. */
38937
+ resolution: LimitResolutionSchema,
38938
+ /** When it ended, ISO-8601. */
38939
+ resolvedAt: external_exports.string(),
38940
+ /** The session the work carried over to (`moved` only), else `null`. */
38941
+ toSessionId: external_exports.string().nullable(),
38942
+ /** The account the work carried over to (`moved` only), else `null`. */
38943
+ toAccountId: external_exports.string().nullable(),
38944
+ /** The model before a `resumed-model` switch, else `null`. */
38945
+ modelFrom: external_exports.string().nullable(),
38946
+ /** The model after a `resumed-model` switch, else `null`. */
38947
+ modelTo: external_exports.string().nullable()
38948
+ }).openapi("LimitHistoryEntry");
38949
+ LimitHistoryResponseSchema = external_exports.object({
38950
+ /** The episodes, oldest first. */
38951
+ entries: external_exports.array(LimitHistoryEntrySchema)
38952
+ }).openapi("LimitHistoryResponse");
38953
+ FoundClaudeFolderSchema = external_exports.object({
38954
+ /** The folder, absolute. */
38955
+ path: external_exports.string(),
38956
+ /** The folder's own name (the path's last part), such as `.claude2`. */
38957
+ name: external_exports.string(),
38958
+ /**
38959
+ * When the account was last used: the newest change among its `projects/`
38960
+ * folder, that folder's children and the files directly inside each child,
38961
+ * ISO-8601. `null` when none could be read.
38962
+ */
38963
+ lastUsedAt: external_exports.string().nullable(),
38964
+ /** Whether the folder holds a file Claude Code saves when an organization manages the account. */
38965
+ orgManaged: external_exports.boolean(),
38966
+ /** The name of that file, or `null` when there is none. */
38967
+ orgMarker: external_exports.string().nullable()
38968
+ }).openapi("FoundClaudeFolder");
38969
+ DismissFoundFolderRequestSchema = external_exports.object({
38970
+ /** The folder, as the found list gave it. */
38971
+ path: external_exports.string().min(1)
38972
+ }).openapi("DismissFoundFolderRequest");
38815
38973
  }
38816
38974
  });
38817
38975
 
@@ -38827,7 +38985,7 @@ function isSafeSigninUrl(value) {
38827
38985
  if (url2.protocol !== "http:") return false;
38828
38986
  return url2.hostname === "localhost" || url2.hostname === "127.0.0.1" || url2.hostname === "[::1]";
38829
38987
  }
38830
- var PermissionModeSchema, PermissionModeIdSchema, PermissionStopSchema2, SessionTaskStatusSchema, StreamEventTypeSchema, QuestionOptionSchema, QuestionItemSchema, EffortLevelSchema, SessionOriginSchema, SessionLifecycleSchema, LimitPlanSchema, SessionLimitSchema, SessionSchema, SessionUpdateResponseSchema, SessionSettingsSchema, StoredSessionSettingsResponseSchema, UpdateSessionRequestSchema, ForkSessionRequestSchema, ReloadPluginsResultSchema, SEED_CONTEXT_MAX_LENGTH, MessageDispositionSchema, DispositionDowngradeReasonSchema, MessageDeliveryOutcomeSchema, InterruptOutcomeSchema, InterruptReasonSchema, InterruptReceiptSchema, QueuedMessageSchema, SendMessageRequestSchema, SendMessageResponseSchema, SessionTriggerResponseSchema, SessionQueueResponseSchema, QueueMoveTargetSchema, UpdateQueuedMessageRequestSchema, UpdateQueuedMessageResponseSchema, DENY_REASON_MAX_LENGTH, ApprovalRequestSchema, BatchApprovalRequestSchema, SubmitAnswersRequestSchema, UI_ACTION_ID_MAX_LENGTH, UI_ACTION_TITLE_MAX_LENGTH, UI_ACTION_PAYLOAD_MAX_LENGTH, UiActionRequestSchema, McpAppPermissionSchema, McpAppResourceRequestSchema, McpAppResourceResponseSchema, ElicitationModeSchema, ElicitationActionSchema, SubmitElicitationRequestSchema, ListSessionsQuerySchema, SessionListWarningSchema, SessionListResponseSchema, RecentSessionsQuerySchema, RecentSessionsResponseSchema, SessionDailyCountsQuerySchema, SessionDailyCountsResponseSchema, CommandsQuerySchema, TextDeltaSchema, ThinkingDeltaSchema, ToolCallStatusSchema, McpAppRefSchema, ToolCallEventSchema, ToolProgressEventSchema, AlwaysAllowScopeSchema, ApprovalEventSchema, QuestionPromptEventSchema, PendingInteractionDTOSchema, ErrorCategorySchema, ErrorEventSchema, ApiRetryEventSchema, DoneEventSchema, TerminalReasonSchema, UsageStateSchema, UsageStatusSchema, SessionStatusEventSchema, ContextUsageCategorySchema, ContextUsageSchema, TaskItemSchema, TaskUpdateEventSchema, RelayReceiptEventSchema, MessageDeliveredEventSchema, RelayMessageEventSchema, BackgroundTaskTypeSchema, BackgroundTaskStatusSchema, BackgroundTaskStartedEventSchema, BackgroundTaskProgressEventSchema, BackgroundTaskDoneEventSchema, SubagentTextDeltaEventSchema, SystemStatusEventSchema, OperationKindSchema, OperationStateSchema, OperationProgressEventShapeSchema, OperationProgressEventSchema, MemoryEntrySchema, MemoryRecallEventSchema, CompactBoundaryEventSchema, sessionImageShape, SessionImageEventSchema, deniedAgentShape, PermissionDeniedEventSchema, PromptSuggestionEventSchema, HookStartedEventSchema, HookProgressEventSchema, HookResponseEventSchema, SdkSessionStateSchema, SessionStateChangedEventSchema, ElicitationPromptEventSchema, ElicitationCompleteEventSchema, InteractionCancelledEventSchema, CapabilityApprovalRequiredEventSchema, CapabilityApprovalResolvedEventSchema, SigninUrlSchema, MCP_SIGNIN_OUTCOMES, McpSigninOutcomeSchema, McpSigninRequiredEventSchema, McpSigninResolvedEventSchema, StreamEventSchema, TextPartSchema, HookStatusSchema, HookPartSchema, ToolApprovalOutcomeSchema, QuestionOutcomeSchema, ToolCallPartSchema, BackgroundTaskPartSchema, ThinkingPartSchema, ErrorPartSchema, ElicitationPartSchema, CapabilityApprovalPartSchema, McpSigninPartSchema, MemoryRecallPartSchema, PermissionDeniedPartSchema, CompactBoundaryPartSchema, ImagePartSchema, MessagePartSchema, MessageTypeSchema, HistoryToolCallSchema, CompactMetadataSchema, HistoryMessageSchema, CommandEntrySchema, CommandRegistrySchema, FileListQuerySchema, RawFileQuerySchema, FileListResponseSchema, WriteFileRequestSchema, WriteFileResponseSchema, FileEntrySchema, FileTreeQuerySchema, FileTreeResponseSchema, FileContentQuerySchema, FileContentResponseSchema, CreateEntryRequestSchema, CreateEntryResponseSchema, DeleteEntryQuerySchema, RenameEntryRequestSchema, CopyEntryRequestSchema, RevealEntryRequestSchema, DiffBaselineOriginSchema, DiffBaselineQuerySchema, DiffBaselineResponseSchema, AdvanceDiffBaselineRequestSchema, DiffPendingQuerySchema, DiffPendingResponseSchema, DiffBaselineRawQuerySchema, RevertDiffBaselineRequestSchema, FileMutationResponseSchema, WorkbenchSignRequestSchema, WorkbenchSignResponseSchema, WorkbenchProbeRequestSchema, WorkbenchProbeResponseSchema, BrowseDirectoryQuerySchema, DirectoryEntrySchema, BrowseDirectoryResponseSchema, TunnelStatusSchema, HealthResponseSchema, ExecutionDefaultsSchema, ExperimentStateSchema, ServerConfigSchema, ModelTierSchema, ModelOptionSchema, SubagentInfoSchema, GitStatusResponseSchema, GitStatusErrorSchema, ErrorResponseSchema, SessionLockedErrorSchema, TaskStatusSchema, SettableTaskStatusSchema, TaskNameSchema, TaskRunStatusSchema, TaskRunTriggerSchema, TaskSchema, TaskRunSchema, CancelTaskRunResponseSchema, TaskTemplateSchema, TASK_DURATION_PATTERN, TASK_DURATION_MAX, TASK_DESCRIPTION_MAX, CreateTaskRequestSchema, SIDEBAR_TAB_ID_PATTERN, ShapeLiveLayoutCaptureSchema, ForkShapeRequestSchema, UpdateTaskRequestSchema, ListTaskRunsQuerySchema, ConfigPatchRequestSchema, ConfigPatchResponseSchema, UploadResultSchema, UploadResponseSchema, UploadProgressSchema, CanvasMediaSrcSchema, UiCanvasContentSchema, UiPanelIdSchema, UiToastLevelSchema, CELEBRATION_KINDS, CELEBRATION_KIND_SYNONYMS, CelebrationKindSchema, UiCommandTargetSchema, UiCommandSchema, UiCommandEventSchema, UiStateSchema, UiStateReportDocumentSchema, UiStateReportSchema, DevtoolsConsoleLevelSchema, DEVTOOLS_ARGS_MAX_CHARS, DevtoolsConsoleEntrySchema, DevtoolsNetworkEntrySchema, DEVTOOLS_CONSOLE_BATCH_MAX, DEVTOOLS_NETWORK_BATCH_MAX, DEVTOOLS_SCREENSHOT_MAX_CHARS, DevtoolsScreenshotResultSchema, DevtoolsIngestSchema, BrowserTargetSchema, BrowserActCommandSchema, BrowserPageSummarySchema, DEVTOOLS_OUTLINE_MAX_CHARS, DevtoolsActionResultSchema, DevtoolsRecordingUploadSchema;
38988
+ var PermissionModeSchema, PermissionModeIdSchema, PermissionStopSchema2, SessionTaskStatusSchema, StreamEventTypeSchema, QuestionOptionSchema, QuestionItemSchema, EffortLevelSchema, SessionOriginSchema, SessionLifecycleSchema, LimitPlanSchema, LimitStateSchema, SessionLimitSchema, ContinueAccountOptionSchema, ContinueOptionsResponseSchema, ContinueSessionRequestSchema, ContinueSessionResponseSchema, WaitForResetRequestSchema, LimitPlanResponseSchema, SessionSchema, SessionUpdateResponseSchema, SessionSettingsSchema, StoredSessionSettingsResponseSchema, UpdateSessionRequestSchema, ForkSessionRequestSchema, ReloadPluginsResultSchema, SEED_CONTEXT_MAX_LENGTH, MessageDispositionSchema, DispositionDowngradeReasonSchema, MessageDeliveryOutcomeSchema, InterruptOutcomeSchema, InterruptReasonSchema, InterruptReceiptSchema, QueuedMessageSchema, SendMessageRequestSchema, SendMessageResponseSchema, SessionTriggerResponseSchema, SessionQueueResponseSchema, QueueMoveTargetSchema, UpdateQueuedMessageRequestSchema, UpdateQueuedMessageResponseSchema, DENY_REASON_MAX_LENGTH, ApprovalRequestSchema, BatchApprovalRequestSchema, SubmitAnswersRequestSchema, UI_ACTION_ID_MAX_LENGTH, UI_ACTION_TITLE_MAX_LENGTH, UI_ACTION_PAYLOAD_MAX_LENGTH, UiActionRequestSchema, McpAppPermissionSchema, McpAppResourceRequestSchema, McpAppResourceResponseSchema, ElicitationModeSchema, ElicitationActionSchema, SubmitElicitationRequestSchema, ListSessionsQuerySchema, SessionListWarningSchema, SessionListResponseSchema, RecentSessionsQuerySchema, RecentSessionsResponseSchema, SessionDailyCountsQuerySchema, SessionDailyCountsResponseSchema, CommandsQuerySchema, TextDeltaSchema, ThinkingDeltaSchema, ToolCallStatusSchema, McpAppRefSchema, ToolCallEventSchema, ToolProgressEventSchema, AlwaysAllowScopeSchema, ApprovalEventSchema, QuestionPromptEventSchema, PendingInteractionDTOSchema, ErrorCategorySchema, ErrorEventSchema, ApiRetryEventSchema, DoneEventSchema, TerminalReasonSchema, UsageStateSchema, UsageStatusSchema, SessionStatusEventSchema, ContextUsageCategorySchema, ContextUsageSchema, TaskItemSchema, TaskUpdateEventSchema, RelayReceiptEventSchema, MessageDeliveredEventSchema, RelayMessageEventSchema, BackgroundTaskTypeSchema, BackgroundTaskStatusSchema, BackgroundTaskStartedEventSchema, BackgroundTaskProgressEventSchema, BackgroundTaskDoneEventSchema, SubagentTextDeltaEventSchema, SystemStatusEventSchema, OperationKindSchema, OperationStateSchema, OperationProgressEventShapeSchema, OperationProgressEventSchema, MemoryEntrySchema, MemoryRecallEventSchema, CompactBoundaryEventSchema, sessionImageShape, SessionImageEventSchema, deniedAgentShape, PermissionDeniedEventSchema, PromptSuggestionEventSchema, HookStartedEventSchema, HookProgressEventSchema, HookResponseEventSchema, SdkSessionStateSchema, SessionStateChangedEventSchema, ElicitationPromptEventSchema, ElicitationCompleteEventSchema, InteractionCancelledEventSchema, CapabilityApprovalRequiredEventSchema, CapabilityApprovalResolvedEventSchema, SigninUrlSchema, MCP_SIGNIN_OUTCOMES, McpSigninOutcomeSchema, McpSigninRequiredEventSchema, McpSigninResolvedEventSchema, StreamEventSchema, TextPartSchema, HookStatusSchema, HookPartSchema, ToolApprovalOutcomeSchema, QuestionOutcomeSchema, ToolCallPartSchema, BackgroundTaskPartSchema, ThinkingPartSchema, ErrorPartSchema, ElicitationPartSchema, CapabilityApprovalPartSchema, McpSigninPartSchema, MemoryRecallPartSchema, PermissionDeniedPartSchema, CompactBoundaryPartSchema, ImagePartSchema, MessagePartSchema, MessageTypeSchema, HistoryToolCallSchema, CompactMetadataSchema, HistoryMessageSchema, CommandEntrySchema, CommandRegistrySchema, FileListQuerySchema, RawFileQuerySchema, FileListResponseSchema, WriteFileRequestSchema, WriteFileResponseSchema, FileEntrySchema, FileTreeQuerySchema, FileTreeResponseSchema, FileContentQuerySchema, FileContentResponseSchema, CreateEntryRequestSchema, CreateEntryResponseSchema, DeleteEntryQuerySchema, RenameEntryRequestSchema, CopyEntryRequestSchema, RevealEntryRequestSchema, DiffBaselineOriginSchema, DiffBaselineQuerySchema, DiffBaselineResponseSchema, AdvanceDiffBaselineRequestSchema, DiffPendingQuerySchema, DiffPendingResponseSchema, DiffBaselineRawQuerySchema, RevertDiffBaselineRequestSchema, FileMutationResponseSchema, WorkbenchSignRequestSchema, WorkbenchSignResponseSchema, WorkbenchProbeRequestSchema, WorkbenchProbeResponseSchema, BrowseDirectoryQuerySchema, DirectoryEntrySchema, BrowseDirectoryResponseSchema, TunnelStatusSchema, HealthResponseSchema, ExecutionDefaultsSchema, ExperimentStateSchema, ServerConfigSchema, ModelTierSchema, ModelOptionSchema, SubagentInfoSchema, GitStatusResponseSchema, GitStatusErrorSchema, ErrorResponseSchema, SessionLockedErrorSchema, TaskStatusSchema, SettableTaskStatusSchema, TaskNameSchema, TaskRunStatusSchema, TaskRunTriggerSchema, TaskSchema, TaskRunSchema, CancelTaskRunResponseSchema, TaskTemplateSchema, TASK_DURATION_PATTERN, TASK_DURATION_MAX, TASK_DESCRIPTION_MAX, CreateTaskRequestSchema, SIDEBAR_TAB_ID_PATTERN, ShapeLiveLayoutCaptureSchema, ForkShapeRequestSchema, UpdateTaskRequestSchema, ListTaskRunsQuerySchema, ConfigPatchRequestSchema, ConfigPatchResponseSchema, UploadResultSchema, UploadResponseSchema, UploadProgressSchema, CanvasMediaSrcSchema, UiCanvasContentSchema, UiPanelIdSchema, UiToastLevelSchema, CELEBRATION_KINDS, CELEBRATION_KIND_SYNONYMS, CelebrationKindSchema, UiCommandTargetSchema, UiCommandSchema, UiCommandEventSchema, UiStateSchema, UiStateReportDocumentSchema, UiStateReportSchema, DevtoolsConsoleLevelSchema, DEVTOOLS_ARGS_MAX_CHARS, DevtoolsConsoleEntrySchema, DevtoolsNetworkEntrySchema, DEVTOOLS_CONSOLE_BATCH_MAX, DEVTOOLS_NETWORK_BATCH_MAX, DEVTOOLS_SCREENSHOT_MAX_CHARS, DevtoolsScreenshotResultSchema, DevtoolsIngestSchema, BrowserTargetSchema, BrowserActCommandSchema, BrowserPageSummarySchema, DEVTOOLS_OUTLINE_MAX_CHARS, DevtoolsActionResultSchema, DevtoolsRecordingUploadSchema;
38831
38989
  var init_schemas3 = __esm({
38832
38990
  "../shared/src/schemas.ts"() {
38833
38991
  "use strict";
@@ -38907,15 +39065,32 @@ var init_schemas3 = __esm({
38907
39065
  SessionOriginSchema = external_exports.enum(["user", "agent", "channel", "room", "task", "external"]).openapi("SessionOrigin");
38908
39066
  SessionLifecycleSchema = external_exports.enum(["idle", "streaming", "blocked", "error", "interrupted"]).openapi("SessionLifecycle");
38909
39067
  LimitPlanSchema = external_exports.discriminatedUnion("mode", [
38910
- external_exports.object({ mode: external_exports.literal("ask") }),
39068
+ external_exports.object({ mode: external_exports.literal("ask"), carryOver: external_exports.literal(false).optional() }),
38911
39069
  external_exports.object({
38912
39070
  mode: external_exports.literal("auto"),
38913
39071
  target: external_exports.string(),
38914
39072
  fireAt: external_exports.string().datetime({ offset: true })
38915
39073
  }),
38916
- external_exports.object({ mode: external_exports.literal("waiting") }),
39074
+ external_exports.object({
39075
+ mode: external_exports.literal("waiting"),
39076
+ resumeAt: external_exports.string().nullable().default(null),
39077
+ autoResume: external_exports.boolean().default(false),
39078
+ resetConfirmedAt: external_exports.string().optional(),
39079
+ unconfirmed: external_exports.literal(true).optional(),
39080
+ carryOver: external_exports.literal(false).optional()
39081
+ }),
38917
39082
  external_exports.object({ mode: external_exports.literal("continued"), sessionId: external_exports.string(), accountId: external_exports.string() })
38918
39083
  ]).openapi("LimitPlan");
39084
+ LimitStateSchema = external_exports.enum([
39085
+ "limited",
39086
+ "wait-only",
39087
+ "model-limited",
39088
+ "all-accounts-out",
39089
+ "handing-off",
39090
+ "moved",
39091
+ "waiting-reset",
39092
+ "reset-ready"
39093
+ ]).openapi("LimitState");
38919
39094
  SessionLimitSchema = external_exports.object({
38920
39095
  /** The registry id of the account that ran out, or `null` when it is not registered. */
38921
39096
  accountId: external_exports.string().nullable(),
@@ -38926,8 +39101,60 @@ var init_schemas3 = __esm({
38926
39101
  /** When the limit was hit, ISO-8601. */
38927
39102
  since: external_exports.string(),
38928
39103
  /** What happens next ({@link LimitPlanSchema}); `ask` when absent. */
38929
- plan: LimitPlanSchema.default({ mode: "ask" })
39104
+ plan: LimitPlanSchema.default({ mode: "ask" }),
39105
+ /**
39106
+ * `model` when only one model's window ran out (`seven_day_opus`,
39107
+ * `seven_day_sonnet`, a `model:*` bucket), else `account`.
39108
+ */
39109
+ scope: external_exports.enum(["account", "model"]).default("account"),
39110
+ /** Where the limit stands ({@link LimitStateSchema}); `limited` in an older snapshot. */
39111
+ state: LimitStateSchema.default("limited"),
39112
+ /** The model the same account can keep going on, when only one model ran out. */
39113
+ modelFallback: external_exports.string().optional(),
39114
+ /** With `all-accounts-out`: the account that comes back first, and when. */
39115
+ allOut: external_exports.object({ accountId: external_exports.string(), resetsAt: external_exports.string().nullable() }).optional()
38930
39116
  }).openapi("SessionLimit");
39117
+ ContinueAccountOptionSchema = external_exports.object({
39118
+ /** The runtime the account belongs to. */
39119
+ runtime: external_exports.string(),
39120
+ /** The registry id. */
39121
+ id: external_exports.string(),
39122
+ /** What the operator calls the account, or `null` when unnamed. */
39123
+ label: external_exports.string().nullable(),
39124
+ /** The resolved display color. */
39125
+ color: external_exports.string(),
39126
+ /** The account's current usage. */
39127
+ usage: AccountUsageSchema,
39128
+ /** Whether work may go to it now. A person may still pick one that is not. */
39129
+ eligible: external_exports.boolean(),
39130
+ /** Why, in plain words. */
39131
+ reason: external_exports.string(),
39132
+ /** The advisor's badge, when it gave one. */
39133
+ badge: external_exports.enum(["recommended", "reserved"]).optional()
39134
+ }).openapi("ContinueAccountOption");
39135
+ ContinueOptionsResponseSchema = external_exports.object({
39136
+ /** The session's current plan. */
39137
+ plan: LimitPlanSchema,
39138
+ /** The accounts to offer, in order; the account that ran out is not among them. */
39139
+ ranking: external_exports.object({
39140
+ accounts: external_exports.array(ContinueAccountOptionSchema),
39141
+ /** The account to suggest first, or `null` when none has room. */
39142
+ recommendedId: external_exports.string().nullable()
39143
+ }),
39144
+ /** True when the account advisor's ranking was used, false for DorkOS's own. */
39145
+ advised: external_exports.boolean()
39146
+ }).openapi("ContinueOptionsResponse");
39147
+ ContinueSessionRequestSchema = external_exports.object({
39148
+ account: external_exports.string().min(1).optional(),
39149
+ runtime: external_exports.string().min(1).optional(),
39150
+ model: external_exports.string().min(1).optional()
39151
+ }).openapi("ContinueSessionRequest");
39152
+ ContinueSessionResponseSchema = external_exports.object({ sessionId: external_exports.string().optional() }).openapi("ContinueSessionResponse");
39153
+ WaitForResetRequestSchema = external_exports.object({
39154
+ /** Whether the session continues by itself once the reset is confirmed. */
39155
+ autoResume: external_exports.boolean().optional()
39156
+ }).openapi("WaitForResetRequest");
39157
+ LimitPlanResponseSchema = external_exports.object({ plan: LimitPlanSchema }).openapi("LimitPlanResponse");
38931
39158
  SessionSchema = external_exports.object({
38932
39159
  id: external_exports.string().uuid(),
38933
39160
  title: external_exports.string(),
@@ -39023,12 +39250,19 @@ var init_schemas3 = __esm({
39023
39250
  accountId: external_exports.string().optional(),
39024
39251
  /**
39025
39252
  * The session's live status in this server process: its lifecycle and any
39026
- * usage limit it hit. ABSENT means the session is not live in this process;
39027
- * read it as idle.
39253
+ * usage limit it hit. ABSENT when the session is not live in this process
39254
+ * and has no stored limit; read it as idle.
39028
39255
  */
39029
39256
  status: external_exports.object({
39030
39257
  lifecycle: SessionLifecycleSchema,
39031
- limit: SessionLimitSchema.nullable()
39258
+ limit: SessionLimitSchema.nullable(),
39259
+ /**
39260
+ * Account-wide cached usage for the account this session bills, as
39261
+ * `SessionStatus.accountUsage` carries it (spec `claude-account-fleet`
39262
+ * §6 U). Set by `GET /api/sessions/:id`; ABSENT on the list, whose
39263
+ * envelope carries each account once.
39264
+ */
39265
+ accountUsage: AccountUsageSchema.nullable().optional()
39032
39266
  }).optional(),
39033
39267
  /**
39034
39268
  * The work item a flow run serves, read from flow's `flow-state.json`
@@ -40814,6 +41048,12 @@ var init_schemas3 = __esm({
40814
41048
  })
40815
41049
  })
40816
41050
  ).openapi({ description: "The Claude accounts the operator has registered" }),
41051
+ defaultAccountColor: external_exports.string().nullable().optional().openapi({
41052
+ description: "The color the operator chose for the standalone default account (this computer's own Claude sign-in when no registered account has its folder), as lowercase #rrggbb, or null when it shows the default for its position. Ignored while a registered account has the default folder: that account's own color wins. Absent on a server too old to report it"
41053
+ }),
41054
+ defaultAccountResolvedColor: external_exports.string().optional().openapi({
41055
+ description: "The color the default account is drawn in, as lowercase #rrggbb, decided by the server: the registered account that has the default folder's own color, else defaultAccountColor, else the default for its position. Draw this rather than re-deriving it. Absent when the config could not be read, or on a server too old to report it"
41056
+ }),
40817
41057
  accountsUnavailable: external_exports.boolean().optional().openapi({
40818
41058
  description: "True when the account registry could NOT be read (the config store threw, or was consulted before it was initialized), so `accounts` is empty because nothing could be learned rather than because nothing is registered. Absent means the list is an answer. A client must not judge an agent or session account reference against an unavailable registry \u2014 an override that cannot be verified is unknown, never wrong"
40819
41059
  }),
@@ -44556,6 +44796,13 @@ var init_config_disclosure = __esm({
44556
44796
  "runtimes.claudeCode.accounts[].path": "expose",
44557
44797
  "runtimes.claudeCode.accounts[].label": "expose",
44558
44798
  "runtimes.claudeCode.accounts[].color": "expose",
44799
+ // The standalone default account's color (DOR-2492): a display hex, the same
44800
+ // class as a row's `color` right above.
44801
+ "runtimes.claudeCode.defaultAccountColor": "expose",
44802
+ // Account folders a person hid from Settings' "Found on this computer" list
44803
+ // (spec claude-account-ui §7.4). Folder paths, the same class as
44804
+ // `accounts[].path` above: exposed on purpose, and naming no secret.
44805
+ "runtimes.claudeCode.dismissedFolders": "expose",
44559
44806
  // The execution defaults a new session on each runtime starts with. A model id
44560
44807
  // and an effort rung are the same class of thing as `runtimes.default`: they
44561
44808
  // describe HOW work runs here, name no credential and no person, and an agent
@@ -45137,6 +45384,16 @@ var init_config_write_policy = __esm({
45137
45384
  // whole array, so a write that could set a color could also add or repoint an
45138
45385
  // account. The row stays operator-only as a unit.
45139
45386
  "runtimes.claudeCode.accounts[].color": "operator-only",
45387
+ // The standalone default account's color (DOR-2492). Cosmetic too, and held
45388
+ // with the rows' colors on purpose: it is the same choice for the one account
45389
+ // that has no row, so an agent that may not recolor a registered account may
45390
+ // not recolor this one either.
45391
+ "runtimes.claudeCode.defaultAccountColor": "operator-only",
45392
+ // Which found account folders Settings stops offering (spec claude-account-ui
45393
+ // §7.4). Hiding a suggestion widens nothing, but the list decides which
45394
+ // accounts a person is shown as addable, so it stays with the roster it
45395
+ // curates: only a person curates it, through the dismiss route.
45396
+ "runtimes.claudeCode.dismissedFolders": "operator-only",
45140
45397
  // The execution defaults for new sessions on each runtime. Writable, and the
45141
45398
  // operator was asked directly: a model and an effort level are a preference
45142
45399
  // about how work runs, on the same footing as `runtimes.default` right above,
@@ -45241,7 +45498,7 @@ var init_config_write_policy = __esm({
45241
45498
  // machine — read as a write rather than as a scope.
45242
45499
  "harness.autoSync",
45243
45500
  // Whether DorkOS moves a person's own skill folders, unattended, inside
45244
- // the agent folders and room folders DorkOS owns (DOR-1853). The same
45501
+ // the agent folders DorkOS owns (DOR-1853). The same
45245
45502
  // clause read one notch harder: `autoSync` writes links DorkOS made, this
45246
45503
  // one moves a file the person wrote.
45247
45504
  "harness.autoAdopt",
@@ -45278,7 +45535,9 @@ var init_config_write_policy = __esm({
45278
45535
  "runtimes.claudeCode.accounts[].id",
45279
45536
  "runtimes.claudeCode.accounts[].path",
45280
45537
  "runtimes.claudeCode.accounts[].label",
45281
- "runtimes.claudeCode.accounts[].color"
45538
+ "runtimes.claudeCode.accounts[].color",
45539
+ "runtimes.claudeCode.defaultAccountColor",
45540
+ "runtimes.claudeCode.dismissedFolders"
45282
45541
  ]
45283
45542
  },
45284
45543
  {
@@ -46785,12 +47044,21 @@ function permissionSeedForOrigin(origin) {
46785
47044
  // An agent launching a session does not hand it the operator's trust stop;
46786
47045
  // whatever power it gets is the tool's clamped mode, set on its own.
46787
47046
  //
47047
+ // A carry-over's row already holds the source session's model, effort and
47048
+ // mode, copied before the send; the origin must not add the operator's stop
47049
+ // on top of what the session already had.
47050
+ //
47051
+ // A resume after an account's reset goes to a session that is already
47052
+ // bound: its row is its power, and the origin must not add to it.
47053
+ //
46788
47054
  // The harness is not a surface anybody ships to.
46789
47055
  case "schedule":
46790
47056
  case "relay-binding":
46791
47057
  case "agent-dm":
46792
47058
  case "connector-event":
46793
47059
  case "agent-launch":
47060
+ case "account-handoff":
47061
+ case "account-resume":
46794
47062
  case "test-harness":
46795
47063
  return "none";
46796
47064
  default: {
@@ -53892,6 +54160,18 @@ var init_sessions = __esm({
53892
54160
  // inference, unpersisted — so nothing is blocked in the meantime.
53893
54161
  runtime: text("runtime"),
53894
54162
  agentPath: text("agent_path"),
54163
+ // What started the session (`TurnOrigin.kind`), written by the same
54164
+ // first-write-wins statement that binds the runtime and never overwritten.
54165
+ // Server-held, unlike the best-effort `Session.origin`, so it is what decides
54166
+ // whether a limited session may carry its work to another account (spec
54167
+ // `claude-account-fleet` D9). NULL = bound before this column existed.
54168
+ launchOrigin: text("launch_origin"),
54169
+ // The episode `resetsAt` (else `since`) of the last usage limit core resumed
54170
+ // this session from by itself (spec `claude-account-fleet` D9 "Wait, then
54171
+ // resume by itself"): at most one automatic resume per window reset. Kept
54172
+ // here, not on the `session_limits` row, because the resumed turn's own
54173
+ // `turn_start` deletes that row. NULL = never resumed automatically.
54174
+ lastAutoResumeFor: text("last_auto_resume_for"),
53895
54175
  createdAt: text("created_at").notNull(),
53896
54176
  // --- Mutable per-session settings (last-write-wins; ADR-0260) ---
53897
54177
  // NULL = "no explicit preference; use the runtime's default."
@@ -54075,14 +54355,101 @@ var init_session_limits = __esm({
54075
54355
  accountPath: text("account_path"),
54076
54356
  /** What happens next, as `LimitPlan` JSON. */
54077
54357
  plan: text("plan").notNull(),
54078
- /** Where the limit stands; `limited` until the out-of-usage flow computes more. */
54358
+ /** Where the limit stands (`LimitState`); `limited` until the out-of-usage flow computes more. */
54079
54359
  state: text("state").notNull(),
54360
+ /** The session's working directory when the limit was hit, or NULL when unknown. */
54361
+ cwd: text("cwd"),
54362
+ /** The model the same account can keep going on when only one model ran out, or NULL. */
54363
+ modelFallback: text("model_fallback"),
54364
+ /** With `all-accounts-out`: the JSON of `{ accountId, resetsAt }` for the earliest reset, or NULL. */
54365
+ allOut: text("all_out"),
54366
+ /**
54367
+ * The extension id of the account advisor that claimed this session (spec
54368
+ * `claude-account-fleet` X, "One writer for a flow run"), or NULL when none
54369
+ * did. Stored rather than asked live, so a claim survives the advisor's
54370
+ * extension reloading.
54371
+ */
54372
+ claimedBy: text("claimed_by"),
54373
+ /**
54374
+ * The session's chosen model when the limit was hit (`session_metadata.model`),
54375
+ * `''` for the runtime's default, or NULL when never recorded (unknown, never
54376
+ * read as a switch). What the limit history compares against at the next
54377
+ * `turn_start` to tell a model switch from a wait (spec `claude-account-ui`
54378
+ * §7.1). Migration 0120 backfilled the rows that predate it.
54379
+ */
54380
+ model: text("model"),
54080
54381
  /** The row's last write. */
54081
54382
  updatedAt: text("updated_at").notNull()
54082
54383
  });
54083
54384
  }
54084
54385
  });
54085
54386
 
54387
+ // ../db/src/schema/session/session-limit-history.ts
54388
+ var sessionLimitHistory;
54389
+ var init_session_limit_history = __esm({
54390
+ "../db/src/schema/session/session-limit-history.ts"() {
54391
+ "use strict";
54392
+ init_sqlite_core();
54393
+ sessionLimitHistory = sqliteTable(
54394
+ "session_limit_history",
54395
+ {
54396
+ /** A uuid. */
54397
+ id: text("id").primaryKey(),
54398
+ /** The canonical session id the limit hit. */
54399
+ sessionId: text("session_id").notNull(),
54400
+ /** When the limit was hit (the episode's `session_limits.since`). */
54401
+ since: text("since").notNull(),
54402
+ /** The runtime the session ran on, such as `claude-code`. */
54403
+ runtime: text("runtime").notNull(),
54404
+ /** The registry id of the account that ran out, or NULL when unregistered. */
54405
+ accountId: text("account_id"),
54406
+ /** The ledger window key that rejected work, such as `five_hour`. */
54407
+ window: text("window").notNull(),
54408
+ /** Whether the whole account ran out (`account`) or one model's window (`model`). */
54409
+ scope: text("scope").notNull(),
54410
+ /** When that window resets, or NULL when unknown. */
54411
+ resetsAt: text("resets_at"),
54412
+ /** How the episode ended. */
54413
+ resolution: text("resolution", {
54414
+ enum: ["moved", "resumed-reset", "resumed-model", "resumed-early"]
54415
+ }).notNull(),
54416
+ /** When it ended. */
54417
+ resolvedAt: text("resolved_at").notNull(),
54418
+ /** The session the work carried over to (`moved` only). */
54419
+ toSessionId: text("to_session_id"),
54420
+ /** The account the work carried over to (`moved` only). */
54421
+ toAccountId: text("to_account_id"),
54422
+ /** The model before a `resumed-model` switch. */
54423
+ modelFrom: text("model_from"),
54424
+ /** The model after a `resumed-model` switch. */
54425
+ modelTo: text("model_to")
54426
+ },
54427
+ (table2) => [
54428
+ uniqueIndex("session_limit_history_episode_idx").on(table2.sessionId, table2.since),
54429
+ index("session_limit_history_resolved_at_idx").on(table2.resolvedAt)
54430
+ ]
54431
+ );
54432
+ }
54433
+ });
54434
+
54435
+ // ../db/src/schema/session/session-context.ts
54436
+ var sessionContext;
54437
+ var init_session_context = __esm({
54438
+ "../db/src/schema/session/session-context.ts"() {
54439
+ "use strict";
54440
+ init_sqlite_core();
54441
+ sessionContext = sqliteTable("session_context", {
54442
+ sessionId: text("session_id").primaryKey(),
54443
+ /** Tokens occupying the context window at the reading. */
54444
+ contextTokens: integer2("context_tokens").notNull(),
54445
+ /** The model's context window at the reading; `0` when the runtime did not say. */
54446
+ contextMaxTokens: integer2("context_max_tokens").notNull(),
54447
+ /** When the reading was taken (ISO-8601). */
54448
+ observedAt: text("observed_at").notNull()
54449
+ });
54450
+ }
54451
+ });
54452
+
54086
54453
  // ../db/src/schema/workspace.ts
54087
54454
  var workspaces;
54088
54455
  var init_workspace2 = __esm({
@@ -56398,7 +56765,8 @@ var init_notifications = __esm({
56398
56765
  "signin.required",
56399
56766
  "update.installed",
56400
56767
  "report.daily",
56401
- "account.limited"
56768
+ "account.limited",
56769
+ "account.reset"
56402
56770
  ]
56403
56771
  }).notNull(),
56404
56772
  /** How loud this was allowed to be. Copied from the registry at write time. */
@@ -56619,7 +56987,9 @@ __export(schema_exports, {
56619
56987
  searchSources: () => searchSources,
56620
56988
  session: () => session,
56621
56989
  sessionConnectionOverrides: () => sessionConnectionOverrides,
56990
+ sessionContext: () => sessionContext,
56622
56991
  sessionEvents: () => sessionEvents,
56992
+ sessionLimitHistory: () => sessionLimitHistory,
56623
56993
  sessionLimits: () => sessionLimits,
56624
56994
  sessionMessageAcceptanceReceipts: () => sessionMessageAcceptanceReceipts,
56625
56995
  sessionMessageQueue: () => sessionMessageQueue,
@@ -56648,6 +57018,8 @@ var init_schema2 = __esm({
56648
57018
  init_session_events();
56649
57019
  init_message_acceptance();
56650
57020
  init_session_limits();
57021
+ init_session_limit_history();
57022
+ init_session_context();
56651
57023
  init_workspace2();
56652
57024
  init_auth();
56653
57025
  init_unclaimed_chats();
@@ -56758,6 +57130,17 @@ Your data has not been touched \u2014 DorkOS never recreates, renames or repairs
56758
57130
  }
56759
57131
  });
56760
57132
 
57133
+ // ../../apps/server/src/services/session/fleet/session-limit-history.ts
57134
+ var LIMIT_HISTORY_RETENTION_MS;
57135
+ var init_session_limit_history2 = __esm({
57136
+ "../../apps/server/src/services/session/fleet/session-limit-history.ts"() {
57137
+ "use strict";
57138
+ init_src2();
57139
+ init_schemas3();
57140
+ LIMIT_HISTORY_RETENTION_MS = 30 * 24 * 60 * 60 * 1e3;
57141
+ }
57142
+ });
57143
+
56761
57144
  // ../../apps/server/src/services/session/fleet/session-limit-store.ts
56762
57145
  function withSessionLimitStore(what, fn) {
56763
57146
  const store = sharedStore;
@@ -56779,6 +57162,7 @@ var init_session_limit_store = __esm({
56779
57162
  init_src2();
56780
57163
  init_schemas3();
56781
57164
  init_logger();
57165
+ init_session_limit_history2();
56782
57166
  }
56783
57167
  });
56784
57168
 
@@ -58775,6 +59159,23 @@ function fillNullsWith(seed) {
58775
59159
  }
58776
59160
  return update;
58777
59161
  }
59162
+ function moveSessionContext(db, fromId, toId) {
59163
+ const source = db.select().from(sessionContext).where(eq(sessionContext.sessionId, fromId)).get();
59164
+ if (!source) return;
59165
+ const destination = db.select().from(sessionContext).where(eq(sessionContext.sessionId, toId)).get();
59166
+ db.transaction((tx) => {
59167
+ tx.delete(sessionContext).where(eq(sessionContext.sessionId, fromId)).run();
59168
+ if (destination && destination.observedAt >= source.observedAt) return;
59169
+ tx.insert(sessionContext).values({ ...source, sessionId: toId }).onConflictDoUpdate({
59170
+ target: sessionContext.sessionId,
59171
+ set: {
59172
+ contextTokens: source.contextTokens,
59173
+ contextMaxTokens: source.contextMaxTokens,
59174
+ observedAt: source.observedAt
59175
+ }
59176
+ }).run();
59177
+ });
59178
+ }
58778
59179
  var BOUND_RUNTIME_CHUNK_SIZE, RuntimeNotRegisteredError, RuntimeRegistry, runtimeRegistry;
58779
59180
  var init_runtime_registry = __esm({
58780
59181
  "../../apps/server/src/services/core/runtime-registry.ts"() {
@@ -58909,6 +59310,10 @@ var init_runtime_registry = __esm({
58909
59310
  sessionId,
58910
59311
  runtime,
58911
59312
  agentPath: agentPath ?? null,
59313
+ // What started it, server-held and never overwritten: the fact that
59314
+ // decides whether a limited session may carry its work to another
59315
+ // account (spec `claude-account-fleet` D9).
59316
+ launchOrigin: origin.kind,
58912
59317
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
58913
59318
  ...seed
58914
59319
  }).onConflictDoUpdate({
@@ -58920,6 +59325,8 @@ var init_runtime_registry = __esm({
58920
59325
  // with no agent never erases a path some other write knew.
58921
59326
  ...agentPath !== void 0 ? { agentPath } : {},
58922
59327
  ...fillNullsWith(seed),
59328
+ // The claim names what started the session only when nothing has yet.
59329
+ launchOrigin: sql`coalesce(${sessionMetadata.launchOrigin}, ${origin.kind})`,
58923
59330
  // **The UPDATE branch is a CLAIM, and not every origin may seed one.**
58924
59331
  // This row already exists: something created it before the session
58925
59332
  // started, which for a person is their own pre-launch settings change
@@ -58938,6 +59345,23 @@ var init_runtime_registry = __esm({
58938
59345
  });
58939
59346
  return result2.changes > 0;
58940
59347
  }
59348
+ /**
59349
+ * Take back the binding row a caller wrote at a turn's launch when that turn
59350
+ * then never ran (DOR-2447).
59351
+ *
59352
+ * A room records a session's owner as its turn launches, because a runtime may
59353
+ * ask for authority that needs the row the moment it starts. If the dispatch
59354
+ * then fails before any turn runs, the room never binds that freshly minted
59355
+ * id and mints another next time — so the row would belong to nothing. Only
59356
+ * the caller that wrote the row, for an id only it knows, may ask this.
59357
+ *
59358
+ * @param sessionId - The minted session id whose launch never produced a turn
59359
+ */
59360
+ async forgetUnstartedSession(sessionId) {
59361
+ const db = this.requireDb("forgetUnstartedSession");
59362
+ db.delete(sessionMetadata).where(eq(sessionMetadata.sessionId, sessionId)).run();
59363
+ return Promise.resolve();
59364
+ }
58941
59365
  /**
58942
59366
  * Return the runtime type string for a session.
58943
59367
  *
@@ -59070,6 +59494,55 @@ var init_runtime_registry = __esm({
59070
59494
  const row = db.select({ agentPath: sessionMetadata.agentPath }).from(sessionMetadata).where(eq(sessionMetadata.sessionId, sessionId)).get();
59071
59495
  return row?.agentPath ?? null;
59072
59496
  }
59497
+ /**
59498
+ * What started a session (`TurnOrigin.kind`), as the binding write recorded
59499
+ * it, or null when the session has no row or was bound before the column
59500
+ * existed. Server-held, unlike `Session.origin`, so it can decide what a
59501
+ * session may do (spec `claude-account-fleet` D9).
59502
+ *
59503
+ * @param sessionId - Session identifier
59504
+ */
59505
+ getSessionLaunchOrigin(sessionId) {
59506
+ const db = this.requireDb("getSessionLaunchOrigin");
59507
+ const row = db.select({ launchOrigin: sessionMetadata.launchOrigin }).from(sessionMetadata).where(eq(sessionMetadata.sessionId, sessionId)).get();
59508
+ return row?.launchOrigin ?? null;
59509
+ }
59510
+ /**
59511
+ * The usage-limit episode core last resumed this session from by itself
59512
+ * (`session_metadata.last_auto_resume_for`), or null when it never did.
59513
+ * Read by every later episode, so a resumed turn that runs out again in the
59514
+ * same window is never resumed a second time (spec `claude-account-fleet`
59515
+ * D9 "Wait, then resume by itself").
59516
+ *
59517
+ * @param sessionId - Session identifier
59518
+ */
59519
+ getLastAutoResumeFor(sessionId) {
59520
+ const db = this.requireDb("getLastAutoResumeFor");
59521
+ const row = db.select({ lastAutoResumeFor: sessionMetadata.lastAutoResumeFor }).from(sessionMetadata).where(eq(sessionMetadata.sessionId, sessionId)).get();
59522
+ return row?.lastAutoResumeFor ?? null;
59523
+ }
59524
+ /**
59525
+ * Record that core is resuming this session by itself from the episode
59526
+ * named `episode`, before the resume is sent. Synchronous, so the record and
59527
+ * the dispatch that follows it happen in one step. Creates an unbound row
59528
+ * when the session has none, and never touches the binding.
59529
+ *
59530
+ * @param sessionId - Session identifier
59531
+ * @param episode - The episode's key (its `resetsAt`, else its `since`), or
59532
+ * `null` to put back "never" when the resume could not be sent
59533
+ */
59534
+ markAutoResumed(sessionId, episode) {
59535
+ const db = this.requireDb("markAutoResumed");
59536
+ db.insert(sessionMetadata).values({
59537
+ sessionId,
59538
+ runtime: null,
59539
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
59540
+ lastAutoResumeFor: episode
59541
+ }).onConflictDoUpdate({
59542
+ target: sessionMetadata.sessionId,
59543
+ set: { lastAutoResumeFor: episode }
59544
+ }).run();
59545
+ }
59073
59546
  /**
59074
59547
  * Read a session's persisted settings, or null when no row exists. NULL
59075
59548
  * columns are omitted from the result (not surfaced as explicit values).
@@ -59123,6 +59596,21 @@ var init_runtime_registry = __esm({
59123
59596
  ...patch
59124
59597
  }).onConflictDoUpdate({ target: sessionMetadata.sessionId, set: patch }).run();
59125
59598
  }
59599
+ /**
59600
+ * Delete a session's `session_metadata` row outright, bound or not.
59601
+ *
59602
+ * For exactly one kind of caller: one that minted the session id itself,
59603
+ * saved settings under it, and then saw the launch refused, throw, or not be
59604
+ * accepted (`session_start`). Nobody else can know that id, so nothing anyone
59605
+ * chose is lost; without this, every refused launch would leave a row for a
59606
+ * session that never existed.
59607
+ *
59608
+ * @param sessionId - The id the caller minted.
59609
+ */
59610
+ async discardSessionSettings(sessionId) {
59611
+ const db = this.requireDb("discardSessionSettings");
59612
+ db.delete(sessionMetadata).where(eq(sessionMetadata.sessionId, sessionId)).run();
59613
+ }
59126
59614
  /**
59127
59615
  * The `permission_mode` a CLAIM should write: the stored one if the runtime
59128
59616
  * being bound can actually run it, otherwise the seed, otherwise nothing.
@@ -59296,6 +59784,15 @@ var init_runtime_registry = __esm({
59296
59784
  if (fromId === toId) return;
59297
59785
  const db = this.requireDb("rekeySessionSettings");
59298
59786
  withSessionLimitStore("rekey", (store) => store.rekeySession(fromId, toId));
59787
+ try {
59788
+ moveSessionContext(db, fromId, toId);
59789
+ } catch (err) {
59790
+ logger.warn("[RuntimeRegistry] could not move a session context reading", {
59791
+ fromId,
59792
+ toId,
59793
+ err: err instanceof Error ? err.message : String(err)
59794
+ });
59795
+ }
59299
59796
  const source = db.select().from(sessionMetadata).where(eq(sessionMetadata.sessionId, fromId)).get();
59300
59797
  if (!source) return;
59301
59798
  const destination = db.select().from(sessionMetadata).where(eq(sessionMetadata.sessionId, toId)).get();
@@ -59311,7 +59808,9 @@ var init_runtime_registry = __esm({
59311
59808
  model: destination.model ?? source.model,
59312
59809
  effort: destination.effort ?? source.effort,
59313
59810
  fastMode: destination.fastMode ?? source.fastMode,
59314
- agentPath: destination.agentPath ?? source.agentPath
59811
+ agentPath: destination.agentPath ?? source.agentPath,
59812
+ launchOrigin: destination.launchOrigin ?? source.launchOrigin,
59813
+ lastAutoResumeFor: destination.lastAutoResumeFor ?? source.lastAutoResumeFor
59315
59814
  }).where(eq(sessionMetadata.sessionId, toId)).run();
59316
59815
  });
59317
59816
  logger.debug(
@@ -59528,6 +60027,7 @@ var init_session_stream = __esm({
59528
60027
  init_approval_schemas();
59529
60028
  init_schemas3();
59530
60029
  init_canvas_schemas();
60030
+ init_account_usage();
59531
60031
  init_schemas3();
59532
60032
  extendZodWithOpenApiOnce();
59533
60033
  SessionContextUsageSchema = external_exports.object({
@@ -59540,7 +60040,15 @@ var init_session_stream = __esm({
59540
60040
  /** Tokens read from prompt cache (90% cost savings). */
59541
60041
  cacheReadTokens: external_exports.number().int(),
59542
60042
  /** Tokens written to prompt cache (slight write premium). */
59543
- cacheCreationTokens: external_exports.number().int()
60043
+ cacheCreationTokens: external_exports.number().int(),
60044
+ /**
60045
+ * When {@link totalTokens} and {@link maxTokens} were measured (ISO-8601):
60046
+ * the moment of a live reading, or the stored reading's time when the
60047
+ * figures were restored on open or after a restart (spec
60048
+ * `claude-account-fleet` §6 U). ABSENT when a runtime reported the figures
60049
+ * without it (an older server).
60050
+ */
60051
+ observedAt: external_exports.string().optional()
59544
60052
  }).openapi("SessionContextUsage");
59545
60053
  SessionCacheStatsSchema = external_exports.object({
59546
60054
  /** Cumulative tokens served from the prompt cache. */
@@ -59580,6 +60088,21 @@ var init_session_stream = __esm({
59580
60088
  * The `.default(null)` keeps pre-usage snapshots parsing (version skew).
59581
60089
  */
59582
60090
  usage: UsageStatusSchema.nullable().default(null),
60091
+ /**
60092
+ * Account-wide cached usage for the account this session bills (spec
60093
+ * `claude-account-fleet` §6 U), stamped from the server's usage store when
60094
+ * the session is opened, so it shows before the session's first turn and
60095
+ * for a single account (`default`). `updatedAt` and each window's
60096
+ * `observedAt` say how fresh it is. `null` when the session's runtime keeps
60097
+ * no usage ledger.
60098
+ *
60099
+ * Never carried by a `status_change`: a change travels only on the global
60100
+ * `account_usage` event, and a client applies it to every session whose
60101
+ * value names that account, matching on (`runtime`, `accountId`), or on
60102
+ * (`runtime`, `path`) when `accountId` is `null`. The `.default(null)` keeps
60103
+ * older snapshots parsing (version skew).
60104
+ */
60105
+ accountUsage: AccountUsageSchema.nullable().default(null),
59583
60106
  /** Prompt-cache accounting, or `null` before the first turn. */
59584
60107
  cacheStats: SessionCacheStatsSchema.nullable(),
59585
60108
  /** Active model identifier, or `null` before the first turn. */
@@ -59754,10 +60277,15 @@ var init_session_stream = __esm({
59754
60277
  // out fleet-wide — which is a runtime naming a tool the session never
59755
60278
  // started. Nothing produces it (the normalizer maps no source field to it),
59756
60279
  // so the delta simply cannot express it.
60280
+ //
60281
+ // `accountUsage` is OMITTED too: it is account-wide, so a change to it
60282
+ // travels once on the global `account_usage` event rather than into every
60283
+ // session's log (a log-backed runtime persists each event it streams, and a
60284
+ // reconnect would replay them all).
59757
60285
  external_exports.object({
59758
60286
  ...seqShape,
59759
60287
  type: external_exports.literal("status_change"),
59760
- status: SessionStatusSchema.omit({ activity: true }).partial().extend({
60288
+ status: SessionStatusSchema.omit({ activity: true, accountUsage: true }).partial().extend({
59761
60289
  contextUsage: SessionContextUsageSchema.partial().nullable().optional()
59762
60290
  })
59763
60291
  }),
@@ -61731,6 +62259,16 @@ function takeAccountsSeen(patch) {
61731
62259
  seen: new Set(parsed.data)
61732
62260
  };
61733
62261
  }
62262
+ function defaultAccountColorRefusal(patch) {
62263
+ const runtimes = patch.runtimes;
62264
+ if (!isRecord(runtimes)) return null;
62265
+ const claudeCode = runtimes.claudeCode;
62266
+ if (!isRecord(claudeCode) || !("defaultAccountColor" in claudeCode)) return null;
62267
+ if (DefaultAccountColorSchema.safeParse(claudeCode.defaultAccountColor).success) return null;
62268
+ return [
62269
+ "runtimes.claudeCode.defaultAccountColor: must be a lowercase #rrggbb color, or null for the default."
62270
+ ];
62271
+ }
61734
62272
  function withReadableLabel(row) {
61735
62273
  return typeof row.label === "string" || row.label === null ? row : { ...row, label: null };
61736
62274
  }
@@ -61855,6 +62393,8 @@ function applyConfigPatch(patch) {
61855
62393
  const taken = takeAccountsSeen(patch);
61856
62394
  if (!taken.ok) return { ok: false, error: "Validation failed", details: taken.details };
61857
62395
  const patchObj = taken.patch;
62396
+ const colorRefusal = defaultAccountColorRefusal(patchObj);
62397
+ if (colorRefusal) return { ok: false, error: "Validation failed", details: colorRefusal };
61858
62398
  const current = configManager.getAll();
61859
62399
  const merged = deepMerge(current, patchObj);
61860
62400
  settleLegacyAccountAlias(merged, patchObj);
@@ -68789,10 +69329,17 @@ different folder, so:
68789
69329
 
68790
69330
  ## Sync before you edit
68791
69331
 
68792
- Run \`git -C <your copy> merge main\` at the start of any turn where you are
68793
- going to change something. This is plain git, not a tool: sorting out a clash in
68794
- your own copy is your job, and doing it there means the room's copy never sits in
68795
- a conflicted state.
69332
+ When a room turn of yours starts and your copy has nothing in progress (nothing
69333
+ changed, nothing committed that the room lacks, still on your own branch),
69334
+ DorkOS brings it up to date with main first, and your room context says so.
69335
+ When you do have work in progress, your copy is left exactly as it is, and your
69336
+ room context lists what moved on main since you branched: who changed it, which
69337
+ files, and which of those you have changed too.
69338
+
69339
+ Either way, run \`git -C <your copy> merge main\` at the start of any turn where
69340
+ you are going to change something. This is plain git, not a tool: sorting out a
69341
+ clash in your own copy is your job, and doing it there means the room's copy
69342
+ never sits in a conflicted state.
68796
69343
 
68797
69344
  Your room context tells you how far the room has moved ahead of you. If you want
68798
69345
  to look before you start, the tool whose name ends in \`room_repo_status\` reports
@@ -69056,7 +69603,7 @@ var init_refusals = __esm({
69056
69603
  /** R7, and the offending keys are a mix, or one belongs to nobody DorkOS knows. */
69057
69604
  S7c: (name, fields) => `"${name}" uses ${fields} in its settings, which DorkOS doesn't recognise, so it can't tell whether your other agents can run it. Run dorkos harness adopt ${name} --claude-only to keep it where it is, or take ${fields} out and adopt it.`,
69058
69605
  /** B1 — `harness.autoAdopt` is on somewhere DorkOS does not own. */
69059
- S8: () => `harness.autoAdopt is on, and it does nothing here: DorkOS only moves skills on its own inside the agent folders and room folders it owns. Run dorkos harness adopt <name> to move one yourself.`,
69606
+ S8: () => `harness.autoAdopt is on, and it does nothing here: DorkOS only moves skills on its own inside the agent folders it owns. Run dorkos harness adopt <name> to move one yourself.`,
69060
69607
  /** R8 — `--claude-only` on a candidate that does not live in Claude Code's folder. */
69061
69608
  S9: (name, root) => `--claude-only records a skill as belonging to Claude Code, and "${name}" lives in ${root}. Leave it where it is, or move the folder yourself.`,
69062
69609
  /**
@@ -135701,7 +136248,13 @@ var init_connector_schemas = __esm({
135701
136248
  operations: external_exports.array(
135702
136249
  ConnectorOperationRevisionSchema.omit({ id: true, discoveredAt: true }).extend({
135703
136250
  // Private upstream revision identity, never included in public revision DTOs.
135704
- providerRevisionRef: external_exports.string().min(1).max(500).optional()
136251
+ providerRevisionRef: external_exports.string().min(1).max(500).optional(),
136252
+ // Presentation hints only. Neither is part of a revision's identity, its
136253
+ // stored row, or its safety classification.
136254
+ /** The service's own display name for the operation, when it gives one. */
136255
+ displayName: external_exports.string().min(1).max(200).optional(),
136256
+ /** True when the service marks the operation as one of its main ones. */
136257
+ important: external_exports.boolean().optional()
135705
136258
  })
135706
136259
  ),
135707
136260
  nextCursor: external_exports.string().min(1).optional(),
@@ -136283,7 +136836,16 @@ var init_connector_provider = __esm({
136283
136836
  /** Exact per-service authentication availability when it differs from the provider default. */
136284
136837
  authentication: ConnectorCapabilityAvailabilitySchema.optional(),
136285
136838
  /** Composio's `max_accounts_per_toolkit`; `undefined` = unbounded/one. */
136286
- maxAccountsPerUser: external_exports.number().int().positive().optional()
136839
+ maxAccountsPerUser: external_exports.number().int().positive().optional(),
136840
+ /**
136841
+ * Where the connection service hosts the app's logo: an https URL on one of
136842
+ * that service's own logo hosts, already checked by the provider. Server-side
136843
+ * only: the catalog never sends it to a browser, which gets a same-origin
136844
+ * logo path instead, and the server's logo route fetches this URL.
136845
+ */
136846
+ logoUrl: external_exports.string().url().max(2e3).optional(),
136847
+ /** The service's own one-line description of the app, already cut to one short sentence. */
136848
+ description: external_exports.string().min(1).max(300).optional()
136287
136849
  });
136288
136850
  ConnectedAccountStatusSchema = external_exports.enum([
136289
136851
  "active",
@@ -142364,7 +142926,7 @@ if (process.argv[2] === "community") {
142364
142926
  })
142365
142927
  );
142366
142928
  const exitCode = await dispatcher.runCommunityDispatcher(process.argv.slice(3), {
142367
- cliVersion: "0.88.0",
142929
+ cliVersion: "0.89.0",
142368
142930
  dorkHome: DORK_HOME,
142369
142931
  processEnv: childEnv,
142370
142932
  parseRelease: (bytes) => releaseContract.parseCompatibleCommunityReleaseManifest(
@@ -142382,7 +142944,7 @@ if (process.argv[2] === "community") {
142382
142944
  process.exit(1);
142383
142945
  }
142384
142946
  }
142385
- var cliErrorReporter = initCliErrorReporting({ dorkHome: DORK_HOME, version: "0.88.0" });
142947
+ var cliErrorReporter = initCliErrorReporting({ dorkHome: DORK_HOME, version: "0.89.0" });
142386
142948
  var uninstallCliErrorHandlers = cliErrorReporter ? installCliErrorHandlers(cliErrorReporter) : void 0;
142387
142949
  if (process.argv[2] === "doctor") {
142388
142950
  process.env.DORK_HOME = DORK_HOME;
@@ -142392,7 +142954,7 @@ if (process.argv[2] === "doctor") {
142392
142954
  if (process.argv[2] === "feedback") {
142393
142955
  process.env.DORK_HOME = DORK_HOME;
142394
142956
  const { runFeedback: runFeedback2 } = await Promise.resolve().then(() => (init_feedback2(), feedback_exports));
142395
- process.exit(await runFeedback2(DORK_HOME, "0.88.0", process.argv.slice(3)));
142957
+ process.exit(await runFeedback2(DORK_HOME, "0.89.0", process.argv.slice(3)));
142396
142958
  }
142397
142959
  if (process.argv[2] === "auth") {
142398
142960
  process.env.DORK_HOME = DORK_HOME;
@@ -142491,7 +143053,7 @@ if (process.argv[2] === "agent" || process.argv[2] === "task" || process.argv[2]
142491
143053
  }
142492
143054
  }
142493
143055
  const { runVersionDispatcher: runVersionDispatcher2 } = await Promise.resolve().then(() => (init_version5(), version_exports));
142494
- process.exit(await runVersionDispatcher2("0.88.0", DORK_HOME, subArgs));
143056
+ process.exit(await runVersionDispatcher2("0.89.0", DORK_HOME, subArgs));
142495
143057
  }
142496
143058
  function parseCliArgs() {
142497
143059
  try {
@@ -142616,14 +143178,14 @@ Examples:
142616
143178
  process.exit(0);
142617
143179
  }
142618
143180
  if (values.version) {
142619
- console.log("0.88.0");
143181
+ console.log("0.89.0");
142620
143182
  process.exit(0);
142621
143183
  }
142622
143184
  if (values["post-install-check"]) {
142623
143185
  const claudeFound = checkClaude();
142624
143186
  const coreExtensionsFound = checkCoreExtensions();
142625
143187
  const extensionsCompile = await checkExtensionCompilation();
142626
- console.log(`dorkos ${"0.88.0"}`);
143188
+ console.log(`dorkos ${"0.89.0"}`);
142627
143189
  if (!coreExtensionsFound) {
142628
143190
  console.log("Installation incomplete \u2014 bundled core extensions are missing.");
142629
143191
  }
@@ -142780,7 +143342,7 @@ if (fs30.existsSync(envPath)) {
142780
143342
  }
142781
143343
  uninstallCliErrorHandlers?.();
142782
143344
  process.env.DORKOS_CLI_ENTRYPOINT = fileURLToPath6(import.meta.url);
142783
- process.env.DORKOS_CLI_VERSION = "0.88.0";
143345
+ process.env.DORKOS_CLI_VERSION = "0.89.0";
142784
143346
  var server;
142785
143347
  try {
142786
143348
  server = await import("../server/index.js");
@@ -142805,7 +143367,7 @@ var ansiReset = "\x1B[0m";
142805
143367
  console.log("");
142806
143368
  console.log(`${purple}${logo}${ansiReset}`);
142807
143369
  console.log("");
142808
- console.log(` DorkOS v${"0.88.0"}`);
143370
+ console.log(` DorkOS v${"0.89.0"}`);
142809
143371
  console.log(` Local: ${link(localUrl, localUrl)}`);
142810
143372
  var nets = networkInterfaces();
142811
143373
  var networkUrl = null;
@@ -142831,9 +143393,9 @@ if (shouldOpenBrowser && process.stdin.isTTY) {
142831
143393
  const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
142832
143394
  exec(`${openCmd} ${localUrl}`);
142833
143395
  }
142834
- checkForUpdate("0.88.0").then((latestVersion) => {
143396
+ checkForUpdate("0.89.0").then((latestVersion) => {
142835
143397
  if (latestVersion) {
142836
- const msg = `Update available: ${"0.88.0"} \u2192 ${latestVersion}`;
143398
+ const msg = `Update available: ${"0.89.0"} \u2192 ${latestVersion}`;
142837
143399
  const cmd = "Run npm install -g dorkos@latest to update";
142838
143400
  const width = Math.max(msg.length, cmd.length) + 6;
142839
143401
  const pad2 = (s2) => `\u2502 ${s2}${" ".repeat(width - s2.length - 6)} \u2502`;