@cryptiklemur/lattice 1.44.2 → 1.45.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.
@@ -746,20 +746,25 @@ export function ChatView({ sessionId: tabSessionId, projectSlug: tabProjectSlug
746
746
  </div>
747
747
  )}
748
748
  {messages.length === 0 && historyLoading ? (
749
- <div className="flex items-center justify-center h-full">
750
- <div className="flex flex-col items-center gap-3">
751
- <div className="flex gap-1.5">
752
- {[0, 1, 2].map(function (i) {
753
- return (
754
- <div
755
- key={i}
756
- className="w-2 h-2 rounded-full bg-primary/50"
757
- style={{ animation: "pulse 1.2s ease-in-out infinite", animationDelay: i * 0.2 + "s" }}
758
- />
759
- );
760
- })}
749
+ <div className="px-5 pt-6 space-y-4 animate-pulse">
750
+ <div className="chat chat-end">
751
+ <div className="chat-bubble bg-primary/10 border-0 w-48 h-10" />
752
+ </div>
753
+ <div className="chat chat-start">
754
+ <div className="chat-bubble bg-base-300/50 border-0 space-y-2 w-80">
755
+ <div className="h-2.5 bg-base-content/8 rounded w-full" />
756
+ <div className="h-2.5 bg-base-content/8 rounded w-3/4" />
757
+ <div className="h-2.5 bg-base-content/8 rounded w-5/6" />
758
+ </div>
759
+ </div>
760
+ <div className="chat chat-end">
761
+ <div className="chat-bubble bg-primary/10 border-0 w-56 h-10" />
762
+ </div>
763
+ <div className="chat chat-start">
764
+ <div className="chat-bubble bg-base-300/50 border-0 space-y-2 w-72">
765
+ <div className="h-2.5 bg-base-content/8 rounded w-full" />
766
+ <div className="h-2.5 bg-base-content/8 rounded w-2/3" />
761
767
  </div>
762
- <span className="text-[12px] text-base-content/30 font-mono">Loading session...</span>
763
768
  </div>
764
769
  </div>
765
770
  ) : messages.length === 0 ? (
@@ -105,7 +105,14 @@ export function ProjectDashboardView() {
105
105
  </div>
106
106
 
107
107
  {loading && (
108
- <div className="text-[13px] text-base-content/40 py-4">Loading...</div>
108
+ <div className="space-y-6 animate-pulse">
109
+ <div className="grid grid-cols-2 sm:grid-cols-4 gap-3">
110
+ {[0, 1, 2, 3].map(function (i) {
111
+ return <div key={i} className="bg-base-content/[0.03] rounded-xl p-3.5 h-20" />;
112
+ })}
113
+ </div>
114
+ <div className="bg-base-content/[0.03] rounded-xl h-32" />
115
+ </div>
109
116
  )}
110
117
 
111
118
  {!loading && settings && (
@@ -166,7 +166,11 @@ export function GlobalPlugins() {
166
166
  }, [send]);
167
167
 
168
168
  if (!loaded) {
169
- return <div className="text-[13px] text-base-content/40 py-4">Loading...</div>;
169
+ return (
170
+ <div className="py-4 space-y-3 animate-pulse">
171
+ {[0, 1, 2].map(function (i) { return <div key={i} className="bg-base-content/[0.03] rounded-xl h-16" />; })}
172
+ </div>
173
+ );
170
174
  }
171
175
 
172
176
  return (
@@ -77,7 +77,11 @@ export function GlobalSkills() {
77
77
  }
78
78
 
79
79
  if (!loaded) {
80
- return <div className="text-[13px] text-base-content/40 py-4">Loading...</div>;
80
+ return (
81
+ <div className="py-4 space-y-3 animate-pulse">
82
+ {[0, 1, 2].map(function (i) { return <div key={i} className="bg-base-content/[0.03] rounded-xl h-16" />; })}
83
+ </div>
84
+ );
81
85
  }
82
86
 
83
87
  return (
@@ -294,6 +294,13 @@ export function useSession(): UseSessionReturn {
294
294
 
295
295
  function handleHistory(msg: ServerMessage) {
296
296
  var m = msg as SessionHistoryMessage;
297
+ if (m.sessionId && m.messages && m.messages.length === 0 && m.title) {
298
+ updateSessionTabTitle(m.sessionId, m.title);
299
+ if (m.sessionId === getSessionStore().state.activeSessionId) {
300
+ getSessionStore().setState(function (s) { return { ...s, activeSessionTitle: m.title ?? s.activeSessionTitle }; });
301
+ }
302
+ return;
303
+ }
297
304
  setCurrentAssistantUuid(null);
298
305
  if (m.sessionId) {
299
306
  var projectSlug = m.projectSlug || getSessionStore().state.activeProjectSlug;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cryptiklemur/lattice",
3
- "version": "1.44.2",
3
+ "version": "1.45.0",
4
4
  "description": "Multi-machine agentic dashboard for Claude Code. Monitor sessions, manage MCP servers and skills, orchestrate across mesh-networked nodes.",
5
5
  "license": "MIT",
6
6
  "author": "Aaron Scherer <me@aaronscherer.me>",
@@ -107,13 +107,9 @@ registerHandler("session", function (clientId: string, message: ClientMessage) {
107
107
  setActiveProject(clientId, activateMsg.projectSlug);
108
108
  watchSessionLock(activateMsg.sessionId);
109
109
  var activateT0 = Date.now();
110
- void Promise.all([
111
- loadSessionHistory(activateMsg.projectSlug, activateMsg.sessionId),
112
- getSessionTitle(activateMsg.projectSlug, activateMsg.sessionId).catch(function () { return null; }),
113
- ]).then(function (results) {
114
- log.session("session:activate history+title: %dms", Date.now() - activateT0);
115
- var historyResult = results[0];
116
- var title = results[1];
110
+ void loadSessionHistory(activateMsg.projectSlug, activateMsg.sessionId).then(function (historyResult) {
111
+ log.session("session:activate history: %dms", Date.now() - activateT0);
112
+ var title: string | null = null;
117
113
  var interrupted = wasSessionInterrupted(activateMsg.sessionId);
118
114
  if (interrupted) {
119
115
  clearInterruptedFlag(activateMsg.sessionId);
@@ -137,6 +133,12 @@ registerHandler("session", function (clientId: string, message: ClientMessage) {
137
133
  sendTo(clientId, { type: "chat:error", message: "Failed to load session history" });
138
134
  });
139
135
 
136
+ setTimeout(function () {
137
+ void getSessionTitle(activateMsg.projectSlug, activateMsg.sessionId).then(function (sessionTitle) {
138
+ if (sessionTitle) {
139
+ sendTo(clientId, { type: "session:history", projectSlug: activateMsg.projectSlug, sessionId: activateMsg.sessionId, messages: [], title: sessionTitle });
140
+ }
141
+ }).catch(function () {});
140
142
  void Promise.all([
141
143
  getSessionUsage(activateMsg.projectSlug, activateMsg.sessionId).catch(function () { return null; }),
142
144
  getContextBreakdown(activateMsg.projectSlug, activateMsg.sessionId).catch(function () { return null; }),
@@ -173,6 +175,7 @@ registerHandler("session", function (clientId: string, message: ClientMessage) {
173
175
  log.session("Failed to activate session: %O", err);
174
176
  sendTo(clientId, { type: "chat:error", message: "Failed to activate session" });
175
177
  });
178
+ }, 50);
176
179
  return;
177
180
  }
178
181