@alivault/pico 0.1.7 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import { i as __toESM } from "../_runtime.mjs";
2
2
  import { X as require_react, Y as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { a as createRouter, c as createRootRoute, n as Scripts, r as HeadContent, s as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
4
4
  import { h as OctagonX, i as TriangleAlert, k as CircleCheck, v as Info } from "../_libs/lucide-react.mjs";
5
- import { A as extractToolText, C as buildItemsFromSync, N as mergeAssistantBlocksForStreaming, O as extractMessageImages, S as assistantBlocksFromMessage, T as createCompactionSummaryItem, h as THEME_STORAGE_KEY, k as extractMessageText$1, m as Spinner, nt as toolCategoryFromTool, u as Route$46, y as TooltipProvider } from "./routes-Di-eYVLe.mjs";
5
+ import { C as TooltipProvider, D as buildItemsFromSync, E as assistantBlocksFromMessage, L as mergeAssistantBlocksForStreaming, M as extractMessageImages, N as extractMessageText$1, P as extractToolText, k as createCompactionSummaryItem, m as Route$46, st as toolCategoryFromTool, v as Spinner, y as THEME_STORAGE_KEY } from "./routes-C8zGEsem.mjs";
6
6
  import { t as QueryClient } from "../_libs/tanstack__query-core.mjs";
7
7
  import { t as setupRouterSsrQueryIntegration } from "../_libs/@tanstack/react-router-ssr-query+[...].mjs";
8
8
  import { n as HotkeysProvider } from "../_libs/tanstack__react-hotkeys.mjs";
@@ -20,7 +20,7 @@ import os, { homedir } from "node:os";
20
20
  import { performance } from "node:perf_hooks";
21
21
  import { isMainThread } from "node:worker_threads";
22
22
  import { execSync, spawn } from "node:child_process";
23
- //#region node_modules/.nitro/vite/services/ssr/assets/router-CvoH1TXL.js
23
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-L-w2zu97.js
24
24
  var import_react = /* @__PURE__ */ __toESM(require_react());
25
25
  var import_jsx_runtime = require_jsx_runtime();
26
26
  var Toaster$1 = ({ ...props }) => {
@@ -513,7 +513,7 @@ async function clearContextDraft(options) {
513
513
  await disposeDraftIfUnused(draftEntry);
514
514
  }
515
515
  async function resolveRequestedEntry(options) {
516
- const { url, context, getSessionEntryByKey, ensureSessionEntryById, getActiveEntry, getOrCreateDraftEntry, activateContextSession, notifyOnActivate = true } = options;
516
+ const { url, context, getSessionEntryByKey, ensureSessionEntryById, getActiveEntry, isDraftEntry, getOrCreateDraftEntry, activateContextSession, notifyOnActivate = true, preferActiveDraft = false } = options;
517
517
  const activateRequestedEntry = async (entry) => {
518
518
  await activateContextSession(context, entry, { notify: notifyOnActivate });
519
519
  return entry;
@@ -523,6 +523,10 @@ async function resolveRequestedEntry(options) {
523
523
  const requestedEntry = getSessionEntryByKey(requestedSessionKey);
524
524
  if (requestedEntry) return await activateRequestedEntry(requestedEntry);
525
525
  }
526
+ if (preferActiveDraft && context.draftKey) {
527
+ const draftEntry = getSessionEntryByKey(context.draftKey);
528
+ if (draftEntry && isDraftEntry(draftEntry)) return await activateRequestedEntry(draftEntry);
529
+ }
526
530
  const requestedSessionId = url.searchParams.get("session");
527
531
  if (requestedSessionId) {
528
532
  const requestedEntry = await ensureSessionEntryById(requestedSessionId);
@@ -4161,9 +4165,11 @@ var PicoRuntime = class {
4161
4165
  getSessionEntryByKey: (key) => this.sessionEntries.get(key),
4162
4166
  ensureSessionEntryById: async (sessionId) => await this.ensureSessionEntryById(sessionId),
4163
4167
  getActiveEntry: (activeContext) => this.getActiveEntry(activeContext),
4168
+ isDraftEntry: (entry) => this.isDraftEntry(entry),
4164
4169
  getOrCreateDraftEntry: async (activeContext) => await this.getOrCreateDraftEntry(activeContext),
4165
4170
  activateContextSession: async (activeContext, entry, activateOptions) => await this.activateContextSession(activeContext, entry, activateOptions),
4166
- notifyOnActivate: options?.notifyOnActivate
4171
+ notifyOnActivate: options?.notifyOnActivate,
4172
+ preferActiveDraft: options?.preferActiveDraft
4167
4173
  });
4168
4174
  }
4169
4175
  async resolveRequest(request, options) {
@@ -4180,7 +4186,10 @@ var PicoRuntime = class {
4180
4186
  scope: context.sessionScope
4181
4187
  });
4182
4188
  try {
4183
- const activeEntry = await this.resolveRequestedEntry(url, context, { notifyOnActivate: options?.notifyOnActivate ?? false });
4189
+ const activeEntry = await this.resolveRequestedEntry(url, context, {
4190
+ notifyOnActivate: options?.notifyOnActivate ?? false,
4191
+ preferActiveDraft: options?.preferActiveDraft ?? true
4192
+ });
4184
4193
  this.logSessionLoadDebug("request_resolve:done", {
4185
4194
  pathname: url.pathname,
4186
4195
  contextId: context.id,
@@ -4564,6 +4573,9 @@ var PicoRuntime = class {
4564
4573
  await this.broadcastEntryState(entry);
4565
4574
  return entry.pendingUserMessages;
4566
4575
  }
4576
+ refreshRetainedConversationItems(entry) {
4577
+ entry.retainedConversationItems = createRetainedConversationState(entry.session.messages.map((message) => sanitizeSessionMessage(message))).items;
4578
+ }
4567
4579
  async bindSessionEntry(entry) {
4568
4580
  const startedAt = performance.now();
4569
4581
  const unsubscribeStartedAt = performance.now();
@@ -4573,7 +4585,7 @@ var PicoRuntime = class {
4573
4585
  ...this.sessionDebugDetails(entry)
4574
4586
  });
4575
4587
  const session = entry.session;
4576
- entry.retainedConversationItems = createRetainedConversationState(session.messages.map((message) => sanitizeSessionMessage(message))).items;
4588
+ this.refreshRetainedConversationItems(entry);
4577
4589
  const viewers = () => [...this.contexts.values()].filter((context) => context.activeKey === entry.key);
4578
4590
  const uiRequestBridge = createUiRequestBridge({
4579
4591
  entryKey: entry.key,
@@ -4696,6 +4708,7 @@ var PicoRuntime = class {
4696
4708
  },
4697
4709
  navigateTree: async (targetId, navigateOptions) => {
4698
4710
  const result = await session.navigateTree(targetId, navigateOptions);
4711
+ this.refreshRetainedConversationItems(entry);
4699
4712
  if (result.editorText != null) entry.uiState.editorText = result.editorText;
4700
4713
  await this.broadcastEntryState(entry);
4701
4714
  if (result.summaryEntry) {
@@ -4864,7 +4877,7 @@ var PicoRuntime = class {
4864
4877
  }
4865
4878
  async createEventsResponse(request) {
4866
4879
  const startedAt = performance.now();
4867
- const { url, context, activeEntry } = await this.resolveRequest(request);
4880
+ const { url, context, activeEntry } = await this.resolveRequest(request, { preferActiveDraft: false });
4868
4881
  context.sidebarBootstrapDirectories = normalizeRequestedDirectories(url.searchParams.getAll("sidebarDirectory"));
4869
4882
  this.logSessionLoadDebug("events_response:create", {
4870
4883
  contextId: context.id,
@@ -4943,7 +4956,7 @@ var PicoRuntime = class {
4943
4956
  }
4944
4957
  }
4945
4958
  async prompt(request, body) {
4946
- const { context, activeEntry } = await this.resolveRequest(request);
4959
+ const { context, activeEntry } = await this.resolveRequest(request, { preferActiveDraft: true });
4947
4960
  const message = typeof body.message === "string" ? body.message : "";
4948
4961
  const images = normalizePromptImages(body.images);
4949
4962
  if (!message.trim() && images.length === 0) throw new Error("message or image is required");
@@ -5271,6 +5284,7 @@ var PicoRuntime = class {
5271
5284
  replaceInstructions: Boolean(body.replaceInstructions),
5272
5285
  label: typeof body.label === "string" ? body.label : void 0
5273
5286
  });
5287
+ this.refreshRetainedConversationItems(activeEntry);
5274
5288
  if (result.editorText != null) activeEntry.uiState.editorText = result.editorText;
5275
5289
  if (result.summaryEntry) {
5276
5290
  this.touchSessionEntry(activeEntry);
@@ -6616,18 +6630,44 @@ var Route$29 = createFileRoute("/api/git-checkout")({ server: { handlers: { POST
6616
6630
  return routeErrorResponse(error, "Failed to switch branch");
6617
6631
  }
6618
6632
  } } } });
6633
+ var GIT_CHANGES_SCOPES = new Set([
6634
+ "all",
6635
+ "files",
6636
+ "branches",
6637
+ "commits"
6638
+ ]);
6639
+ function isGitChangesScope(value) {
6640
+ return Boolean(value && GIT_CHANGES_SCOPES.has(value));
6641
+ }
6642
+ function getGitChangesScope(url) {
6643
+ const gitScope = url.searchParams.get("gitScope");
6644
+ if (isGitChangesScope(gitScope)) return gitScope;
6645
+ const legacyScope = url.searchParams.get("scope");
6646
+ return isGitChangesScope(legacyScope) ? legacyScope : "all";
6647
+ }
6648
+ function getRuntimeRequestForGitChanges(request, url) {
6649
+ const legacyScope = url.searchParams.get("scope");
6650
+ if (url.searchParams.has("gitScope") || !isGitChangesScope(legacyScope)) return request;
6651
+ const runtimeUrl = new URL(url);
6652
+ runtimeUrl.searchParams.delete("scope");
6653
+ return new Request(runtimeUrl.toString(), {
6654
+ headers: request.headers,
6655
+ method: request.method
6656
+ });
6657
+ }
6619
6658
  var Route$28 = createFileRoute("/api/git-changes")({ server: { handlers: { GET: async ({ request }) => {
6620
6659
  const url = new URL(request.url);
6621
6660
  const requestedCwd = url.searchParams.get("cwd") || "";
6622
- const scope = url.searchParams.get("scope") || "all";
6661
+ const gitScope = getGitChangesScope(url);
6623
6662
  const commitsLimitValue = url.searchParams.get("commitsLimit");
6624
6663
  const commitsLimitParam = Number(commitsLimitValue);
6625
6664
  const commitsLimit = commitsLimitValue !== null && Number.isFinite(commitsLimitParam) ? commitsLimitParam : void 0;
6626
6665
  if (!requestedCwd.trim()) return errorResponse("cwd is required");
6627
6666
  try {
6628
- const { context, activeEntry } = await getPicoRuntime().resolveRequest(request);
6667
+ const runtimeRequest = getRuntimeRequestForGitChanges(request, url);
6668
+ const { context, activeEntry } = await getPicoRuntime().resolveRequest(runtimeRequest);
6629
6669
  const cwd = await resolveDirectoryPath(requestedCwd, getPicoRuntime().getBaseCwd(activeEntry, context));
6630
- if (scope === "files") {
6670
+ if (gitScope === "files") {
6631
6671
  const files = await readDirectoryGitFiles(cwd);
6632
6672
  return jsonResponse({
6633
6673
  ok: true,
@@ -6641,7 +6681,7 @@ var Route$28 = createFileRoute("/api/git-changes")({ server: { handlers: { GET:
6641
6681
  unpushedCommitShortHashes: []
6642
6682
  });
6643
6683
  }
6644
- if (scope === "branches") {
6684
+ if (gitScope === "branches") {
6645
6685
  const branches = await readDirectoryGitBranches(cwd);
6646
6686
  return jsonResponse({
6647
6687
  ok: true,
@@ -6655,7 +6695,7 @@ var Route$28 = createFileRoute("/api/git-changes")({ server: { handlers: { GET:
6655
6695
  unpushedCommitShortHashes: []
6656
6696
  });
6657
6697
  }
6658
- if (scope === "commits") {
6698
+ if (gitScope === "commits") {
6659
6699
  const commits = await readDirectoryGitCommits(cwd, { limit: commitsLimit });
6660
6700
  return jsonResponse({
6661
6701
  ok: true,
@@ -5,7 +5,7 @@ import { n as clsx } from "../_libs/class-variance-authority+clsx.mjs";
5
5
  import { t as twMerge } from "../_libs/tailwind-merge.mjs";
6
6
  import { B as ArrowDown, I as ArrowUp, M as ChevronUp, O as Command, R as ArrowRight, V as ArrowBigUp, m as Option, z as ArrowLeft } from "../_libs/lucide-react.mjs";
7
7
  import { n as string, t as object } from "../_libs/zod.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-Di-eYVLe.js
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-C8zGEsem.js
9
9
  var import_react = /* @__PURE__ */ __toESM(require_react());
10
10
  var import_jsx_runtime = require_jsx_runtime();
11
11
  function cn(...inputs) {
@@ -265,6 +265,10 @@ var HIDE_TOOL_BLOCKS_STORAGE_KEY = "pico-hide-tools";
265
265
  var CENTER_MESSAGES_STORAGE_KEY = "pico-center-messages";
266
266
  var AUTO_SCROLL_ENABLED_STORAGE_KEY = "pico-auto-scroll";
267
267
  var RIGHT_SIDEBAR_OPEN_STORAGE_KEY = "pico-right-sidebar-open";
268
+ var RIGHT_SIDEBAR_ACTIVE_TAB_STORAGE_KEY = "pico-right-sidebar-active-tab";
269
+ var RIGHT_SIDEBAR_WIDTHS_STORAGE_KEY = "pico-right-sidebar-widths";
270
+ var RIGHT_SIDEBAR_FILE_TREE_WIDTH_STORAGE_KEY = "pico-right-sidebar-file-tree-width";
271
+ var RIGHT_SIDEBAR_HISTORY_HEIGHT_STORAGE_KEY = "pico-right-sidebar-history-height";
268
272
  var PROMPT_DRAFTS_STORAGE_KEY = "pico-prompt-drafts";
269
273
  var VIEWER_CONTEXT_STORAGE_KEY = "pico-context-id";
270
274
  function createContextId() {
@@ -1265,11 +1269,11 @@ function getSessionTitle(summary) {
1265
1269
  if (summary?.name?.trim()) return summary.name.trim();
1266
1270
  return "New session";
1267
1271
  }
1268
- var $$splitComponentImporter = () => import("./routes-DJqUmK-U.mjs");
1272
+ var $$splitComponentImporter = () => import("./routes-u4ntFNaT.mjs");
1269
1273
  var indexSearchSchema = object({ session: string().optional() });
1270
1274
  var Route = createFileRoute("/")({
1271
1275
  validateSearch: indexSearchSchema,
1272
1276
  component: lazyRouteComponent($$splitComponentImporter, "component")
1273
1277
  });
1274
1278
  //#endregion
1275
- export { sameContextUsage as $, extractToolText as A, readStoredAutoScrollEnabled as B, buildItemsFromSync as C, createInitialSessionState as D, createContextId as E, normalizeSessionSelectionKeys as F, readStoredPromptDraft as G, readStoredCollapsedDirectories as H, normalizeStoredDirectoryList as I, readStoredSessionDoneDesktopNotificationsEnabled as J, readStoredRecentDirectories as K, normalizeThemeMode as L, getSessionTitle as M, mergeAssistantBlocksForStreaming as N, extractMessageImages as O, normalizePromptImage as P, safeLocalStorageSetItem as Q, previewUrlForImage as R, assistantBlocksFromMessage as S, createCompactionSummaryItem as T, readStoredDraftDirectory as U, readStoredCenterMessages as V, readStoredHideToolBlocks as W, readStoredSidebarDirectories as X, readStoredSessionDoneSoundEnabled as Y, rememberStoredPromptDraft as Z, Tooltip$1 as _, HIDE_TOOL_BLOCKS_STORAGE_KEY as a, TooltipTrigger as b, RECENT_DIRECTORIES_STORAGE_KEY as c, SESSION_DONE_DESKTOP_NOTIFICATIONS_ENABLED_STORAGE_KEY as d, sessionListEntryKey as et, SESSION_DONE_SOUND_ENABLED_STORAGE_KEY as f, TitleTooltip as g, THEME_STORAGE_KEY as h, DRAFT_DIRECTORY_STORAGE_KEY as i, flattenTree as j, extractMessageText as k, RIGHT_SIDEBAR_OPEN_STORAGE_KEY as l, Spinner as m, CENTER_MESSAGES_STORAGE_KEY as n, toolCategoryFromTool as nt, Kbd as o, SIDEBAR_DIRECTORIES_STORAGE_KEY as p, readStoredRightSidebarOpen as q, COLLAPSED_DIRECTORIES_STORAGE_KEY as r, KeyboardShortcutContent as s, AUTO_SCROLL_ENABLED_STORAGE_KEY as t, thinkingSummaryText as tt, Route as u, TooltipContent as v, cn as w, VIEWER_CONTEXT_STORAGE_KEY as x, TooltipProvider as y, promptDraftKey as z };
1279
+ export { readStoredSessionDoneSoundEnabled as $, createContextId as A, normalizeStoredDirectoryList as B, TooltipProvider as C, buildItemsFromSync as D, assistantBlocksFromMessage as E, flattenTree as F, readStoredCenterMessages as G, previewUrlForImage as H, getSessionTitle as I, readStoredHideToolBlocks as J, readStoredCollapsedDirectories as K, mergeAssistantBlocksForStreaming as L, extractMessageImages as M, extractMessageText as N, cn as O, extractToolText as P, readStoredSessionDoneDesktopNotificationsEnabled as Q, normalizePromptImage as R, TooltipContent as S, VIEWER_CONTEXT_STORAGE_KEY as T, promptDraftKey as U, normalizeThemeMode as V, readStoredAutoScrollEnabled as W, readStoredRecentDirectories as X, readStoredPromptDraft as Y, readStoredRightSidebarOpen as Z, SIDEBAR_DIRECTORIES_STORAGE_KEY as _, HIDE_TOOL_BLOCKS_STORAGE_KEY as a, sessionListEntryKey as at, TitleTooltip as b, RECENT_DIRECTORIES_STORAGE_KEY as c, RIGHT_SIDEBAR_HISTORY_HEIGHT_STORAGE_KEY as d, readStoredSidebarDirectories as et, RIGHT_SIDEBAR_OPEN_STORAGE_KEY as f, SESSION_DONE_SOUND_ENABLED_STORAGE_KEY as g, SESSION_DONE_DESKTOP_NOTIFICATIONS_ENABLED_STORAGE_KEY as h, DRAFT_DIRECTORY_STORAGE_KEY as i, sameContextUsage as it, createInitialSessionState as j, createCompactionSummaryItem as k, RIGHT_SIDEBAR_ACTIVE_TAB_STORAGE_KEY as l, Route as m, CENTER_MESSAGES_STORAGE_KEY as n, safeLocalStorageGetItem as nt, Kbd as o, thinkingSummaryText as ot, RIGHT_SIDEBAR_WIDTHS_STORAGE_KEY as p, readStoredDraftDirectory as q, COLLAPSED_DIRECTORIES_STORAGE_KEY as r, safeLocalStorageSetItem as rt, KeyboardShortcutContent as s, toolCategoryFromTool as st, AUTO_SCROLL_ENABLED_STORAGE_KEY as t, rememberStoredPromptDraft as tt, RIGHT_SIDEBAR_FILE_TREE_WIDTH_STORAGE_KEY as u, Spinner as v, TooltipTrigger as w, Tooltip$1 as x, THEME_STORAGE_KEY as y, normalizeSessionSelectionKeys as z };