@lukeashford/aurelius 3.2.1 → 3.3.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.
package/dist/index.d.mts CHANGED
@@ -846,23 +846,13 @@ interface TodosListProps extends React$1.HTMLAttributes<HTMLDivElement> {
846
846
  * @default "Tasks"
847
847
  */
848
848
  title?: string;
849
+ /**
850
+ * Called when the "Stop All Tasks" button is clicked.
851
+ * Only shown when at least one task is in_progress.
852
+ * The consumer decides what stopping means (cancel API calls, mark cancelled, etc.).
853
+ */
854
+ onStopAllTasks?: () => void;
849
855
  }
850
- /**
851
- * TodosList displays a structured list of tasks with status indicators.
852
- *
853
- * Features:
854
- * - Nested tasks with indentation
855
- * - Status indicators: done (checkmark), in_progress (snake animation), pending (empty),
856
- * cancelled, failed
857
- * - Done tasks are crossed out with golden checkmark
858
- * - Cancelled/failed tasks are crossed out with subtle styling and sorted to bottom of their local
859
- * group
860
- * - Max 1/4 screen height with scroll
861
- * - Subtasks appear when parent task is in_progress or done
862
- *
863
- * The component automatically sorts cancelled/failed tasks to the bottom of their local group
864
- * (not globally), so just changing a task's status will reorder it appropriately.
865
- */
866
856
  declare const TodosList: React$1.ForwardRefExoticComponent<TodosListProps & React$1.RefAttributes<HTMLDivElement>>;
867
857
  /**
868
858
  * Returns true when every task (and subtask, recursively) is in a
@@ -1402,6 +1392,12 @@ interface ChatInterfaceProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>
1402
1392
  * @default "Tasks"
1403
1393
  */
1404
1394
  tasksTitle?: string;
1395
+ /**
1396
+ * Called when the "Stop All Tasks" button is clicked in the tasks panel.
1397
+ * Only shown when at least one task has in_progress status.
1398
+ * The consumer app decides what stopping means (cancel API calls, mark tasks cancelled, etc.).
1399
+ */
1400
+ onStopAllTasks?: () => void;
1405
1401
  /**
1406
1402
  * Additional tools to add to the tool sidebars. Each ExternalToolDefinition provides
1407
1403
  * an id, icon, label, group ('top-left' | 'bottom-left' | 'top-right' | 'bottom-right'),
package/dist/index.d.ts CHANGED
@@ -846,23 +846,13 @@ interface TodosListProps extends React$1.HTMLAttributes<HTMLDivElement> {
846
846
  * @default "Tasks"
847
847
  */
848
848
  title?: string;
849
+ /**
850
+ * Called when the "Stop All Tasks" button is clicked.
851
+ * Only shown when at least one task is in_progress.
852
+ * The consumer decides what stopping means (cancel API calls, mark cancelled, etc.).
853
+ */
854
+ onStopAllTasks?: () => void;
849
855
  }
850
- /**
851
- * TodosList displays a structured list of tasks with status indicators.
852
- *
853
- * Features:
854
- * - Nested tasks with indentation
855
- * - Status indicators: done (checkmark), in_progress (snake animation), pending (empty),
856
- * cancelled, failed
857
- * - Done tasks are crossed out with golden checkmark
858
- * - Cancelled/failed tasks are crossed out with subtle styling and sorted to bottom of their local
859
- * group
860
- * - Max 1/4 screen height with scroll
861
- * - Subtasks appear when parent task is in_progress or done
862
- *
863
- * The component automatically sorts cancelled/failed tasks to the bottom of their local group
864
- * (not globally), so just changing a task's status will reorder it appropriately.
865
- */
866
856
  declare const TodosList: React$1.ForwardRefExoticComponent<TodosListProps & React$1.RefAttributes<HTMLDivElement>>;
867
857
  /**
868
858
  * Returns true when every task (and subtask, recursively) is in a
@@ -1402,6 +1392,12 @@ interface ChatInterfaceProps extends Omit<React$1.HTMLAttributes<HTMLDivElement>
1402
1392
  * @default "Tasks"
1403
1393
  */
1404
1394
  tasksTitle?: string;
1395
+ /**
1396
+ * Called when the "Stop All Tasks" button is clicked in the tasks panel.
1397
+ * Only shown when at least one task has in_progress status.
1398
+ * The consumer app decides what stopping means (cancel API calls, mark tasks cancelled, etc.).
1399
+ */
1400
+ onStopAllTasks?: () => void;
1405
1401
  /**
1406
1402
  * Additional tools to add to the tool sidebars. Each ExternalToolDefinition provides
1407
1403
  * an id, icon, label, group ('top-left' | 'bottom-left' | 'top-right' | 'bottom-right'),
package/dist/index.js CHANGED
@@ -6061,6 +6061,7 @@ ArtifactsPanelToggle.displayName = "ArtifactsPanelToggle";
6061
6061
 
6062
6062
  // src/components/chat/TodosList.tsx
6063
6063
  var import_react73 = __toESM(require("react"));
6064
+ var import_lucide_react14 = require("lucide-react");
6064
6065
  var TASK_STATUSES = {
6065
6066
  PENDING: "pending",
6066
6067
  IN_PROGRESS: "in_progress",
@@ -6126,8 +6127,15 @@ function TaskItem({ task, depth = 0 }) {
6126
6127
  )
6127
6128
  ), showSubtasks && /* @__PURE__ */ import_react73.default.createElement("div", { className: "flex flex-col" }, sortedSubtasks.map((subtask) => /* @__PURE__ */ import_react73.default.createElement(TaskItem, { key: subtask.id, task: subtask, depth: depth + 1 }))));
6128
6129
  }
6130
+ function hasInProgressTask(tasks) {
6131
+ return tasks.some((t) => {
6132
+ if (t.status === "in_progress") return true;
6133
+ if (t.subtasks && t.subtasks.length > 0) return hasInProgressTask(t.subtasks);
6134
+ return false;
6135
+ });
6136
+ }
6129
6137
  var TodosList = import_react73.default.forwardRef(
6130
- ({ tasks, title = "Tasks", className, ...rest }, ref) => {
6138
+ ({ tasks, title = "Tasks", onStopAllTasks, className, ...rest }, ref) => {
6131
6139
  const sortedTasks = (0, import_react73.useMemo)(() => sortTasks(tasks), [tasks]);
6132
6140
  const countCompleted = (taskList) => {
6133
6141
  let count = 0;
@@ -6150,6 +6158,7 @@ var TodosList = import_react73.default.forwardRef(
6150
6158
  }
6151
6159
  return count;
6152
6160
  };
6161
+ const showStopButton = !!onStopAllTasks && hasInProgressTask(tasks);
6153
6162
  if (tasks.length === 0) {
6154
6163
  return null;
6155
6164
  }
@@ -6172,7 +6181,23 @@ var TodosList = import_react73.default.forwardRef(
6172
6181
  /* @__PURE__ */ import_react73.default.createElement("h4", { className: "text-xs font-medium text-white" }, title),
6173
6182
  /* @__PURE__ */ import_react73.default.createElement("span", { className: "text-xs text-silver/60" }, countCompleted(tasks), "/", countTotal(tasks))
6174
6183
  ),
6175
- /* @__PURE__ */ import_react73.default.createElement("div", { className: "flex-1 overflow-y-auto px-4 py-2" }, sortedTasks.map((task) => /* @__PURE__ */ import_react73.default.createElement(TaskItem, { key: task.id, task })))
6184
+ /* @__PURE__ */ import_react73.default.createElement("div", { className: "flex-1 overflow-y-auto px-4 py-2" }, sortedTasks.map((task) => /* @__PURE__ */ import_react73.default.createElement(TaskItem, { key: task.id, task }))),
6185
+ showStopButton && /* @__PURE__ */ import_react73.default.createElement("div", { className: "px-4 py-2 border-t border-ash/40 flex-shrink-0" }, /* @__PURE__ */ import_react73.default.createElement(
6186
+ "button",
6187
+ {
6188
+ type: "button",
6189
+ onClick: onStopAllTasks,
6190
+ className: cx(
6191
+ "w-full flex items-center justify-center gap-2 px-3 py-1.5",
6192
+ "bg-error/10 hover:bg-error/20 text-error",
6193
+ "border border-error/30",
6194
+ "text-xs font-medium",
6195
+ "transition-colors duration-200"
6196
+ )
6197
+ },
6198
+ /* @__PURE__ */ import_react73.default.createElement(import_lucide_react14.Square, { className: "w-3 h-3 fill-current" }),
6199
+ "Stop All Tasks"
6200
+ ))
6176
6201
  );
6177
6202
  }
6178
6203
  );
@@ -6438,6 +6463,7 @@ var ChatInterface = import_react77.default.forwardRef(
6438
6463
  onArtifactsPanelOpenChange,
6439
6464
  tasks = [],
6440
6465
  tasksTitle,
6466
+ onStopAllTasks,
6441
6467
  tools: externalTools = [],
6442
6468
  className,
6443
6469
  ...rest
@@ -6698,7 +6724,7 @@ var ChatInterface = import_react77.default.forwardRef(
6698
6724
  }
6699
6725
  );
6700
6726
  case "todos":
6701
- return tasks.length > 0 ? /* @__PURE__ */ import_react77.default.createElement(TodosList, { tasks, title: tasksTitle, className: "h-full" }) : /* @__PURE__ */ import_react77.default.createElement("div", { className: "h-full flex flex-col" }, /* @__PURE__ */ import_react77.default.createElement("div", { className: "flex items-center p-4 border-b border-ash/40 shrink-0" }, /* @__PURE__ */ import_react77.default.createElement("h3", { className: "text-xs font-medium text-white" }, "Tasks")), /* @__PURE__ */ import_react77.default.createElement("div", { className: "flex-1 flex items-center justify-center" }, /* @__PURE__ */ import_react77.default.createElement("p", { className: "text-xs text-silver/60" }, "No tasks")));
6727
+ return tasks.length > 0 ? /* @__PURE__ */ import_react77.default.createElement(TodosList, { tasks, title: tasksTitle, onStopAllTasks, className: "h-full" }) : /* @__PURE__ */ import_react77.default.createElement("div", { className: "h-full flex flex-col" }, /* @__PURE__ */ import_react77.default.createElement("div", { className: "flex items-center p-4 border-b border-ash/40 shrink-0" }, /* @__PURE__ */ import_react77.default.createElement("h3", { className: "text-xs font-medium text-white" }, "Tasks")), /* @__PURE__ */ import_react77.default.createElement("div", { className: "flex-1 flex items-center justify-center" }, /* @__PURE__ */ import_react77.default.createElement("p", { className: "text-xs text-silver/60" }, "No tasks")));
6702
6728
  default: {
6703
6729
  const externalTool = externalTools.find((t) => t.id === toolId);
6704
6730
  return externalTool?.content ?? null;
@@ -6796,7 +6822,7 @@ ChatInterface.displayName = "ChatInterface";
6796
6822
 
6797
6823
  // src/components/chat/MessageActions.tsx
6798
6824
  var import_react78 = __toESM(require("react"));
6799
- var import_lucide_react14 = require("lucide-react");
6825
+ var import_lucide_react15 = require("lucide-react");
6800
6826
  var ActionButton2 = ({ onClick, label, children, className, disabled }) => /* @__PURE__ */ import_react78.default.createElement(
6801
6827
  "button",
6802
6828
  {
@@ -6917,7 +6943,7 @@ var MessageActions = import_react78.default.forwardRef(
6917
6943
  label: "Cancel edit",
6918
6944
  className: "text-silver/60 hover:text-error"
6919
6945
  },
6920
- /* @__PURE__ */ import_react78.default.createElement(import_lucide_react14.X, { className: "w-4 h-4" })
6946
+ /* @__PURE__ */ import_react78.default.createElement(import_lucide_react15.X, { className: "w-4 h-4" })
6921
6947
  ), /* @__PURE__ */ import_react78.default.createElement(
6922
6948
  ActionButton2,
6923
6949
  {
@@ -6926,7 +6952,7 @@ var MessageActions = import_react78.default.forwardRef(
6926
6952
  className: "text-silver/60 hover:text-gold",
6927
6953
  disabled: !editValue.trim() || editValue.trim() === content
6928
6954
  },
6929
- /* @__PURE__ */ import_react78.default.createElement(import_lucide_react14.Send, { className: "w-4 h-4" })
6955
+ /* @__PURE__ */ import_react78.default.createElement(import_lucide_react15.Send, { className: "w-4 h-4" })
6930
6956
  ))
6931
6957
  ),
6932
6958
  /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-silver/50 mt-1" }, "Press Enter to submit, Esc to cancel. This will create a new branch.")
@@ -6943,9 +6969,9 @@ var MessageActions = import_react78.default.forwardRef(
6943
6969
  ),
6944
6970
  ...rest
6945
6971
  },
6946
- /* @__PURE__ */ import_react78.default.createElement(ActionButton2, { onClick: handleCopy, label: copied ? "Copied!" : "Copy message" }, copied ? /* @__PURE__ */ import_react78.default.createElement(import_lucide_react14.Check, { className: "w-3.5 h-3.5 text-success" }) : /* @__PURE__ */ import_react78.default.createElement(import_lucide_react14.Copy, { className: "w-3.5 h-3.5" })),
6947
- isUser && onEdit && /* @__PURE__ */ import_react78.default.createElement(ActionButton2, { onClick: handleStartEdit, label: "Edit message" }, /* @__PURE__ */ import_react78.default.createElement(import_lucide_react14.Pencil, { className: "w-3.5 h-3.5" })),
6948
- !isUser && onRetry && /* @__PURE__ */ import_react78.default.createElement(ActionButton2, { onClick: onRetry, label: "Regenerate response" }, /* @__PURE__ */ import_react78.default.createElement(import_lucide_react14.RotateCcw, { className: "w-3.5 h-3.5" }))
6972
+ /* @__PURE__ */ import_react78.default.createElement(ActionButton2, { onClick: handleCopy, label: copied ? "Copied!" : "Copy message" }, copied ? /* @__PURE__ */ import_react78.default.createElement(import_lucide_react15.Check, { className: "w-3.5 h-3.5 text-success" }) : /* @__PURE__ */ import_react78.default.createElement(import_lucide_react15.Copy, { className: "w-3.5 h-3.5" })),
6973
+ isUser && onEdit && /* @__PURE__ */ import_react78.default.createElement(ActionButton2, { onClick: handleStartEdit, label: "Edit message" }, /* @__PURE__ */ import_react78.default.createElement(import_lucide_react15.Pencil, { className: "w-3.5 h-3.5" })),
6974
+ !isUser && onRetry && /* @__PURE__ */ import_react78.default.createElement(ActionButton2, { onClick: onRetry, label: "Regenerate response" }, /* @__PURE__ */ import_react78.default.createElement(import_lucide_react15.RotateCcw, { className: "w-3.5 h-3.5" }))
6949
6975
  );
6950
6976
  }
6951
6977
  );
@@ -6953,7 +6979,7 @@ MessageActions.displayName = "MessageActions";
6953
6979
 
6954
6980
  // src/components/chat/BranchNavigator.tsx
6955
6981
  var import_react79 = __toESM(require("react"));
6956
- var import_lucide_react15 = require("lucide-react");
6982
+ var import_lucide_react16 = require("lucide-react");
6957
6983
  var BranchNavigator = import_react79.default.forwardRef(
6958
6984
  ({
6959
6985
  current,
@@ -6985,7 +7011,7 @@ var BranchNavigator = import_react79.default.forwardRef(
6985
7011
  "aria-label": "Branch navigation",
6986
7012
  ...rest
6987
7013
  },
6988
- showIcon && /* @__PURE__ */ import_react79.default.createElement(import_lucide_react15.GitBranch, { className: cx(iconSize, "mr-0.5 text-silver/50"), "aria-hidden": "true" }),
7014
+ showIcon && /* @__PURE__ */ import_react79.default.createElement(import_lucide_react16.GitBranch, { className: cx(iconSize, "mr-0.5 text-silver/50"), "aria-hidden": "true" }),
6989
7015
  /* @__PURE__ */ import_react79.default.createElement(
6990
7016
  "button",
6991
7017
  {
@@ -6999,7 +7025,7 @@ var BranchNavigator = import_react79.default.forwardRef(
6999
7025
  ),
7000
7026
  "aria-label": "Previous branch"
7001
7027
  },
7002
- /* @__PURE__ */ import_react79.default.createElement(import_lucide_react15.ChevronLeft, { className: iconSize })
7028
+ /* @__PURE__ */ import_react79.default.createElement(import_lucide_react16.ChevronLeft, { className: iconSize })
7003
7029
  ),
7004
7030
  /* @__PURE__ */ import_react79.default.createElement("span", { className: cx(textSize, "tabular-nums min-w-6 text-center") }, current, "/", total),
7005
7031
  /* @__PURE__ */ import_react79.default.createElement(
@@ -7015,7 +7041,7 @@ var BranchNavigator = import_react79.default.forwardRef(
7015
7041
  ),
7016
7042
  "aria-label": "Next branch"
7017
7043
  },
7018
- /* @__PURE__ */ import_react79.default.createElement(import_lucide_react15.ChevronRight, { className: iconSize })
7044
+ /* @__PURE__ */ import_react79.default.createElement(import_lucide_react16.ChevronRight, { className: iconSize })
7019
7045
  )
7020
7046
  );
7021
7047
  }