@brunobracaioli/aibrain 0.4.0-beta.14 → 0.4.0-beta.15
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 +2 -1
- package/dist/claude-observation.mjs +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/extensions-catalog.mjs +49 -4
- package/dist/extensions-cli.mjs +8 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,7 +63,8 @@ Licensed `aisac claude` sessions also load guardrail hooks as the session plugin
|
|
|
63
63
|
|
|
64
64
|
Licensed sessions of `aisac claude` and `aisac codex` can also load reviewed MCP
|
|
65
65
|
servers: `github` (read-only, token in `GITHUB_PERSONAL_ACCESS_TOKEN`), `supabase`
|
|
66
|
-
(read-only), `vercel`, `playwright` (pinned, isolated) and `
|
|
66
|
+
(read-only), `vercel`, `playwright` (pinned, isolated), `context7` and `creatives` (the
|
|
67
|
+
AISAC Creatives Studio, from client `0.4.0-beta.15`).
|
|
67
68
|
- **Default:** every server is off. `aisac mcp` lists them, `aisac mcp enable|disable
|
|
68
69
|
<id>` or `aisac mcp reset` changes the next session, and `aisac mcp info <id>` says
|
|
69
70
|
what a server reaches and how to log in.
|
|
@@ -16,7 +16,7 @@ export const MAX_LOG_FILES = 3;
|
|
|
16
16
|
const LOCK_WAIT_MS = 250;
|
|
17
17
|
const LOCK_STALE_MS = 30_000;
|
|
18
18
|
const ADMISSION_MS = 60 * 60 * 1000;
|
|
19
|
-
export const ADAPTER_VERSION = '0.4.0-beta.
|
|
19
|
+
export const ADAPTER_VERSION = '0.4.0-beta.15';
|
|
20
20
|
const MAX_DIAGNOSTIC_COUNT = 10_000_000;
|
|
21
21
|
const MAX_DIAGNOSTIC_BYTES = 128 * 1024 * 1024;
|
|
22
22
|
const CHECKPOINT_BACKENDS = new Set(['native_store', 'private_file']);
|
package/dist/cli.mjs
CHANGED
|
@@ -44,7 +44,7 @@ import { anyFormatter } from './guardrails/format.mjs';
|
|
|
44
44
|
import { readCodexGuardrails } from './guardrails-plugin.mjs';
|
|
45
45
|
import { codexHooksStatus, supportsCodexHooks } from './codex-hooks.mjs';
|
|
46
46
|
|
|
47
|
-
const VERSION = '0.4.0-beta.
|
|
47
|
+
const VERSION = '0.4.0-beta.15';
|
|
48
48
|
// The command is `aisac`; `aibrain` is an alias installed from the same entry.
|
|
49
49
|
const COMMAND = 'aisac';
|
|
50
50
|
const ENDPOINT = 'https://mcp.ai-brain.aisac.cloud/mcp';
|
|
@@ -185,10 +185,14 @@ export function hookIds() {
|
|
|
185
185
|
* @property {Readonly<Record<CatalogLocale, string>>} [loginNote] Why and how this login differs.
|
|
186
186
|
* @property {Readonly<Record<CatalogLocale, string>>} description
|
|
187
187
|
* @property {Readonly<Record<CatalogLocale, string>>} reaches What the server can reach (FR7).
|
|
188
|
-
* @property {readonly string[]} [blockedTools] Tools
|
|
189
|
-
*
|
|
188
|
+
* @property {readonly string[]} [blockedTools] Tools removed in both clients whatever the
|
|
189
|
+
* user's permission mode is (FR7.2): tools that spend money, or that would take a
|
|
190
|
+
* credential as an argument. Exact names.
|
|
190
191
|
* @property {readonly string[]} [blockedToolPrefixes] Name prefixes removed in Claude Code
|
|
191
192
|
* only, through a glob deny rule; Codex documents exact names only (FR7.2).
|
|
193
|
+
* @property {Readonly<Record<CatalogLocale, string>>} [blockedNote] Why the tools are
|
|
194
|
+
* blocked, when the reason is not spending; `aisac mcp info` prints it in place of the
|
|
195
|
+
* spending sentence (FR7.2 amendment of 2026-11-09).
|
|
192
196
|
*/
|
|
193
197
|
|
|
194
198
|
/** Session name of a catalog server, so it never collides with the user's own. */
|
|
@@ -196,8 +200,10 @@ export const MCP_SERVER_PREFIX = 'aisac-';
|
|
|
196
200
|
const PLAYWRIGHT_PACKAGE = '@playwright/mcp@0.0.83';
|
|
197
201
|
|
|
198
202
|
/**
|
|
199
|
-
* MCP catalog v1 (spec FR7; the owner chose the
|
|
200
|
-
*
|
|
203
|
+
* MCP catalog v1 (spec FR7; the owner chose the five vendor servers on 2026-11-03)
|
|
204
|
+
* plus `creatives`, the AISAC Creatives Studio (owner, 2026-11-09; spec
|
|
205
|
+
* aisac-engineering-reels FR8, wave E7c). The review of each entry (source,
|
|
206
|
+
* transport, login, tools, reach) is recorded in the extensions spec (FR7.1).
|
|
201
207
|
* @type {readonly McpEntry[]}
|
|
202
208
|
*/
|
|
203
209
|
export const MCP_CATALOG = Object.freeze([
|
|
@@ -315,6 +321,45 @@ export const MCP_CATALOG = Object.freeze([
|
|
|
315
321
|
'Só documentação pública de bibliotecas. O que o agente pergunta (nomes de bibliotecas e dúvidas) vai para a Upstash, então não coloque segredos nem código privado nessas perguntas. Funciona sem login, com limites de uso menores.',
|
|
316
322
|
},
|
|
317
323
|
},
|
|
324
|
+
{
|
|
325
|
+
id: 'creatives',
|
|
326
|
+
defaultOn: false,
|
|
327
|
+
clients: ['claude', 'codex'],
|
|
328
|
+
publisher: 'AISAC',
|
|
329
|
+
source: 'https://studio.aisac.agency/',
|
|
330
|
+
// The URL is the OAuth resource the Studio itself publishes in its
|
|
331
|
+
// protected-resource metadata (read 2026-11-09, reels spec M3). The Studio
|
|
332
|
+
// web app lives at studio.aisac.agency, but that domain is the browser origin
|
|
333
|
+
// only: the MCP issuer, audience and resource stay on this host, so a token
|
|
334
|
+
// obtained for this URL is the one the server accepts.
|
|
335
|
+
transport: { type: 'http', url: 'https://mcp-creatives.vercel.app/mcp' },
|
|
336
|
+
login: 'host-oauth',
|
|
337
|
+
// The key-management tools take or delete a provider key by name. A key typed
|
|
338
|
+
// into a tool call would stay in the session transcript, so keys are managed
|
|
339
|
+
// only on the Studio keys page (reels spec D2, FR8). The generate tools spend
|
|
340
|
+
// on the keys the user registered there: not blocked (FR7.2 amendment).
|
|
341
|
+
blockedTools: ['creatives_register_key', 'creatives_revoke_key'],
|
|
342
|
+
blockedNote: {
|
|
343
|
+
en: 'Provider keys are managed only on the Studio keys page (https://studio.aisac.agency/?studio=keys): a key typed into a tool call would stay in the session transcript.',
|
|
344
|
+
'pt-BR':
|
|
345
|
+
'As chaves dos provedores são gerenciadas só na página de chaves do Studio (https://studio.aisac.agency/?studio=keys): uma chave digitada numa chamada de ferramenta ficaria no transcript da sessão.',
|
|
346
|
+
},
|
|
347
|
+
loginNote: {
|
|
348
|
+
en: 'The Studio login needs an account with access (it comes with the AISAC Engineering purchase). Register your provider keys on the Studio keys page before the first generation; the server never takes a key as an argument.',
|
|
349
|
+
'pt-BR':
|
|
350
|
+
'O login do Studio exige uma conta com acesso (vem com a compra do AISAC Engineering). Registre as chaves dos seus provedores na página de chaves do Studio antes da primeira geração; o servidor nunca recebe uma chave como argumento.',
|
|
351
|
+
},
|
|
352
|
+
description: {
|
|
353
|
+
en: 'The AISAC Creatives Studio: images, narration and video generated with your own provider keys, plus voices, influencer profiles and reel productions.',
|
|
354
|
+
'pt-BR':
|
|
355
|
+
'O AISAC Creatives Studio: imagens, narração e vídeo gerados com as suas próprias chaves de provedor, mais vozes, perfis de influencer e produções de reels.',
|
|
356
|
+
},
|
|
357
|
+
reaches: {
|
|
358
|
+
en: 'Your Studio account only: the generations, assets, voice presets, influencer profiles, Motion projects and productions you own, and the fingerprints of the provider keys you registered (never the keys). Image, audio and video generation and the Motion stages spend on your own provider keys, within the limits the Studio enforces; a Studio production spends only after an approval in the Studio web app or in the Mothership. Registering and revoking keys is blocked by AISAC.',
|
|
359
|
+
'pt-BR':
|
|
360
|
+
'Só a sua conta do Studio: as gerações, assets, presets de voz, perfis de influencer, projetos Motion e produções que são seus, e as impressões digitais das chaves de provedor que você registrou (nunca as chaves). Geração de imagem, áudio e vídeo e as etapas do Motion gastam das suas próprias chaves de provedor, dentro dos limites que o Studio impõe; uma produção do Studio só gasta depois de uma aprovação no app web do Studio ou no Mothership. Registrar e revogar chaves é bloqueado pela AISAC.',
|
|
361
|
+
},
|
|
362
|
+
},
|
|
318
363
|
]);
|
|
319
364
|
|
|
320
365
|
/** @param {string} id @returns {McpEntry | undefined} */
|
package/dist/extensions-cli.mjs
CHANGED
|
@@ -273,11 +273,13 @@ export function serverInfo(entry, locale, item) {
|
|
|
273
273
|
note: 'Hosted by the vendor: its tools can change without a client release, so keep the confirmation of each call on.',
|
|
274
274
|
},
|
|
275
275
|
reaches: entry.reaches[locale],
|
|
276
|
-
// Tools
|
|
276
|
+
// Tools removed whatever the permission mode is (FR7.2): they spend money, or
|
|
277
|
+
// the entry's blockedNote says why.
|
|
277
278
|
blockedTools: [...(entry.blockedTools ?? [])],
|
|
278
279
|
...(entry.blockedToolPrefixes === undefined
|
|
279
280
|
? {}
|
|
280
281
|
: { blockedToolPrefixes: [...entry.blockedToolPrefixes] }),
|
|
282
|
+
...(entry.blockedNote === undefined ? {} : { blockedNote: entry.blockedNote[locale] }),
|
|
281
283
|
login,
|
|
282
284
|
...(variable === undefined ? {} : { tokenVariable: variable }),
|
|
283
285
|
...(entry.loginNote === undefined ? {} : { loginNote: entry.loginNote[locale] }),
|
|
@@ -304,8 +306,12 @@ function printInfo(info) {
|
|
|
304
306
|
prefixes.length === 0
|
|
305
307
|
? ''
|
|
306
308
|
: ` In Claude Code, also any tool whose name starts with ${prefixes.join(', ')}.`;
|
|
309
|
+
const reason =
|
|
310
|
+
info.blockedNote === undefined
|
|
311
|
+
? `Blocked by AISAC, because they spend money: ${info.blockedTools.join(', ')}.${claudeOnly}`
|
|
312
|
+
: `Blocked by AISAC: ${info.blockedTools.join(', ')}.${claudeOnly} ${info.blockedNote}`;
|
|
307
313
|
console.log(
|
|
308
|
-
|
|
314
|
+
`${reason} They stay blocked even if you allow every tool or skip permission prompts.`,
|
|
309
315
|
);
|
|
310
316
|
}
|
|
311
317
|
if (info.loginNote !== undefined) console.log(`Login: ${info.loginNote}`);
|
package/dist/package.json
CHANGED
package/package.json
CHANGED