memoryblock 0.0.1 → 0.1.1-beta
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/LICENSE +21 -0
- package/README.md +221 -0
- package/bin/mblk.js +6 -0
- package/dist/bin/mblk.d.ts +3 -0
- package/dist/bin/mblk.d.ts.map +1 -0
- package/dist/bin/mblk.js +339 -0
- package/dist/bin/mblk.js.map +1 -0
- package/dist/cli/commands/create.d.ts +2 -0
- package/dist/cli/commands/create.d.ts.map +1 -0
- package/dist/cli/commands/create.js +48 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +5 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +147 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +209 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/permissions.d.ts +13 -0
- package/dist/cli/commands/permissions.d.ts.map +1 -0
- package/dist/cli/commands/permissions.js +60 -0
- package/dist/cli/commands/permissions.js.map +1 -0
- package/dist/cli/commands/plugin-settings.d.ts +6 -0
- package/dist/cli/commands/plugin-settings.d.ts.map +1 -0
- package/dist/cli/commands/plugin-settings.js +118 -0
- package/dist/cli/commands/plugin-settings.js.map +1 -0
- package/dist/cli/commands/plugins.d.ts +3 -0
- package/dist/cli/commands/plugins.d.ts.map +1 -0
- package/dist/cli/commands/plugins.js +83 -0
- package/dist/cli/commands/plugins.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +8 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +96 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/server.d.ts +25 -0
- package/dist/cli/commands/server.d.ts.map +1 -0
- package/dist/cli/commands/server.js +295 -0
- package/dist/cli/commands/server.js.map +1 -0
- package/dist/cli/commands/service.d.ts +18 -0
- package/dist/cli/commands/service.d.ts.map +1 -0
- package/dist/cli/commands/service.js +309 -0
- package/dist/cli/commands/service.js.map +1 -0
- package/dist/cli/commands/start.d.ts +11 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +801 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +78 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +9 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +83 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/web.d.ts +5 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +63 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/constants.d.ts +38 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +80 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/logger.d.ts +12 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +40 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/engine/agent.d.ts +15 -0
- package/dist/engine/agent.d.ts.map +1 -0
- package/dist/engine/agent.js +19 -0
- package/dist/engine/agent.js.map +1 -0
- package/dist/engine/conversation-log.d.ts +35 -0
- package/dist/engine/conversation-log.d.ts.map +1 -0
- package/dist/engine/conversation-log.js +83 -0
- package/dist/engine/conversation-log.js.map +1 -0
- package/dist/engine/cost-tracker.d.ts +52 -0
- package/dist/engine/cost-tracker.d.ts.map +1 -0
- package/dist/engine/cost-tracker.js +110 -0
- package/dist/engine/cost-tracker.js.map +1 -0
- package/dist/engine/gatekeeper.d.ts +20 -0
- package/dist/engine/gatekeeper.d.ts.map +1 -0
- package/dist/engine/gatekeeper.js +43 -0
- package/dist/engine/gatekeeper.js.map +1 -0
- package/dist/engine/memory.d.ts +28 -0
- package/dist/engine/memory.d.ts.map +1 -0
- package/dist/engine/memory.js +69 -0
- package/dist/engine/memory.js.map +1 -0
- package/dist/engine/monitor.d.ts +81 -0
- package/dist/engine/monitor.d.ts.map +1 -0
- package/dist/engine/monitor.js +610 -0
- package/dist/engine/monitor.js.map +1 -0
- package/dist/engine/prompts.d.ts +31 -0
- package/dist/engine/prompts.d.ts.map +1 -0
- package/dist/engine/prompts.js +93 -0
- package/dist/engine/prompts.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +544 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +111 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.d.ts +188 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config.d.ts +24 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +86 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fs.d.ts +18 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +65 -0
- package/dist/utils/fs.js.map +1 -0
- package/package.json +78 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/delete.ts"],"names":[],"mappings":"AA6DA,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmElG;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCvE"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { promises as fsp } from 'node:fs';
|
|
3
|
+
import * as p from '@clack/prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { loadGlobalConfig, resolveBlocksDir, isInitialized } from '../../utils/config.js';
|
|
6
|
+
import { ensureDir, pathExists } from '../../utils/fs.js';
|
|
7
|
+
import { log } from '../logger.js';
|
|
8
|
+
import { t } from '@memoryblock/locale';
|
|
9
|
+
/**
|
|
10
|
+
* Find archived folders matching a block name.
|
|
11
|
+
* Supports both:
|
|
12
|
+
* - Exact archive name: "dev-pal_2026-03-21T10-33-24-242Z"
|
|
13
|
+
* - Block name prefix: "dev-pal" (matches all archives of that block)
|
|
14
|
+
*/
|
|
15
|
+
async function findArchives(archiveDir, query) {
|
|
16
|
+
// Strip _archive/ prefix if user pastes it
|
|
17
|
+
const name = query.replace(/^_archive\//, '');
|
|
18
|
+
try {
|
|
19
|
+
const entries = await fsp.readdir(archiveDir);
|
|
20
|
+
// 1. Exact match
|
|
21
|
+
if (entries.includes(name))
|
|
22
|
+
return [name];
|
|
23
|
+
// 2. Prefix match: "dev-pal" matches "dev-pal_2026-03-21T10-33-24-242Z"
|
|
24
|
+
const matches = entries
|
|
25
|
+
.filter(e => e.startsWith(`${name}_`))
|
|
26
|
+
.sort()
|
|
27
|
+
.reverse(); // newest first
|
|
28
|
+
return matches;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a single archive — if multiple exist, let user pick.
|
|
36
|
+
*/
|
|
37
|
+
async function resolveArchive(archiveDir, query) {
|
|
38
|
+
const matches = await findArchives(archiveDir, query);
|
|
39
|
+
if (matches.length === 0)
|
|
40
|
+
return null;
|
|
41
|
+
if (matches.length === 1)
|
|
42
|
+
return matches[0];
|
|
43
|
+
// Multiple archives — let the user pick
|
|
44
|
+
const selection = await p.select({
|
|
45
|
+
message: `Multiple archives found for "${query}". Which one?`,
|
|
46
|
+
options: matches.map(m => {
|
|
47
|
+
// Extract the timestamp for a cleaner label
|
|
48
|
+
const tsMatch = m.match(/_(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2})/);
|
|
49
|
+
const hint = tsMatch ? tsMatch[1].replace(/-/g, ':').replace('T', ' ').slice(0, 16) : '';
|
|
50
|
+
return { value: m, label: m, hint };
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
if (p.isCancel(selection))
|
|
54
|
+
return null;
|
|
55
|
+
return selection;
|
|
56
|
+
}
|
|
57
|
+
export async function deleteCommand(blockName, options) {
|
|
58
|
+
if (!(await isInitialized())) {
|
|
59
|
+
throw new Error(t.general.notInitialized);
|
|
60
|
+
}
|
|
61
|
+
const globalConfig = await loadGlobalConfig();
|
|
62
|
+
const blocksDir = resolveBlocksDir(globalConfig);
|
|
63
|
+
const blockPath = join(blocksDir, blockName);
|
|
64
|
+
// Check if it's a direct block path first
|
|
65
|
+
if (await pathExists(blockPath)) {
|
|
66
|
+
if (blockName.startsWith('_archive/')) {
|
|
67
|
+
if (!options?.hard) {
|
|
68
|
+
throw new Error(t.archive.mustUseHard);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (options?.hard) {
|
|
72
|
+
try {
|
|
73
|
+
await fsp.rm(blockPath, { recursive: true, force: true });
|
|
74
|
+
log.success(t.archive.hardDeleteSuccess(blockName));
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
throw new Error(`Failed to delete: ${err.message}`);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Soft delete — move to _archive directory
|
|
82
|
+
const archiveDir = join(blocksDir, '_archive');
|
|
83
|
+
await ensureDir(archiveDir);
|
|
84
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
85
|
+
const archiveName = `${blockName}_${timestamp}`;
|
|
86
|
+
const archivePath = join(archiveDir, archiveName);
|
|
87
|
+
try {
|
|
88
|
+
await fsp.rename(blockPath, archivePath);
|
|
89
|
+
log.success(t.archive.success(blockName));
|
|
90
|
+
log.dim(` ${t.archive.location(`_archive/${archiveName}`)}`);
|
|
91
|
+
log.dim(` ${t.archive.restoreCmd(blockName)}`);
|
|
92
|
+
log.dim(` ${t.archive.deleteCmd(blockName)}`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
throw new Error(`Failed to archive block: ${err.message}`);
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Not a live block — maybe user wants to hard-delete an archive by name?
|
|
100
|
+
if (options?.hard) {
|
|
101
|
+
const archiveDir = join(blocksDir, '_archive');
|
|
102
|
+
const resolved = await resolveArchive(archiveDir, blockName);
|
|
103
|
+
if (!resolved) {
|
|
104
|
+
throw new Error(`Block or archive "${blockName}" not found.`);
|
|
105
|
+
}
|
|
106
|
+
const archivePath = join(archiveDir, resolved);
|
|
107
|
+
try {
|
|
108
|
+
await fsp.rm(archivePath, { recursive: true, force: true });
|
|
109
|
+
log.success(`"${resolved}" permanently deleted from archive.`);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
throw new Error(`Failed to delete: ${err.message}`);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
throw new Error(`Block "${blockName}" not found. Run \`mblk status\` to see available blocks.`);
|
|
117
|
+
}
|
|
118
|
+
export async function restoreCommand(archiveName) {
|
|
119
|
+
if (!(await isInitialized())) {
|
|
120
|
+
throw new Error(t.general.notInitialized);
|
|
121
|
+
}
|
|
122
|
+
const globalConfig = await loadGlobalConfig();
|
|
123
|
+
const blocksDir = resolveBlocksDir(globalConfig);
|
|
124
|
+
const archiveDir = join(blocksDir, '_archive');
|
|
125
|
+
// Resolve the archive — supports block name, full name, or prefix
|
|
126
|
+
const resolved = await resolveArchive(archiveDir, archiveName);
|
|
127
|
+
if (!resolved) {
|
|
128
|
+
throw new Error(`No archive found for "${archiveName}". Run \`mblk status\` to check archives.`);
|
|
129
|
+
}
|
|
130
|
+
const archivePath = join(archiveDir, resolved);
|
|
131
|
+
// Extract original block name (strip timestamp suffix)
|
|
132
|
+
const match = resolved.match(/^(.*?)_\d{4}-\d{2}-\d{2}T.*/);
|
|
133
|
+
const targetName = match ? match[1] : resolved;
|
|
134
|
+
const targetPath = join(blocksDir, targetName);
|
|
135
|
+
if (await pathExists(targetPath)) {
|
|
136
|
+
throw new Error(`Cannot restore: A block named "${targetName}" already exists. Delete or rename it first.`);
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
await fsp.rename(archivePath, targetPath);
|
|
140
|
+
log.success(`Block "${targetName}" restored successfully.`);
|
|
141
|
+
log.dim(` Start with: ${chalk.bold(`mblk start ${targetName}`)}`);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
throw new Error(`Failed to restore block: ${err.message}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/cli/commands/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive onboarding wizard.
|
|
3
|
+
* Multi-step setup: providers → channels → plugins → API keys → first block.
|
|
4
|
+
* Uses @clack/prompts for styled terminal UI.
|
|
5
|
+
*/
|
|
6
|
+
export declare function initCommand(options?: {
|
|
7
|
+
nonInteractive?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4NvF"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { ensureDir, writeJson } from '../../utils/fs.js';
|
|
4
|
+
import { getWsRoot, getConfigPath, getAuthPath, isInitialized, } from '../../utils/config.js';
|
|
5
|
+
import { GlobalConfigSchema } from '../../schemas.js';
|
|
6
|
+
import { log } from '../logger.js';
|
|
7
|
+
import { PROVIDERS, CHANNELS, PLUGINS, PROVIDER_AUTH, CHANNEL_AUTH } from '../constants.js';
|
|
8
|
+
// Brand accent
|
|
9
|
+
const ACCENT = chalk.hex('#805AD5');
|
|
10
|
+
const DIM = chalk.dim;
|
|
11
|
+
/**
|
|
12
|
+
* Interactive onboarding wizard.
|
|
13
|
+
* Multi-step setup: providers → channels → plugins → API keys → first block.
|
|
14
|
+
* Uses @clack/prompts for styled terminal UI.
|
|
15
|
+
*/
|
|
16
|
+
export async function initCommand(options) {
|
|
17
|
+
const wsDir = getWsRoot();
|
|
18
|
+
// Non-interactive: create defaults and exit
|
|
19
|
+
if (options?.nonInteractive) {
|
|
20
|
+
await ensureDir(wsDir);
|
|
21
|
+
const defaultConfig = GlobalConfigSchema.parse({
|
|
22
|
+
blocksDir: './blocks'
|
|
23
|
+
});
|
|
24
|
+
await writeJson(getConfigPath(), defaultConfig);
|
|
25
|
+
await writeJson(getAuthPath(), {
|
|
26
|
+
aws: { accessKeyId: '', secretAccessKey: '', region: 'us-east-1' },
|
|
27
|
+
anthropic: { apiKey: '' },
|
|
28
|
+
openai: { apiKey: '' },
|
|
29
|
+
gemini: { apiKey: '' },
|
|
30
|
+
telegram: { botToken: '', chatId: '' },
|
|
31
|
+
brave: { apiKey: '' }
|
|
32
|
+
});
|
|
33
|
+
log.brand('Initialized (non-interactive)');
|
|
34
|
+
log.success(`Workspace: ${wsDir}`);
|
|
35
|
+
log.success(`Config: ${getConfigPath()}`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const alreadyInit = await isInitialized();
|
|
39
|
+
// Welcome
|
|
40
|
+
console.log('');
|
|
41
|
+
log.banner();
|
|
42
|
+
console.log(DIM(' Deploy isolated AI workspaces on your machine.\n'));
|
|
43
|
+
p.intro(chalk.bold('Setup Wizard'));
|
|
44
|
+
if (alreadyInit) {
|
|
45
|
+
const proceed = await p.confirm({
|
|
46
|
+
message: 'Already configured globally. Re-run setup?',
|
|
47
|
+
initialValue: false,
|
|
48
|
+
});
|
|
49
|
+
if (p.isCancel(proceed) || !proceed) {
|
|
50
|
+
p.outro('Setup cancelled.');
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ─── Step 1: Providers ───────────────────────────────
|
|
55
|
+
const selectedProviders = await p.multiselect({
|
|
56
|
+
message: 'Which providers do you want to use?',
|
|
57
|
+
options: PROVIDERS,
|
|
58
|
+
initialValues: ['bedrock'],
|
|
59
|
+
required: true,
|
|
60
|
+
});
|
|
61
|
+
if (p.isCancel(selectedProviders)) {
|
|
62
|
+
p.outro('Setup cancelled.');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// ─── Step 2: Channels ───────────────────────────────
|
|
66
|
+
const selectedChannels = await p.multiselect({
|
|
67
|
+
message: 'Which channels do you want to enable?',
|
|
68
|
+
options: CHANNELS.map(ch => ({
|
|
69
|
+
...ch,
|
|
70
|
+
label: (ch.value === 'cli' || ch.value === 'web') ? `${ch.label} (always on)` : ch.label,
|
|
71
|
+
})),
|
|
72
|
+
initialValues: ['cli', 'web'],
|
|
73
|
+
required: true,
|
|
74
|
+
});
|
|
75
|
+
if (p.isCancel(selectedChannels)) {
|
|
76
|
+
p.outro('Setup cancelled.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// ─── Step 3: Skills & Plugins ───────────────────────
|
|
80
|
+
p.log.info(`${chalk.green('✓')} Core skills (file ops, shell, dev) — always available`);
|
|
81
|
+
p.log.info(`${chalk.green('✓')} Multi-Agent Orchestration — always available`);
|
|
82
|
+
let selectedPlugins = [];
|
|
83
|
+
if (PLUGINS.length > 0) {
|
|
84
|
+
selectedPlugins = await p.multiselect({
|
|
85
|
+
message: 'Select additional skills & plugins to install:',
|
|
86
|
+
options: PLUGINS.map(pl => ({
|
|
87
|
+
value: pl.value,
|
|
88
|
+
label: pl.label,
|
|
89
|
+
hint: pl.hint,
|
|
90
|
+
})),
|
|
91
|
+
required: false,
|
|
92
|
+
});
|
|
93
|
+
if (p.isCancel(selectedPlugins)) {
|
|
94
|
+
p.outro('Setup cancelled.');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// ─── Step 4: API Keys ───────────────────────────────
|
|
99
|
+
const authData = {};
|
|
100
|
+
for (const provider of selectedProviders) {
|
|
101
|
+
const providerAuth = PROVIDER_AUTH[provider];
|
|
102
|
+
if (!providerAuth || providerAuth.fields.length === 0)
|
|
103
|
+
continue;
|
|
104
|
+
const providerLabel = PROVIDERS.find(p => p.value === provider)?.label || provider;
|
|
105
|
+
p.log.step(`${providerLabel} credentials`);
|
|
106
|
+
const data = {};
|
|
107
|
+
for (const field of providerAuth.fields) {
|
|
108
|
+
const value = await p.text({
|
|
109
|
+
message: field.label,
|
|
110
|
+
placeholder: field.key === 'region' ? 'us-east-1' : '',
|
|
111
|
+
defaultValue: field.key === 'region' ? 'us-east-1' : undefined,
|
|
112
|
+
});
|
|
113
|
+
if (p.isCancel(value)) {
|
|
114
|
+
p.outro('Setup cancelled.');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
data[field.key] = value || '';
|
|
118
|
+
}
|
|
119
|
+
authData[provider === 'bedrock' ? 'aws' : provider] = data;
|
|
120
|
+
}
|
|
121
|
+
// Channel auth (only telegram has auth currently)
|
|
122
|
+
for (const channel of selectedChannels) {
|
|
123
|
+
const fields = CHANNEL_AUTH[channel];
|
|
124
|
+
if (!fields)
|
|
125
|
+
continue;
|
|
126
|
+
const channelLabel = CHANNELS.find(c => c.value === channel)?.label || channel;
|
|
127
|
+
p.log.step(`${channelLabel} credentials`);
|
|
128
|
+
const data = {};
|
|
129
|
+
for (const field of fields) {
|
|
130
|
+
const value = await p.text({
|
|
131
|
+
message: field.label,
|
|
132
|
+
placeholder: field.secret ? '' : 'optional',
|
|
133
|
+
});
|
|
134
|
+
if (p.isCancel(value)) {
|
|
135
|
+
p.outro('Setup cancelled.');
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
data[field.key] = value || '';
|
|
139
|
+
}
|
|
140
|
+
authData[channel] = data;
|
|
141
|
+
}
|
|
142
|
+
// ─── Step 5: Connection Testing ─────────────────────
|
|
143
|
+
const s = p.spinner();
|
|
144
|
+
const results = [];
|
|
145
|
+
// Test Bedrock
|
|
146
|
+
if (authData.aws?.accessKeyId) {
|
|
147
|
+
s.start('Testing Bedrock connection...');
|
|
148
|
+
try {
|
|
149
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
150
|
+
// @ts-ignore — dynamic import, may not be installed
|
|
151
|
+
const { BedrockRuntimeClient, ConverseCommand } = await import('@aws-sdk/client-bedrock-runtime');
|
|
152
|
+
const client = new BedrockRuntimeClient({
|
|
153
|
+
region: authData.aws.region || 'us-east-1',
|
|
154
|
+
credentials: { accessKeyId: authData.aws.accessKeyId, secretAccessKey: authData.aws.secretAccessKey },
|
|
155
|
+
});
|
|
156
|
+
await client.send(new ConverseCommand({
|
|
157
|
+
modelId: 'anthropic.claude-3-haiku-20240307-v1:0',
|
|
158
|
+
messages: [{ role: 'user', content: [{ text: 'hi' }] }],
|
|
159
|
+
inferenceConfig: { maxTokens: 1 },
|
|
160
|
+
}));
|
|
161
|
+
results.push({ name: 'Bedrock', ok: true });
|
|
162
|
+
s.stop('Bedrock ✓');
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
// AccessDeniedException means credentials ARE valid, just model not enabled
|
|
166
|
+
const isAccessIssue = err?.name === 'AccessDeniedException' || err?.Code === 'AccessDeniedException';
|
|
167
|
+
if (isAccessIssue) {
|
|
168
|
+
results.push({ name: 'Bedrock', ok: true });
|
|
169
|
+
s.stop('Bedrock ✓ (credentials valid, enable models in AWS console)');
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
results.push({ name: 'Bedrock', ok: false });
|
|
173
|
+
s.stop('Bedrock ✗ (check credentials later)');
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Test Telegram
|
|
178
|
+
if (authData.telegram?.botToken) {
|
|
179
|
+
s.start('Testing Telegram bot...');
|
|
180
|
+
try {
|
|
181
|
+
const res = await fetch(`https://api.telegram.org/bot${authData.telegram.botToken}/getMe`);
|
|
182
|
+
const data = await res.json();
|
|
183
|
+
results.push({ name: 'Telegram', ok: data.ok });
|
|
184
|
+
s.stop(data.ok ? 'Telegram ✓' : 'Telegram ✗');
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
results.push({ name: 'Telegram', ok: false });
|
|
188
|
+
s.stop('Telegram ✗');
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// ─── Step 6: Save Configuration ─────────────────────
|
|
192
|
+
await ensureDir(wsDir);
|
|
193
|
+
const defaultConfig = GlobalConfigSchema.parse({
|
|
194
|
+
blocksDir: './blocks',
|
|
195
|
+
});
|
|
196
|
+
await writeJson(getConfigPath(), defaultConfig);
|
|
197
|
+
await writeJson(getAuthPath(), authData);
|
|
198
|
+
// ─── Done ───────────────────────────────────────────
|
|
199
|
+
console.log('');
|
|
200
|
+
p.note([
|
|
201
|
+
...results.map(r => `${r.ok ? chalk.green('✓') : chalk.yellow('○')} ${r.name}`),
|
|
202
|
+
...(results.length === 0 ? [DIM('No connections configured yet')] : []),
|
|
203
|
+
'',
|
|
204
|
+
DIM(`Workspace: ${wsDir}`),
|
|
205
|
+
DIM(`Config: ${getConfigPath()}`),
|
|
206
|
+
].join('\n'), 'Setup Complete');
|
|
207
|
+
p.outro(`Run ${ACCENT('mblk start <name>')} to create and start your first block.`);
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* View or update block permissions.
|
|
3
|
+
* Permissions are CLI-only — they cannot be changed via chat or web.
|
|
4
|
+
*/
|
|
5
|
+
export declare function permissionsCommand(blockName: string, options?: {
|
|
6
|
+
scope?: string;
|
|
7
|
+
allowShell?: boolean;
|
|
8
|
+
denyShell?: boolean;
|
|
9
|
+
allowNetwork?: boolean;
|
|
10
|
+
denyNetwork?: boolean;
|
|
11
|
+
maxTimeout?: string;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/permissions.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,wBAAsB,kBAAkB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACN,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,GACF,OAAO,CAAC,IAAI,CAAC,CAqDf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { loadGlobalConfig, resolveBlockPath, loadBlockConfig, saveBlockConfig } from '../../utils/config.js';
|
|
2
|
+
import { pathExists } from '../../utils/fs.js';
|
|
3
|
+
import { log } from '../logger.js';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
const VALID_SCOPES = ['block', 'workspace', 'system'];
|
|
6
|
+
/**
|
|
7
|
+
* View or update block permissions.
|
|
8
|
+
* Permissions are CLI-only — they cannot be changed via chat or web.
|
|
9
|
+
*/
|
|
10
|
+
export async function permissionsCommand(blockName, options) {
|
|
11
|
+
const globalConfig = await loadGlobalConfig();
|
|
12
|
+
const blockPath = resolveBlockPath(globalConfig, blockName);
|
|
13
|
+
if (!await pathExists(join(blockPath, 'config.json'))) {
|
|
14
|
+
log.error(`Block "${blockName}" not found.`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const config = await loadBlockConfig(blockPath);
|
|
18
|
+
const perms = config.permissions || { scope: 'block', allowShell: false, allowNetwork: true, maxTimeout: 120_000 };
|
|
19
|
+
// No flags = show current permissions
|
|
20
|
+
const hasFlags = options?.scope || options?.allowShell || options?.denyShell
|
|
21
|
+
|| options?.allowNetwork || options?.denyNetwork || options?.maxTimeout;
|
|
22
|
+
if (!hasFlags) {
|
|
23
|
+
log.brand(`permissions — ${blockName}\n`);
|
|
24
|
+
console.log(` Scope: ${perms.scope}`);
|
|
25
|
+
console.log(` Shell Access: ${perms.allowShell ? '✓ allowed' : '✗ denied'}`);
|
|
26
|
+
console.log(` Network: ${perms.allowNetwork ? '✓ allowed' : '✗ denied'}`);
|
|
27
|
+
console.log(` Max Timeout: ${(perms.maxTimeout / 1000).toFixed(0)}s`);
|
|
28
|
+
console.log('');
|
|
29
|
+
log.dim(' Scopes:');
|
|
30
|
+
log.dim(' block — read/write own block directory only (default)');
|
|
31
|
+
log.dim(' workspace — access the entire workspace');
|
|
32
|
+
log.dim(' system — unrestricted file and shell access');
|
|
33
|
+
console.log('');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Apply changes
|
|
37
|
+
if (options?.scope) {
|
|
38
|
+
if (!VALID_SCOPES.includes(options.scope)) {
|
|
39
|
+
log.error(`Invalid scope: "${options.scope}". Use: block, workspace, or system.`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
perms.scope = options.scope;
|
|
43
|
+
}
|
|
44
|
+
if (options?.allowShell)
|
|
45
|
+
perms.allowShell = true;
|
|
46
|
+
if (options?.denyShell)
|
|
47
|
+
perms.allowShell = false;
|
|
48
|
+
if (options?.allowNetwork)
|
|
49
|
+
perms.allowNetwork = true;
|
|
50
|
+
if (options?.denyNetwork)
|
|
51
|
+
perms.allowNetwork = false;
|
|
52
|
+
if (options?.maxTimeout)
|
|
53
|
+
perms.maxTimeout = parseInt(options.maxTimeout, 10) * 1000;
|
|
54
|
+
// Save
|
|
55
|
+
config.permissions = perms;
|
|
56
|
+
await saveBlockConfig(blockPath, config);
|
|
57
|
+
log.success(` Permissions updated for "${blockName}".`);
|
|
58
|
+
console.log(` Scope: ${perms.scope}, Shell: ${perms.allowShell ? 'yes' : 'no'}, Network: ${perms.allowNetwork ? 'yes' : 'no'}, Timeout: ${(perms.maxTimeout / 1000).toFixed(0)}s`);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/cli/commands/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-settings.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plugin-settings.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuG5E"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { log } from '../logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* mblk settings <plugin> — view/edit plugin settings via CLI.
|
|
5
|
+
* Auto-generates forms from the plugin's settings schema.
|
|
6
|
+
*/
|
|
7
|
+
export async function pluginSettingsCommand(pluginId) {
|
|
8
|
+
let installer;
|
|
9
|
+
try {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
11
|
+
// @ts-ignore — optional runtime dependency, not needed at compile time
|
|
12
|
+
const mod = await import('@memoryblock/plugin-installer');
|
|
13
|
+
installer = new mod.PluginInstaller();
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
log.error('Plugin installer not available.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const plugins = await installer.listPlugins();
|
|
20
|
+
// No plugin specified — list all plugins with settings
|
|
21
|
+
if (!pluginId) {
|
|
22
|
+
const withSettings = plugins.filter((pl) => pl.settings && Object.keys(pl.settings).length > 0);
|
|
23
|
+
if (withSettings.length === 0) {
|
|
24
|
+
log.dim(' No plugins with configurable settings.');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
log.brand('plugin settings\n');
|
|
28
|
+
for (const pl of withSettings) {
|
|
29
|
+
const fields = Object.keys(pl.settings).length;
|
|
30
|
+
console.log(` ${pl.core ? '●' : '○'} ${pl.name} (${pl.id}) — ${fields} setting${fields > 1 ? 's' : ''}`);
|
|
31
|
+
}
|
|
32
|
+
console.log('');
|
|
33
|
+
log.dim(' Run `mblk settings <plugin-id>` to configure.');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Find the plugin
|
|
37
|
+
const plugin = plugins.find((pl) => pl.id === pluginId);
|
|
38
|
+
if (!plugin) {
|
|
39
|
+
log.error(`Plugin "${pluginId}" not found.`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
if (!plugin.settings || Object.keys(plugin.settings).length === 0) {
|
|
43
|
+
log.dim(` Plugin "${plugin.name}" has no configurable settings.`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Load current values
|
|
47
|
+
const current = await installer.getPluginSettings(pluginId);
|
|
48
|
+
p.intro(`${plugin.name} Settings`);
|
|
49
|
+
const updates = {};
|
|
50
|
+
for (const [key, field] of Object.entries(plugin.settings)) {
|
|
51
|
+
const currentVal = current[key];
|
|
52
|
+
if (field.type === 'select') {
|
|
53
|
+
const result = await p.select({
|
|
54
|
+
message: field.label,
|
|
55
|
+
options: (field.options || []).map((o) => ({
|
|
56
|
+
value: o,
|
|
57
|
+
label: o,
|
|
58
|
+
hint: o === currentVal ? 'current' : undefined,
|
|
59
|
+
})),
|
|
60
|
+
initialValue: currentVal || field.default,
|
|
61
|
+
});
|
|
62
|
+
if (p.isCancel(result)) {
|
|
63
|
+
p.outro('Cancelled.');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
updates[key] = result;
|
|
67
|
+
}
|
|
68
|
+
else if (field.type === 'toggle') {
|
|
69
|
+
const result = await p.confirm({
|
|
70
|
+
message: field.label,
|
|
71
|
+
initialValue: currentVal ?? field.default ?? false,
|
|
72
|
+
});
|
|
73
|
+
if (p.isCancel(result)) {
|
|
74
|
+
p.outro('Cancelled.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
updates[key] = result;
|
|
78
|
+
}
|
|
79
|
+
else if (field.type === 'number') {
|
|
80
|
+
const result = await p.text({
|
|
81
|
+
message: `${field.label} (${field.min ?? ''}–${field.max ?? ''})`,
|
|
82
|
+
defaultValue: String(currentVal ?? field.default ?? ''),
|
|
83
|
+
placeholder: String(field.default ?? ''),
|
|
84
|
+
validate: (v) => {
|
|
85
|
+
const n = parseInt(v || '', 10);
|
|
86
|
+
if (isNaN(n))
|
|
87
|
+
return 'Must be a number';
|
|
88
|
+
if (field.min !== undefined && n < field.min)
|
|
89
|
+
return `Min: ${field.min}`;
|
|
90
|
+
if (field.max !== undefined && n > field.max)
|
|
91
|
+
return `Max: ${field.max}`;
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
if (p.isCancel(result)) {
|
|
95
|
+
p.outro('Cancelled.');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
updates[key] = parseInt(String(result), 10);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// text / password
|
|
102
|
+
const result = await p.text({
|
|
103
|
+
message: field.label,
|
|
104
|
+
defaultValue: String(currentVal ?? field.default ?? ''),
|
|
105
|
+
placeholder: field.placeholder || '',
|
|
106
|
+
});
|
|
107
|
+
if (p.isCancel(result)) {
|
|
108
|
+
p.outro('Cancelled.');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
updates[key] = result;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Save
|
|
115
|
+
await installer.savePluginSettings(pluginId, updates);
|
|
116
|
+
p.outro(`Settings saved for ${plugin.name}.`);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=plugin-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-settings.js","sourceRoot":"","sources":["../../../src/cli/commands/plugin-settings.ts"],"names":[],"mappings":"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"}
|