codexmate 0.0.28 → 0.0.29
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 +421 -421
- package/README.zh.md +354 -354
- package/cli/agents-files.js +224 -224
- package/cli/archive-helpers.js +446 -446
- package/cli/auth-profiles.js +375 -375
- package/cli/builtin-proxy.js +1725 -1620
- package/cli/claude-proxy.js +1022 -1022
- package/cli/config-bootstrap.js +384 -384
- package/cli/config-health.js +338 -338
- package/cli/doctor-core.js +903 -903
- package/cli/import-skills-url.js +356 -356
- package/cli/openai-bridge.js +1576 -1489
- package/cli/openclaw-config.js +629 -629
- package/cli/session-convert-args.js +65 -65
- package/cli/session-convert-io.js +82 -82
- package/cli/session-convert.js +43 -43
- package/cli/session-usage.concurrent.js +28 -28
- package/cli/session-usage.js +118 -118
- package/cli/session-usage.models.js +176 -176
- package/cli/skills.js +1141 -1141
- package/cli/zip-commands.js +510 -510
- package/cli.js +15340 -15264
- package/lib/automation.js +404 -404
- package/lib/cli-file-utils.js +151 -151
- package/lib/cli-models-utils.js +440 -440
- package/lib/cli-network-utils.js +190 -190
- package/lib/cli-path-utils.js +85 -85
- package/lib/cli-session-utils.js +121 -121
- package/lib/cli-sessions.js +417 -417
- package/lib/cli-utils.js +155 -155
- package/lib/cli-webhook.js +126 -0
- package/lib/download-artifacts.js +92 -92
- package/lib/mcp-stdio.js +453 -453
- package/lib/task-orchestrator.js +869 -869
- package/lib/text-diff.js +303 -303
- package/lib/workflow-engine.js +340 -340
- package/package.json +76 -76
- package/plugins/README.md +20 -20
- package/plugins/README.zh-CN.md +20 -20
- package/plugins/prompt-templates/comment-polish/index.mjs +25 -25
- package/plugins/prompt-templates/computed.mjs +253 -253
- package/plugins/prompt-templates/index.mjs +8 -8
- package/plugins/prompt-templates/manifest.mjs +15 -15
- package/plugins/prompt-templates/methods.mjs +553 -553
- package/plugins/prompt-templates/overview.mjs +91 -91
- package/plugins/prompt-templates/ownership.mjs +19 -19
- package/plugins/prompt-templates/rule-ack/index.mjs +21 -21
- package/plugins/prompt-templates/storage.mjs +64 -64
- package/plugins/registry.mjs +16 -16
- package/web-ui/app.js +639 -625
- package/web-ui/index.html +36 -35
- package/web-ui/logic.agents-diff.mjs +386 -386
- package/web-ui/logic.claude.mjs +168 -168
- package/web-ui/logic.codex.mjs +69 -56
- package/web-ui/logic.mjs +5 -5
- package/web-ui/logic.runtime.mjs +128 -128
- package/web-ui/logic.session-convert.mjs +70 -70
- package/web-ui/logic.sessions.mjs +765 -765
- package/web-ui/modules/api.mjs +90 -90
- package/web-ui/modules/app.computed.dashboard.mjs +225 -225
- package/web-ui/modules/app.computed.index.mjs +17 -17
- package/web-ui/modules/app.computed.main-tabs.mjs +205 -205
- package/web-ui/modules/app.computed.session.mjs +999 -994
- package/web-ui/modules/app.constants.mjs +15 -15
- package/web-ui/modules/app.methods.agents.mjs +632 -632
- package/web-ui/modules/app.methods.claude-config.mjs +200 -190
- package/web-ui/modules/app.methods.codex-config.mjs +892 -892
- package/web-ui/modules/app.methods.index.mjs +94 -92
- package/web-ui/modules/app.methods.install.mjs +205 -205
- package/web-ui/modules/app.methods.navigation.mjs +761 -743
- package/web-ui/modules/app.methods.openclaw-core.mjs +814 -814
- package/web-ui/modules/app.methods.openclaw-editing.mjs +372 -372
- package/web-ui/modules/app.methods.openclaw-persist.mjs +369 -369
- package/web-ui/modules/app.methods.providers.mjs +493 -412
- package/web-ui/modules/app.methods.runtime.mjs +345 -345
- package/web-ui/modules/app.methods.session-actions.mjs +593 -593
- package/web-ui/modules/app.methods.session-browser.mjs +984 -984
- package/web-ui/modules/app.methods.session-timeline.mjs +479 -479
- package/web-ui/modules/app.methods.session-trash.mjs +438 -439
- package/web-ui/modules/app.methods.startup-claude.mjs +533 -533
- package/web-ui/modules/app.methods.task-orchestration.mjs +556 -556
- package/web-ui/modules/app.methods.webhook.mjs +79 -0
- package/web-ui/modules/config-mode.computed.mjs +124 -124
- package/web-ui/modules/config-template-confirm-pref.mjs +33 -33
- package/web-ui/modules/i18n.dict.mjs +3131 -2109
- package/web-ui/modules/i18n.mjs +62 -56
- package/web-ui/modules/plugins.computed.mjs +3 -3
- package/web-ui/modules/plugins.methods.mjs +3 -3
- package/web-ui/modules/plugins.storage.mjs +11 -11
- package/web-ui/modules/provider-url-display.mjs +17 -17
- package/web-ui/modules/sessions-filters-url.mjs +85 -85
- package/web-ui/modules/skills.computed.mjs +107 -107
- package/web-ui/modules/skills.methods.mjs +481 -481
- package/web-ui/partials/index/layout-footer.html +13 -13
- package/web-ui/partials/index/layout-header.html +500 -475
- package/web-ui/partials/index/modal-config-template-agents.html +174 -174
- package/web-ui/partials/index/modal-confirm-toast.html +32 -32
- package/web-ui/partials/index/modal-health-check.html +45 -45
- package/web-ui/partials/index/modal-openclaw-config.html +280 -280
- package/web-ui/partials/index/modal-skills.html +200 -200
- package/web-ui/partials/index/modals-basic.html +162 -165
- package/web-ui/partials/index/panel-config-claude.html +194 -188
- package/web-ui/partials/index/panel-config-codex.html +323 -312
- package/web-ui/partials/index/panel-config-openclaw.html +83 -83
- package/web-ui/partials/index/panel-dashboard.html +186 -186
- package/web-ui/partials/index/panel-docs.html +147 -147
- package/web-ui/partials/index/panel-market.html +177 -177
- package/web-ui/partials/index/panel-orchestration.html +391 -391
- package/web-ui/partials/index/panel-plugins.html +253 -253
- package/web-ui/partials/index/panel-sessions.html +316 -316
- package/web-ui/partials/index/panel-settings.html +190 -253
- package/web-ui/partials/index/panel-trash.html +88 -0
- package/web-ui/partials/index/panel-usage.html +371 -371
- package/web-ui/res/json5.min.js +1 -1
- package/web-ui/res/vue.global.prod.js +13 -13
- package/web-ui/session-helpers.mjs +576 -576
- package/web-ui/source-bundle.cjs +233 -233
- package/web-ui/styles/base-theme.css +281 -281
- package/web-ui/styles/controls-forms.css +422 -422
- package/web-ui/styles/dashboard.css +274 -274
- package/web-ui/styles/docs-panel.css +271 -247
- package/web-ui/styles/feedback.css +108 -108
- package/web-ui/styles/health-check-dialog.css +144 -144
- package/web-ui/styles/layout-shell.css +626 -606
- package/web-ui/styles/modals-core.css +466 -466
- package/web-ui/styles/navigation-panels.css +391 -391
- package/web-ui/styles/openclaw-structured.css +266 -266
- package/web-ui/styles/plugins-panel.css +523 -523
- package/web-ui/styles/responsive.css +454 -454
- package/web-ui/styles/sessions-list.css +419 -419
- package/web-ui/styles/sessions-preview.css +411 -411
- package/web-ui/styles/sessions-toolbar-trash.css +330 -330
- package/web-ui/styles/sessions-usage.css +1040 -1040
- package/web-ui/styles/settings-panel.css +349 -185
- package/web-ui/styles/skills-list.css +303 -303
- package/web-ui/styles/skills-market.css +406 -406
- package/web-ui/styles/task-orchestration.css +822 -822
- package/web-ui/styles/titles-cards.css +472 -472
- package/web-ui/styles/trash-panel.css +90 -0
- package/web-ui/styles/webhook.css +81 -0
- package/web-ui/styles.css +23 -21
- package/web-ui.html +17 -17
package/web-ui/modules/api.mjs
CHANGED
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
const browserLocation = typeof location !== 'undefined' ? location : null;
|
|
2
|
-
|
|
3
|
-
export const API_BASE = (browserLocation && browserLocation.origin && browserLocation.origin !== 'null')
|
|
4
|
-
? browserLocation.origin
|
|
5
|
-
: 'http://localhost:3737';
|
|
6
|
-
|
|
7
|
-
async function postApi(action, params = {}) {
|
|
8
|
-
return await fetch(`${API_BASE}/api`, {
|
|
9
|
-
method: 'POST',
|
|
10
|
-
headers: { 'Content-Type': 'application/json' },
|
|
11
|
-
body: JSON.stringify({ action, params })
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function buildApiResponseContext(action, res, contentType) {
|
|
16
|
-
return `${action} (${res.status} ${res.statusText}, content-type: ${contentType || 'unknown'})`;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function formatUnexpectedApiBodySnippet(body, contentType) {
|
|
20
|
-
const raw = typeof body === 'string' ? body.trim() : '';
|
|
21
|
-
if (!raw) {
|
|
22
|
-
return '';
|
|
23
|
-
}
|
|
24
|
-
const normalizedContentType = String(contentType || '').toLowerCase();
|
|
25
|
-
const looksLikeHtml = normalizedContentType.includes('text/html')
|
|
26
|
-
|| /<!doctype\s+html|<html[\s>]|<head[\s>]|<body[\s>]/i.test(raw);
|
|
27
|
-
if (looksLikeHtml) {
|
|
28
|
-
return '';
|
|
29
|
-
}
|
|
30
|
-
const singleLine = raw.replace(/\s+/g, ' ').trim();
|
|
31
|
-
if (!singleLine) {
|
|
32
|
-
return '';
|
|
33
|
-
}
|
|
34
|
-
return singleLine.length > 200
|
|
35
|
-
? `${singleLine.slice(0, 197)}...`
|
|
36
|
-
: singleLine;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function withPayloadTooLargeErrorCode(res, payload) {
|
|
40
|
-
if (res.status !== 413 || (payload && typeof payload === 'object' && payload.errorCode)) {
|
|
41
|
-
return payload;
|
|
42
|
-
}
|
|
43
|
-
return { ...payload, errorCode: 'payload-too-large' };
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function api(action, params = {}) {
|
|
47
|
-
const res = await postApi(action, params);
|
|
48
|
-
const contentType = String(res.headers.get('content-type') || '').toLowerCase();
|
|
49
|
-
if (contentType && !contentType.includes('application/json')) {
|
|
50
|
-
const body = await res.text();
|
|
51
|
-
const errorDetails = buildApiResponseContext(action, res, contentType);
|
|
52
|
-
const bodySnippet = formatUnexpectedApiBodySnippet(body, contentType);
|
|
53
|
-
const bodyDetails = bodySnippet ? `: ${bodySnippet}` : '';
|
|
54
|
-
throw new Error(`Unexpected non-JSON API response for ${errorDetails}${bodyDetails}`);
|
|
55
|
-
}
|
|
56
|
-
try {
|
|
57
|
-
return await res.json();
|
|
58
|
-
} catch (error) {
|
|
59
|
-
const errorDetails = buildApiResponseContext(action, res, contentType);
|
|
60
|
-
throw new Error(`Failed to parse API response for ${errorDetails}: ${error.message}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export async function apiWithMeta(action, params = {}) {
|
|
65
|
-
const res = await postApi(action, params);
|
|
66
|
-
const contentType = String(res.headers.get('content-type') || '').toLowerCase();
|
|
67
|
-
if (contentType.includes('application/json')) {
|
|
68
|
-
try {
|
|
69
|
-
const payload = await res.json();
|
|
70
|
-
if (payload && typeof payload === 'object' && !Array.isArray(payload)) {
|
|
71
|
-
return { ...withPayloadTooLargeErrorCode(res, payload), ok: res.ok, status: res.status };
|
|
72
|
-
}
|
|
73
|
-
return res.status === 413
|
|
74
|
-
? { ok: res.ok, status: res.status, data: payload, errorCode: 'payload-too-large' }
|
|
75
|
-
: { ok: res.ok, status: res.status, data: payload };
|
|
76
|
-
} catch (error) {
|
|
77
|
-
if (res.status === 413) {
|
|
78
|
-
return { ok: false, status: 413, errorCode: 'payload-too-large' };
|
|
79
|
-
}
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
const error = await res.text();
|
|
84
|
-
return {
|
|
85
|
-
ok: res.ok,
|
|
86
|
-
status: res.status,
|
|
87
|
-
error,
|
|
88
|
-
errorCode: res.status === 413 ? 'payload-too-large' : ''
|
|
89
|
-
};
|
|
90
|
-
}
|
|
1
|
+
const browserLocation = typeof location !== 'undefined' ? location : null;
|
|
2
|
+
|
|
3
|
+
export const API_BASE = (browserLocation && browserLocation.origin && browserLocation.origin !== 'null')
|
|
4
|
+
? browserLocation.origin
|
|
5
|
+
: 'http://localhost:3737';
|
|
6
|
+
|
|
7
|
+
async function postApi(action, params = {}) {
|
|
8
|
+
return await fetch(`${API_BASE}/api`, {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
headers: { 'Content-Type': 'application/json' },
|
|
11
|
+
body: JSON.stringify({ action, params })
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function buildApiResponseContext(action, res, contentType) {
|
|
16
|
+
return `${action} (${res.status} ${res.statusText}, content-type: ${contentType || 'unknown'})`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function formatUnexpectedApiBodySnippet(body, contentType) {
|
|
20
|
+
const raw = typeof body === 'string' ? body.trim() : '';
|
|
21
|
+
if (!raw) {
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
const normalizedContentType = String(contentType || '').toLowerCase();
|
|
25
|
+
const looksLikeHtml = normalizedContentType.includes('text/html')
|
|
26
|
+
|| /<!doctype\s+html|<html[\s>]|<head[\s>]|<body[\s>]/i.test(raw);
|
|
27
|
+
if (looksLikeHtml) {
|
|
28
|
+
return '';
|
|
29
|
+
}
|
|
30
|
+
const singleLine = raw.replace(/\s+/g, ' ').trim();
|
|
31
|
+
if (!singleLine) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
return singleLine.length > 200
|
|
35
|
+
? `${singleLine.slice(0, 197)}...`
|
|
36
|
+
: singleLine;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function withPayloadTooLargeErrorCode(res, payload) {
|
|
40
|
+
if (res.status !== 413 || (payload && typeof payload === 'object' && payload.errorCode)) {
|
|
41
|
+
return payload;
|
|
42
|
+
}
|
|
43
|
+
return { ...payload, errorCode: 'payload-too-large' };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function api(action, params = {}) {
|
|
47
|
+
const res = await postApi(action, params);
|
|
48
|
+
const contentType = String(res.headers.get('content-type') || '').toLowerCase();
|
|
49
|
+
if (contentType && !contentType.includes('application/json')) {
|
|
50
|
+
const body = await res.text();
|
|
51
|
+
const errorDetails = buildApiResponseContext(action, res, contentType);
|
|
52
|
+
const bodySnippet = formatUnexpectedApiBodySnippet(body, contentType);
|
|
53
|
+
const bodyDetails = bodySnippet ? `: ${bodySnippet}` : '';
|
|
54
|
+
throw new Error(`Unexpected non-JSON API response for ${errorDetails}${bodyDetails}`);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return await res.json();
|
|
58
|
+
} catch (error) {
|
|
59
|
+
const errorDetails = buildApiResponseContext(action, res, contentType);
|
|
60
|
+
throw new Error(`Failed to parse API response for ${errorDetails}: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function apiWithMeta(action, params = {}) {
|
|
65
|
+
const res = await postApi(action, params);
|
|
66
|
+
const contentType = String(res.headers.get('content-type') || '').toLowerCase();
|
|
67
|
+
if (contentType.includes('application/json')) {
|
|
68
|
+
try {
|
|
69
|
+
const payload = await res.json();
|
|
70
|
+
if (payload && typeof payload === 'object' && !Array.isArray(payload)) {
|
|
71
|
+
return { ...withPayloadTooLargeErrorCode(res, payload), ok: res.ok, status: res.status };
|
|
72
|
+
}
|
|
73
|
+
return res.status === 413
|
|
74
|
+
? { ok: res.ok, status: res.status, data: payload, errorCode: 'payload-too-large' }
|
|
75
|
+
: { ok: res.ok, status: res.status, data: payload };
|
|
76
|
+
} catch (error) {
|
|
77
|
+
if (res.status === 413) {
|
|
78
|
+
return { ok: false, status: 413, errorCode: 'payload-too-large' };
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const error = await res.text();
|
|
84
|
+
return {
|
|
85
|
+
ok: res.ok,
|
|
86
|
+
status: res.status,
|
|
87
|
+
error,
|
|
88
|
+
errorCode: res.status === 413 ? 'payload-too-large' : ''
|
|
89
|
+
};
|
|
90
|
+
}
|
|
@@ -1,225 +1,225 @@
|
|
|
1
|
-
import { getProviderDisplayUrl, checkIsTransformProvider } from './provider-url-display.mjs';
|
|
2
|
-
import { getCodexModelCatalogForProvider, CODEX_PROVIDER_TEMPLATES } from '../logic.codex.mjs';
|
|
3
|
-
export function createDashboardComputed() {
|
|
4
|
-
return {
|
|
5
|
-
agentsDiffHasChanges() {
|
|
6
|
-
if (this.agentsDiffTruncated) {
|
|
7
|
-
return !!this.agentsDiffHasChangesValue;
|
|
8
|
-
}
|
|
9
|
-
const stats = this.agentsDiffStats || {};
|
|
10
|
-
const added = Number(stats.added || 0);
|
|
11
|
-
const removed = Number(stats.removed || 0);
|
|
12
|
-
return added > 0 || removed > 0;
|
|
13
|
-
},
|
|
14
|
-
configTemplateDiffHasChanges() {
|
|
15
|
-
const stats = this.configTemplateDiffStats || {};
|
|
16
|
-
const added = Number(stats.added || 0);
|
|
17
|
-
const removed = Number(stats.removed || 0);
|
|
18
|
-
if (this.configTemplateDiffHasChangesValue !== undefined && this.configTemplateDiffHasChangesValue !== null) {
|
|
19
|
-
return !!this.configTemplateDiffHasChangesValue;
|
|
20
|
-
}
|
|
21
|
-
return added > 0 || removed > 0;
|
|
22
|
-
},
|
|
23
|
-
claudeModelHasList() {
|
|
24
|
-
return this.claudeModelOptions.length > 0;
|
|
25
|
-
},
|
|
26
|
-
claudeModelOptions() {
|
|
27
|
-
const list = Array.isArray(this.claudeModels) ? [...this.claudeModels] : [];
|
|
28
|
-
const current = (this.currentClaudeModel || '').trim();
|
|
29
|
-
if (current && !list.includes(current)) {
|
|
30
|
-
list.unshift(current);
|
|
31
|
-
}
|
|
32
|
-
return list;
|
|
33
|
-
},
|
|
34
|
-
activeProviderModel() {
|
|
35
|
-
return (name) => {
|
|
36
|
-
const target = String(name || '').trim();
|
|
37
|
-
if (!target) return '';
|
|
38
|
-
const dict = this.currentModels && typeof this.currentModels === 'object' ? this.currentModels : {};
|
|
39
|
-
const fromDict = typeof dict[target] === 'string' ? dict[target].trim() : '';
|
|
40
|
-
if (fromDict) return fromDict;
|
|
41
|
-
const activeName = String(this.currentProvider || '').trim();
|
|
42
|
-
if (target === activeName) {
|
|
43
|
-
const top = typeof this.currentModel === 'string' ? this.currentModel.trim() : '';
|
|
44
|
-
if (top && top !== '未设置') return top;
|
|
45
|
-
}
|
|
46
|
-
return '';
|
|
47
|
-
};
|
|
48
|
-
},
|
|
49
|
-
codexModelOptions() {
|
|
50
|
-
const seen = new Set();
|
|
51
|
-
const out = [];
|
|
52
|
-
const push = (val) => {
|
|
53
|
-
const s = typeof val === 'string' ? val.trim() : '';
|
|
54
|
-
if (!s || seen.has(s)) return;
|
|
55
|
-
seen.add(s);
|
|
56
|
-
out.push(s);
|
|
57
|
-
};
|
|
58
|
-
const activeName = String(this.displayCurrentProvider || '').trim();
|
|
59
|
-
const current = typeof this.currentModel === 'string' ? this.currentModel.trim() : '';
|
|
60
|
-
if (current && current !== '未设置') push(current);
|
|
61
|
-
const dict = this.currentModels && typeof this.currentModels === 'object' ? this.currentModels : {};
|
|
62
|
-
if (activeName && typeof dict[activeName] === 'string') push(dict[activeName]);
|
|
63
|
-
const remote = Array.isArray(this.models) ? this.models : [];
|
|
64
|
-
for (const m of remote) push(m);
|
|
65
|
-
const list = Array.isArray(this.providersList) ? this.providersList : [];
|
|
66
|
-
const activeProvider = list.find((p) => p && p.name === activeName);
|
|
67
|
-
if (activeProvider) {
|
|
68
|
-
for (const m of getCodexModelCatalogForProvider(activeProvider)) push(m);
|
|
69
|
-
}
|
|
70
|
-
return out;
|
|
71
|
-
},
|
|
72
|
-
codexModelHasList() {
|
|
73
|
-
return this.codexModelOptions.length > 0;
|
|
74
|
-
},
|
|
75
|
-
codexProviderTemplates() {
|
|
76
|
-
return CODEX_PROVIDER_TEMPLATES;
|
|
77
|
-
},
|
|
78
|
-
displayCurrentProvider() {
|
|
79
|
-
const switching = String(this.providerSwitchDisplayTarget || '').trim();
|
|
80
|
-
if (switching) return switching;
|
|
81
|
-
const current = String(this.currentProvider || '').trim();
|
|
82
|
-
return current;
|
|
83
|
-
},
|
|
84
|
-
displayProvidersList() {
|
|
85
|
-
const list = Array.isArray(this.providersList) ? this.providersList : [];
|
|
86
|
-
return list;
|
|
87
|
-
},
|
|
88
|
-
|
|
89
|
-
displayProviderUrl() {
|
|
90
|
-
return (provider) => getProviderDisplayUrl(provider);
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
isTransformProvider() {
|
|
94
|
-
return (provider) => checkIsTransformProvider(provider);
|
|
95
|
-
},
|
|
96
|
-
installTargetCards() {
|
|
97
|
-
const targets = Array.isArray(this.installStatusTargets) && this.installStatusTargets.length
|
|
98
|
-
? this.installStatusTargets
|
|
99
|
-
: [
|
|
100
|
-
{
|
|
101
|
-
id: 'claude',
|
|
102
|
-
name: 'Claude Code CLI',
|
|
103
|
-
packageName: '@anthropic-ai/claude-code',
|
|
104
|
-
installed: false,
|
|
105
|
-
bin: 'claude',
|
|
106
|
-
version: '',
|
|
107
|
-
commandPath: '',
|
|
108
|
-
error: ''
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
id: 'codebuddy',
|
|
112
|
-
name: 'CodeBuddy Code',
|
|
113
|
-
packageName: '@tencent-ai/codebuddy-code',
|
|
114
|
-
installed: false,
|
|
115
|
-
bin: 'codebuddy',
|
|
116
|
-
version: '',
|
|
117
|
-
commandPath: '',
|
|
118
|
-
error: ''
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
id: 'gemini',
|
|
122
|
-
name: 'Gemini CLI',
|
|
123
|
-
packageName: '@google/gemini-cli',
|
|
124
|
-
installed: false,
|
|
125
|
-
bin: 'gemini',
|
|
126
|
-
version: '',
|
|
127
|
-
commandPath: '',
|
|
128
|
-
error: ''
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
id: 'codex',
|
|
132
|
-
name: 'Codex CLI',
|
|
133
|
-
packageName: '@openai/codex',
|
|
134
|
-
installed: false,
|
|
135
|
-
bin: 'codex',
|
|
136
|
-
version: '',
|
|
137
|
-
commandPath: '',
|
|
138
|
-
error: ''
|
|
139
|
-
}
|
|
140
|
-
];
|
|
141
|
-
const action = this.normalizeInstallAction(this.installCommandAction);
|
|
142
|
-
return targets.map((target) => {
|
|
143
|
-
const id = target && typeof target.id === 'string' ? target.id : '';
|
|
144
|
-
const termuxCommand = id === 'codex'
|
|
145
|
-
? this.getInstallCommand(id, action, 'termux')
|
|
146
|
-
: '';
|
|
147
|
-
return {
|
|
148
|
-
...target,
|
|
149
|
-
command: this.getInstallCommand(id, action),
|
|
150
|
-
termuxCommand
|
|
151
|
-
};
|
|
152
|
-
});
|
|
153
|
-
},
|
|
154
|
-
installRegistryPreview() {
|
|
155
|
-
return this.resolveInstallRegistryUrl(this.installRegistryPreset, this.installRegistryCustom);
|
|
156
|
-
},
|
|
157
|
-
inspectorBusyStatus() {
|
|
158
|
-
const tasks = [];
|
|
159
|
-
if (this.loading) tasks.push(this.t('dashboard.busy.init'));
|
|
160
|
-
if (this.sessionsLoading) tasks.push(this.t('dashboard.busy.sessions'));
|
|
161
|
-
if (this.codexModelsLoading || this.claudeModelsLoading) tasks.push(this.t('dashboard.busy.models'));
|
|
162
|
-
if (this.codexApplying || this.configTemplateApplying || this.openclawApplying) tasks.push(this.t('dashboard.busy.configApply'));
|
|
163
|
-
if (this.agentsSaving) tasks.push(this.t('dashboard.busy.agents'));
|
|
164
|
-
if (this.skillsLoading || this.skillsDeleting || this.skillsScanningImports || this.skillsImporting || this.skillsZipImporting || this.skillsExporting) tasks.push(this.t('dashboard.busy.skills'));
|
|
165
|
-
if (this.taskOrchestration && (this.taskOrchestration.loading || this.taskOrchestration.planning || this.taskOrchestration.running || this.taskOrchestration.queueAdding || this.taskOrchestration.queueStarting || this.taskOrchestration.retrying || this.taskOrchestration.selectedRunLoading)) {
|
|
166
|
-
tasks.push(this.t('dashboard.busy.tasks'));
|
|
167
|
-
}
|
|
168
|
-
return tasks.length ? tasks.join(' / ') : this.t('dashboard.busy.idle');
|
|
169
|
-
},
|
|
170
|
-
inspectorMessageSummary() {
|
|
171
|
-
const value = typeof this.message === 'string' ? this.message.trim() : '';
|
|
172
|
-
return value || this.t('dashboard.message.none');
|
|
173
|
-
},
|
|
174
|
-
inspectorSessionSourceLabel() {
|
|
175
|
-
if (this.sessionFilterSource === 'codex') return this.t('dashboard.sessionSource.codex');
|
|
176
|
-
if (this.sessionFilterSource === 'claude') return this.t('dashboard.sessionSource.claude');
|
|
177
|
-
if (this.sessionFilterSource === 'gemini') return this.t('dashboard.sessionSource.gemini');
|
|
178
|
-
if (this.sessionFilterSource === 'codebuddy') return this.t('dashboard.sessionSource.codebuddy');
|
|
179
|
-
return this.t('dashboard.sessionSource.all');
|
|
180
|
-
},
|
|
181
|
-
inspectorSessionPathLabel() {
|
|
182
|
-
const value = typeof this.sessionPathFilter === 'string' ? this.sessionPathFilter.trim() : '';
|
|
183
|
-
return value || this.t('dashboard.sessionPath.all');
|
|
184
|
-
},
|
|
185
|
-
inspectorSessionQueryLabel() {
|
|
186
|
-
if (!this.isSessionQueryEnabled) return this.t('dashboard.sessionQuery.unsupported');
|
|
187
|
-
const value = typeof this.sessionQuery === 'string' ? this.sessionQuery.trim() : '';
|
|
188
|
-
return value || this.t('dashboard.sessionQuery.unset');
|
|
189
|
-
},
|
|
190
|
-
inspectorHealthStatus() {
|
|
191
|
-
if (this.initError) return this.t('dashboard.healthStatus.failRead');
|
|
192
|
-
if (this.loading) return this.t('dashboard.healthStatus.initializing');
|
|
193
|
-
return this.t('dashboard.healthStatus.ok');
|
|
194
|
-
},
|
|
195
|
-
inspectorHealthTone() {
|
|
196
|
-
if (this.initError) return 'error';
|
|
197
|
-
if (this.loading) return 'warn';
|
|
198
|
-
return 'ok';
|
|
199
|
-
},
|
|
200
|
-
inspectorModelLoadStatus() {
|
|
201
|
-
if (this.codexModelsLoading || this.claudeModelsLoading) {
|
|
202
|
-
return this.t('dashboard.modelStatus.loading');
|
|
203
|
-
}
|
|
204
|
-
if (this.modelsSource === 'error' || this.claudeModelsSource === 'error') {
|
|
205
|
-
return this.t('dashboard.modelStatus.error');
|
|
206
|
-
}
|
|
207
|
-
return this.t('dashboard.modelStatus.ok');
|
|
208
|
-
},
|
|
209
|
-
installTroubleshootingTips() {
|
|
210
|
-
const platform = this.resolveInstallPlatform();
|
|
211
|
-
if (platform === 'win32') {
|
|
212
|
-
return [
|
|
213
|
-
this.t('docs.tip.win.1'),
|
|
214
|
-
this.t('docs.tip.win.2'),
|
|
215
|
-
this.t('docs.tip.win.3')
|
|
216
|
-
];
|
|
217
|
-
}
|
|
218
|
-
return [
|
|
219
|
-
this.t('docs.tip.unix.1'),
|
|
220
|
-
this.t('docs.tip.unix.2'),
|
|
221
|
-
this.t('docs.tip.unix.3')
|
|
222
|
-
];
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
}
|
|
1
|
+
import { getProviderDisplayUrl, checkIsTransformProvider } from './provider-url-display.mjs';
|
|
2
|
+
import { getCodexModelCatalogForProvider, CODEX_PROVIDER_TEMPLATES } from '../logic.codex.mjs';
|
|
3
|
+
export function createDashboardComputed() {
|
|
4
|
+
return {
|
|
5
|
+
agentsDiffHasChanges() {
|
|
6
|
+
if (this.agentsDiffTruncated) {
|
|
7
|
+
return !!this.agentsDiffHasChangesValue;
|
|
8
|
+
}
|
|
9
|
+
const stats = this.agentsDiffStats || {};
|
|
10
|
+
const added = Number(stats.added || 0);
|
|
11
|
+
const removed = Number(stats.removed || 0);
|
|
12
|
+
return added > 0 || removed > 0;
|
|
13
|
+
},
|
|
14
|
+
configTemplateDiffHasChanges() {
|
|
15
|
+
const stats = this.configTemplateDiffStats || {};
|
|
16
|
+
const added = Number(stats.added || 0);
|
|
17
|
+
const removed = Number(stats.removed || 0);
|
|
18
|
+
if (this.configTemplateDiffHasChangesValue !== undefined && this.configTemplateDiffHasChangesValue !== null) {
|
|
19
|
+
return !!this.configTemplateDiffHasChangesValue;
|
|
20
|
+
}
|
|
21
|
+
return added > 0 || removed > 0;
|
|
22
|
+
},
|
|
23
|
+
claudeModelHasList() {
|
|
24
|
+
return this.claudeModelOptions.length > 0;
|
|
25
|
+
},
|
|
26
|
+
claudeModelOptions() {
|
|
27
|
+
const list = Array.isArray(this.claudeModels) ? [...this.claudeModels] : [];
|
|
28
|
+
const current = (this.currentClaudeModel || '').trim();
|
|
29
|
+
if (current && !list.includes(current)) {
|
|
30
|
+
list.unshift(current);
|
|
31
|
+
}
|
|
32
|
+
return list;
|
|
33
|
+
},
|
|
34
|
+
activeProviderModel() {
|
|
35
|
+
return (name) => {
|
|
36
|
+
const target = String(name || '').trim();
|
|
37
|
+
if (!target) return '';
|
|
38
|
+
const dict = this.currentModels && typeof this.currentModels === 'object' ? this.currentModels : {};
|
|
39
|
+
const fromDict = typeof dict[target] === 'string' ? dict[target].trim() : '';
|
|
40
|
+
if (fromDict) return fromDict;
|
|
41
|
+
const activeName = String(this.currentProvider || '').trim();
|
|
42
|
+
if (target === activeName) {
|
|
43
|
+
const top = typeof this.currentModel === 'string' ? this.currentModel.trim() : '';
|
|
44
|
+
if (top && top !== '未设置') return top;
|
|
45
|
+
}
|
|
46
|
+
return '';
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
codexModelOptions() {
|
|
50
|
+
const seen = new Set();
|
|
51
|
+
const out = [];
|
|
52
|
+
const push = (val) => {
|
|
53
|
+
const s = typeof val === 'string' ? val.trim() : '';
|
|
54
|
+
if (!s || seen.has(s)) return;
|
|
55
|
+
seen.add(s);
|
|
56
|
+
out.push(s);
|
|
57
|
+
};
|
|
58
|
+
const activeName = String(this.displayCurrentProvider || '').trim();
|
|
59
|
+
const current = typeof this.currentModel === 'string' ? this.currentModel.trim() : '';
|
|
60
|
+
if (current && current !== '未设置') push(current);
|
|
61
|
+
const dict = this.currentModels && typeof this.currentModels === 'object' ? this.currentModels : {};
|
|
62
|
+
if (activeName && typeof dict[activeName] === 'string') push(dict[activeName]);
|
|
63
|
+
const remote = Array.isArray(this.models) ? this.models : [];
|
|
64
|
+
for (const m of remote) push(m);
|
|
65
|
+
const list = Array.isArray(this.providersList) ? this.providersList : [];
|
|
66
|
+
const activeProvider = list.find((p) => p && p.name === activeName);
|
|
67
|
+
if (activeProvider) {
|
|
68
|
+
for (const m of getCodexModelCatalogForProvider(activeProvider)) push(m);
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
},
|
|
72
|
+
codexModelHasList() {
|
|
73
|
+
return this.codexModelOptions.length > 0;
|
|
74
|
+
},
|
|
75
|
+
codexProviderTemplates() {
|
|
76
|
+
return CODEX_PROVIDER_TEMPLATES;
|
|
77
|
+
},
|
|
78
|
+
displayCurrentProvider() {
|
|
79
|
+
const switching = String(this.providerSwitchDisplayTarget || '').trim();
|
|
80
|
+
if (switching) return switching;
|
|
81
|
+
const current = String(this.currentProvider || '').trim();
|
|
82
|
+
return current;
|
|
83
|
+
},
|
|
84
|
+
displayProvidersList() {
|
|
85
|
+
const list = Array.isArray(this.providersList) ? this.providersList : [];
|
|
86
|
+
return list;
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
displayProviderUrl() {
|
|
90
|
+
return (provider) => getProviderDisplayUrl(provider);
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
isTransformProvider() {
|
|
94
|
+
return (provider) => checkIsTransformProvider(provider);
|
|
95
|
+
},
|
|
96
|
+
installTargetCards() {
|
|
97
|
+
const targets = Array.isArray(this.installStatusTargets) && this.installStatusTargets.length
|
|
98
|
+
? this.installStatusTargets
|
|
99
|
+
: [
|
|
100
|
+
{
|
|
101
|
+
id: 'claude',
|
|
102
|
+
name: 'Claude Code CLI',
|
|
103
|
+
packageName: '@anthropic-ai/claude-code',
|
|
104
|
+
installed: false,
|
|
105
|
+
bin: 'claude',
|
|
106
|
+
version: '',
|
|
107
|
+
commandPath: '',
|
|
108
|
+
error: ''
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: 'codebuddy',
|
|
112
|
+
name: 'CodeBuddy Code',
|
|
113
|
+
packageName: '@tencent-ai/codebuddy-code',
|
|
114
|
+
installed: false,
|
|
115
|
+
bin: 'codebuddy',
|
|
116
|
+
version: '',
|
|
117
|
+
commandPath: '',
|
|
118
|
+
error: ''
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
id: 'gemini',
|
|
122
|
+
name: 'Gemini CLI',
|
|
123
|
+
packageName: '@google/gemini-cli',
|
|
124
|
+
installed: false,
|
|
125
|
+
bin: 'gemini',
|
|
126
|
+
version: '',
|
|
127
|
+
commandPath: '',
|
|
128
|
+
error: ''
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: 'codex',
|
|
132
|
+
name: 'Codex CLI',
|
|
133
|
+
packageName: '@openai/codex',
|
|
134
|
+
installed: false,
|
|
135
|
+
bin: 'codex',
|
|
136
|
+
version: '',
|
|
137
|
+
commandPath: '',
|
|
138
|
+
error: ''
|
|
139
|
+
}
|
|
140
|
+
];
|
|
141
|
+
const action = this.normalizeInstallAction(this.installCommandAction);
|
|
142
|
+
return targets.map((target) => {
|
|
143
|
+
const id = target && typeof target.id === 'string' ? target.id : '';
|
|
144
|
+
const termuxCommand = id === 'codex'
|
|
145
|
+
? this.getInstallCommand(id, action, 'termux')
|
|
146
|
+
: '';
|
|
147
|
+
return {
|
|
148
|
+
...target,
|
|
149
|
+
command: this.getInstallCommand(id, action),
|
|
150
|
+
termuxCommand
|
|
151
|
+
};
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
installRegistryPreview() {
|
|
155
|
+
return this.resolveInstallRegistryUrl(this.installRegistryPreset, this.installRegistryCustom);
|
|
156
|
+
},
|
|
157
|
+
inspectorBusyStatus() {
|
|
158
|
+
const tasks = [];
|
|
159
|
+
if (this.loading) tasks.push(this.t('dashboard.busy.init'));
|
|
160
|
+
if (this.sessionsLoading) tasks.push(this.t('dashboard.busy.sessions'));
|
|
161
|
+
if (this.codexModelsLoading || this.claudeModelsLoading) tasks.push(this.t('dashboard.busy.models'));
|
|
162
|
+
if (this.codexApplying || this.configTemplateApplying || this.openclawApplying) tasks.push(this.t('dashboard.busy.configApply'));
|
|
163
|
+
if (this.agentsSaving) tasks.push(this.t('dashboard.busy.agents'));
|
|
164
|
+
if (this.skillsLoading || this.skillsDeleting || this.skillsScanningImports || this.skillsImporting || this.skillsZipImporting || this.skillsExporting) tasks.push(this.t('dashboard.busy.skills'));
|
|
165
|
+
if (this.taskOrchestration && (this.taskOrchestration.loading || this.taskOrchestration.planning || this.taskOrchestration.running || this.taskOrchestration.queueAdding || this.taskOrchestration.queueStarting || this.taskOrchestration.retrying || this.taskOrchestration.selectedRunLoading)) {
|
|
166
|
+
tasks.push(this.t('dashboard.busy.tasks'));
|
|
167
|
+
}
|
|
168
|
+
return tasks.length ? tasks.join(' / ') : this.t('dashboard.busy.idle');
|
|
169
|
+
},
|
|
170
|
+
inspectorMessageSummary() {
|
|
171
|
+
const value = typeof this.message === 'string' ? this.message.trim() : '';
|
|
172
|
+
return value || this.t('dashboard.message.none');
|
|
173
|
+
},
|
|
174
|
+
inspectorSessionSourceLabel() {
|
|
175
|
+
if (this.sessionFilterSource === 'codex') return this.t('dashboard.sessionSource.codex');
|
|
176
|
+
if (this.sessionFilterSource === 'claude') return this.t('dashboard.sessionSource.claude');
|
|
177
|
+
if (this.sessionFilterSource === 'gemini') return this.t('dashboard.sessionSource.gemini');
|
|
178
|
+
if (this.sessionFilterSource === 'codebuddy') return this.t('dashboard.sessionSource.codebuddy');
|
|
179
|
+
return this.t('dashboard.sessionSource.all');
|
|
180
|
+
},
|
|
181
|
+
inspectorSessionPathLabel() {
|
|
182
|
+
const value = typeof this.sessionPathFilter === 'string' ? this.sessionPathFilter.trim() : '';
|
|
183
|
+
return value || this.t('dashboard.sessionPath.all');
|
|
184
|
+
},
|
|
185
|
+
inspectorSessionQueryLabel() {
|
|
186
|
+
if (!this.isSessionQueryEnabled) return this.t('dashboard.sessionQuery.unsupported');
|
|
187
|
+
const value = typeof this.sessionQuery === 'string' ? this.sessionQuery.trim() : '';
|
|
188
|
+
return value || this.t('dashboard.sessionQuery.unset');
|
|
189
|
+
},
|
|
190
|
+
inspectorHealthStatus() {
|
|
191
|
+
if (this.initError) return this.t('dashboard.healthStatus.failRead');
|
|
192
|
+
if (this.loading) return this.t('dashboard.healthStatus.initializing');
|
|
193
|
+
return this.t('dashboard.healthStatus.ok');
|
|
194
|
+
},
|
|
195
|
+
inspectorHealthTone() {
|
|
196
|
+
if (this.initError) return 'error';
|
|
197
|
+
if (this.loading) return 'warn';
|
|
198
|
+
return 'ok';
|
|
199
|
+
},
|
|
200
|
+
inspectorModelLoadStatus() {
|
|
201
|
+
if (this.codexModelsLoading || this.claudeModelsLoading) {
|
|
202
|
+
return this.t('dashboard.modelStatus.loading');
|
|
203
|
+
}
|
|
204
|
+
if (this.modelsSource === 'error' || this.claudeModelsSource === 'error') {
|
|
205
|
+
return this.t('dashboard.modelStatus.error');
|
|
206
|
+
}
|
|
207
|
+
return this.t('dashboard.modelStatus.ok');
|
|
208
|
+
},
|
|
209
|
+
installTroubleshootingTips() {
|
|
210
|
+
const platform = this.resolveInstallPlatform();
|
|
211
|
+
if (platform === 'win32') {
|
|
212
|
+
return [
|
|
213
|
+
this.t('docs.tip.win.1'),
|
|
214
|
+
this.t('docs.tip.win.2'),
|
|
215
|
+
this.t('docs.tip.win.3')
|
|
216
|
+
];
|
|
217
|
+
}
|
|
218
|
+
return [
|
|
219
|
+
this.t('docs.tip.unix.1'),
|
|
220
|
+
this.t('docs.tip.unix.2'),
|
|
221
|
+
this.t('docs.tip.unix.3')
|
|
222
|
+
];
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|