@cryptiklemur/lattice 5.10.0 → 5.11.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/client/assets/{angular-html-BDIcxkJq.js → angular-html-BoFzmWT8.js} +1 -1
- package/dist/client/assets/{angular-ts-Bt22ouNH.js → angular-ts-DZnI8rKE.js} +1 -1
- package/dist/client/assets/{apl-p8qkxzEK.js → apl-DstVmncE.js} +1 -1
- package/dist/client/assets/{astro-CIaMc49M.js → astro-DTPCjzEx.js} +1 -1
- package/dist/client/assets/{blade-BR56EAMD.js → blade-6q42Ss3F.js} +1 -1
- package/dist/client/assets/{c-Dli0HzAh.js → c-BQDGJ-nQ.js} +1 -1
- package/dist/client/assets/{cobol-Cad15ECy.js → cobol-Dlh0WvsZ.js} +1 -1
- package/dist/client/assets/{coffee-DpyATEbF.js → coffee-DdQv129j.js} +1 -1
- package/dist/client/assets/{cpp-KN8_NFsf.js → cpp-DhbQJIv4.js} +1 -1
- package/dist/client/assets/{crystal-CuyGv0kh.js → crystal-C22kERUB.js} +1 -1
- package/dist/client/assets/{css-Cm3q4bxn.js → css-n31O5kHj.js} +1 -1
- package/dist/client/assets/{dist-BjxsMc4u.js → dist-D8okl7lw.js} +2 -2
- package/dist/client/assets/{edge-B6S7CSbx.js → edge-Cgwx-o_7.js} +1 -1
- package/dist/client/assets/{elixir-CNUy9H8T.js → elixir-DAGM2WKD.js} +1 -1
- package/dist/client/assets/{elm-CNfcWmb9.js → elm-BLw_7oO9.js} +1 -1
- package/dist/client/assets/{erb-DWebzDaI.js → erb-DCaNhYa7.js} +1 -1
- package/dist/client/assets/{git-rebase-B_Pt2ZBK.js → git-rebase-CNNhb8-g.js} +1 -1
- package/dist/client/assets/{glimmer-js-CVwoOd72.js → glimmer-js-BnZd88Wi.js} +1 -1
- package/dist/client/assets/{glimmer-ts-CjtFSxjz.js → glimmer-ts-DvFNbZu-.js} +1 -1
- package/dist/client/assets/{glsl-CP4rggAA.js → glsl-Dnrk_Jnx.js} +1 -1
- package/dist/client/assets/{graphql-Dbm6sAtp.js → graphql-DlWTPvCG.js} +1 -1
- package/dist/client/assets/{hack-Bj9y3SGf.js → hack-DQg1Ek33.js} +1 -1
- package/dist/client/assets/{haml-DRGrdf3f.js → haml-DSk45qIE.js} +1 -1
- package/dist/client/assets/{handlebars-CFKjcBMg.js → handlebars-DuLvATB2.js} +1 -1
- package/dist/client/assets/{html-Vcd4eHHg.js → html-D4DiUnLg.js} +1 -1
- package/dist/client/assets/{html-derivative-BF0YbD4L.js → html-derivative-CS5MZ6d9.js} +1 -1
- package/dist/client/assets/{http-CGVTa2NT.js → http-CkDncfer.js} +1 -1
- package/dist/client/assets/{hurl-B0GrsGqd.js → hurl-DU39oO3U.js} +1 -1
- package/dist/client/assets/{index-CX1tudsF.js → index-CHPfE1Zl.js} +129 -129
- package/dist/client/assets/index-DHUKmLLC.css +2 -0
- package/dist/client/assets/{java-BJHQqHsm.js → java-lntACKEu.js} +1 -1
- package/dist/client/assets/{javascript-CmuMsKrc.js → javascript-CxkFc6nV.js} +1 -1
- package/dist/client/assets/{jinja-JxCLeq1j.js → jinja-DolO2zO7.js} +1 -1
- package/dist/client/assets/{jison-BdgAUhei.js → jison-Cok5FPev.js} +1 -1
- package/dist/client/assets/{json-DtPissHL.js → json-BebuQPrq.js} +1 -1
- package/dist/client/assets/{jsx-DUAxxDkP.js → jsx-iLBaUyXr.js} +1 -1
- package/dist/client/assets/{julia-DxDlbL6e.js → julia-C5Dsc7cH.js} +1 -1
- package/dist/client/assets/{just-CVmAAx2R.js → just-DJYqq_9R.js} +1 -1
- package/dist/client/assets/{latex-uwxggTWA.js → latex-BTTYiKj1.js} +1 -1
- package/dist/client/assets/{liquid-xsETAJJy.js → liquid-DpAKCrOB.js} +1 -1
- package/dist/client/assets/{lua-B2Hh8PgD.js → lua-BZ6b1hko.js} +1 -1
- package/dist/client/assets/{marko-yDeGxD87.js → marko-D8VK6iGt.js} +1 -1
- package/dist/client/assets/{mdc-QMp4ieYR.js → mdc-Paa3XzwY.js} +1 -1
- package/dist/client/assets/{nginx-7gmRmcqz.js → nginx-C5k9mWtJ.js} +1 -1
- package/dist/client/assets/{nim-CA8SNY_7.js → nim-Dst6YSnE.js} +1 -1
- package/dist/client/assets/{perl-lx5nW4VC.js → perl-XhiCjgBp.js} +1 -1
- package/dist/client/assets/{php-DgHiW953.js → php-BcsPLnLU.js} +1 -1
- package/dist/client/assets/{pug-CbbB1vwb.js → pug-GLH9-eAJ.js} +1 -1
- package/dist/client/assets/{qml-COrzwCIh.js → qml-Cj_lJioE.js} +1 -1
- package/dist/client/assets/{r-Dv7pZJDH.js → r-B70aGYK5.js} +1 -1
- package/dist/client/assets/{razor-D2m8EDP5.js → razor-R3gub_zy.js} +1 -1
- package/dist/client/assets/{regexp-BXLT-jPc.js → regexp-itC0dIUJ.js} +1 -1
- package/dist/client/assets/{rst-_S6rrUYh.js → rst-DdyoV8E2.js} +1 -1
- package/dist/client/assets/{ruby-C3XO7tYY.js → ruby-BYBZsv66.js} +1 -1
- package/dist/client/assets/{sas-DP2k4iuN.js → sas-fqfqXqj1.js} +1 -1
- package/dist/client/assets/{scss-lhLFMXGn.js → scss-B-ELv6mu.js} +1 -1
- package/dist/client/assets/{shellscript-BYlBPHen.js → shellscript-BgB8TNw6.js} +1 -1
- package/dist/client/assets/{shellsession-CbVyQKWZ.js → shellsession-BLK2Dgkm.js} +1 -1
- package/dist/client/assets/{soy-Be8a0lHq.js → soy-C7_RmNrp.js} +1 -1
- package/dist/client/assets/{sql-2KxvU9YS.js → sql-AUgbUJq4.js} +1 -1
- package/dist/client/assets/{stata-BxlWftTS.js → stata-CIVqSIOr.js} +1 -1
- package/dist/client/assets/{surrealql-CJ-q86nR.js → surrealql-BzRQzc5S.js} +1 -1
- package/dist/client/assets/{svelte-Q1ml0OiY.js → svelte-BCIwEwtb.js} +1 -1
- package/dist/client/assets/{templ-BbfPZhtu.js → templ-C1hbwe4u.js} +1 -1
- package/dist/client/assets/{tex-Dcth4Gi6.js → tex-CI4tIsaP.js} +1 -1
- package/dist/client/assets/{ts-tags-BKhSOXI3.js → ts-tags-SUeikhEp.js} +1 -1
- package/dist/client/assets/{tsx-CS6iQ0XH.js → tsx-xkp7aIZs.js} +1 -1
- package/dist/client/assets/{twig-BHp31ZxS.js → twig-CGgBSAyc.js} +1 -1
- package/dist/client/assets/{typescript-16YJBTaO.js → typescript-O2YMTl_s.js} +1 -1
- package/dist/client/assets/{vue-CMKwTi4r.js → vue-DsNRxos1.js} +1 -1
- package/dist/client/assets/{vue-html-Dr8VUA2G.js → vue-html-CuY3t7bs.js} +1 -1
- package/dist/client/assets/{vue-vine-DZUqDerl.js → vue-vine-C6kSCKwY.js} +1 -1
- package/dist/client/assets/{xml-CBbBKKDC.js → xml-DafwzOLY.js} +1 -1
- package/dist/client/assets/{xsl-DWEX6PKX.js → xsl-1SGGZibr.js} +1 -1
- package/dist/client/assets/{yaml-DvKvvh3X.js → yaml-DSVhzmhr.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +1 -1
- package/dist/server/analytics/engine.js +241 -241
- package/dist/server/assets.js +4 -4
- package/dist/server/auth/passphrase.js +13 -13
- package/dist/server/config.js +7 -7
- package/dist/server/daemon.js +93 -93
- package/dist/server/features/brainstorm.js +42 -42
- package/dist/server/features/ralph-loop.js +33 -33
- package/dist/server/features/scheduler.js +53 -53
- package/dist/server/features/specs.js +54 -54
- package/dist/server/features/sticky-notes.js +17 -17
- package/dist/server/features/superpowers.js +24 -24
- package/dist/server/handlers/analytics.js +1 -1
- package/dist/server/handlers/attachment.js +32 -32
- package/dist/server/handlers/bookmarks.js +4 -4
- package/dist/server/handlers/brainstorm.js +4 -4
- package/dist/server/handlers/chat.js +54 -54
- package/dist/server/handlers/editor.js +13 -13
- package/dist/server/handlers/fs.js +51 -51
- package/dist/server/handlers/hooks.js +20 -20
- package/dist/server/handlers/loop.js +6 -6
- package/dist/server/handlers/memory.js +44 -44
- package/dist/server/handlers/mesh.js +60 -60
- package/dist/server/handlers/notes.js +7 -7
- package/dist/server/handlers/plugins.js +174 -174
- package/dist/server/handlers/project-settings.js +26 -26
- package/dist/server/handlers/scheduler.js +6 -6
- package/dist/server/handlers/session.js +24 -24
- package/dist/server/handlers/settings.js +21 -21
- package/dist/server/handlers/skills.js +91 -91
- package/dist/server/handlers/specs.js +51 -28
- package/dist/server/handlers/terminal.js +13 -13
- package/dist/server/handlers/themes.js +21 -21
- package/dist/server/handlers/update.js +17 -17
- package/dist/server/hooks/event_forward.sh +34 -0
- package/dist/server/hooks/post_tool_use.sh +26 -0
- package/dist/server/hooks/statusline.sh +26 -0
- package/dist/server/identity.js +6 -6
- package/dist/server/index.js +111 -111
- package/dist/server/logger.js +1 -1
- package/dist/server/mesh/connector.js +78 -78
- package/dist/server/mesh/crypto.js +20 -20
- package/dist/server/mesh/discovery.js +14 -14
- package/dist/server/mesh/pairing.js +30 -30
- package/dist/server/mesh/peers.js +10 -10
- package/dist/server/mesh/proxy.js +14 -14
- package/dist/server/mesh/session-sync.js +23 -23
- package/dist/server/project/bookmarks.js +11 -11
- package/dist/server/project/context-breakdown.js +70 -70
- package/dist/server/project/file-browser.js +17 -17
- package/dist/server/project/project-files.js +68 -68
- package/dist/server/project/registry.js +10 -10
- package/dist/server/project/sdk-bridge.js +157 -157
- package/dist/server/project/session.js +201 -199
- package/dist/server/project/terminal.js +15 -15
- package/dist/server/project/warmup.js +37 -37
- package/dist/server/push.js +11 -11
- package/dist/server/runtime.js +1 -1
- package/dist/server/tls.js +15 -15
- package/dist/server/tui.js +15 -15
- package/dist/server/update-checker.js +21 -21
- package/dist/server/ws/broadcast.js +18 -18
- package/dist/server/ws/router.js +17 -17
- package/dist/shared/constants.js +8 -8
- package/package.json +2 -2
- package/dist/client/assets/index-DlfI20Gn.css +0 -2
|
@@ -7,7 +7,7 @@ import { join } from "node:path";
|
|
|
7
7
|
import { homedir } from "node:os";
|
|
8
8
|
import { readProjectClaudeMd, writeProjectClaudeMd, readProjectClaudeSettings, mergeProjectClaudeSettings, readProjectRules, writeProjectRules, readProjectMcpServers, writeProjectMcpServers, readProjectSkills, readGlobalRules, readGlobalPermissions, readGlobalMcpServers, readGlobalSkills, } from "../project/project-files.js";
|
|
9
9
|
function loadGlobalClaudeMd() {
|
|
10
|
-
|
|
10
|
+
const mdPath = join(homedir(), ".claude", "CLAUDE.md");
|
|
11
11
|
if (existsSync(mdPath)) {
|
|
12
12
|
try {
|
|
13
13
|
return readFileSync(mdPath, "utf-8");
|
|
@@ -17,22 +17,22 @@ function loadGlobalClaudeMd() {
|
|
|
17
17
|
return "";
|
|
18
18
|
}
|
|
19
19
|
function buildProjectSettings(projectSlug) {
|
|
20
|
-
|
|
20
|
+
const project = getProjectBySlug(projectSlug);
|
|
21
21
|
if (!project) {
|
|
22
22
|
return { error: "Project not found" };
|
|
23
23
|
}
|
|
24
24
|
if (!existsSync(project.path)) {
|
|
25
25
|
return { error: "Project path does not exist on disk" };
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
const claudeMd = readProjectClaudeMd(project.path);
|
|
28
|
+
const claudeSettings = readProjectClaudeSettings(project.path);
|
|
29
|
+
const lattice = (claudeSettings.lattice ?? {});
|
|
30
|
+
const permissions = (claudeSettings.permissions ?? { allow: [], deny: [] });
|
|
31
|
+
const rules = readProjectRules(project.path);
|
|
32
|
+
const mcpServers = readProjectMcpServers(project.path);
|
|
33
|
+
const skills = readProjectSkills(project.path);
|
|
34
|
+
const config = loadConfig();
|
|
35
|
+
const settings = {
|
|
36
36
|
title: project.title,
|
|
37
37
|
path: project.path,
|
|
38
38
|
icon: project.icon,
|
|
@@ -65,8 +65,8 @@ function buildProjectSettings(projectSlug) {
|
|
|
65
65
|
}
|
|
66
66
|
registerHandler("project-settings", function (clientId, message) {
|
|
67
67
|
if (message.type === "project-settings:get") {
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
const getMsg = message;
|
|
69
|
+
const result = buildProjectSettings(getMsg.projectSlug);
|
|
70
70
|
if ("error" in result) {
|
|
71
71
|
sendTo(clientId, { type: "project-settings:error", projectSlug: getMsg.projectSlug, message: result.error });
|
|
72
72
|
return;
|
|
@@ -75,11 +75,11 @@ registerHandler("project-settings", function (clientId, message) {
|
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
77
|
if (message.type === "project-settings:update") {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
const updateMsg = message;
|
|
79
|
+
const projectSlug = updateMsg.projectSlug;
|
|
80
|
+
const section = updateMsg.section;
|
|
81
|
+
const settings = updateMsg.settings;
|
|
82
|
+
const project = getProjectBySlug(projectSlug);
|
|
83
83
|
if (!project) {
|
|
84
84
|
sendTo(clientId, { type: "project-settings:error", projectSlug, message: "Project not found" });
|
|
85
85
|
return;
|
|
@@ -91,8 +91,8 @@ registerHandler("project-settings", function (clientId, message) {
|
|
|
91
91
|
try {
|
|
92
92
|
if (section === "general") {
|
|
93
93
|
invalidateConfigCache();
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
const config = loadConfig();
|
|
95
|
+
const idx = config.projects.findIndex(function (p) { return p.slug === projectSlug; });
|
|
96
96
|
if (idx !== -1) {
|
|
97
97
|
if (typeof settings.title === "string") {
|
|
98
98
|
config.projects[idx].title = settings.title;
|
|
@@ -107,7 +107,7 @@ registerHandler("project-settings", function (clientId, message) {
|
|
|
107
107
|
if (typeof settings.claudeMd === "string") {
|
|
108
108
|
writeProjectClaudeMd(project.path, settings.claudeMd);
|
|
109
109
|
}
|
|
110
|
-
|
|
110
|
+
const latticeUpdates = {};
|
|
111
111
|
if (settings.defaultModel !== undefined)
|
|
112
112
|
latticeUpdates.defaultModel = settings.defaultModel;
|
|
113
113
|
if (settings.defaultEffort !== undefined)
|
|
@@ -122,8 +122,8 @@ registerHandler("project-settings", function (clientId, message) {
|
|
|
122
122
|
}
|
|
123
123
|
else if (section === "environment") {
|
|
124
124
|
invalidateConfigCache();
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
const config = loadConfig();
|
|
126
|
+
const idx = config.projects.findIndex(function (p) { return p.slug === projectSlug; });
|
|
127
127
|
if (idx !== -1) {
|
|
128
128
|
config.projects[idx].env = settings.env ?? {};
|
|
129
129
|
saveConfig(config);
|
|
@@ -136,7 +136,7 @@ registerHandler("project-settings", function (clientId, message) {
|
|
|
136
136
|
writeProjectRules(project.path, settings.rules ?? []);
|
|
137
137
|
}
|
|
138
138
|
else if (section === "plugins") {
|
|
139
|
-
|
|
139
|
+
const disabledPlugins = Array.isArray(settings.disabledPlugins) ? settings.disabledPlugins : [];
|
|
140
140
|
mergeProjectClaudeSettings(project.path, {
|
|
141
141
|
lattice: { disabledPlugins: disabledPlugins },
|
|
142
142
|
});
|
|
@@ -151,11 +151,11 @@ registerHandler("project-settings", function (clientId, message) {
|
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
catch (err) {
|
|
154
|
-
|
|
154
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
155
155
|
sendTo(clientId, { type: "project-settings:error", projectSlug, message: errMsg });
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
158
|
-
|
|
158
|
+
const updated = buildProjectSettings(projectSlug);
|
|
159
159
|
if ("error" in updated) {
|
|
160
160
|
sendTo(clientId, { type: "project-settings:error", projectSlug, message: updated.error });
|
|
161
161
|
return;
|
|
@@ -7,8 +7,8 @@ registerHandler("scheduler", function (clientId, message) {
|
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
9
|
if (message.type === "scheduler:create") {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const createMsg = message;
|
|
11
|
+
const task = createTask({
|
|
12
12
|
name: createMsg.name,
|
|
13
13
|
prompt: createMsg.prompt,
|
|
14
14
|
cron: createMsg.cron,
|
|
@@ -23,20 +23,20 @@ registerHandler("scheduler", function (clientId, message) {
|
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
if (message.type === "scheduler:delete") {
|
|
26
|
-
|
|
26
|
+
const deleteMsg = message;
|
|
27
27
|
deleteTask(deleteMsg.taskId);
|
|
28
28
|
sendTo(clientId, { type: "scheduler:tasks", tasks: listTasks() });
|
|
29
29
|
return;
|
|
30
30
|
}
|
|
31
31
|
if (message.type === "scheduler:toggle") {
|
|
32
|
-
|
|
32
|
+
const toggleMsg = message;
|
|
33
33
|
toggleTask(toggleMsg.taskId);
|
|
34
34
|
sendTo(clientId, { type: "scheduler:tasks", tasks: listTasks() });
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
37
|
if (message.type === "scheduler:update") {
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const updateMsg = message;
|
|
39
|
+
const updated = updateTask(updateMsg.taskId, {
|
|
40
40
|
name: updateMsg.name,
|
|
41
41
|
prompt: updateMsg.prompt,
|
|
42
42
|
cron: updateMsg.cron,
|
|
@@ -9,10 +9,10 @@ import { wasSessionInterrupted, clearInterruptedFlag } from "../project/sdk-brid
|
|
|
9
9
|
import { log } from "../logger.js";
|
|
10
10
|
registerHandler("session", async function (clientId, message) {
|
|
11
11
|
if (message.type === "session:list_request") {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const listReqMsg = message;
|
|
13
|
+
const offset = listReqMsg.offset || 0;
|
|
14
|
+
const limit = listReqMsg.limit || 0;
|
|
15
|
+
const t0 = Date.now();
|
|
16
16
|
void listSessions(listReqMsg.projectSlug, { offset, limit }).then(function (result) {
|
|
17
17
|
log.session("session:list_request for %s took %dms (%d sessions)", listReqMsg.projectSlug, Date.now() - t0, result.sessions.length);
|
|
18
18
|
sendTo(clientId, {
|
|
@@ -26,7 +26,7 @@ registerHandler("session", async function (clientId, message) {
|
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
if (message.type === "session:preview_request") {
|
|
29
|
-
|
|
29
|
+
const previewMsg = message;
|
|
30
30
|
void getSessionPreview(previewMsg.projectSlug, previewMsg.sessionId).then(function (preview) {
|
|
31
31
|
if (preview) {
|
|
32
32
|
sendTo(clientId, { type: "session:preview", sessionId: previewMsg.sessionId, preview });
|
|
@@ -35,14 +35,14 @@ registerHandler("session", async function (clientId, message) {
|
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
37
|
if (message.type === "session:list_all_request") {
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const config = loadConfig();
|
|
39
|
+
const allPromises = config.projects.map(function (p) {
|
|
40
40
|
return listSessions(p.slug, { limit: 20 });
|
|
41
41
|
});
|
|
42
42
|
void Promise.all(allPromises).then(function (results) {
|
|
43
|
-
|
|
44
|
-
for (
|
|
45
|
-
for (
|
|
43
|
+
const merged = [];
|
|
44
|
+
for (let i = 0; i < results.length; i++) {
|
|
45
|
+
for (let j = 0; j < results[i].sessions.length; j++) {
|
|
46
46
|
merged.push(results[i].sessions[j]);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -55,8 +55,8 @@ registerHandler("session", async function (clientId, message) {
|
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
57
|
if (message.type === "session:history_page") {
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
const pageMsg = message;
|
|
59
|
+
const activeSession = getActiveSession(clientId);
|
|
60
60
|
void getSessionHistoryPage(pageMsg.sessionId, pageMsg.before, pageMsg.limit, activeSession?.projectSlug, pageMsg.loaded).then(function (page) {
|
|
61
61
|
sendTo(clientId, {
|
|
62
62
|
type: "session:history_page_result",
|
|
@@ -69,8 +69,8 @@ registerHandler("session", async function (clientId, message) {
|
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
if (message.type === "session:create") {
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
const createMsg = message;
|
|
73
|
+
const session = createSession(createMsg.projectSlug, createMsg.sessionType);
|
|
74
74
|
updateSessionInIndex(createMsg.projectSlug, session);
|
|
75
75
|
sendTo(clientId, { type: "session:created", session });
|
|
76
76
|
broadcastToProject(createMsg.projectSlug, {
|
|
@@ -83,25 +83,25 @@ registerHandler("session", async function (clientId, message) {
|
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
if (message.type === "session:activate") {
|
|
86
|
-
|
|
86
|
+
const activateMsg = message;
|
|
87
87
|
setActiveSession(clientId, activateMsg.projectSlug, activateMsg.sessionId);
|
|
88
88
|
setActiveProject(clientId, activateMsg.projectSlug);
|
|
89
89
|
invalidateHistoryCache(activateMsg.sessionId);
|
|
90
|
-
|
|
90
|
+
const fileSize = await getSessionFileSizeBytes(activateMsg.projectSlug, activateMsg.sessionId);
|
|
91
91
|
sendTo(clientId, { type: "session:loading_progress", sessionId: activateMsg.sessionId, fileSize });
|
|
92
|
-
|
|
92
|
+
const activateT0 = Date.now();
|
|
93
93
|
void Promise.all([
|
|
94
94
|
loadSessionHistory(activateMsg.projectSlug, activateMsg.sessionId),
|
|
95
95
|
getSessionTitle(activateMsg.projectSlug, activateMsg.sessionId).catch(function () { return null; }),
|
|
96
96
|
getSessionUsage(activateMsg.projectSlug, activateMsg.sessionId).catch(function () { return null; }),
|
|
97
97
|
getContextBreakdown(activateMsg.projectSlug, activateMsg.sessionId).catch(function () { return null; }),
|
|
98
98
|
]).then(function (results) {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
const historyResult = results[0];
|
|
100
|
+
const sessionTitle = results[1];
|
|
101
|
+
const usage = results[2];
|
|
102
|
+
const breakdown = results[3];
|
|
103
103
|
log.session("session:activate: %dms", Date.now() - activateT0);
|
|
104
|
-
|
|
104
|
+
const interrupted = wasSessionInterrupted(activateMsg.sessionId);
|
|
105
105
|
if (interrupted) {
|
|
106
106
|
clearInterruptedFlag(activateMsg.sessionId);
|
|
107
107
|
}
|
|
@@ -140,7 +140,7 @@ registerHandler("session", async function (clientId, message) {
|
|
|
140
140
|
return;
|
|
141
141
|
}
|
|
142
142
|
if (message.type === "session:rename") {
|
|
143
|
-
|
|
143
|
+
const renameMsg = message;
|
|
144
144
|
void findProjectSlugForSession(renameMsg.sessionId).then(function (projectSlug) {
|
|
145
145
|
if (!projectSlug) {
|
|
146
146
|
sendTo(clientId, { type: "chat:error", message: "Session not found" });
|
|
@@ -161,7 +161,7 @@ registerHandler("session", async function (clientId, message) {
|
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
163
|
if (message.type === "session:delete") {
|
|
164
|
-
|
|
164
|
+
const deleteMsg = message;
|
|
165
165
|
void findProjectSlugForSession(deleteMsg.sessionId).then(function (deleteProjectSlug) {
|
|
166
166
|
if (!deleteProjectSlug) {
|
|
167
167
|
sendTo(clientId, { type: "chat:error", message: "Session not found" });
|
|
@@ -10,12 +10,12 @@ import { sendBudgetStatus } from "./chat.js";
|
|
|
10
10
|
import { buildNodesMessage } from "./mesh.js";
|
|
11
11
|
export function detectIdeProjectName(projectPath) {
|
|
12
12
|
try {
|
|
13
|
-
|
|
13
|
+
const ideDir = join(projectPath, ".idea");
|
|
14
14
|
if (!existsSync(ideDir))
|
|
15
15
|
return undefined;
|
|
16
|
-
|
|
16
|
+
const ideNameFile = join(ideDir, ".name");
|
|
17
17
|
if (existsSync(ideNameFile)) {
|
|
18
|
-
|
|
18
|
+
const name = readFileSync(ideNameFile, "utf-8").trim();
|
|
19
19
|
if (name)
|
|
20
20
|
return name;
|
|
21
21
|
}
|
|
@@ -26,7 +26,7 @@ export function detectIdeProjectName(projectPath) {
|
|
|
26
26
|
}
|
|
27
27
|
import { loadOrCreateIdentity } from "../identity.js";
|
|
28
28
|
function loadGlobalClaudeMd() {
|
|
29
|
-
|
|
29
|
+
const mdPath = join(homedir(), ".claude", "CLAUDE.md");
|
|
30
30
|
if (existsSync(mdPath)) {
|
|
31
31
|
try {
|
|
32
32
|
return readFileSync(mdPath, "utf-8");
|
|
@@ -36,17 +36,17 @@ function loadGlobalClaudeMd() {
|
|
|
36
36
|
return "";
|
|
37
37
|
}
|
|
38
38
|
function saveGlobalClaudeMd(content) {
|
|
39
|
-
|
|
39
|
+
const claudeDir = join(homedir(), ".claude");
|
|
40
40
|
if (!existsSync(claudeDir)) {
|
|
41
41
|
mkdirSync(claudeDir, { recursive: true });
|
|
42
42
|
}
|
|
43
43
|
writeFileSync(join(claudeDir, "CLAUDE.md"), content, "utf-8");
|
|
44
44
|
}
|
|
45
45
|
function loadSpinnerVerbs() {
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
const claudeSettingsPath = join(homedir(), ".claude", "settings.json");
|
|
47
|
+
const defaultVerbs = ["Thinking", "Analyzing", "Processing", "Computing", "Evaluating", "Considering", "Examining", "Reviewing"];
|
|
48
48
|
try {
|
|
49
|
-
|
|
49
|
+
const claudeSettings = JSON.parse(readFileSync(claudeSettingsPath, "utf-8"));
|
|
50
50
|
if (claudeSettings.spinnerVerbs) {
|
|
51
51
|
if (claudeSettings.spinnerVerbs.mode === "replace") {
|
|
52
52
|
return claudeSettings.spinnerVerbs.verbs || [];
|
|
@@ -59,9 +59,9 @@ function loadSpinnerVerbs() {
|
|
|
59
59
|
}
|
|
60
60
|
registerHandler("settings", function (clientId, message) {
|
|
61
61
|
if (message.type === "settings:get") {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
const config = loadConfig();
|
|
63
|
+
const identity = loadOrCreateIdentity();
|
|
64
|
+
const configWithClaudeMd = { ...config, claudeMd: loadGlobalClaudeMd() };
|
|
65
65
|
sendTo(clientId, {
|
|
66
66
|
type: "settings:data",
|
|
67
67
|
config: configWithClaudeMd,
|
|
@@ -82,9 +82,9 @@ registerHandler("settings", function (clientId, message) {
|
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
84
84
|
if (message.type === "settings:update") {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
const updateMsg = message;
|
|
86
|
+
const current = loadConfig();
|
|
87
|
+
const incoming = updateMsg.settings;
|
|
88
88
|
if (typeof incoming.claudeMd === "string") {
|
|
89
89
|
saveGlobalClaudeMd(incoming.claudeMd);
|
|
90
90
|
delete incoming.claudeMd;
|
|
@@ -97,15 +97,15 @@ registerHandler("settings", function (clientId, message) {
|
|
|
97
97
|
removeProject(incoming.removeProject);
|
|
98
98
|
delete incoming.removeProject;
|
|
99
99
|
}
|
|
100
|
-
|
|
100
|
+
const incomingProjects = incoming.projects;
|
|
101
101
|
if (incomingProjects && incomingProjects.length > 0) {
|
|
102
|
-
for (
|
|
103
|
-
|
|
102
|
+
for (let i = 0; i < incomingProjects.length; i++) {
|
|
103
|
+
const proj = incomingProjects[i];
|
|
104
104
|
addProject(proj.path, proj.title);
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
const refreshed = loadConfig();
|
|
108
|
+
const updated = {
|
|
109
109
|
...refreshed,
|
|
110
110
|
...incoming,
|
|
111
111
|
globalEnv: {
|
|
@@ -118,7 +118,7 @@ registerHandler("settings", function (clientId, message) {
|
|
|
118
118
|
delete updated.costBudget;
|
|
119
119
|
}
|
|
120
120
|
saveConfig(updated);
|
|
121
|
-
|
|
121
|
+
const updatedWithClaudeMd = { ...updated, claudeMd: loadGlobalClaudeMd() };
|
|
122
122
|
sendTo(clientId, {
|
|
123
123
|
type: "settings:data",
|
|
124
124
|
config: updatedWithClaudeMd,
|
|
@@ -128,7 +128,7 @@ registerHandler("settings", function (clientId, message) {
|
|
|
128
128
|
spinnerVerbs: loadSpinnerVerbs(),
|
|
129
129
|
wslDistro: process.env.WSL_DISTRO_NAME || undefined,
|
|
130
130
|
});
|
|
131
|
-
|
|
131
|
+
const updatedIdentity = loadOrCreateIdentity();
|
|
132
132
|
broadcast({
|
|
133
133
|
type: "projects:list",
|
|
134
134
|
projects: updated.projects.map(function (p) {
|