jinzd-ai-cli 0.4.328 → 0.4.330
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/README.md +4 -4
- package/README.zh-CN.md +4 -4
- package/dist/{batch-GE6XWXPK.js → batch-GXITPLER.js} +2 -2
- package/dist/{chunk-IEKVRC2E.js → chunk-265M6ZLH.js} +4 -4
- package/dist/{chunk-BRZZ3QAI.js → chunk-2BAFLDDL.js} +44 -7
- package/dist/{chunk-JXGE4T4U.js → chunk-2SYDIWRU.js} +1 -1
- package/dist/{chunk-LOS7T2JS.js → chunk-3YVZJHTF.js} +1 -1
- package/dist/{chunk-NOQKCHIQ.js → chunk-AJITHMRE.js} +1 -1
- package/dist/{chunk-T4K4RZKR.js → chunk-CCFCPAKN.js} +1 -1
- package/dist/{chunk-IOLDD5ZA.js → chunk-DU44SD6A.js} +1 -1
- package/dist/{chunk-E3RJEQZA.js → chunk-DX2U6QK4.js} +1 -1
- package/dist/{chunk-NKTCITLH.js → chunk-GEC3MEVQ.js} +48 -40
- package/dist/{chunk-VKQIHFI5.js → chunk-GWEBO4RF.js} +1 -1
- package/dist/{chunk-B4EBCSKM.js → chunk-HMQA2R3O.js} +1 -1
- package/dist/{chunk-WDEO7J3T.js → chunk-LLXHA2LA.js} +8 -8
- package/dist/{chunk-U6VATMAI.js → chunk-LUJ4JVMI.js} +4 -4
- package/dist/{chunk-UQI5TOL2.js → chunk-M5B6G6AY.js} +4 -4
- package/dist/{chunk-OVEZ6HB5.js → chunk-QU74ONFF.js} +9 -3
- package/dist/{ci-U5Q3BMQP.js → ci-6K3JNHB4.js} +5 -5
- package/dist/{ci-format-4RR2G3RR.js → ci-format-2L3RFJVH.js} +2 -2
- package/dist/{constants-5YWODQHN.js → constants-DLJECTGQ.js} +1 -1
- package/dist/{constants-J3346CYX.js → constants-J5SJ232X.js} +1 -1
- package/dist/{doctor-cli-PCSMI6ZV.js → doctor-cli-BHS7G2XY.js} +5 -5
- package/dist/electron-server.js +124 -59
- package/dist/{hub-R3WSYGNT.js → hub-PPG4N6QQ.js} +1 -1
- package/dist/index.js +32 -21
- package/dist/{persistent-memory-64EXCOV4.js → persistent-memory-3XTSZ3QR.js} +2 -2
- package/dist/{persistent-memory-JZWKXFUF.js → persistent-memory-O4T2OTVV.js} +2 -2
- package/dist/{pr-2EZKHIQ5.js → pr-M6ZY4CEK.js} +5 -5
- package/dist/{run-tests-CC24OLYI.js → run-tests-H3DIUCDB.js} +2 -2
- package/dist/{run-tests-RUYOX42E.js → run-tests-WQE3XTUL.js} +2 -2
- package/dist/{server-DQFHA3Z2.js → server-5NQSYQ2T.js} +31 -16
- package/dist/{server-GU7XSXSR.js → server-J2B26DZK.js} +5 -5
- package/dist/{task-orchestrator-62LRX42O.js → task-orchestrator-CI7EDT25.js} +5 -5
- package/dist/{usage-RDLAA5HC.js → usage-AJYZ5A7P.js} +3 -3
- package/dist/web/client/app.js +9 -0
- package/dist/web/client/app.js.br +0 -0
- package/dist/web/client/app.js.gz +0 -0
- package/dist/web/client/index.html +1 -0
- package/dist/web/client/index.html.br +0 -0
- package/dist/web/client/index.html.gz +0 -0
- package/dist/web/client/state.js +3 -0
- package/dist/web/client/state.js.br +0 -0
- package/dist/web/client/state.js.gz +0 -0
- package/dist/web/client/style.css +3 -0
- package/dist/web/client/style.css.br +0 -0
- package/dist/web/client/style.css.gz +0 -0
- package/package.json +1 -1
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import {
|
|
3
3
|
countSeverity,
|
|
4
4
|
runCi
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-LUJ4JVMI.js";
|
|
6
|
+
import "./chunk-CCFCPAKN.js";
|
|
7
7
|
import {
|
|
8
8
|
buildReviewPrompt,
|
|
9
9
|
buildSecurityReviewPrompt,
|
|
@@ -14,16 +14,16 @@ import {
|
|
|
14
14
|
} from "./chunk-6YZEZFX5.js";
|
|
15
15
|
import {
|
|
16
16
|
ProviderRegistry
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-GEC3MEVQ.js";
|
|
18
18
|
import {
|
|
19
19
|
ConfigManager
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-QU74ONFF.js";
|
|
21
21
|
import "./chunk-E2W2MI6H.js";
|
|
22
22
|
import "./chunk-TU3L3PW7.js";
|
|
23
23
|
import "./chunk-BMLQPSHP.js";
|
|
24
24
|
import {
|
|
25
25
|
VERSION
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-AJITHMRE.js";
|
|
27
27
|
|
|
28
28
|
// src/cli/pr.ts
|
|
29
29
|
import { execFileSync } from "child_process";
|
|
@@ -2,9 +2,9 @@ import {
|
|
|
2
2
|
executeTests,
|
|
3
3
|
runTestProcess,
|
|
4
4
|
runTestsTool
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DU44SD6A.js";
|
|
6
6
|
import "./chunk-QMFMST2T.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-3YVZJHTF.js";
|
|
8
8
|
export {
|
|
9
9
|
executeTests,
|
|
10
10
|
runTestProcess,
|
|
@@ -86,7 +86,7 @@ import {
|
|
|
86
86
|
skillHistoryNote,
|
|
87
87
|
snapshotFile,
|
|
88
88
|
stripRoutingTags
|
|
89
|
-
} from "./chunk-
|
|
89
|
+
} from "./chunk-LLXHA2LA.js";
|
|
90
90
|
import {
|
|
91
91
|
CNY_PER_USD,
|
|
92
92
|
CostTracker,
|
|
@@ -95,7 +95,7 @@ import {
|
|
|
95
95
|
getCostCurrency,
|
|
96
96
|
getPricing,
|
|
97
97
|
setCostCurrency
|
|
98
|
-
} from "./chunk-
|
|
98
|
+
} from "./chunk-2BAFLDDL.js";
|
|
99
99
|
import {
|
|
100
100
|
DEFAULT_MAX_TOOL_OUTPUT_CHARS,
|
|
101
101
|
ToolExecutor,
|
|
@@ -130,7 +130,7 @@ import {
|
|
|
130
130
|
spawnAgentContext,
|
|
131
131
|
truncateOutput,
|
|
132
132
|
undoStack
|
|
133
|
-
} from "./chunk-
|
|
133
|
+
} from "./chunk-M5B6G6AY.js";
|
|
134
134
|
import {
|
|
135
135
|
buildReviewPrompt,
|
|
136
136
|
buildSecurityReviewPrompt
|
|
@@ -157,7 +157,7 @@ import {
|
|
|
157
157
|
restoreMemoryEntries,
|
|
158
158
|
updateMemoryApproval,
|
|
159
159
|
updateMemoryEntry
|
|
160
|
-
} from "./chunk-
|
|
160
|
+
} from "./chunk-DX2U6QK4.js";
|
|
161
161
|
import "./chunk-RWRZVQCB.js";
|
|
162
162
|
import "./chunk-B3MPYI4E.js";
|
|
163
163
|
import "./chunk-M6HLYG33.js";
|
|
@@ -176,7 +176,7 @@ import {
|
|
|
176
176
|
buildDoctorReport,
|
|
177
177
|
formatDoctorReport,
|
|
178
178
|
loadContextFiles
|
|
179
|
-
} from "./chunk-
|
|
179
|
+
} from "./chunk-265M6ZLH.js";
|
|
180
180
|
import {
|
|
181
181
|
describePlugin,
|
|
182
182
|
getActivePluginAssets,
|
|
@@ -191,14 +191,14 @@ import {
|
|
|
191
191
|
runTool,
|
|
192
192
|
setPluginEnabled,
|
|
193
193
|
trustPlugin
|
|
194
|
-
} from "./chunk-
|
|
194
|
+
} from "./chunk-HMQA2R3O.js";
|
|
195
195
|
import "./chunk-RS7SKYTS.js";
|
|
196
196
|
import {
|
|
197
197
|
ProviderRegistry
|
|
198
|
-
} from "./chunk-
|
|
198
|
+
} from "./chunk-GEC3MEVQ.js";
|
|
199
199
|
import {
|
|
200
200
|
ConfigManager
|
|
201
|
-
} from "./chunk-
|
|
201
|
+
} from "./chunk-QU74ONFF.js";
|
|
202
202
|
import {
|
|
203
203
|
CONTENT_ONLY_STREAM_REMINDER,
|
|
204
204
|
TEE_FINAL_USER_NUDGE,
|
|
@@ -231,7 +231,7 @@ import {
|
|
|
231
231
|
import {
|
|
232
232
|
assertReadablePath
|
|
233
233
|
} from "./chunk-JJFJWD35.js";
|
|
234
|
-
import "./chunk-
|
|
234
|
+
import "./chunk-GWEBO4RF.js";
|
|
235
235
|
import {
|
|
236
236
|
AGENTIC_BEHAVIOR_GUIDELINE,
|
|
237
237
|
AUTHOR,
|
|
@@ -247,7 +247,7 @@ import {
|
|
|
247
247
|
SKILLS_DIR_NAME,
|
|
248
248
|
VERSION,
|
|
249
249
|
buildUserIdentityPrompt
|
|
250
|
-
} from "./chunk-
|
|
250
|
+
} from "./chunk-AJITHMRE.js";
|
|
251
251
|
import {
|
|
252
252
|
runWithExecutionContext,
|
|
253
253
|
runWithSessionKey
|
|
@@ -979,7 +979,7 @@ Cache: write=${cacheCreate} read=${cacheRead}` : "";
|
|
|
979
979
|
Cost: ${formatCost(cost)}` : "";
|
|
980
980
|
let memoryLine = "";
|
|
981
981
|
try {
|
|
982
|
-
const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-
|
|
982
|
+
const { countPendingMemories: countPendingMemories2 } = await import("./persistent-memory-O4T2OTVV.js");
|
|
983
983
|
const pending = countPendingMemories2(ctx.config.getConfigDir());
|
|
984
984
|
if (pending > 0) memoryLine = `
|
|
985
985
|
Memory: \u26A0 ${pending} pending approval \u2014 see the Memory panel or /memory`;
|
|
@@ -1908,7 +1908,7 @@ async function handleTest(args, ctx) {
|
|
|
1908
1908
|
const isCommand = argStr.includes(" ") || /^(mvn|gradle|npm|pytest|cargo|go)\b/.test(argStr);
|
|
1909
1909
|
testArgs = isCommand ? { command: argStr } : { filter: argStr };
|
|
1910
1910
|
}
|
|
1911
|
-
const runTests = ctx.runTests ?? (await import("./run-tests-
|
|
1911
|
+
const runTests = ctx.runTests ?? (await import("./run-tests-H3DIUCDB.js")).executeTests;
|
|
1912
1912
|
const report = await runTests(testArgs);
|
|
1913
1913
|
ctx.send({ type: "info", message: report });
|
|
1914
1914
|
} catch (err) {
|
|
@@ -2184,7 +2184,7 @@ async function handleMemory(args, ctx) {
|
|
|
2184
2184
|
}
|
|
2185
2185
|
if (intent.kind === "status") {
|
|
2186
2186
|
const { getChatIndexStatus } = await import("./chat-index-7CLR4CBG.js");
|
|
2187
|
-
const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-
|
|
2187
|
+
const { listMemoryEntries: listMemoryEntries2, isMemoryExpired: isMemoryExpired2, formatMemoryForPrompt: formatMemoryForPrompt2 } = await import("./persistent-memory-O4T2OTVV.js");
|
|
2188
2188
|
const memories = listMemoryEntries2(configDir, { includeExpired: true, includeRejected: true });
|
|
2189
2189
|
const injected = formatMemoryForPrompt2(configDir, process.cwd(), ctx.config.get("memory")?.maxChars);
|
|
2190
2190
|
const view = buildMemoryStatusView({
|
|
@@ -2207,7 +2207,7 @@ async function handleMemory(args, ctx) {
|
|
|
2207
2207
|
return;
|
|
2208
2208
|
}
|
|
2209
2209
|
if (intent.kind === "recall") {
|
|
2210
|
-
const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-
|
|
2210
|
+
const { searchPersistentMemories, touchMemoryReferences } = await import("./persistent-memory-O4T2OTVV.js");
|
|
2211
2211
|
const { searchChatMemory } = await import("./chat-index-7CLR4CBG.js");
|
|
2212
2212
|
const persistentHits = searchPersistentMemories(configDir, intent.query, process.cwd(), 3);
|
|
2213
2213
|
if (persistentHits.length > 0) {
|
|
@@ -2328,7 +2328,7 @@ async function handleMemory(args, ctx) {
|
|
|
2328
2328
|
ctx.handleMemoryManage(intent.action, args[1], intent.action === "expire" ? args[2] : void 0);
|
|
2329
2329
|
} else if (intent.kind === "export") {
|
|
2330
2330
|
if (args[1] === "md") {
|
|
2331
|
-
const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-
|
|
2331
|
+
const { exportMemoryEntries: exportMemoryEntries2 } = await import("./persistent-memory-O4T2OTVV.js");
|
|
2332
2332
|
ctx.send({
|
|
2333
2333
|
type: "export_data",
|
|
2334
2334
|
format: "md",
|
|
@@ -4392,6 +4392,12 @@ function getModuleDir() {
|
|
|
4392
4392
|
}
|
|
4393
4393
|
return resolve3(".");
|
|
4394
4394
|
}
|
|
4395
|
+
var WebStartupError = class extends Error {
|
|
4396
|
+
constructor(message) {
|
|
4397
|
+
super(message);
|
|
4398
|
+
this.name = "WebStartupError";
|
|
4399
|
+
}
|
|
4400
|
+
};
|
|
4395
4401
|
async function startWebServer(options = {}) {
|
|
4396
4402
|
const port = options.port ?? 3e3;
|
|
4397
4403
|
const host = options.host ?? "localhost";
|
|
@@ -4400,7 +4406,7 @@ async function startWebServer(options = {}) {
|
|
|
4400
4406
|
const config = new ConfigManager();
|
|
4401
4407
|
const authManager = new AuthManager(config.getConfigDir());
|
|
4402
4408
|
if (!authManager.isEnabled() && !["localhost", "127.0.0.1", "::1"].includes(host)) {
|
|
4403
|
-
throw new
|
|
4409
|
+
throw new WebStartupError("Network listening requires authentication. Create a user first: aicli user create <username>");
|
|
4404
4410
|
}
|
|
4405
4411
|
await setupProxy(config.get("proxy"));
|
|
4406
4412
|
const providers = new ProviderRegistry();
|
|
@@ -4526,6 +4532,8 @@ async function startWebServer(options = {}) {
|
|
|
4526
4532
|
const cookie = parseCookie(req.headers.cookie ?? "");
|
|
4527
4533
|
return equalToken(cookie.aicli_local, access.localToken) || !!authManager.verifyToken(cookie.aicli_token ?? "");
|
|
4528
4534
|
} });
|
|
4535
|
+
wss.on("error", () => {
|
|
4536
|
+
});
|
|
4529
4537
|
if (authManager.isEnabled()) {
|
|
4530
4538
|
console.log(` Auth: ${authManager.listUsers().length} user(s) registered`);
|
|
4531
4539
|
} else {
|
|
@@ -5070,6 +5078,12 @@ async function startWebServer(options = {}) {
|
|
|
5070
5078
|
actualPort++;
|
|
5071
5079
|
console.log(` \u26A0 Port ${actualPort - 1} in use, trying ${actualPort}...`);
|
|
5072
5080
|
server.close(() => tryListen(attempt + 1));
|
|
5081
|
+
} else if (err.code === "EADDRINUSE") {
|
|
5082
|
+
reject(new WebStartupError(`Ports ${port}-${actualPort} are all in use. Pick another one: aicli web --port <number>`));
|
|
5083
|
+
} else if (err.code === "EACCES") {
|
|
5084
|
+
reject(new WebStartupError(`No permission to listen on port ${actualPort}. Pick another one: aicli web --port <number>`));
|
|
5085
|
+
} else if (err.code === "EADDRNOTAVAIL" || err.code === "ENOTFOUND") {
|
|
5086
|
+
reject(new WebStartupError(`Cannot listen on host "${host}" (${err.code}). Check the --host value.`));
|
|
5073
5087
|
} else {
|
|
5074
5088
|
reject(err);
|
|
5075
5089
|
}
|
|
@@ -5172,5 +5186,6 @@ async function openBrowser(url) {
|
|
|
5172
5186
|
}
|
|
5173
5187
|
}
|
|
5174
5188
|
export {
|
|
5189
|
+
WebStartupError,
|
|
5175
5190
|
startWebServer
|
|
5176
5191
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
ToolRegistry
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-M5B6G6AY.js";
|
|
5
5
|
import "./chunk-6JHACXB3.js";
|
|
6
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-DX2U6QK4.js";
|
|
7
7
|
import "./chunk-RWRZVQCB.js";
|
|
8
8
|
import "./chunk-B3MPYI4E.js";
|
|
9
9
|
import "./chunk-M6HLYG33.js";
|
|
@@ -14,7 +14,7 @@ import "./chunk-JL44HGZC.js";
|
|
|
14
14
|
import "./chunk-3FEZSLGI.js";
|
|
15
15
|
import {
|
|
16
16
|
runTool
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-HMQA2R3O.js";
|
|
18
18
|
import "./chunk-RS7SKYTS.js";
|
|
19
19
|
import {
|
|
20
20
|
getDangerLevel,
|
|
@@ -24,10 +24,10 @@ import "./chunk-TU3L3PW7.js";
|
|
|
24
24
|
import "./chunk-HOSJZMQS.js";
|
|
25
25
|
import "./chunk-BMLQPSHP.js";
|
|
26
26
|
import "./chunk-JJFJWD35.js";
|
|
27
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-GWEBO4RF.js";
|
|
28
28
|
import {
|
|
29
29
|
VERSION
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-AJITHMRE.js";
|
|
31
31
|
import "./chunk-SXIJLSVF.js";
|
|
32
32
|
|
|
33
33
|
// src/mcp/server.ts
|
|
@@ -4,9 +4,9 @@ import {
|
|
|
4
4
|
googleSearchContext,
|
|
5
5
|
isToolCapableProvider,
|
|
6
6
|
truncateOutput
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-M5B6G6AY.js";
|
|
8
8
|
import "./chunk-6JHACXB3.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-DX2U6QK4.js";
|
|
10
10
|
import "./chunk-RWRZVQCB.js";
|
|
11
11
|
import "./chunk-B3MPYI4E.js";
|
|
12
12
|
import "./chunk-M6HLYG33.js";
|
|
@@ -17,7 +17,7 @@ import "./chunk-JL44HGZC.js";
|
|
|
17
17
|
import "./chunk-3FEZSLGI.js";
|
|
18
18
|
import {
|
|
19
19
|
runTool
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-HMQA2R3O.js";
|
|
21
21
|
import "./chunk-RS7SKYTS.js";
|
|
22
22
|
import {
|
|
23
23
|
getDangerLevel,
|
|
@@ -29,10 +29,10 @@ import {
|
|
|
29
29
|
atomicWriteFileSync
|
|
30
30
|
} from "./chunk-BMLQPSHP.js";
|
|
31
31
|
import "./chunk-JJFJWD35.js";
|
|
32
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-GWEBO4RF.js";
|
|
33
33
|
import {
|
|
34
34
|
SUBAGENT_ALLOWED_TOOLS
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-AJITHMRE.js";
|
|
36
36
|
import "./chunk-SXIJLSVF.js";
|
|
37
37
|
|
|
38
38
|
// src/hub/task-orchestrator.ts
|
|
@@ -5,14 +5,14 @@ import {
|
|
|
5
5
|
formatCost,
|
|
6
6
|
getPricing,
|
|
7
7
|
setCostCurrency
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-2BAFLDDL.js";
|
|
9
9
|
import "./chunk-RS7SKYTS.js";
|
|
10
10
|
import {
|
|
11
11
|
ConfigManager
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-QU74ONFF.js";
|
|
13
13
|
import "./chunk-TU3L3PW7.js";
|
|
14
14
|
import "./chunk-BMLQPSHP.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-AJITHMRE.js";
|
|
16
16
|
|
|
17
17
|
// src/cli/usage.ts
|
|
18
18
|
function classifyRowCost(row) {
|
package/dist/web/client/app.js
CHANGED
|
@@ -2705,6 +2705,7 @@ function showAuthScreen(hasUsers) {
|
|
|
2705
2705
|
screen.classList.remove('hidden');
|
|
2706
2706
|
app.style.display = 'none';
|
|
2707
2707
|
|
|
2708
|
+
authHasUsers = !!hasUsers;
|
|
2708
2709
|
// If no users registered, show register form by default
|
|
2709
2710
|
if (!hasUsers) {
|
|
2710
2711
|
authMode = 'register';
|
|
@@ -2734,10 +2735,18 @@ function updateAuthForm() {
|
|
|
2734
2735
|
|
|
2735
2736
|
errorEl.classList.add('hidden');
|
|
2736
2737
|
|
|
2738
|
+
// Registration is closed server-side once a user exists: say how accounts
|
|
2739
|
+
// are added instead of offering a Register link that always fails with 403.
|
|
2740
|
+
const registrationClosed = authMode === 'login' && authHasUsers;
|
|
2741
|
+
toggle.classList.toggle('hidden', registrationClosed);
|
|
2742
|
+
document.getElementById('auth-closed-hint')?.classList.toggle('hidden', !registrationClosed);
|
|
2737
2743
|
if (authMode === 'register') {
|
|
2738
2744
|
subtitle.textContent = 'Create your account to get started';
|
|
2739
2745
|
submit.textContent = 'Create Account';
|
|
2740
2746
|
toggle.innerHTML = 'Already have an account? <span class="text-primary">Sign In</span>';
|
|
2747
|
+
} else if (registrationClosed) {
|
|
2748
|
+
subtitle.textContent = 'Sign in to continue';
|
|
2749
|
+
submit.textContent = 'Sign In';
|
|
2741
2750
|
} else {
|
|
2742
2751
|
subtitle.textContent = 'Sign in to continue';
|
|
2743
2752
|
submit.textContent = 'Sign In';
|
|
Binary file
|
|
Binary file
|
|
@@ -59,6 +59,7 @@
|
|
|
59
59
|
<button id="auth-toggle" class="btn btn-ghost btn-sm" data-action="toggle-auth-mode" type="button">
|
|
60
60
|
Don't have an account? <span class="text-primary">Register</span>
|
|
61
61
|
</button>
|
|
62
|
+
<p id="auth-closed-hint" class="hidden text-sm opacity-70">New accounts are added on the host:<br><code>aicli user create <name></code></p>
|
|
62
63
|
</div>
|
|
63
64
|
</div>
|
|
64
65
|
</div>
|
|
Binary file
|
|
Binary file
|
package/dist/web/client/state.js
CHANGED
|
@@ -54,6 +54,9 @@ let authToken = '';
|
|
|
54
54
|
try { localStorage.removeItem('aicli-auth-token'); } catch {}
|
|
55
55
|
let authUsername = localStorage.getItem('aicli-auth-user') || '';
|
|
56
56
|
let authMode = 'login'; // 'login' or 'register'
|
|
57
|
+
// Once a user exists the server closes registration (403) — the login form
|
|
58
|
+
// must not offer a Register link it can never honour.
|
|
59
|
+
let authHasUsers = false;
|
|
57
60
|
|
|
58
61
|
// ── Streaming render state ─────────────────────────────────────────
|
|
59
62
|
/** @type {HTMLElement|null} */
|
|
Binary file
|
|
Binary file
|
|
@@ -791,6 +791,9 @@ button, a, .session-item, .file-tree-row, .template-item, .tool-item, .mcp-serve
|
|
|
791
791
|
#btn-think, #btn-plan { font-size: 0.8rem; padding: 0 0.4rem; }
|
|
792
792
|
}
|
|
793
793
|
|
|
794
|
+
/* Brand stays on one line: in a crowded navbar it wrapped to "ai-" / "cli". */
|
|
795
|
+
.brand-text { white-space: nowrap; }
|
|
796
|
+
|
|
794
797
|
/* ── Responsive: Phone ──────────────────────────────── */
|
|
795
798
|
@media (max-width: 640px) {
|
|
796
799
|
/* Navbar: compact layout */
|
|
Binary file
|
|
Binary file
|