@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 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 `context7`.
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.14';
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.14';
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 that spend money, removed in both
189
- * clients whatever the user's permission mode is (FR7.2). Exact names.
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 list on 2026-11-03). The review of
200
- * each entry (source, transport, login, tools, reach) is recorded in the spec.
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} */
@@ -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 that spend money, removed whatever the permission mode is (FR7.2).
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
- `Blocked by AISAC, because they spend money: ${info.blockedTools.join(', ')}.${claudeOnly} They stay blocked even if you allow every tool or skip permission prompts.`,
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
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@brunobracaioli/aibrain",
3
- "version": "0.4.0-beta.14",
3
+ "version": "0.4.0-beta.15",
4
4
  "type": "module"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brunobracaioli/aibrain",
3
- "version": "0.4.0-beta.14",
3
+ "version": "0.4.0-beta.15",
4
4
  "private": false,
5
5
  "description": "AISAC client for Claude Code and Codex: AI Brain memory, context management and AISAC Engineering",
6
6
  "license": "UNLICENSED",