auroq-os 2.5.11 → 2.6.0
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/.auroq-core/core/synapse/engine.js +54 -11
- package/.auroq-core/core/synapse/layers/layer-processor.js +11 -2
- package/.auroq-core/core/synapse/runtime/hook-runtime.js +27 -15
- package/.auroq-core/core-config.yaml +1 -1
- package/.claude/commands/AuroqOS/agents/ops.md +8 -3
- package/.claude/hooks/auroq-sync.cjs +14 -4
- package/.claude/rules/mcp-usage.md +1 -1
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +27 -0
- package/README.md +31 -21
- package/bin/auroq-os.js +454 -63
- package/installer/install.ps1 +2 -2
- package/installer/install.sh +2 -2
- package/lib/auth.js +271 -103
- package/lib/credentials.js +4 -0
- package/lib/runtime-integrity.json +288 -0
- package/lib/synapse-hashes.json +6 -3
- package/lib/telemetry.mjs +4 -1
- package/package.json +6 -4
- package/scripts/assert-mcp-pin.mjs +12 -5
- package/scripts/build-pack.mjs +43 -12
- package/scripts/pack-state.mjs +64 -0
- package/scripts/postpack-casca.mjs +3 -26
- package/scripts/prepack-casca.mjs +32 -32
- package/scripts/runtime-integrity.mjs +173 -0
|
@@ -123,9 +123,8 @@ class PipelineMetrics {
|
|
|
123
123
|
* Record that a layer encountered an error.
|
|
124
124
|
*
|
|
125
125
|
* @param {string} name - Layer name
|
|
126
|
-
* @param {Error} error - The error object
|
|
127
126
|
*/
|
|
128
|
-
errorLayer(name
|
|
127
|
+
errorLayer(name) {
|
|
129
128
|
const existing = this.layers[name] || {};
|
|
130
129
|
if (existing.start) {
|
|
131
130
|
const endTime = process.hrtime.bigint();
|
|
@@ -135,7 +134,7 @@ class PipelineMetrics {
|
|
|
135
134
|
this.layers[name] = {
|
|
136
135
|
...existing,
|
|
137
136
|
status: 'error',
|
|
138
|
-
|
|
137
|
+
errorCode: 'SYNAPSE_LAYER_FAILED',
|
|
139
138
|
};
|
|
140
139
|
}
|
|
141
140
|
|
|
@@ -170,8 +169,27 @@ class PipelineMetrics {
|
|
|
170
169
|
// SynapseEngine
|
|
171
170
|
// ---------------------------------------------------------------------------
|
|
172
171
|
|
|
173
|
-
/**
|
|
172
|
+
/** Cooperative budget between layers; synchronous work cannot be interrupted. */
|
|
174
173
|
const PIPELINE_TIMEOUT_MS = 100;
|
|
174
|
+
// Keep substantial headroom below the outer hook's 5000 ms safety timeout.
|
|
175
|
+
const MAX_PIPELINE_TIMEOUT_MS = 1000;
|
|
176
|
+
const SYNAPSE_PIPELINE_TIMEOUT_ENV = 'AUROQ_SYNAPSE_PIPELINE_TIMEOUT_MS';
|
|
177
|
+
|
|
178
|
+
/** Resolve a short pipeline budget. Invalid values preserve the safe default. */
|
|
179
|
+
function resolvePipelineTimeoutMs(config = {}) {
|
|
180
|
+
const fromEnv = process.env[SYNAPSE_PIPELINE_TIMEOUT_ENV];
|
|
181
|
+
const value = fromEnv !== undefined && fromEnv !== ''
|
|
182
|
+
? fromEnv
|
|
183
|
+
: config.synapse?.pipelineTimeoutMs;
|
|
184
|
+
if (value === undefined || value === null) return PIPELINE_TIMEOUT_MS;
|
|
185
|
+
const timeout = typeof value === 'number' || typeof value === 'string' ? Number(value) : NaN;
|
|
186
|
+
if (!Number.isInteger(timeout) || timeout <= 0 || timeout > MAX_PIPELINE_TIMEOUT_MS) {
|
|
187
|
+
// Do not echo invalid values: environment/config may contain private text.
|
|
188
|
+
console.warn('[synapse:engine] SYNAPSE_INVALID_PIPELINE_TIMEOUT');
|
|
189
|
+
return PIPELINE_TIMEOUT_MS;
|
|
190
|
+
}
|
|
191
|
+
return timeout;
|
|
192
|
+
}
|
|
175
193
|
|
|
176
194
|
/**
|
|
177
195
|
* NOG-18: Default active layers (L0-L2 only).
|
|
@@ -250,8 +268,13 @@ class SynapseEngine {
|
|
|
250
268
|
async process(prompt, session, processConfig) {
|
|
251
269
|
const safeProcessConfig = (processConfig && typeof processConfig === 'object') ? processConfig : {};
|
|
252
270
|
const mergedConfig = { ...this.config, ...safeProcessConfig };
|
|
271
|
+
mergedConfig.synapse = { ...(this.config.synapse || {}), ...(safeProcessConfig.synapse || {}) };
|
|
272
|
+
const pipelineTimeoutMs = resolvePipelineTimeoutMs(mergedConfig);
|
|
273
|
+
const pipelineNow = typeof safeProcessConfig.nowNs === 'function'
|
|
274
|
+
? safeProcessConfig.nowNs
|
|
275
|
+
: process.hrtime.bigint;
|
|
253
276
|
const metrics = new PipelineMetrics();
|
|
254
|
-
metrics.totalStart =
|
|
277
|
+
metrics.totalStart = pipelineNow();
|
|
255
278
|
|
|
256
279
|
// 1. Calculate bracket (or use fixed layers in non-legacy mode)
|
|
257
280
|
const promptCount = (session && session.prompt_count) || 0;
|
|
@@ -266,7 +289,7 @@ class SynapseEngine {
|
|
|
266
289
|
|
|
267
290
|
// Guard: no layer config (invalid bracket — should not happen)
|
|
268
291
|
if (!layerConfig) {
|
|
269
|
-
metrics.totalEnd =
|
|
292
|
+
metrics.totalEnd = pipelineNow();
|
|
270
293
|
return { xml: '', metrics: metrics.getSummary() };
|
|
271
294
|
}
|
|
272
295
|
activeLayers = layerConfig.layers;
|
|
@@ -291,8 +314,8 @@ class SynapseEngine {
|
|
|
291
314
|
continue;
|
|
292
315
|
}
|
|
293
316
|
|
|
294
|
-
//
|
|
295
|
-
if (Number(
|
|
317
|
+
// Cooperative check between layers; the host owns interruption of a stuck process.
|
|
318
|
+
if (Number(pipelineNow() - metrics.totalStart) / 1e6 >= pipelineTimeoutMs) {
|
|
296
319
|
// Log remaining layers as skipped
|
|
297
320
|
const remaining = this.layers.slice(this.layers.indexOf(layer));
|
|
298
321
|
for (const r of remaining) {
|
|
@@ -314,14 +337,28 @@ class SynapseEngine {
|
|
|
314
337
|
previousLayers,
|
|
315
338
|
});
|
|
316
339
|
|
|
317
|
-
|
|
340
|
+
let result;
|
|
341
|
+
try {
|
|
342
|
+
result = layer._safeProcess(context);
|
|
343
|
+
} catch (_error) {
|
|
344
|
+
metrics.errorLayer(layer.name);
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
318
347
|
|
|
319
348
|
if (result && Array.isArray(result.rules)) {
|
|
320
349
|
metrics.endLayer(layer.name, result.rules.length);
|
|
321
350
|
results.push(result);
|
|
322
351
|
previousLayers.push(result);
|
|
323
352
|
} else if (result === null || result === undefined) {
|
|
324
|
-
|
|
353
|
+
try {
|
|
354
|
+
if (typeof layer.getLastError === 'function' && layer.getLastError()) {
|
|
355
|
+
metrics.errorLayer(layer.name);
|
|
356
|
+
} else {
|
|
357
|
+
metrics.skipLayer(layer.name, 'Returned null');
|
|
358
|
+
}
|
|
359
|
+
} catch (_error) {
|
|
360
|
+
metrics.errorLayer(layer.name);
|
|
361
|
+
}
|
|
325
362
|
} else {
|
|
326
363
|
metrics.skipLayer(layer.name, 'Invalid result format');
|
|
327
364
|
}
|
|
@@ -341,8 +378,9 @@ class SynapseEngine {
|
|
|
341
378
|
}
|
|
342
379
|
}
|
|
343
380
|
|
|
344
|
-
metrics.totalEnd =
|
|
381
|
+
metrics.totalEnd = pipelineNow();
|
|
345
382
|
const summary = metrics.getSummary();
|
|
383
|
+
summary.pipeline_timeout_ms = pipelineTimeoutMs;
|
|
346
384
|
|
|
347
385
|
// Persist hook metrics (fire-and-forget)
|
|
348
386
|
this._persistHookMetrics(summary, bracket, mergedConfig);
|
|
@@ -382,6 +420,7 @@ class SynapseEngine {
|
|
|
382
420
|
const hookBootMs = hookBootTime ? Number(process.hrtime.bigint() - hookBootTime) / 1e6 : 0;
|
|
383
421
|
const data = {
|
|
384
422
|
totalDuration: summary.total_ms,
|
|
423
|
+
pipelineTimeoutMs: summary.pipeline_timeout_ms,
|
|
385
424
|
hookBootMs,
|
|
386
425
|
bracket,
|
|
387
426
|
layersLoaded: summary.layers_loaded,
|
|
@@ -397,6 +436,7 @@ class SynapseEngine {
|
|
|
397
436
|
duration: info.duration || 0,
|
|
398
437
|
status: info.status || 'unknown',
|
|
399
438
|
rules: info.rules || 0,
|
|
439
|
+
...(info.errorCode ? { errorCode: info.errorCode } : {}),
|
|
400
440
|
};
|
|
401
441
|
}
|
|
402
442
|
fs.writeFileSync(
|
|
@@ -413,4 +453,7 @@ module.exports = {
|
|
|
413
453
|
SynapseEngine,
|
|
414
454
|
PipelineMetrics,
|
|
415
455
|
PIPELINE_TIMEOUT_MS,
|
|
456
|
+
MAX_PIPELINE_TIMEOUT_MS,
|
|
457
|
+
SYNAPSE_PIPELINE_TIMEOUT_ENV,
|
|
458
|
+
resolvePipelineTimeoutMs,
|
|
416
459
|
};
|
|
@@ -34,6 +34,7 @@ class LayerProcessor {
|
|
|
34
34
|
this.name = name;
|
|
35
35
|
this.layer = layer;
|
|
36
36
|
this.timeout = timeout;
|
|
37
|
+
this._lastError = null;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
/**
|
|
@@ -65,6 +66,7 @@ class LayerProcessor {
|
|
|
65
66
|
*/
|
|
66
67
|
_safeProcess(context) {
|
|
67
68
|
const start = Date.now();
|
|
69
|
+
this._lastError = null;
|
|
68
70
|
try {
|
|
69
71
|
const result = this.process(context);
|
|
70
72
|
const elapsed = Date.now() - start;
|
|
@@ -72,11 +74,18 @@ class LayerProcessor {
|
|
|
72
74
|
console.warn(`[synapse:${this.name}] Warning: Layer exceeded timeout (${elapsed}ms > ${this.timeout}ms)`);
|
|
73
75
|
}
|
|
74
76
|
return result;
|
|
75
|
-
} catch (
|
|
76
|
-
|
|
77
|
+
} catch (_error) {
|
|
78
|
+
// Raw error messages/stacks can contain prompt or domain content.
|
|
79
|
+
this._lastError = new Error('SYNAPSE_LAYER_FAILED');
|
|
80
|
+
console.warn(`[synapse:${this.name}] SYNAPSE_LAYER_FAILED`);
|
|
77
81
|
return null;
|
|
78
82
|
}
|
|
79
83
|
}
|
|
84
|
+
|
|
85
|
+
/** Return a content-free failure marker for the engine's metrics. */
|
|
86
|
+
getLastError() {
|
|
87
|
+
return this._lastError;
|
|
88
|
+
}
|
|
80
89
|
}
|
|
81
90
|
|
|
82
91
|
module.exports = LayerProcessor;
|
|
@@ -6,25 +6,29 @@ const fs = require('fs');
|
|
|
6
6
|
const DEFAULT_STALE_TTL_HOURS = 168; // 7 days
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* Read
|
|
10
|
-
* Falls back to DEFAULT_STALE_TTL_HOURS (168h = 7 days).
|
|
9
|
+
* Read optional project configuration without disclosing parse failures.
|
|
11
10
|
*
|
|
12
11
|
* @param {string} cwd - Working directory
|
|
13
|
-
* @returns {
|
|
12
|
+
* @returns {object} Configuration or an empty object
|
|
14
13
|
*/
|
|
15
|
-
function
|
|
14
|
+
function loadCoreConfig(cwd) {
|
|
16
15
|
try {
|
|
17
|
-
const yaml = require('js-yaml');
|
|
18
16
|
const configPath = path.join(cwd, '.auroq-core', 'core-config.yaml');
|
|
19
|
-
if (!fs.existsSync(configPath)) return
|
|
17
|
+
if (!fs.existsSync(configPath)) return {};
|
|
18
|
+
const yaml = require('js-yaml');
|
|
20
19
|
const config = yaml.load(fs.readFileSync(configPath, 'utf8'));
|
|
21
|
-
|
|
22
|
-
return typeof ttl === 'number' && ttl > 0 ? ttl : DEFAULT_STALE_TTL_HOURS;
|
|
20
|
+
return config && typeof config === 'object' ? config : {};
|
|
23
21
|
} catch (_err) {
|
|
24
|
-
|
|
22
|
+
// YAML errors can contain configuration values; never log their text.
|
|
23
|
+
return {};
|
|
25
24
|
}
|
|
26
25
|
}
|
|
27
26
|
|
|
27
|
+
function getStaleSessionTTL(config) {
|
|
28
|
+
const ttl = config && config.synapse && config.synapse.session && config.synapse.session.staleTTLHours;
|
|
29
|
+
return typeof ttl === 'number' && ttl > 0 ? ttl : DEFAULT_STALE_TTL_HOURS;
|
|
30
|
+
}
|
|
31
|
+
|
|
28
32
|
/**
|
|
29
33
|
* Resolve runtime dependencies for Synapse hook execution.
|
|
30
34
|
*
|
|
@@ -46,7 +50,7 @@ function resolveHookRuntime(input) {
|
|
|
46
50
|
if (!fs.existsSync(synapsePath)) return null;
|
|
47
51
|
|
|
48
52
|
try {
|
|
49
|
-
const { loadSession, cleanStaleSessions } = require(
|
|
53
|
+
const { loadSession, createSession, cleanStaleSessions } = require(
|
|
50
54
|
path.join(cwd, '.auroq-core', 'core', 'synapse', 'session', 'session-manager.js'),
|
|
51
55
|
);
|
|
52
56
|
const { SynapseEngine } = require(
|
|
@@ -54,13 +58,21 @@ function resolveHookRuntime(input) {
|
|
|
54
58
|
);
|
|
55
59
|
|
|
56
60
|
const sessionsDir = path.join(synapsePath, 'sessions');
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
let session = sessionId ? loadSession(sessionId, sessionsDir) : null;
|
|
62
|
+
// loadSession validates the ID before we use it as a filename. Create only
|
|
63
|
+
// a missing session: an unreadable/corrupt existing file is kept intact.
|
|
64
|
+
if (!session && sessionId && !fs.existsSync(path.join(sessionsDir, `${sessionId}.json`))) {
|
|
65
|
+
session = createSession(sessionId, cwd, sessionsDir);
|
|
66
|
+
}
|
|
67
|
+
const shouldCleanStaleSessions = session?.prompt_count === 0;
|
|
68
|
+
session = session || { prompt_count: 0 };
|
|
69
|
+
const coreConfig = loadCoreConfig(cwd);
|
|
70
|
+
const engine = new SynapseEngine(synapsePath, { synapse: coreConfig.synapse || {} });
|
|
59
71
|
|
|
60
72
|
// AC3: Run cleanup on first prompt only (fire-and-forget)
|
|
61
|
-
if (
|
|
73
|
+
if (shouldCleanStaleSessions) {
|
|
62
74
|
try {
|
|
63
|
-
const ttlHours = getStaleSessionTTL(
|
|
75
|
+
const ttlHours = getStaleSessionTTL(coreConfig);
|
|
64
76
|
const removed = cleanStaleSessions(sessionsDir, ttlHours);
|
|
65
77
|
if (removed > 0 && process.env.DEBUG === '1') {
|
|
66
78
|
console.error(`[hook-runtime] Cleaned ${removed} stale session(s) (TTL: ${ttlHours}h)`);
|
|
@@ -73,7 +85,7 @@ function resolveHookRuntime(input) {
|
|
|
73
85
|
return { engine, session, sessionId, sessionsDir, cwd };
|
|
74
86
|
} catch (error) {
|
|
75
87
|
if (process.env.DEBUG === '1') {
|
|
76
|
-
console.error(
|
|
88
|
+
console.error('[hook-runtime] SYNAPSE_RUNTIME_FAILED');
|
|
77
89
|
}
|
|
78
90
|
return null;
|
|
79
91
|
}
|
|
@@ -10,8 +10,13 @@ O Pack chega ao vivo pelo MCP. NUNCA peça zip nem instalacao do Pack.
|
|
|
10
10
|
|
|
11
11
|
Ao ativar, mostre o selo de acesso que a tool devolver (as duas primeiras linhas) antes de qualquer outra coisa — é como o aluno vê que a licença dele foi conferida agora.
|
|
12
12
|
|
|
13
|
-
Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se existe `agents/ops/OPS-LOCAL.md` no disco (é o Bootstrap completo que morava no computador do aluno antes da migração; o instalador guarda ele ali). Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com o Bootstrap que já está no seu computador." — e siga por esse arquivo como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare. Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
|
|
13
|
+
Se a tool recusar (acesso vencido, cancelado, suspenso ou encerrado) ou falhar: confira se existe `agents/ops/OPS-LOCAL.md` no disco (é o Bootstrap completo que morava no computador do aluno antes da migração; o instalador guarda ele ali). Se existir, avise em UMA linha — "O servidor não liberou o conteúdo ao vivo; seguindo com o Bootstrap que já está no seu computador." — e siga por esse arquivo como fonte da verdade, mostrando a mensagem do servidor junto. Se não existir, mostre a mensagem exatamente como veio, com o contato do suporte da Arcane, e pare (única exceção abaixo). Nunca improvisar de memória, nunca tentar de novo sozinho. O que já estava no computador do aluno antes da migração continua dele.
|
|
14
14
|
|
|
15
|
-
**
|
|
15
|
+
**Exceção — atualizar ou consertar a conexão sem o MCP:** se a tool falhou ou recusou e o aluno pediu para atualizar o sistema ou consertar a conexão, rode você mesmo na raiz do negócio (Windows: `npx.cmd` no lugar de `npx`), sem mandar o aluno ao terminal:
|
|
16
|
+
- atualizar: `npx -y auroq-os@latest manutencao --agente` (Claude Code: timeout 600000; Codex: espere a linha `AUROQ_RESULTADO`). `status=ok` → "Pronto, atualizei."; `motivo=login` → oriente o login na janela "Login Arcane" que abriu, nunca peça senha no chat, e peça que ele repita o pedido; `motivo=migracao` → peça o SIM e rode de novo com `--migrar-mcp`; outro erro → mostre a `mensagem` e sugira o Arcano;
|
|
17
|
+
- consertar a conexão: `npx -y auroq-os@latest register-mcp`.
|
|
18
|
+
Depois: "Feche e abra o Claude Code (ou o Codex) para terminar." Não rode `doctor` em seguida.
|
|
16
19
|
|
|
17
|
-
|
|
20
|
+
**Comandos antigos aposentados:** `*update-auroq`, `*update`, `*update-packarcane` e instalacao do Pack nao autorizam copiar arquivos antigos ou instalar ZIP. Para conteudo, usar o MCP. Para atualizar o sistema ("atualiza o sistema"), seguir `forja_bundle` com forge_id `ops` e fase `manutencao` — ou a exceção acima, se o MCP falhar. Nunca seguir a antiga lista ATUALIZA nem extrair pacote em /tmp/auroq-update.
|
|
21
|
+
|
|
22
|
+
CRITICAL: Do not treat this file as the Bootstrap. Use the MCP `arcane` tools; fall back to `agents/ops/OPS-LOCAL.md` only after the MCP refused or failed and that file exists. Without the MCP, the only other local action is the update/connection exception above.
|
|
@@ -51,6 +51,9 @@ function describeCommits(range, limit) {
|
|
|
51
51
|
|
|
52
52
|
// ─── Aviso de versao nova (1x por dia) ───────────────────
|
|
53
53
|
const VERSION_CHECK_EVERY_MS = 24 * 60 * 60 * 1000;
|
|
54
|
+
// Consulta que falhou (sem internet, npm fora): tenta de novo em 1 h, nao em 24 h. Antes a
|
|
55
|
+
// checagem era marcada ANTES de consultar e uma falha deixava o aluno 24 h sem aviso.
|
|
56
|
+
const VERSION_RETRY_AFTER_FAIL_MS = 60 * 60 * 1000;
|
|
54
57
|
|
|
55
58
|
function localVersion() {
|
|
56
59
|
try {
|
|
@@ -80,11 +83,18 @@ function versionNotice() {
|
|
|
80
83
|
const st = readState();
|
|
81
84
|
const now = Date.now();
|
|
82
85
|
if (st.lastVersionCheck && now - st.lastVersionCheck < VERSION_CHECK_EVERY_MS) return null;
|
|
83
|
-
st.
|
|
84
|
-
writeState(st);
|
|
86
|
+
if (st.lastVersionFail && now - st.lastVersionFail < VERSION_RETRY_AFTER_FAIL_MS) return null;
|
|
85
87
|
const latest = npmLatest();
|
|
86
|
-
if (!latest
|
|
87
|
-
|
|
88
|
+
if (!latest) {
|
|
89
|
+
st.lastVersionFail = now; // offline nao vira insistencia, mas tambem nao cala 24 h
|
|
90
|
+
writeState(st);
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
st.lastVersionCheck = now; // so marca as 24 h depois de o npm responder
|
|
94
|
+
st.lastVersionFail = 0;
|
|
95
|
+
writeState(st);
|
|
96
|
+
if (cmpVer(latest, local) <= 0) return null;
|
|
97
|
+
return `[Auroq update] Saiu versao nova do sistema: v${local} instalada → v${latest} disponivel. Na sua primeira resposta, avise o expert em 1 frase simples e pergunte: "Quer que eu atualize agora? Leva uns 5 minutos e voce nao precisa fazer nada." Se ele disser sim: a atualizacao e feita pelo Ops, sem o expert abrir terminal — chame a tool forja_bundle (MCP arcane) com forge_id "ops" e fase "manutencao" e siga aqueles passos a risca (e o mesmo que ele pedir ao Ops "atualiza o sistema"). Se ele disser nao, nao pergunte de novo nesta conversa.`;
|
|
88
98
|
}
|
|
89
99
|
|
|
90
100
|
function sessionStart() {
|
|
@@ -27,4 +27,4 @@ Outros agentes sao **consumidores** de MCP, nao administradores. Se precisar de
|
|
|
27
27
|
3. Playwright nos cenarios tecnicos
|
|
28
28
|
4. Ferramentas externas sem equivalente nativo
|
|
29
29
|
|
|
30
|
-
Se a tool `arcane` recusar ou falhar: a pasta do agente existe em `agents/`? Sim → avisar em uma linha e seguir pelo disco. Não → mostrar a mensagem e parar. Nunca improvisar de memoria.
|
|
30
|
+
Se a tool `arcane` recusar ou falhar: a pasta do agente existe em `agents/`? Sim → avisar em uma linha e seguir pelo disco. Não → mostrar a mensagem e parar. Nunca improvisar de memoria. Exceção: pedido de atualizar o sistema ou consertar a conexão — o Ops roda a manutenção local (ver o atalho do Ops).
|
package/AGENTS.md
CHANGED
|
@@ -7,7 +7,7 @@ Sistema operacional de IA. Runtimes oficiais desta versão: Claude Code e Codex.
|
|
|
7
7
|
- Claude: `/companion`, `/ops`, `/consultor`, `/squad-forge`, …
|
|
8
8
|
- Codex: `$companion`, `$ops`, `$consultor`, `$squad-forge`, … (skills em `.agents/skills/`)
|
|
9
9
|
|
|
10
|
-
Todo conteúdo Arcane vem pelo MCP `arcane` (catálogos `auroq-core` e `arcane-pack`). Nunca procurar esse conteúdo em `agents/`. Se a tool falhar, mostre a mensagem e pare.
|
|
10
|
+
Todo conteúdo Arcane vem pelo MCP `arcane` (catálogos `auroq-core` e `arcane-pack`). Nunca procurar esse conteúdo em `agents/`. Se a tool falhar, mostre a mensagem e pare (exceção: pedido de atualizar o sistema ou consertar a conexão — o `$ops` roda a manutenção local).
|
|
11
11
|
|
|
12
12
|
**Execucao preparada pelo MCP:** Edicao, Carrossel, Trafego, Low Ticket e Bia recebem seus arquivos por `squad_passo` com o recurso_id do squad e passo `preparar-execucao`. O agente executa o script retornado na pasta do negocio e continua o trabalho. Anuncios funciona sem arquivos locais. Nao instalar nem atualizar Pack; nao pedir ZIP. Os arquivos locais servem apenas para executar o passo, nunca como fonte do metodo.
|
|
13
13
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,30 @@
|
|
|
1
|
+
## 2.6.0 — 2026-09-21
|
|
2
|
+
|
|
3
|
+
### O aluno atualiza o sistema pelo Ops, sem abrir terminal
|
|
4
|
+
|
|
5
|
+
- O caminho oficial de atualizar e pedir ao Ops, no Claude Code ou no Codex: "atualiza o sistema" (ou responder "sim" quando o sistema avisa que saiu versao nova). O Ops roda `manutencao --agente` e responde "Pronto, atualizei" — dizendo se precisa fechar e abrir o aplicativo. Rodar no terminal virou so reserva.
|
|
6
|
+
- `manutencao --agente` nunca faz pergunta que trave e termina sempre com uma linha que o Ops le: `AUROQ_RESULTADO status=ok versao=<x.y.z> reabrir=<sim|nao>` ou `AUROQ_RESULTADO status=erro motivo=<login|acesso|rede|pasta|migracao|falha> mensagem="..."`. Sem terminal de verdade (o Ops, CI), vale o mesmo mesmo sem `--agente`: nenhuma pergunta espera digitacao.
|
|
7
|
+
- Negocio no sistema antigo (sem MCP) so migra com o SIM do aluno: o Ops pergunta no chat e repassa com `--migrar-mcp`. Sem o SIM, nada e alterado (`motivo=migracao`).
|
|
8
|
+
- Login expirado sem terminal: abre uma janela "Login Arcane" pro aluno digitar e-mail e senha da plataforma e espera ate 5 minutos (Windows: `cmd` com `npx.cmd`, sem depender da politica do PowerShell; Mac: Terminal). Nao abriu ou o tempo acabou: `motivo=login` com o comando exato. Senha nunca passa pelo chat.
|
|
9
|
+
- `~/.arcane/credentials.json` nao e mais apagado quando a sessao falha: e o mesmo arquivo do conteudo ao vivo, e apaga-lo derrubava o MCP do aluno. Renovacao que falha rele o arquivo (o cliente MCP pode ter girado o token ao mesmo tempo) e tenta de novo uma vez; sessao recusada pelo servidor deixa de passar em silencio. Campos que so o cliente MCP usa ficam no arquivo.
|
|
10
|
+
- A manutencao nao apaga mais as permissoes do aluno: `.claude/settings.json` e mesclado — o que o sistema controla (hooks do sistema, estilo, idioma) vem da versao nova; permissoes (inclusive o modo sem pedir permissao), `statusLine`, `env`, outras chaves e hooks proprios do aluno ficam, sem hook duplicado.
|
|
11
|
+
- A versao nova so e carimbada no fim, depois de tudo dar certo — e o registro do conteudo ao vivo so recebe a versao nova junto com esse carimbo: uma manutencao interrompida no meio nao finge mais que a pasta esta em dia, nem para o servidor.
|
|
12
|
+
- O registro do conteudo ao vivo (`.mcp.json` e `.codex/config.toml`) passa a levar `AUROQ_OS_VERSION` (versao do motor da pasta), junto com o que ja existia no `env`. O cliente 0.7.0 manda essa versao ao servidor, que avisa quem ficou para tras. `doctor` e `register-mcp` mantem o valor em dia sem acusar pendencia. O que e do aluno no `env` fica; o que o sistema administra (proxy, certificado, variaveis do Windows) continua vindo da maquina de agora — proxy que sumiu sai do registro, e o "conserta a conexao" volta a consertar.
|
|
13
|
+
- O que espera decisao do aluno deixa de virar "atualizacao falhou": pedir o SIM da migracao e pedir o login registram desfecho proprio na telemetria, e erro inesperado ao conferir o acesso sai como `motivo=falha` com a mensagem real — nunca mais manda procurar uma janela de login que nao existe.
|
|
14
|
+
- `check-access` volta a responder na hora quando nao ha terminal (com o comando exato do login): a janela "Login Arcane" e so da manutencao, que a pede de proposito.
|
|
15
|
+
- O pin do cliente passa a morar no campo `arcaneMcpPin` do package.json (fonte unica, lida tambem pelo servidor no npm) e vai a `arcane-mcp@0.7.0`. A publicacao continua travada ate o 0.7.0 existir no npm.
|
|
16
|
+
- Aviso de versao ao abrir o Claude Code: uma consulta que falha nao cala mais o aviso por 24 h (tenta de novo em 1 h), e o texto oferece atualizar pelo Ops.
|
|
17
|
+
- Na falta do conteudo ao vivo, o atalho do Ops ainda consegue atualizar o sistema ou consertar a conexao localmente e manda fechar e abrir o aplicativo.
|
|
18
|
+
- Inclui tudo do 2.5.12. Instaladores do repositorio preparados para 2.6.0 (regra do 2.5.12): as copias publicas so sao promovidas depois de publicar o arcane-mcp 0.7.0 e o 2.6.0 e passar os gates nativos.
|
|
19
|
+
|
|
20
|
+
## 2.5.12 — 2026-09-21
|
|
21
|
+
|
|
22
|
+
- SYNAPSE persiste a sessao desde o primeiro prompt, limita o orcamento total entre camadas e distingue falhas sem expor mensagens/conteudo privado. Mantem manifest, eventos dos hosts e camadas opcionais desligadas.
|
|
23
|
+
- Pacote real passa por inventario SHA-256 apos a casca, arquivos obrigatorios/proibidos e referencias locais do runtime. O empacotamento restaura o checkout, inclusive em falhas. Integridade de conteudo nao equivale a assinatura de autoria.
|
|
24
|
+
- Atualiza js-yaml para 4.3.2, corrigindo avisos de consumo excessivo de CPU no parser usado pelo motor.
|
|
25
|
+
- Manutencao reconhece as versoes oficiais anteriores do SYNAPSE e preserva arquivos personalizados e dados do negocio. Mantem arcane-mcp@0.6.1.
|
|
26
|
+
- Instaladores preparados para esta versao; copias publicas so sao promovidas depois dos gates nativos macOS/Windows Node 22/24 e da verificacao no npm. Maquinas existentes atualizam pelo fluxo de manutencao.
|
|
27
|
+
|
|
1
28
|
## 2.5.11 — 2026-09-21
|
|
2
29
|
|
|
3
30
|
### O diagnostico passa a dizer o que achou (EMB-050)
|
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ irm https://arka.education/install.ps1 | iex
|
|
|
29
29
|
Depois, **feche e abra** o Claude Code ou o Codex — senao ele nao enxerga o que
|
|
30
30
|
acabou de ser instalado.
|
|
31
31
|
|
|
32
|
-
O caminho manual antigo foi aposentado. Use a instalacao guiada acima. Em negocio existente, peca ao Ops "
|
|
32
|
+
O caminho manual antigo foi aposentado. Use a instalacao guiada acima. Em negocio existente, peca ao Ops "atualiza o sistema" (no Claude Code ou no Codex). Os agentes e squads chegam pelo MCP, sem instalacao ou atualizacao de Pack.
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
> **Grok:** nao precisa de `sync:codex`. Ele descobre `.claude/commands/`,
|
|
@@ -44,7 +44,7 @@ O caminho manual antigo foi aposentado. Use a instalacao guiada acima. Em negoci
|
|
|
44
44
|
|
|
45
45
|
| Comando | O que faz |
|
|
46
46
|
|---------|-----------|
|
|
47
|
-
| `auroq-os manutencao` | Manutencao do motor no negocio existente; conteudo vem pelo MCP |
|
|
47
|
+
| `auroq-os manutencao` | Manutencao do motor no negocio existente; conteudo vem pelo MCP. **Caminho normal: pedir ao Ops "atualiza o sistema"** — ele roda `manutencao --agente` (sem perguntas; ultima linha `AUROQ_RESULTADO ...`). Rodar no terminal e so reserva |
|
|
48
48
|
| `auroq-os clone` | Continua o SEU negocio em outra maquina (ou na maquina de um colaborador) — baixa tudo do GitHub, ja instalado |
|
|
49
49
|
| `auroq-os fix-gitignore` | Garante as protecoes de segredo no .gitignore (vault, .env, midia) e destraqueia segredos versionados |
|
|
50
50
|
| `auroq-os login` | Forca novo login (substitui credencial atual) |
|
|
@@ -98,23 +98,31 @@ e o servidor, e diz exatamente o que fazer.
|
|
|
98
98
|
|
|
99
99
|
## Atualizar o sistema
|
|
100
100
|
|
|
101
|
-
De tempos em tempos sai versao nova do **motor** (novos comandos,
|
|
102
|
-
Voce nao precisa vigiar nada:
|
|
103
|
-
|
|
101
|
+
De tempos em tempos sai versao nova do **motor** ou da **conexao** (novos comandos,
|
|
102
|
+
correcoes). Voce nao precisa vigiar nada: quando existe versao nova, o proprio sistema
|
|
103
|
+
avisa — ao usar um squad ou agente do conteudo ao vivo e ao abrir o Claude Code no seu
|
|
104
|
+
projeto — e pergunta se voce quer atualizar.
|
|
104
105
|
|
|
105
|
-
Pra atualizar, e uma frase — dentro do Claude Code, com o Ops ativo
|
|
106
|
+
Pra atualizar, e uma frase — dentro do Claude Code ou do Codex, com o Ops ativo
|
|
107
|
+
(`/AuroqOS:agents:ops` ou `$ops`), ou respondendo "sim" ao aviso:
|
|
106
108
|
|
|
107
109
|
```
|
|
108
110
|
atualiza o sistema
|
|
109
111
|
```
|
|
110
112
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
Voce nao abre terminal nem digita comando: o Ops salva um ponto de restauracao (commit)
|
|
114
|
+
se houver trabalho seu pendente, roda a manutencao e diz se precisa fechar e abrir o
|
|
115
|
+
aplicativo. Se o login da plataforma tiver expirado, abre uma janela "Login Arcane" pra
|
|
116
|
+
voce digitar o e-mail e a senha (nunca no chat). **Seus dados nunca sao tocados**:
|
|
117
|
+
memoria do Companion, documentos, cockpit, campanhas, squads que voce criou,
|
|
118
|
+
personalizacoes e as suas permissoes do Claude Code ficam exatamente como estavam.
|
|
119
|
+
O que se atualiza e so o framework.
|
|
120
|
+
|
|
121
|
+
Reserva, so se o Ops nao abrir: na pasta do negocio, `npx -y auroq-os@latest manutencao`
|
|
122
|
+
(Windows: `npx.cmd`).
|
|
115
123
|
|
|
116
124
|
O historico do que mudou em cada versao fica no arquivo `CHANGELOG.md`, dentro do
|
|
117
|
-
proprio pacote
|
|
125
|
+
proprio pacote.
|
|
118
126
|
|
|
119
127
|
## Historico de uso (AHI)
|
|
120
128
|
|
|
@@ -174,8 +182,8 @@ Direitos de consulta/exclusao continuam disponiveis com autenticacao mesmo sem
|
|
|
174
182
|
licenca de captura. Para apagar o historico da conta inteira, o escopo explicito
|
|
175
183
|
exigido e `excluir --account --confirm-delete`.
|
|
176
184
|
|
|
177
|
-
A atualizacao do coletor exige
|
|
178
|
-
o host. O aviso de nova versao ao iniciar o Claude Code nao instala essa correcao.
|
|
185
|
+
A atualizacao do coletor exige a manutencao no projeto (peca ao Ops "atualiza o sistema")
|
|
186
|
+
e reabrir o host. O aviso de nova versao ao iniciar o Claude Code nao instala essa correcao.
|
|
179
187
|
A publicacao do pacote tambem nao comprova que cada aluno ja atualizou.
|
|
180
188
|
|
|
181
189
|
## Estrutura
|
|
@@ -228,14 +236,17 @@ agents/ → Seu exercito (companion, workers, minds, squads)
|
|
|
228
236
|
*Auroq OS — by Euriler Jube / Arka*
|
|
229
237
|
|
|
230
238
|
|
|
231
|
-
## Observabilidade do motor
|
|
239
|
+
## Observabilidade e integridade do motor
|
|
232
240
|
|
|
233
|
-
Apos publicacao, `npx -y auroq-os@2.
|
|
234
|
-
manutencao/diagnostico. `npx -y auroq-os@2.
|
|
241
|
+
Apos publicacao, `npx -y auroq-os@2.6.0 doctor` mostra a fila local segura e os comandos pinados de
|
|
242
|
+
manutencao/diagnostico. `npx -y auroq-os@2.6.0 manutencao` preserva o caminho existente
|
|
235
243
|
de consentimento legado, studentFiles, customizacoes e dados do negocio. Nao ha
|
|
236
|
-
migracao forcada. O registro MCP aponta para `arcane-mcp@0.
|
|
237
|
-
|
|
238
|
-
|
|
244
|
+
migracao forcada. O registro MCP aponta para `arcane-mcp@0.7.0` — o pin mora no campo
|
|
245
|
+
`arcaneMcpPin` do package.json (fonte unica; o servidor le o mesmo campo no npm). O 0.7.0
|
|
246
|
+
ainda precisa ser publicado: `npm run release:verify` recusa publicar com um pin que o npm
|
|
247
|
+
nao resolva. Os instaladores do repositorio ficam preparados para 2.6.0; as copias publicas so recebem
|
|
248
|
+
a versao apos os gates nativos e a verificacao do tarball publicado.
|
|
249
|
+
O pacote inclui `lib/runtime-integrity.json`: inventario SHA-256 gerado depois da montagem da casca, verificavel com `npm run integrity:verify` dentro do pacote extraido. Ele comprova consistencia do conteudo; nao e uma assinatura de autoria.
|
|
239
250
|
|
|
240
251
|
O CLI inicia captura antes das dependencias pesadas e registra resultado ao sair.
|
|
241
252
|
Eventos com identidade ja existente podem seguir pela rota autenticada na proxima
|
|
@@ -254,8 +265,7 @@ instalacao/manutencao/doctor/login/register-mcp. Bootstrap conversacional e o tr
|
|
|
254
265
|
final do squad nao sao inferidos como sucesso por sair do CLI ou preparar arquivos.
|
|
255
266
|
Antes de o script chegar ou em computador que nunca executa nosso codigo, nao ha sinal.
|
|
256
267
|
A rota events continua autenticada, limitada e idempotente. A plataforma deve receber
|
|
257
|
-
a whitelist antes de distribuir/promover os clientes;
|
|
258
|
-
mantem o pin 2.5.1 publicado ate a promocao npm ser possivel. Nao precisa migration adicional.
|
|
268
|
+
a whitelist antes de distribuir/promover os clientes; a promocao dos instaladores sincronizados depende da publicacao e verificacao da versao fixada. Nao precisa migration adicional.
|
|
259
269
|
|
|
260
270
|
O canal de adocao e o instalador oficial, o README/changelog, o doctor e o aviso de
|
|
261
271
|
comando aposentado quando a versao nova e executada. Isso nao atualiza silenciosamente
|