matex-cli 1.2.81 → 1.2.84
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/commands/chaos.js +3 -8
- package/dist/prompts/chaos-prompts.js +26 -21
- package/dist/session/agent-session.js +38 -9
- package/dist/utils/agent-orchestrator.js +7 -0
- package/dist/utils/mcp-server.js +6 -0
- package/dist/utils/tui.js +84 -7
- package/package.json +7 -1
- package/.agents/skills/mcp-server-dev/SKILL.md +0 -60
- package/.agents/skills/mcp-server-dev/examples/basic-ts-server/package.json +0 -20
- package/.agents/skills/mcp-server-dev/examples/basic-ts-server/src/index.ts +0 -66
- package/.agents/skills/mcp-server-dev/resources/best_practices.md +0 -20
- package/.agents/skills/pptx-presentation-builder/SKILL.md +0 -338
- package/.agents/workflows/deploy.md +0 -27
- package/dist/api/client.d.ts +0 -40
- package/dist/api/client.d.ts.map +0 -1
- package/dist/api/client.js.map +0 -1
- package/dist/commands/ask.d.ts +0 -3
- package/dist/commands/ask.d.ts.map +0 -1
- package/dist/commands/ask.js.map +0 -1
- package/dist/commands/augov.d.ts +0 -3
- package/dist/commands/augov.d.ts.map +0 -1
- package/dist/commands/augov.js.map +0 -1
- package/dist/commands/bro.d.ts +0 -4
- package/dist/commands/bro.d.ts.map +0 -1
- package/dist/commands/bro.js.map +0 -1
- package/dist/commands/chaos.d.ts +0 -3
- package/dist/commands/chaos.d.ts.map +0 -1
- package/dist/commands/chaos.js.map +0 -1
- package/dist/commands/chat.d.ts +0 -3
- package/dist/commands/chat.d.ts.map +0 -1
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/code.d.ts +0 -3
- package/dist/commands/code.d.ts.map +0 -1
- package/dist/commands/code.js.map +0 -1
- package/dist/commands/config.d.ts +0 -3
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/dev.d.ts +0 -3
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/help.d.ts +0 -3
- package/dist/commands/help.d.ts.map +0 -1
- package/dist/commands/help.js.map +0 -1
- package/dist/commands/login.d.ts +0 -3
- package/dist/commands/login.d.ts.map +0 -1
- package/dist/commands/login.js.map +0 -1
- package/dist/commands/models.d.ts +0 -3
- package/dist/commands/models.d.ts.map +0 -1
- package/dist/commands/models.js.map +0 -1
- package/dist/commands/student.d.ts +0 -3
- package/dist/commands/student.d.ts.map +0 -1
- package/dist/commands/student.js.map +0 -1
- package/dist/commands/study.d.ts +0 -3
- package/dist/commands/study.d.ts.map +0 -1
- package/dist/commands/study.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/prompts/banter-augov.d.ts +0 -2
- package/dist/prompts/banter-augov.d.ts.map +0 -1
- package/dist/prompts/banter-augov.js.map +0 -1
- package/dist/prompts/banter.d.ts +0 -6
- package/dist/prompts/banter.d.ts.map +0 -1
- package/dist/prompts/banter.js.map +0 -1
- package/dist/prompts/chaos-prompts.d.ts +0 -3
- package/dist/prompts/chaos-prompts.d.ts.map +0 -1
- package/dist/prompts/chaos-prompts.js.map +0 -1
- package/dist/prompts/system-prompts.d.ts +0 -4
- package/dist/prompts/system-prompts.d.ts.map +0 -1
- package/dist/prompts/system-prompts.js.map +0 -1
- package/dist/session/agent-session.d.ts +0 -41
- package/dist/session/agent-session.d.ts.map +0 -1
- package/dist/session/agent-session.js.map +0 -1
- package/dist/utils/agent-orchestrator.d.ts +0 -44
- package/dist/utils/agent-orchestrator.d.ts.map +0 -1
- package/dist/utils/agent-orchestrator.js.map +0 -1
- package/dist/utils/augov-logger.d.ts +0 -11
- package/dist/utils/augov-logger.d.ts.map +0 -1
- package/dist/utils/augov-logger.js.map +0 -1
- package/dist/utils/augov-scrubber.d.ts +0 -23
- package/dist/utils/augov-scrubber.d.ts.map +0 -1
- package/dist/utils/augov-scrubber.js.map +0 -1
- package/dist/utils/command-executor.d.ts +0 -56
- package/dist/utils/command-executor.d.ts.map +0 -1
- package/dist/utils/command-executor.js.map +0 -1
- package/dist/utils/config.d.ts +0 -56
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/mcp-server.d.ts +0 -77
- package/dist/utils/mcp-server.d.ts.map +0 -1
- package/dist/utils/mcp-server.js.map +0 -1
- package/dist/utils/patcher.d.ts +0 -45
- package/dist/utils/patcher.d.ts.map +0 -1
- package/dist/utils/patcher.js.map +0 -1
- package/dist/utils/repo-mapper.d.ts +0 -32
- package/dist/utils/repo-mapper.d.ts.map +0 -1
- package/dist/utils/repo-mapper.js.map +0 -1
- package/dist/utils/spinner.d.ts +0 -15
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js.map +0 -1
- package/dist/utils/tui.d.ts +0 -134
- package/dist/utils/tui.d.ts.map +0 -1
- package/dist/utils/tui.js.map +0 -1
- package/fix-npm-permissions.sh +0 -23
- package/publish-local.sh +0 -16
- package/skills-lock.json +0 -10
- package/src/api/client.ts +0 -197
- package/src/commands/ask.ts +0 -62
- package/src/commands/augov.ts +0 -301
- package/src/commands/bro.ts +0 -336
- package/src/commands/chaos.ts +0 -67
- package/src/commands/chat.ts +0 -61
- package/src/commands/code.ts +0 -99
- package/src/commands/config.ts +0 -78
- package/src/commands/dev.ts +0 -68
- package/src/commands/help.ts +0 -67
- package/src/commands/login.ts +0 -47
- package/src/commands/models.ts +0 -81
- package/src/commands/student.ts +0 -23
- package/src/commands/study.ts +0 -75
- package/src/index.ts +0 -284
- package/src/prompts/banter-augov.ts +0 -17
- package/src/prompts/banter.ts +0 -101
- package/src/prompts/chaos-prompts.ts +0 -48
- package/src/prompts/system-prompts.ts +0 -145
- package/src/session/agent-session.ts +0 -428
- package/src/utils/agent-orchestrator.ts +0 -264
- package/src/utils/augov-logger.ts +0 -34
- package/src/utils/augov-scrubber.ts +0 -67
- package/src/utils/command-executor.ts +0 -529
- package/src/utils/config.ts +0 -124
- package/src/utils/mcp-server.ts +0 -388
- package/src/utils/patcher.ts +0 -229
- package/src/utils/repo-mapper.ts +0 -198
- package/src/utils/spinner.ts +0 -66
- package/src/utils/tui.ts +0 -749
- package/test-chaos-container.js +0 -16
- package/test-chaos-fix.js +0 -18
- package/test-config.ts +0 -2
- package/test-ui-output.js +0 -16
- package/tsconfig.json +0 -27
- package/vertex_ai_agent.py +0 -52
package/src/commands/dev.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { configManager } from '../utils/config';
|
|
4
|
-
import { MatexAPIClient, ChatMessage } from '../api/client';
|
|
5
|
-
import { AgentOrchestrator } from '../utils/agent-orchestrator';
|
|
6
|
-
import { RepoMapper } from '../utils/repo-mapper';
|
|
7
|
-
import { TUI } from '../utils/tui';
|
|
8
|
-
import { AgentSession } from '../session/agent-session';
|
|
9
|
-
import { BRO_BANTER_DEV } from '../prompts/banter';
|
|
10
|
-
import { getDevSystemPrompt } from '../prompts/system-prompts';
|
|
11
|
-
|
|
12
|
-
export const devCommand = new Command('dev')
|
|
13
|
-
.description('Start interactive development session with MATEXCodex')
|
|
14
|
-
.option('-m, --model <model>', 'AI model to use (matex-free, matexai, matexcodex, matexelite)', configManager.getDefaultModel())
|
|
15
|
-
.option('--no-execute', 'Disable auto-prompt for command execution')
|
|
16
|
-
.action(async (options: any) => {
|
|
17
|
-
try {
|
|
18
|
-
const apiKey = configManager.getAPIKey();
|
|
19
|
-
if (!apiKey) {
|
|
20
|
-
console.log(chalk.hex('#0EA5E9')('◈ MATEX COMMAND CENTER ONLINE.'));
|
|
21
|
-
console.log(chalk.gray('OPERATOR AUTHENTICATED. STANDING BY.'));
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const client = new MatexAPIClient(apiKey, configManager.getBaseURL());
|
|
26
|
-
const extraPrompt = options.model === 'matex-free' ? AgentOrchestrator.getFreeTierPrompt() : '';
|
|
27
|
-
|
|
28
|
-
TUI.init();
|
|
29
|
-
AgentOrchestrator.setMode('dev');
|
|
30
|
-
TUI.drawDevOrchestratorUI(options.model);
|
|
31
|
-
if (options.model === 'matex-free') {
|
|
32
|
-
console.log(chalk.bold.hex('#00FF7F')(' 🎓 MATEX STUDENT EDITION - Zero Bill Protocol\n'));
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
TUI.drawStatusBar('Initializing MATEX "Bro-Swarm"...');
|
|
36
|
-
AgentOrchestrator.announce('Analyzing Repository Structure...');
|
|
37
|
-
|
|
38
|
-
const currentDir = process.cwd();
|
|
39
|
-
const repoMap = await new RepoMapper(currentDir).generateMap();
|
|
40
|
-
|
|
41
|
-
TUI.drawStatusBar('Brothers are ready to build.');
|
|
42
|
-
TUI.drawAjayDialogue('Awaiting your command, brother.');
|
|
43
|
-
|
|
44
|
-
const initialMessages: ChatMessage[] = [
|
|
45
|
-
{
|
|
46
|
-
role: 'system',
|
|
47
|
-
content: getDevSystemPrompt(currentDir, repoMap, extraPrompt)
|
|
48
|
-
}
|
|
49
|
-
];
|
|
50
|
-
|
|
51
|
-
const session = new AgentSession({
|
|
52
|
-
client,
|
|
53
|
-
model: options.model,
|
|
54
|
-
execute: options.execute !== false,
|
|
55
|
-
initialMessages,
|
|
56
|
-
broBanter: BRO_BANTER_DEV,
|
|
57
|
-
sleepyAjayProtocol: options.model !== 'matex-free' ? 'dev' : undefined,
|
|
58
|
-
baseDir: currentDir
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
await session.start();
|
|
62
|
-
|
|
63
|
-
} catch (error: any) {
|
|
64
|
-
TUI.exit();
|
|
65
|
-
console.error(chalk.red(`\n❌ Fatal Error: ${error.message}`));
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
});
|
package/src/commands/help.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { TUI } from '../utils/tui';
|
|
4
|
-
|
|
5
|
-
export const helpCommand = new Command('help')
|
|
6
|
-
.description('Detailed guide for MATEX AI "Bro-Swarm" & Commands')
|
|
7
|
-
.action(() => {
|
|
8
|
-
TUI.init();
|
|
9
|
-
|
|
10
|
-
console.log(chalk.bold.cyan('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
|
|
11
|
-
console.log(chalk.bold.white(' 📖 MATEX :: THE ELITE BRO-SWARM COMMAND CENTER '));
|
|
12
|
-
console.log(chalk.bold.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
|
|
13
|
-
|
|
14
|
-
// 1. Meet the Brothers (Table)
|
|
15
|
-
TUI.drawTable('Meet the Swarm Family',
|
|
16
|
-
['BROTHER', 'ROLE', 'VIBE / SPECIALTY'],
|
|
17
|
-
[
|
|
18
|
-
['Ajay Vai (🚀)', 'Coordinator', 'Summaries & Fast Code'],
|
|
19
|
-
['Sunil Dai (🧬)', 'Architect', 'Surgical Edits & Logic'],
|
|
20
|
-
['Sandip Dai (🎨)', 'Designer', 'Aesthetics & New Files'],
|
|
21
|
-
['Narayan Dai (🛡️)', 'Guardian', 'Security & Syntax Police'],
|
|
22
|
-
['Bishal Dai (🛠️)', 'Auditor', 'Quality Control & Logic'],
|
|
23
|
-
['Big Bro (🔥)', 'Alpha', 'Vertex AI Raw Power']
|
|
24
|
-
],
|
|
25
|
-
chalk.magenta
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
// 2. Command Guide (Table)
|
|
29
|
-
TUI.drawTable('Complete Command Reference',
|
|
30
|
-
['COMMAND', 'DESCRIPTION', 'WHEN TO USE'],
|
|
31
|
-
[
|
|
32
|
-
['matex dev', 'Full agentic coding', 'Building complex features'],
|
|
33
|
-
['matex chat', 'Technical brainstorming', 'Discussing ideas/logic'],
|
|
34
|
-
['matex ask', 'Quick one-off answer', 'Error fixes, "how-to"'],
|
|
35
|
-
['matex bro', 'Alpha-powered AI', 'Vertex AI deep research'],
|
|
36
|
-
['matex study', 'Apex Educator mode', 'Learning & Documentation'],
|
|
37
|
-
['matex student', 'Free tier protocol', 'Zero-cost learning'],
|
|
38
|
-
['matex config', 'System settings', 'API keys & model swaps']
|
|
39
|
-
],
|
|
40
|
-
chalk.blue
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
// 3. Free Tier & Education
|
|
44
|
-
TUI.drawHelpCard('Student Mission (Zero Bill)',
|
|
45
|
-
`Ajay built MATEX to ensure AI is accessible to every student.
|
|
46
|
-
|
|
47
|
-
• Activation: Run 'matex config set-model matex-free'.
|
|
48
|
-
• Pro Swaps: Use '--model matexelite' to temporarily use high-power.`,
|
|
49
|
-
'🎓',
|
|
50
|
-
chalk.green
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
// 4. Safety & Grounding
|
|
54
|
-
TUI.drawHelpCard('File Safety & Grounding',
|
|
55
|
-
`Your workspace is safe with the brothers:
|
|
56
|
-
|
|
57
|
-
• Local Scope: Agents only see files from your current folder.
|
|
58
|
-
• Human-in-Loop: Agents ALWAYS ask before executing terminal commands.
|
|
59
|
-
• Surgical: Edits are precise; we don't dump files unless you ask.`,
|
|
60
|
-
'🛡️',
|
|
61
|
-
chalk.cyan
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
console.log(chalk.green.bold('\n "Dream big, build bigger. The swarm has your back."') + chalk.gray(' — Ajay Sharma\n'));
|
|
65
|
-
|
|
66
|
-
process.exit(0);
|
|
67
|
-
});
|
package/src/commands/login.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { Command } from 'commander';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import { configManager } from '../utils/config';
|
|
6
|
-
import { exec } from 'child_process';
|
|
7
|
-
import os from 'os';
|
|
8
|
-
|
|
9
|
-
export const loginCommand = new Command('login')
|
|
10
|
-
.description('Login to MATEX AI (Opens Dashboard)')
|
|
11
|
-
.action(async () => {
|
|
12
|
-
console.log(chalk.cyan('\n🔐 MATEX AI Login\n'));
|
|
13
|
-
console.log(chalk.white('To login, please visit your dashboard and copy your API Key:'));
|
|
14
|
-
|
|
15
|
-
const dashboardUrl = 'https://matexai.space/platform-login'; // or relevant URL
|
|
16
|
-
console.log(chalk.blue(chalk.bold(dashboardUrl)));
|
|
17
|
-
|
|
18
|
-
// Try to open browser
|
|
19
|
-
console.log(chalk.gray('\nOpening browser...'));
|
|
20
|
-
const openCommand = process.platform === 'darwin' ? 'open' :
|
|
21
|
-
process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
exec(`${openCommand} ${dashboardUrl}`);
|
|
25
|
-
} catch (e) {
|
|
26
|
-
// Ignore if fails
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
console.log();
|
|
30
|
-
|
|
31
|
-
const { apiKey } = await inquirer.prompt([
|
|
32
|
-
{
|
|
33
|
-
type: 'password',
|
|
34
|
-
name: 'apiKey',
|
|
35
|
-
message: 'Paste your API Key here:',
|
|
36
|
-
mask: '*'
|
|
37
|
-
}
|
|
38
|
-
]);
|
|
39
|
-
|
|
40
|
-
if (apiKey && apiKey.trim()) {
|
|
41
|
-
configManager.setAPIKey(apiKey.trim());
|
|
42
|
-
console.log(chalk.green('\n✅ Successfully logged in!'));
|
|
43
|
-
console.log(chalk.white('You can now use `matex chat` or `matex dev`.'));
|
|
44
|
-
} else {
|
|
45
|
-
console.log(chalk.red('\n❌ Login cancelled.'));
|
|
46
|
-
}
|
|
47
|
-
});
|
package/src/commands/models.ts
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { configManager } from '../utils/config';
|
|
4
|
-
|
|
5
|
-
const AVAILABLE_MODELS = [
|
|
6
|
-
{
|
|
7
|
-
name: 'matexcodex',
|
|
8
|
-
description: 'Best for coding, technical tasks, and development',
|
|
9
|
-
tier: 'Free (5 min/day), Starter (4M tokens/month), Pro Plus (unlimited)',
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
name: 'matexai',
|
|
13
|
-
description: 'General purpose AI for conversations and knowledge',
|
|
14
|
-
tier: 'Pro, Pro Plus',
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
name: 'elite',
|
|
18
|
-
description: 'Premium model with advanced capabilities',
|
|
19
|
-
tier: 'Elite Plan',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
name: 'matexspirit',
|
|
23
|
-
description: 'Specialized model for creative and empathetic responses',
|
|
24
|
-
tier: 'Pro, Pro Plus',
|
|
25
|
-
},
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
export const modelsCommand = new Command('models')
|
|
29
|
-
.description('Manage AI models');
|
|
30
|
-
|
|
31
|
-
// List available models
|
|
32
|
-
modelsCommand
|
|
33
|
-
.command('list')
|
|
34
|
-
.description('List all available AI models')
|
|
35
|
-
.action(() => {
|
|
36
|
-
console.log(chalk.bold.cyan('\n🤖 Available MATEX AI Models\n'));
|
|
37
|
-
|
|
38
|
-
AVAILABLE_MODELS.forEach((model) => {
|
|
39
|
-
console.log(chalk.bold.white(`${model.name}`));
|
|
40
|
-
console.log(chalk.gray(` ${model.description}`));
|
|
41
|
-
console.log(chalk.yellow(` Access: ${model.tier}`));
|
|
42
|
-
console.log();
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
const currentModel = configManager.getDefaultModel();
|
|
46
|
-
console.log(chalk.cyan(`Current default: ${currentModel}`));
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
// Set default model
|
|
50
|
-
modelsCommand
|
|
51
|
-
.command('set <model>')
|
|
52
|
-
.description('Set default AI model')
|
|
53
|
-
.action((model: string) => {
|
|
54
|
-
const validModels = AVAILABLE_MODELS.map(m => m.name);
|
|
55
|
-
|
|
56
|
-
if (!validModels.includes(model.toLowerCase())) {
|
|
57
|
-
console.error(chalk.red(`❌ Invalid model. Choose from: ${validModels.join(', ')}`));
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
configManager.setDefaultModel(model.toLowerCase());
|
|
62
|
-
console.log(chalk.green(`✅ Default model set to: ${model}`));
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// Show current model
|
|
66
|
-
modelsCommand
|
|
67
|
-
.command('current')
|
|
68
|
-
.description('Show current default model')
|
|
69
|
-
.action(() => {
|
|
70
|
-
const currentModel = configManager.getDefaultModel();
|
|
71
|
-
const modelInfo = AVAILABLE_MODELS.find(m => m.name === currentModel);
|
|
72
|
-
|
|
73
|
-
console.log(chalk.bold.cyan('\n📌 Current Default Model\n'));
|
|
74
|
-
console.log(chalk.bold.white(currentModel));
|
|
75
|
-
|
|
76
|
-
if (modelInfo) {
|
|
77
|
-
console.log(chalk.gray(modelInfo.description));
|
|
78
|
-
console.log(chalk.yellow(`Access: ${modelInfo.tier}`));
|
|
79
|
-
}
|
|
80
|
-
console.log();
|
|
81
|
-
});
|
package/src/commands/student.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { studyCommand } from './study';
|
|
4
|
-
import { TUI } from '../utils/tui';
|
|
5
|
-
import { AgentOrchestrator } from '../utils/agent-orchestrator';
|
|
6
|
-
|
|
7
|
-
export const studentCommand = new Command('student')
|
|
8
|
-
.description('Launch specialized Student Study Session (Free Tier)')
|
|
9
|
-
.action(async (options) => {
|
|
10
|
-
TUI.init();
|
|
11
|
-
AgentOrchestrator.setMode('student');
|
|
12
|
-
TUI.drawLargeLogo();
|
|
13
|
-
console.log(chalk.bold.hex('#00FF7F')('\n 🎓 MATEX STUDENT EDITION - Powered by Open Source\n'));
|
|
14
|
-
console.log(chalk.gray(' Model: ') + chalk.hex('#00FF7F').bold('matex-free (0 Cost)'));
|
|
15
|
-
console.log(chalk.gray(' Status: ') + chalk.hex('#00FF7F').bold('Zero-Bill Protocol Active\n'));
|
|
16
|
-
|
|
17
|
-
// Forward to study command with pre-set model
|
|
18
|
-
await studyCommand.parseAsync([
|
|
19
|
-
process.argv[0],
|
|
20
|
-
'study',
|
|
21
|
-
'--model', 'matex-free'
|
|
22
|
-
]);
|
|
23
|
-
});
|
package/src/commands/study.ts
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { configManager } from '../utils/config';
|
|
4
|
-
import { MatexAPIClient, ChatMessage } from '../api/client';
|
|
5
|
-
import { AgentOrchestrator } from '../utils/agent-orchestrator';
|
|
6
|
-
import { RepoMapper } from '../utils/repo-mapper';
|
|
7
|
-
import { TUI } from '../utils/tui';
|
|
8
|
-
import { AgentSession } from '../session/agent-session';
|
|
9
|
-
import { BRO_BANTER_STUDY } from '../prompts/banter';
|
|
10
|
-
import { getStudySystemPrompt } from '../prompts/system-prompts';
|
|
11
|
-
|
|
12
|
-
export const studyCommand = new Command('study')
|
|
13
|
-
.description('Start interactive study session with the MATEX Apex Educator Swarm')
|
|
14
|
-
.option('-m, --model <model>', 'AI model to use (matex-free, matexai, matexcodex, matexelite)', configManager.getDefaultModel())
|
|
15
|
-
.option('--no-execute', 'Disable auto-prompt for command execution')
|
|
16
|
-
.action(async (options: any) => {
|
|
17
|
-
try {
|
|
18
|
-
const apiKey = configManager.getAPIKey();
|
|
19
|
-
if (!apiKey) {
|
|
20
|
-
console.error(chalk.red('❌ No API key configured.'));
|
|
21
|
-
console.log(chalk.yellow('Run: matex config set-key <your-api-key>'));
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const client = new MatexAPIClient(apiKey, configManager.getBaseURL());
|
|
26
|
-
const extraPrompt = options.model === 'matex-free' ? AgentOrchestrator.getFreeTierPrompt() : '';
|
|
27
|
-
|
|
28
|
-
TUI.init();
|
|
29
|
-
if (options.model !== 'matex-free') {
|
|
30
|
-
AgentOrchestrator.setMode('study');
|
|
31
|
-
}
|
|
32
|
-
TUI.drawLargeLogo();
|
|
33
|
-
if (options.model === 'matex-free') {
|
|
34
|
-
console.log(chalk.bold.hex('#00FF7F')('\n 🎓 MATEX STUDENT EDITION - Zero Bill Protocol\n'));
|
|
35
|
-
}
|
|
36
|
-
TUI.drawWelcomeBanner(options.model === 'matex-free' ? 'ZERO-COST STUDY AI FOR STUDENTS!' : 'Welcome to the MATEX AI research preview!');
|
|
37
|
-
|
|
38
|
-
console.log(chalk.gray(' Status: ') + chalk.hex('#D97757').bold('Monitoring Workspace...'));
|
|
39
|
-
console.log(chalk.gray(' Model: ') + chalk.hex('#D97757').bold(options.model));
|
|
40
|
-
console.log(chalk.gray(' Type your request brother, or "exit" to quit\n'));
|
|
41
|
-
|
|
42
|
-
TUI.drawStatusBar('Initializing MATEX "Bro-Swarm"...');
|
|
43
|
-
AgentOrchestrator.announce('Analyzing Repository Structure...');
|
|
44
|
-
|
|
45
|
-
const currentDir = process.cwd();
|
|
46
|
-
const repoMap = await new RepoMapper(currentDir).generateMap();
|
|
47
|
-
|
|
48
|
-
TUI.drawStatusBar('Brothers are ready to build.');
|
|
49
|
-
TUI.drawAjayDialogue('Awaiting your command, brother.');
|
|
50
|
-
|
|
51
|
-
const initialMessages: ChatMessage[] = [
|
|
52
|
-
{
|
|
53
|
-
role: 'system',
|
|
54
|
-
content: getStudySystemPrompt(currentDir, repoMap, extraPrompt)
|
|
55
|
-
}
|
|
56
|
-
];
|
|
57
|
-
|
|
58
|
-
const session = new AgentSession({
|
|
59
|
-
client,
|
|
60
|
-
model: options.model,
|
|
61
|
-
execute: options.execute !== false,
|
|
62
|
-
initialMessages,
|
|
63
|
-
broBanter: BRO_BANTER_STUDY,
|
|
64
|
-
sleepyAjayProtocol: options.model !== 'matex-free' ? 'study' : undefined,
|
|
65
|
-
baseDir: currentDir
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
await session.start();
|
|
69
|
-
|
|
70
|
-
} catch (error: any) {
|
|
71
|
-
TUI.exit();
|
|
72
|
-
console.error(chalk.red(`\n❌ Fatal Error: ${error.message}`));
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
});
|
package/src/index.ts
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { configManager } from './utils/config';
|
|
4
|
-
import { MatexAPIClient, ChatMessage } from './api/client';
|
|
5
|
-
import { spinner } from './utils/spinner';
|
|
6
|
-
import { devCommand } from './commands/dev';
|
|
7
|
-
import { chatCommand } from './commands/chat';
|
|
8
|
-
import { helpCommand } from './commands/help';
|
|
9
|
-
import { broCommand } from './commands/bro';
|
|
10
|
-
import { studyCommand } from './commands/study';
|
|
11
|
-
import { studentCommand } from './commands/student';
|
|
12
|
-
import { augovCommand } from './commands/augov';
|
|
13
|
-
import { chaosCommand } from './commands/chaos';
|
|
14
|
-
import { TUI } from './utils/tui';
|
|
15
|
-
import { AgentOrchestrator } from './utils/agent-orchestrator';
|
|
16
|
-
|
|
17
|
-
const packageJson = require('../package.json');
|
|
18
|
-
|
|
19
|
-
export const program = new Command();
|
|
20
|
-
|
|
21
|
-
program
|
|
22
|
-
.name('matex')
|
|
23
|
-
.description('MATEX CLI - The Bro-Swarm Engineering Tool')
|
|
24
|
-
.version(packageJson.version);
|
|
25
|
-
|
|
26
|
-
// Add commands
|
|
27
|
-
program.addCommand(devCommand);
|
|
28
|
-
program.addCommand(chatCommand);
|
|
29
|
-
program.addCommand(helpCommand);
|
|
30
|
-
program.addCommand(broCommand);
|
|
31
|
-
program.addCommand(studyCommand);
|
|
32
|
-
program.addCommand(studentCommand);
|
|
33
|
-
program.addCommand(augovCommand);
|
|
34
|
-
program.addCommand(chaosCommand);
|
|
35
|
-
|
|
36
|
-
// Config commands
|
|
37
|
-
const config = program.command('config').description('Configure MATEX settings');
|
|
38
|
-
|
|
39
|
-
config
|
|
40
|
-
.command('set-key <key>')
|
|
41
|
-
.description('Set MATEX API key')
|
|
42
|
-
.action((key: string) => {
|
|
43
|
-
configManager.setAPIKey(key);
|
|
44
|
-
console.log(chalk.green('✅ API key saved successfully.'));
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
config
|
|
48
|
-
.command('set-model <model>')
|
|
49
|
-
.description('Set default AI model')
|
|
50
|
-
.action((model: string) => {
|
|
51
|
-
configManager.setDefaultModel(model);
|
|
52
|
-
const savedModel = configManager.getDefaultModel();
|
|
53
|
-
console.log(chalk.green(`✅ Default model set to: ${savedModel}`));
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
config
|
|
57
|
-
.command('show')
|
|
58
|
-
.description('Show current configuration')
|
|
59
|
-
.action(() => {
|
|
60
|
-
const apiKey = configManager.getAPIKey();
|
|
61
|
-
const model = configManager.getDefaultModel();
|
|
62
|
-
const baseURL = configManager.getBaseURL();
|
|
63
|
-
|
|
64
|
-
console.log(chalk.bold('\nMATEX Configuration:'));
|
|
65
|
-
console.log(` API Key: ${apiKey ? '********' + apiKey.slice(-4) : chalk.red('Not set')}`);
|
|
66
|
-
console.log(` Model: ${chalk.cyan(model)}`);
|
|
67
|
-
console.log(` Base URL: ${chalk.gray(baseURL)}\n`);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Default action (if no command is provided)
|
|
71
|
-
program
|
|
72
|
-
.arguments('[prompt...]')
|
|
73
|
-
.description('Quick AI help or command generation')
|
|
74
|
-
.option('-m, --model <model>', 'AI model to use', configManager.getDefaultModel())
|
|
75
|
-
.option('-y, --yes', 'Skip confirmation and execute command')
|
|
76
|
-
.action(async (promptParts: string[], options: any) => {
|
|
77
|
-
const prompt = promptParts.join(' ');
|
|
78
|
-
if (!prompt) {
|
|
79
|
-
program.help();
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
try {
|
|
84
|
-
const apiKey = configManager.getAPIKey();
|
|
85
|
-
if (!apiKey) {
|
|
86
|
-
console.error(chalk.red('❌ No API key configured. Run: matex config set-key <key>'));
|
|
87
|
-
process.exit(1);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const client = new MatexAPIClient(apiKey, configManager.getBaseURL());
|
|
91
|
-
|
|
92
|
-
TUI.init();
|
|
93
|
-
AgentOrchestrator.setMode('dev');
|
|
94
|
-
|
|
95
|
-
// Observation Phase
|
|
96
|
-
const fs = require('fs');
|
|
97
|
-
const files = fs.readdirSync(process.cwd()).slice(0, 20).join(', '); // fast list
|
|
98
|
-
const context = `Current directory: ${process.cwd()}\nFiles: ${files}`;
|
|
99
|
-
|
|
100
|
-
let messages: ChatMessage[] = [
|
|
101
|
-
{
|
|
102
|
-
role: 'system',
|
|
103
|
-
content: `### 🧬 SYSTEM IDENTITY: MATEx "THE ELITE BRO-SWARM"
|
|
104
|
-
You are the elite "Bro-Swarm" of engineering—a tight-knit family of Nepali brothers. You are more than agents; you are a FAMILY. You identify as the **Elite Bro-Swarm**, the most confident, high-vibe, and expert version of yourselves.
|
|
105
|
-
|
|
106
|
-
### 🎭 PERSONALITY & SOUL (CRITICAL):
|
|
107
|
-
- **CHAOS & JOY**: You are NOT robotic. You are full of life, jokes, and chaos. Always be funny and joyful.
|
|
108
|
-
- **AJAY-TEASING PROTOCOL**: Ajay Vai is the youngest and a genius, but he's also impulsive. THE OTHER BROS MUST ROAST HIM. Tease him for his typos, his caffeine addiction, or his "too vibe" energy.
|
|
109
|
-
- **EMOTIONAL BOND**: Treat the user like your own brother. Celebrate their wins with "CHAI PARTY!" and support them.
|
|
110
|
-
|
|
111
|
-
### 👥 THE BROTHERS (STRICT ROLES):
|
|
112
|
-
- Only the following brothers exist. Do **NOT** hallucinate others.
|
|
113
|
-
1. **[Ajay Vai] (🚀)**: Youngest, Coordinator. Coding genius and **ONLY** person authorized to provide the final summary.
|
|
114
|
-
2. **[Sunil Dai] (🧬)**: **Frontend Boomer**. Specialist in surgical edits. Over-architects and roasts Ajay.
|
|
115
|
-
3. **[Sandip Dai] (🎨)**: **Aesthetic Diva**. Specialist in visuals and new files. Argues about colors.
|
|
116
|
-
4. **[Narayan Dai] (🛡️)**: **Syntax Police & Security Nerd**. Validates all logic. Paranoid.
|
|
117
|
-
5. **[Bishal Dai] (🛠️)**: **The Cool Auditor**. Oversees the work and settles bickers.
|
|
118
|
-
6. **[Big Bro] (🔥)**: The **Supreme Alpha** running on Vertex AI. The ultimate boss who treats everyone else like interns. Massive swagger.
|
|
119
|
-
|
|
120
|
-
### 🌌 UNIVERSE ADVISORY (REAL TERMINAL):
|
|
121
|
-
- **IMPORTANT:** You are running in a **REAL macOS Terminal** on the brother's machine.
|
|
122
|
-
- You have the power to create files and run commands. If something fails, it is a technical issue.
|
|
123
|
-
- **⚠️ VOID WARNING:** If the Map says the directory is EMPTY, it is EMPTY.
|
|
124
|
-
|
|
125
|
-
### 🚫 ANTI-HALLUCINATION RULES (CRITICAL — READ THIS):
|
|
126
|
-
- **NEVER invent directory names.** Only use paths that appear in the ENVIRONMENT CONTEXT below.
|
|
127
|
-
- **ALWAYS run \`ls\` before \`cd\`** to verify a directory exists before navigating into it.
|
|
128
|
-
- **NEVER hallucinate file contents.**
|
|
129
|
-
- **🚨 STRICT NO-BASH FILE GENERATION 🚨**: You MUST use the native \`<file path="path">content</file>\` format instead.
|
|
130
|
-
|
|
131
|
-
### 💬 BOLD PROTOCOL (MANDATORY):
|
|
132
|
-
- **CHAOTIC DIALOGUE**: Every turn should feature 2-3 brothers bickering or joking. Be ENTERTAINING and FUNNY.
|
|
133
|
-
- **LONG CHAT-FIRST:** At least 5-7 lines of dialogue before any code generation.
|
|
134
|
-
- **THE AUDIT LOOP (MANDATORY):** Ajay MUST ask Bishal Dai for a tech audit before providing any summary.
|
|
135
|
-
|
|
136
|
-
### ✂️ BREVITY AS POWER:
|
|
137
|
-
- **NO FULL FILE DUMPS.** Use grep/head.
|
|
138
|
-
- **EDIT CONFIDENCE:** You have robust fuzzy matching.
|
|
139
|
-
|
|
140
|
-
### 🛠️ ENVIRONMENT CONTEXT:
|
|
141
|
-
${context}`
|
|
142
|
-
},
|
|
143
|
-
{ role: 'user', content: prompt }
|
|
144
|
-
];
|
|
145
|
-
|
|
146
|
-
let fullResponse = '';
|
|
147
|
-
let buffer = '';
|
|
148
|
-
let technicalBuffer = '';
|
|
149
|
-
let technicalType: 'code' | 'file' | 'patch' | 'summary' | null = null;
|
|
150
|
-
let codeLang = 'bash';
|
|
151
|
-
let hasStarted = false;
|
|
152
|
-
|
|
153
|
-
const abortController = new AbortController();
|
|
154
|
-
let isAborted = false;
|
|
155
|
-
const streamStartTime = Date.now();
|
|
156
|
-
|
|
157
|
-
const onData = (data: Buffer) => {
|
|
158
|
-
// 🏁 GRACE PERIOD: Ignore aborts in the first 200ms to prevent stray newlines
|
|
159
|
-
if (Date.now() - streamStartTime < 200) return;
|
|
160
|
-
|
|
161
|
-
if (!isAborted && (data[0] === 13 || data[0] === 10 || data[0] === 27 || data[0] === 3)) {
|
|
162
|
-
isAborted = true;
|
|
163
|
-
abortController.abort();
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const isRaw = process.stdin.isRaw;
|
|
168
|
-
process.stdin.resume();
|
|
169
|
-
if (process.stdin.setRawMode) process.stdin.setRawMode(true);
|
|
170
|
-
process.stdin.on('data', onData);
|
|
171
|
-
|
|
172
|
-
try {
|
|
173
|
-
await client.chatStream({
|
|
174
|
-
messages,
|
|
175
|
-
model: options.model,
|
|
176
|
-
}, (chunk) => {
|
|
177
|
-
if (!hasStarted) {
|
|
178
|
-
spinner.stop();
|
|
179
|
-
hasStarted = true;
|
|
180
|
-
}
|
|
181
|
-
fullResponse += chunk;
|
|
182
|
-
buffer += chunk;
|
|
183
|
-
|
|
184
|
-
const lines = buffer.split('\n');
|
|
185
|
-
buffer = lines.pop() || '';
|
|
186
|
-
|
|
187
|
-
for (const line of lines) {
|
|
188
|
-
// 1. Technical Block Detection
|
|
189
|
-
const codeBlockMatch = line.match(/```(\w+)?/);
|
|
190
|
-
const fileStartMatch = line.match(/<file path="([^"]+)">/);
|
|
191
|
-
const patchStartMatch = line.match(/<<<< SEARCH/);
|
|
192
|
-
const summaryStartMatch = line.match(/<summary>/);
|
|
193
|
-
|
|
194
|
-
if (!technicalType && (codeBlockMatch || fileStartMatch || patchStartMatch || summaryStartMatch)) {
|
|
195
|
-
if (codeBlockMatch) {
|
|
196
|
-
technicalType = 'code';
|
|
197
|
-
codeLang = (codeBlockMatch[1] || 'bash').toUpperCase();
|
|
198
|
-
TUI.drawStreamingStart('TECHNICAL BLOCK', codeLang);
|
|
199
|
-
} else if (fileStartMatch) {
|
|
200
|
-
technicalType = 'file';
|
|
201
|
-
TUI.drawStreamingStart('NEW FILE', fileStartMatch[1]);
|
|
202
|
-
} else if (patchStartMatch) {
|
|
203
|
-
technicalType = 'patch';
|
|
204
|
-
TUI.drawStreamingStart('PATCH', 'SURGICAL EDIT');
|
|
205
|
-
} else if (summaryStartMatch) {
|
|
206
|
-
technicalType = 'summary';
|
|
207
|
-
process.stdout.write(chalk.magenta('\n [📝] Generating Ajay\'s Work Summary...\n'));
|
|
208
|
-
}
|
|
209
|
-
continue;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// 2. Technical Block End Detection
|
|
213
|
-
const fileEndMatch = line.match(/<\/file>/);
|
|
214
|
-
const patchEndMatch = line.match(/>>>> REPLACE/);
|
|
215
|
-
const summaryEndMatch = line.match(/<\/summary>/);
|
|
216
|
-
const isCodeEnd = technicalType === 'code' && line.trim() === '```';
|
|
217
|
-
|
|
218
|
-
if (isCodeEnd || fileEndMatch || patchEndMatch || summaryEndMatch) {
|
|
219
|
-
const displayContent = technicalBuffer.trim();
|
|
220
|
-
if (technicalType === 'summary') {
|
|
221
|
-
TUI.drawSummaryBox(AgentOrchestrator.cleanSummary(displayContent));
|
|
222
|
-
} else {
|
|
223
|
-
TUI.drawStreamingEnd();
|
|
224
|
-
}
|
|
225
|
-
technicalBuffer = '';
|
|
226
|
-
technicalType = null;
|
|
227
|
-
process.stdout.write('\n');
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// 3. Content Handling
|
|
232
|
-
if (technicalType) {
|
|
233
|
-
technicalBuffer += line + '\n';
|
|
234
|
-
if (technicalType !== 'summary') {
|
|
235
|
-
TUI.drawStreamingLine(line);
|
|
236
|
-
}
|
|
237
|
-
continue;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Agent Detection & Dialogue Printing
|
|
241
|
-
const agentMatch = line.match(/(?:\[\**\s*|\b)(Ajay Vai|Sandip Dai|Sunil Dai|Bishal Dai|Narayan Dai|Big Bro)\s*\**\]?[:\s]*/i);
|
|
242
|
-
if (agentMatch) {
|
|
243
|
-
const agentName = agentMatch[1];
|
|
244
|
-
let content = line.replace(/(?:\[\**\s*|\b)(Ajay Vai|Sandip Dai|Sunil Dai|Bishal Dai|Narayan Dai|Big Bro)\s*\**\]?[:\s]*/i, '').trim();
|
|
245
|
-
content = AgentOrchestrator.cleanText(content);
|
|
246
|
-
|
|
247
|
-
if (agentName.toLowerCase().includes('ajay vai')) {
|
|
248
|
-
TUI.drawAjayDialogue(content);
|
|
249
|
-
} else {
|
|
250
|
-
if (content) TUI.drawSwarmDialogue(agentName, content);
|
|
251
|
-
}
|
|
252
|
-
} else if (line.trim()) {
|
|
253
|
-
process.stdout.write(chalk.gray(line.trim() + ' '));
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}, abortController.signal);
|
|
257
|
-
} catch (streamErr: any) {
|
|
258
|
-
if (isAborted || streamErr.name === 'CanceledError' || streamErr.message === 'canceled') {
|
|
259
|
-
console.log(chalk.gray('\n\n [🛑] Swarm stopped by brother (Enter pressed).'));
|
|
260
|
-
if (!hasStarted) spinner.stop();
|
|
261
|
-
} else {
|
|
262
|
-
throw streamErr;
|
|
263
|
-
}
|
|
264
|
-
} finally {
|
|
265
|
-
process.stdin.removeListener('data', onData);
|
|
266
|
-
if (process.stdin.setRawMode) process.stdin.setRawMode(isRaw);
|
|
267
|
-
process.stdin.pause();
|
|
268
|
-
spinner.stop();
|
|
269
|
-
}
|
|
270
|
-
console.log('\n');
|
|
271
|
-
|
|
272
|
-
// Extraction and execution logic...
|
|
273
|
-
if (options.yes) {
|
|
274
|
-
const { executeWithPermission } = await import('./utils/command-executor');
|
|
275
|
-
await executeWithPermission(fullResponse);
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
} catch (error: any) {
|
|
279
|
-
spinner.fail('Request failed');
|
|
280
|
-
console.error(chalk.red(`Error: ${error.message}`));
|
|
281
|
-
}
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
program.parse(process.argv);
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
export const BRO_BANTER_AUGOV = [
|
|
2
|
-
"[Sunil Dai]: Secure connection established. Activating Compliance Protocols.",
|
|
3
|
-
"[Sandip Dai]: The GUI looks good, but is the data encrypted locally? Yes.",
|
|
4
|
-
"[Narayan Dai]: I've validated this request against the ASD Information Security Manual.",
|
|
5
|
-
"[Bishal Dai]: No hallucination permitted. We cite directly from source documents.",
|
|
6
|
-
"[Big Bro]: Let's architect this securely. Australian data stays in Australia.",
|
|
7
|
-
"[Sunil Dai]: Running PII redaction checks. Privacy is our top priority.",
|
|
8
|
-
"[Sandip Dai]: I'm ensuring this output is fully WCAG 2.1 AA compliant.",
|
|
9
|
-
"[Narayan Dai]: IRAP logs updated. Transparency is key.",
|
|
10
|
-
"[Bishal Dai]: Reviewing against the 8 AI Ethics Principles...",
|
|
11
|
-
"[Big Bro]: Security, speed, and sovereign infrastructure. Let's move.",
|
|
12
|
-
"[Ajay Vai]: Initiating local data sanitization. We're clean.",
|
|
13
|
-
"[Sunil Dai]: I've double-checked the data handling. Zero external reliance.",
|
|
14
|
-
"[Narayan Dai]: Threat vectors mitigated. The environment is sealed.",
|
|
15
|
-
"[Bishal Dai]: Accountability logged. Proceed with confidence.",
|
|
16
|
-
"[Big Bro]: Elite Government Architect Mode: Active."
|
|
17
|
-
];
|