mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-07 16:09:43 +02:00
Merge pull request #454
fix(run): make the Instance count stepper work for every non-Claude mode
This commit is contained in:
+134
-96
@@ -1257,6 +1257,44 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/** Reads the "Instance count" stepper, clamped like runClaude()'s own copy. */
|
||||||
|
_readTabCount() {
|
||||||
|
return Math.min(20, Math.max(1, parseInt(document.getElementById('tabCount').value) || 1));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Launches `tabCount` quick-start sessions of one non-Claude mode
|
||||||
|
* sequentially, selecting the first once all are up. Shared by every
|
||||||
|
* run*() below except runClaude() (which has its own remote/docker
|
||||||
|
* branching and parallel-create path) — before this helper existed, each
|
||||||
|
* of them ignored the "Instance count" stepper entirely and always
|
||||||
|
* launched exactly one session, with no error, just the wrong count.
|
||||||
|
* `buildBody(sessionName)` returns that mode's quick-start POST body.
|
||||||
|
*/
|
||||||
|
async _launchQuickStartInstances(caseName, tabCount, label, buildBody, ownsLaunchTerminal) {
|
||||||
|
const startNumber = this._nextCaseSessionStartNumber(caseName);
|
||||||
|
let firstSessionId = null;
|
||||||
|
if (tabCount > 1) {
|
||||||
|
this._appendSessionLaunchStatus(ownsLaunchTerminal, `Starting ${tabCount} ${label} session(s) in ${caseName}...`);
|
||||||
|
}
|
||||||
|
for (let i = 0; i < tabCount; i++) {
|
||||||
|
const sessionName = `w${startNumber + i}-${caseName}`;
|
||||||
|
const res = await fetch('/api/quick-start', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify(buildBody(sessionName)),
|
||||||
|
});
|
||||||
|
const data = await res.json();
|
||||||
|
if (!data.success) throw new Error(data.error || `Failed to start ${label}`);
|
||||||
|
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
||||||
|
if (!firstSessionId) firstSessionId = data.data.sessionId;
|
||||||
|
}
|
||||||
|
if (tabCount > 1) {
|
||||||
|
this._appendSessionLaunchStatus(ownsLaunchTerminal, `All ${tabCount} ${label} session(s) ready`);
|
||||||
|
}
|
||||||
|
return firstSessionId;
|
||||||
|
},
|
||||||
|
|
||||||
async runOpenCode() {
|
async runOpenCode() {
|
||||||
const caseName = document.getElementById('quickStartCase').value || 'testcase';
|
const caseName = document.getElementById('quickStartCase').value || 'testcase';
|
||||||
// Remote cases run the CLI on the REMOTE host — the local /api/opencode/status
|
// Remote cases run the CLI on the REMOTE host — the local /api/opencode/status
|
||||||
@@ -1285,27 +1323,27 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
// Quick-start with opencode mode (auto-allow tools by default).
|
// Quick-start with opencode mode (auto-allow tools by default).
|
||||||
// No `effort` field — it's Claude-specific (OpenCode has no /effort).
|
// No `effort` field — it's Claude-specific (OpenCode has no /effort).
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'OpenCode',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'opencode',
|
mode: 'opencode',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
openCodeConfig: { autoAllowTools: true },
|
openCodeConfig: { autoAllowTools: true },
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start OpenCode');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
// Switch to the new session (don't pre-set activeSessionId — selectSession
|
// Switch to the new session (don't pre-set activeSessionId — selectSession
|
||||||
// early-returns when IDs match, skipping buffer load and sendResize)
|
// early-returns when IDs match, skipping buffer load and sendResize)
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1339,13 +1377,15 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
|
|
||||||
const globalSettings = this.loadAppSettingsFromStorage();
|
const globalSettings = this.loadAppSettingsFromStorage();
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), globalSettings);
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), globalSettings);
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'Codex',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'codex',
|
mode: 'codex',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
codexConfig: {
|
codexConfig: {
|
||||||
dangerouslyBypassApprovals: globalSettings.codexDangerouslyBypassApprovals ?? false,
|
dangerouslyBypassApprovals: globalSettings.codexDangerouslyBypassApprovals ?? false,
|
||||||
@@ -1354,16 +1394,14 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
},
|
},
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start Codex');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
// Switch to the new session (don't pre-set activeSessionId — selectSession
|
// Switch to the new session (don't pre-set activeSessionId — selectSession
|
||||||
// early-returns when IDs match, skipping buffer load and sendResize)
|
// early-returns when IDs match, skipping buffer load and sendResize)
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1396,25 +1434,25 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'Gemini',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'gemini',
|
mode: 'gemini',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
geminiConfig: { approvalMode: 'yolo' },
|
geminiConfig: { approvalMode: 'yolo' },
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start Gemini');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1447,25 +1485,25 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'Antigravity',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'antigravity',
|
mode: 'antigravity',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
antigravityConfig: { dangerouslySkipPermissions: true },
|
antigravityConfig: { dangerouslySkipPermissions: true },
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start Antigravity');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1507,22 +1545,22 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'Pi',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'pi',
|
mode: 'pi',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote || Object.keys(envOverrides).length === 0 ? {} : { envOverrides }),
|
...(isRemote || Object.keys(envOverrides).length === 0 ? {} : { envOverrides }),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start Pi');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1555,24 +1593,24 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'OMP',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'omp',
|
mode: 'omp',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start OMP');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1614,25 +1652,25 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'Grok',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'grok',
|
mode: 'grok',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
grokConfig: { alwaysApprove: true },
|
grokConfig: { alwaysApprove: true },
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start Grok');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
@@ -1692,25 +1730,25 @@ Object.assign(CodemanApp.prototype, {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
const envOverrides = this.buildEnvOverrides(this.getCaseSettings(caseName), this.loadAppSettingsFromStorage());
|
||||||
const res = await fetch('/api/quick-start', {
|
const tabCount = this._readTabCount();
|
||||||
method: 'POST',
|
const firstSessionId = await this._launchQuickStartInstances(
|
||||||
headers: { 'Content-Type': 'application/json' },
|
caseName,
|
||||||
body: JSON.stringify({
|
tabCount,
|
||||||
|
'DeepSeek',
|
||||||
|
(sessionName) => ({
|
||||||
caseName,
|
caseName,
|
||||||
mode: 'deepseek',
|
mode: 'deepseek',
|
||||||
sessionName: `w${this._nextCaseSessionStartNumber(caseName)}-${caseName}`,
|
sessionName,
|
||||||
...(isRemote ? {} : {
|
...(isRemote ? {} : {
|
||||||
deepSeekConfig: { permissionMode: 'danger-full-access' },
|
deepSeekConfig: { permissionMode: 'danger-full-access' },
|
||||||
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
...(Object.keys(envOverrides).length > 0 ? { envOverrides } : {}),
|
||||||
}),
|
}),
|
||||||
})
|
}),
|
||||||
});
|
ownsLaunchTerminal
|
||||||
const data = await res.json();
|
);
|
||||||
if (!data.success) throw new Error(data.error || 'Failed to start DeepSeek');
|
|
||||||
await this._ensureCreatedSessionVisible(data.data.sessionId, data.data.session);
|
|
||||||
|
|
||||||
if (data.data.sessionId) {
|
if (firstSessionId) {
|
||||||
await this.selectSession(data.data.sessionId);
|
await this.selectSession(firstSessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.terminal.focus();
|
this.terminal.focus();
|
||||||
|
|||||||
@@ -511,6 +511,7 @@ describe('Codex quick start settings', () => {
|
|||||||
it('passes global Codex settings into quick-start config for new sessions', async () => {
|
it('passes global Codex settings into quick-start config for new sessions', async () => {
|
||||||
const elements: Record<string, any> = {
|
const elements: Record<string, any> = {
|
||||||
quickStartCase: { value: 'codex-case' },
|
quickStartCase: { value: 'codex-case' },
|
||||||
|
tabCount: { value: '1' },
|
||||||
};
|
};
|
||||||
const requests: Array<{ url: string; body?: any }> = [];
|
const requests: Array<{ url: string; body?: any }> = [];
|
||||||
const CodemanApp = function CodemanApp(this: any) {};
|
const CodemanApp = function CodemanApp(this: any) {};
|
||||||
@@ -837,6 +838,7 @@ describe('Gemini quick start', () => {
|
|||||||
it('drives runGemini() through the {success,data} envelope and selects the new session', async () => {
|
it('drives runGemini() through the {success,data} envelope and selects the new session', async () => {
|
||||||
const elements: Record<string, any> = {
|
const elements: Record<string, any> = {
|
||||||
quickStartCase: { value: 'gemini-case' },
|
quickStartCase: { value: 'gemini-case' },
|
||||||
|
tabCount: { value: '1' },
|
||||||
};
|
};
|
||||||
const requests: Array<{ url: string; body?: any }> = [];
|
const requests: Array<{ url: string; body?: any }> = [];
|
||||||
const CodemanApp = function CodemanApp(this: any) {};
|
const CodemanApp = function CodemanApp(this: any) {};
|
||||||
@@ -891,6 +893,7 @@ describe('Antigravity quick start', () => {
|
|||||||
it('drives runAntigravity() through the {success,data} envelope and selects the new session', async () => {
|
it('drives runAntigravity() through the {success,data} envelope and selects the new session', async () => {
|
||||||
const elements: Record<string, any> = {
|
const elements: Record<string, any> = {
|
||||||
quickStartCase: { value: 'ag-case' },
|
quickStartCase: { value: 'ag-case' },
|
||||||
|
tabCount: { value: '1' },
|
||||||
};
|
};
|
||||||
const requests: Array<{ url: string; body?: any }> = [];
|
const requests: Array<{ url: string; body?: any }> = [];
|
||||||
const CodemanApp = function CodemanApp(this: any) {};
|
const CodemanApp = function CodemanApp(this: any) {};
|
||||||
@@ -947,6 +950,7 @@ describe('Pi quick start', () => {
|
|||||||
it('drives runPi() through the {success,data} envelope and sends no piConfig', async () => {
|
it('drives runPi() through the {success,data} envelope and sends no piConfig', async () => {
|
||||||
const elements: Record<string, any> = {
|
const elements: Record<string, any> = {
|
||||||
quickStartCase: { value: 'pi-case' },
|
quickStartCase: { value: 'pi-case' },
|
||||||
|
tabCount: { value: '1' },
|
||||||
};
|
};
|
||||||
const requests: Array<{ url: string; body?: any }> = [];
|
const requests: Array<{ url: string; body?: any }> = [];
|
||||||
const CodemanApp = function CodemanApp(this: any) {};
|
const CodemanApp = function CodemanApp(this: any) {};
|
||||||
@@ -1035,6 +1039,7 @@ describe('Grok quick start', () => {
|
|||||||
it('drives runGrok() through the {success,data} envelope and sends alwaysApprove', async () => {
|
it('drives runGrok() through the {success,data} envelope and sends alwaysApprove', async () => {
|
||||||
const elements: Record<string, any> = {
|
const elements: Record<string, any> = {
|
||||||
quickStartCase: { value: 'grok-case' },
|
quickStartCase: { value: 'grok-case' },
|
||||||
|
tabCount: { value: '1' },
|
||||||
};
|
};
|
||||||
const requests: Array<{ url: string; body?: any }> = [];
|
const requests: Array<{ url: string; body?: any }> = [];
|
||||||
const CodemanApp = function CodemanApp(this: any) {};
|
const CodemanApp = function CodemanApp(this: any) {};
|
||||||
|
|||||||
Reference in New Issue
Block a user