@orkastery/cli 0.2.0 → 0.3.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/LICENSE +1 -1
- package/README.md +86 -65
- package/adapters/README.md +30 -15
- package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
- package/adapters/claude-code/README.md +110 -8
- package/adapters/claude-code/commands/onboarding.md +21 -0
- package/adapters/claude-code/commands/ork.md +99 -27
- package/adapters/claude-code/hooks/hooks.json +6 -1
- package/adapters/claude-code/hooks/ork-sensor.js +66 -0
- package/adapters/codex/skills/ork/SKILL.md +57 -0
- package/adapters/hermes/README.md +163 -0
- package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
- package/adapters/hermes/bin/ork-brain.sh +4 -0
- package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
- package/adapters/hermes/bin/ork-maestro.sh +6 -0
- package/adapters/hermes/bin/ork-master-enviar.py +84 -0
- package/adapters/hermes/bin/ork-objective-message.sh +17 -0
- package/adapters/hermes/bin/ork-objective-status.sh +12 -0
- package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
- package/adapters/hermes/hermes.plugin.json +26 -4
- package/adapters/hermes/hitl-ingress/__init__.py +356 -0
- package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
- package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
- package/adapters/openclaw/README.md +135 -26
- package/adapters/openclaw/bin/ork-brain.sh +4 -0
- package/adapters/openclaw/construir.sh +19 -0
- package/adapters/openclaw/dist/hitl-ingress.js +199 -0
- package/adapters/openclaw/dist/index.js +437 -0
- package/adapters/openclaw/openclaw.plugin.json +39 -134
- package/adapters/openclaw/package.json +26 -0
- package/adapters/openclaw/src/hitl-ingress.ts +180 -0
- package/adapters/openclaw/src/index.ts +458 -0
- package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
- package/adapters/openclaw/tsconfig.json +15 -0
- package/assets/docs/markdownlint-cli2.jsonc +22 -0
- package/assets/docs/padroes/documentacao-de-produto.md +133 -0
- package/assets/docs/padroes/roadmap-de-produto.md +98 -0
- package/assets/docs/produto/README.md +14 -0
- package/assets/docs/produto/_modelo-feature.md +59 -0
- package/assets/docs/roadmap/README.md +14 -0
- package/assets/docs/roadmap/_modelo-item.md +73 -0
- package/assets/orkmind-native-schema.json +32 -0
- package/assets/orkmind_bridge.py +357 -0
- package/assets/orkmind_fixture.py +67 -0
- package/assets/orkmind_prospective.py +138 -0
- package/assets/reference-tariffs-i07.json +23 -0
- package/dist/adapters/claude-bg.js +488 -39
- package/dist/adapters/codex-controller-sensor.js +449 -0
- package/dist/adapters/codex-controller-worker.js +361 -0
- package/dist/adapters/codex-controller.js +252 -0
- package/dist/adapters/codex-events.js +205 -0
- package/dist/adapters/codex-question.js +26 -0
- package/dist/adapters/codex-runner.js +133 -0
- package/dist/adapters/codex.js +394 -0
- package/dist/agents-md.js +84 -0
- package/dist/auditoria.js +11 -8
- package/dist/auditrun.js +5 -4
- package/dist/board.js +173 -22
- package/dist/branch-de-estado.js +136 -0
- package/dist/canarios-hitl.js +177 -0
- package/dist/canarios-i43.js +543 -0
- package/dist/canarios-pulse.js +147 -0
- package/dist/canarios-sensores.js +129 -0
- package/dist/canarios.js +111 -2
- package/dist/catalogo.js +9 -0
- package/dist/ci.js +216 -0
- package/dist/ciclos.js +2 -1
- package/dist/claim-lint.js +64 -0
- package/dist/claims.js +60 -0
- package/dist/company-brain-capture.js +195 -0
- package/dist/company-brain-cli.js +123 -0
- package/dist/company-brain-client.js +61 -0
- package/dist/company-brain-contract.js +166 -0
- package/dist/company-brain-journal.js +192 -0
- package/dist/company-brain-mcp.js +33 -0
- package/dist/company-brain-migration.js +60 -0
- package/dist/company-brain-source.js +177 -0
- package/dist/company-brain-worker.js +18 -0
- package/dist/conducao-texto.js +61 -0
- package/dist/conducao.js +876 -0
- package/dist/contrato-publico.js +39 -0
- package/dist/creation-operation-store.js +251 -0
- package/dist/creation-operation.js +148 -0
- package/dist/decisao-autonoma.js +183 -0
- package/dist/delegation.js +79 -0
- package/dist/demo.js +120 -0
- package/dist/docs.js +828 -0
- package/dist/doctor.js +183 -24
- package/dist/entrega-pr.js +117 -0
- package/dist/escopo-escrita.js +71 -0
- package/dist/estado-thread.js +222 -0
- package/dist/evalrunner.js +12 -0
- package/dist/fabrica-estado.js +329 -0
- package/dist/fabrica-publicar.js +76 -0
- package/dist/fix.js +21 -0
- package/dist/gates.js +55 -9
- package/dist/handoff.js +39 -23
- package/dist/hitl-canais.js +333 -0
- package/dist/hitl-classificacao.js +131 -0
- package/dist/hitl-contract.js +465 -0
- package/dist/hitl-estado.js +136 -0
- package/dist/hitl-gates.js +554 -0
- package/dist/hitl-ingress-receipt.js +382 -0
- package/dist/hitl-local-atestado.js +57 -0
- package/dist/hitl-local-receipt.js +328 -0
- package/dist/hitl-local.js +143 -0
- package/dist/hitl-lock.js +139 -0
- package/dist/hitl-lote.js +223 -0
- package/dist/hitl-native-offer.js +97 -0
- package/dist/hitl-native.js +65 -0
- package/dist/hitl-presentation.js +209 -0
- package/dist/hitl-public-receipt.js +176 -0
- package/dist/hitl-resumo.js +209 -0
- package/dist/hitl-sessions.js +475 -0
- package/dist/hitl.js +711 -0
- package/dist/horario.js +269 -0
- package/dist/hosts.js +198 -22
- package/dist/index.js +1736 -93
- package/dist/indice.js +99 -0
- package/dist/init.js +28 -3
- package/dist/integracoes-locais.js +17 -0
- package/dist/leases.js +65 -21
- package/dist/ledger-stats.js +272 -0
- package/dist/ledger.js +107 -2
- package/dist/licoes.js +215 -0
- package/dist/liveness.js +218 -0
- package/dist/maestro-actions.js +51 -0
- package/dist/maestro-authority.js +152 -0
- package/dist/maestro-cli.js +97 -0
- package/dist/maestro-contract.js +55 -0
- package/dist/maestro-discovery.js +132 -0
- package/dist/maestro-runtime.js +268 -0
- package/dist/maestro-snapshot.js +86 -0
- package/dist/maestro-sources.js +224 -0
- package/dist/manifest.js +165 -6
- package/dist/maquina.js +102 -0
- package/dist/master-audit.js +101 -0
- package/dist/master-batch.js +43 -0
- package/dist/master-digest.js +149 -0
- package/dist/master-migracao.js +155 -0
- package/dist/master.js +361 -77
- package/dist/mcp-artifacts.js +234 -0
- package/dist/mcp-git.js +433 -0
- package/dist/mcp-install.js +310 -0
- package/dist/mcp-maestro.js +25 -0
- package/dist/mcp-server.js +469 -0
- package/dist/mcp-ship.js +436 -0
- package/dist/mcp-verify.js +173 -0
- package/dist/memoria-humana.js +207 -0
- package/dist/memoria.js +314 -78
- package/dist/memory-migration.js +279 -0
- package/dist/memory-prospective.js +148 -0
- package/dist/modos-migracao.js +191 -0
- package/dist/modos.js +151 -15
- package/dist/monitor-lock.js +110 -0
- package/dist/objective.js +449 -0
- package/dist/ocupacao.js +267 -0
- package/dist/onboarding.js +303 -0
- package/dist/orkmind.js +389 -90
- package/dist/orquestracao.js +96 -69
- package/dist/phase.js +596 -150
- package/dist/playbook-capabilities.js +150 -0
- package/dist/playbook-contracts.js +188 -0
- package/dist/portfolio-context.js +61 -0
- package/dist/portfolio.js +180 -0
- package/dist/preflight.js +207 -0
- package/dist/process-audit.js +112 -0
- package/dist/project-state.js +93 -0
- package/dist/prompts.js +25 -5
- package/dist/prova-minima.js +112 -0
- package/dist/pulse-cadencia.js +163 -0
- package/dist/pulse-consentimento.js +260 -0
- package/dist/pulse-delivery.js +323 -0
- package/dist/pulse-resposta.js +542 -0
- package/dist/pulse.js +262 -0
- package/dist/ratelimit.js +35 -2
- package/dist/recall.js +80 -3
- package/dist/redacao-saida.js +45 -0
- package/dist/redacao-url.js +66 -0
- package/dist/retry.js +637 -115
- package/dist/roadmap-reservas.js +243 -0
- package/dist/runtime-ambiente.js +38 -0
- package/dist/runtime-context.js +215 -0
- package/dist/runtime-profiles.js +869 -0
- package/dist/runtimes.js +103 -0
- package/dist/sandbox.js +9 -0
- package/dist/session-events.js +203 -0
- package/dist/session-watcher-claude.js +637 -0
- package/dist/session-watcher.js +683 -0
- package/dist/sessoes-adopt.js +154 -0
- package/dist/sessoes-inventario.js +159 -0
- package/dist/sessoes.js +16 -35
- package/dist/setup.js +691 -0
- package/dist/ship.js +150 -15
- package/dist/slug.js +1 -1
- package/dist/thread-close.js +115 -0
- package/dist/thread.js +142 -28
- package/dist/tokens.js +1 -1
- package/dist/util.js +4 -2
- package/dist/verify-sandbox.js +265 -0
- package/dist/verify.js +270 -25
- package/dist/versao.js +60 -0
- package/dist/worktree.js +31 -2
- package/dist/write-activation.js +291 -0
- package/dist/yaml.js +2 -0
- package/eval/casos/onboarding.json +102 -0
- package/eval/casos/orkastery-bootstrap.json +35 -1
- package/eval/casos/scope-check-capability-map.json +45 -7
- package/eval/casos/ship-release.json +2 -2
- package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
- package/eval/fixtures/b2-master-log/caso.json +1 -1
- package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
- package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
- package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
- package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
- package/eval/fixtures/fx-codex-dry/caso.json +18 -0
- package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
- package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
- package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
- package/eval/fixtures/fx-happy/caso.json +6 -4
- package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
- package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
- package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
- package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
- package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
- package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
- package/eval/fixtures/fx-omnicanal/caso.json +17 -0
- package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
- package/monitor/company-brain.cjs +17 -0
- package/monitor/pulse-scope.cjs +45 -0
- package/monitor/pulse.cron +18 -0
- package/monitor/varredura-pulse.sh +27 -0
- package/package.json +25 -4
- package/schemas/claims.schema.json +25 -0
- package/schemas/company-brain.schema.json +1158 -0
- package/schemas/creation-operation.schema.json +365 -0
- package/schemas/maestro-snapshot.schema.json +2716 -0
- package/skills/core/onboarding/SKILL.md +50 -0
- package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
- package/skills/core/thread-state/SKILL.md +3 -1
- package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ehRegistroDeAdocao = ehRegistroDeAdocao;
|
|
37
|
+
exports.adotarSessao = adotarSessao;
|
|
38
|
+
/** Adoção é registro de uma identidade existente, nunca despacho ou retomada. */
|
|
39
|
+
const fs = __importStar(require("node:fs"));
|
|
40
|
+
const path = __importStar(require("node:path"));
|
|
41
|
+
const node_crypto_1 = require("node:crypto");
|
|
42
|
+
const estado_thread_1 = require("./estado-thread");
|
|
43
|
+
const sessoes_inventario_1 = require("./sessoes-inventario");
|
|
44
|
+
const thread_1 = require("./thread");
|
|
45
|
+
const ledger_1 = require("./ledger");
|
|
46
|
+
const util_1 = require("./util");
|
|
47
|
+
const pulse_delivery_1 = require("./pulse-delivery");
|
|
48
|
+
/** Classificação pura: reconhece adoções legadas sem regravar seus IDs ou ledgers. */
|
|
49
|
+
function ehRegistroDeAdocao(thread) {
|
|
50
|
+
return (thread.origem === 'adocao' || thread.sessoes.length > 0) &&
|
|
51
|
+
thread.sessoes.every(s => s.origem === 'adocao');
|
|
52
|
+
}
|
|
53
|
+
function adotarSessao(carregado, chave) {
|
|
54
|
+
if (!/^[a-f0-9-]{8,}$/i.test(chave))
|
|
55
|
+
return {
|
|
56
|
+
ok: false, criada: false, motivo: 'session.invalid', detalhe: 'use identidade exata ou prefixo de pelo menos oito caracteres',
|
|
57
|
+
};
|
|
58
|
+
const raiz = (0, estado_thread_1.raizDoEstado)(carregado.raiz);
|
|
59
|
+
const lock = path.join(raiz, '.orkastery/sessions-adopt.lock');
|
|
60
|
+
fs.mkdirSync(path.dirname(lock), { recursive: true });
|
|
61
|
+
const ocupada = { ok: false, criada: false, motivo: 'lease.busy',
|
|
62
|
+
detalhe: 'adoção em curso ou lock sem dono comprovadamente morto; preserve o lock e consulte o proprietário' };
|
|
63
|
+
// A guarda oficial serializa a recuperação; o arquivo mantém compatibilidade com adoções anteriores.
|
|
64
|
+
const guarda = (0, pulse_delivery_1.adquirirLockMonitor)(lock + '.guard');
|
|
65
|
+
if (!guarda.ok)
|
|
66
|
+
return ocupada;
|
|
67
|
+
let fd;
|
|
68
|
+
let corpo = '';
|
|
69
|
+
try {
|
|
70
|
+
try {
|
|
71
|
+
try {
|
|
72
|
+
fd = fs.openSync(lock, 'wx', 0o600);
|
|
73
|
+
}
|
|
74
|
+
catch (erro) {
|
|
75
|
+
if (erro.code !== 'EEXIST')
|
|
76
|
+
return ocupada;
|
|
77
|
+
const antes = fs.lstatSync(lock);
|
|
78
|
+
if (!antes.isFile())
|
|
79
|
+
return ocupada;
|
|
80
|
+
const conteudo = fs.readFileSync(lock, 'utf8');
|
|
81
|
+
const pid = JSON.parse(conteudo).pid;
|
|
82
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
83
|
+
return ocupada;
|
|
84
|
+
try {
|
|
85
|
+
process.kill(pid, 0);
|
|
86
|
+
return ocupada;
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
if (e.code !== 'ESRCH')
|
|
90
|
+
return ocupada;
|
|
91
|
+
}
|
|
92
|
+
const atual = fs.lstatSync(lock);
|
|
93
|
+
if (atual.ino !== antes.ino || atual.dev !== antes.dev || fs.readFileSync(lock, 'utf8') !== conteudo)
|
|
94
|
+
return ocupada;
|
|
95
|
+
fs.unlinkSync(lock);
|
|
96
|
+
fd = fs.openSync(lock, 'wx', 0o600);
|
|
97
|
+
}
|
|
98
|
+
corpo = JSON.stringify({ pid: process.pid, criadaEm: (0, util_1.agora)() });
|
|
99
|
+
fs.writeFileSync(fd, corpo);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return ocupada;
|
|
103
|
+
}
|
|
104
|
+
const inventario = (0, sessoes_inventario_1.inventariarSessoes)(raiz, { global: true, todas: true });
|
|
105
|
+
if (!inventario.ok)
|
|
106
|
+
return { ok: false, criada: false, motivo: 'runtime.unavailable',
|
|
107
|
+
detalhe: 'inventário incompleto ou ambíguo; consulte sessions --global --all --json' };
|
|
108
|
+
const exatas = inventario.sessoes.filter(s => s.sessionId === chave);
|
|
109
|
+
const candidatas = exatas.length ? exatas : inventario.sessoes.filter(s => s.sessionId.startsWith(chave));
|
|
110
|
+
if (candidatas.length !== 1)
|
|
111
|
+
return { ok: false, criada: false,
|
|
112
|
+
motivo: candidatas.length ? 'session.ambiguous' : 'session.missing',
|
|
113
|
+
detalhe: candidatas.length ? 'prefixo identifica mais de uma sessão' : 'identidade não encontrada no runtime' };
|
|
114
|
+
const s = candidatas[0];
|
|
115
|
+
if (s.vinculos.length === 1)
|
|
116
|
+
return { ok: true, criada: false, sessionId: s.sessionId,
|
|
117
|
+
runtime: s.runtime, vinculo: s.vinculos[0], detalhe: 'vínculo existente preservado' };
|
|
118
|
+
const assunto = 'ad' + (0, node_crypto_1.createHash)('sha256').update(s.runtime + ':' + s.sessionId).digest('hex').slice(0, 10);
|
|
119
|
+
// Preparar a thread inteira antes da gravação evita uma janela sem identidade.
|
|
120
|
+
const { thread } = (0, thread_1.novaThread)({ ...carregado, raiz }, { nome: `Sessão adotada ${s.runtime} ${s.sessionId}`,
|
|
121
|
+
assunto, modo: 'auto', dryRun: true });
|
|
122
|
+
const dir = (0, thread_1.dirThread)(raiz, thread.id);
|
|
123
|
+
if (fs.existsSync(dir))
|
|
124
|
+
return { ok: false, criada: false, motivo: 'session.conflict',
|
|
125
|
+
detalhe: 'domicílio de adoção já existe sem vínculo confirmado; preservar e reconciliar' };
|
|
126
|
+
const adotadaEm = (0, util_1.agora)();
|
|
127
|
+
thread.origem = 'adocao';
|
|
128
|
+
thread.sessoes.push({ sessionId: s.sessionId, runtime: s.runtime, slug: thread.slug,
|
|
129
|
+
fase: thread.faseAtual, bloco: 'ad-hoc', origem: 'adocao', adotadaEm, cwdOrigem: s.cwd, verificada: true });
|
|
130
|
+
(0, thread_1.gravarThread)(raiz, thread);
|
|
131
|
+
(0, ledger_1.registrar)(dir, thread.id, 'session_adopted', { sessionId: s.sessionId, runtime: s.runtime,
|
|
132
|
+
origem: 'adocao', adotadaEm, cwdOrigem: s.cwd, por: 'ork sessions adopt',
|
|
133
|
+
evidencia: inventario.fontes.filter(f => f.ok).map(f => f.origem) });
|
|
134
|
+
return { ok: true, criada: true, sessionId: s.sessionId, runtime: s.runtime,
|
|
135
|
+
vinculo: { raiz, thread: thread.id, fase: thread.faseAtual, origem: path.join(dir, 'thread.json') },
|
|
136
|
+
detalhe: 'sessão real adotada em thread ad hoc Auto' };
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
try {
|
|
140
|
+
if (fd !== undefined) {
|
|
141
|
+
const nosso = fs.fstatSync(fd);
|
|
142
|
+
fs.closeSync(fd);
|
|
143
|
+
if (fs.existsSync(lock)) {
|
|
144
|
+
const atual = fs.lstatSync(lock);
|
|
145
|
+
if (atual.ino === nosso.ino && atual.dev === nosso.dev && fs.readFileSync(lock, 'utf8') === corpo)
|
|
146
|
+
fs.unlinkSync(lock);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
guarda.liberar();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.inventariarSessoes = inventariarSessoes;
|
|
37
|
+
/** Inventário explícito da conta atual, com fontes e vínculos verificáveis. */
|
|
38
|
+
const fs = __importStar(require("node:fs"));
|
|
39
|
+
const path = __importStar(require("node:path"));
|
|
40
|
+
const os = __importStar(require("node:os"));
|
|
41
|
+
const claude_bg_1 = require("./adapters/claude-bg");
|
|
42
|
+
const codex_1 = require("./adapters/codex");
|
|
43
|
+
const estado_thread_1 = require("./estado-thread");
|
|
44
|
+
const thread_1 = require("./thread");
|
|
45
|
+
/** Projeto canônico mais próximo de cada cwd declarado, sem varrer o HOME inteiro. */
|
|
46
|
+
function raizesDeRegistros(cwds) {
|
|
47
|
+
const raizes = new Set();
|
|
48
|
+
const ancestrais = new Set();
|
|
49
|
+
for (const cwd of cwds) {
|
|
50
|
+
let dir = path.resolve(cwd);
|
|
51
|
+
let encontrou = false;
|
|
52
|
+
for (;;) {
|
|
53
|
+
if (fs.existsSync(dir)) {
|
|
54
|
+
const canonica = (0, estado_thread_1.raizDoEstado)(dir);
|
|
55
|
+
if (fs.existsSync(path.join(canonica, '.orkastery', 'threads'))) {
|
|
56
|
+
if (encontrou)
|
|
57
|
+
ancestrais.add(canonica);
|
|
58
|
+
else
|
|
59
|
+
raizes.add(canonica);
|
|
60
|
+
encontrou = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const pai = path.dirname(dir);
|
|
64
|
+
if (pai === dir)
|
|
65
|
+
break;
|
|
66
|
+
dir = pai;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { raizes: [...raizes].sort(),
|
|
70
|
+
ancestraisPendentes: [...ancestrais].filter(r => !raizes.has(r)).sort() };
|
|
71
|
+
}
|
|
72
|
+
function inventariarSessoes(raiz, opcoes = {}) {
|
|
73
|
+
const canonica = (0, estado_thread_1.raizDoEstado)(raiz);
|
|
74
|
+
const claude = (0, claude_bg_1.consultarSessoes)(undefined, opcoes.todas);
|
|
75
|
+
const codex = (0, codex_1.consultarRollouts)(opcoes.todas);
|
|
76
|
+
const fontes = [
|
|
77
|
+
{ origem: `claude agents --json${opcoes.todas ? ' --all' : ''}`, ok: claude.ok, detalhe: claude.detalhe },
|
|
78
|
+
...codex.resultadosFontes,
|
|
79
|
+
];
|
|
80
|
+
const todas = [
|
|
81
|
+
...claude.sessoes.map(s => ({ ...s, runtime: 'claude-bg', vinculos: [] })),
|
|
82
|
+
...codex.sessoes.map(s => ({ ...s, runtime: 'codex', vinculos: [] })),
|
|
83
|
+
];
|
|
84
|
+
// O cruzamento usa o universo global mesmo quando a apresentação é local.
|
|
85
|
+
try {
|
|
86
|
+
const projetos = raizesDeRegistros([canonica, ...todas.map(s => s.cwd)]);
|
|
87
|
+
// Não abrir registros de um hospedeiro apenas por ancestralidade. Sem consultá-lo,
|
|
88
|
+
// porém, não podemos descartar vínculos: a fonte pendente impede um falso zero global.
|
|
89
|
+
// Se outro cwd declarar esse projeto, ele entra normalmente em projetos.raizes.
|
|
90
|
+
for (const projeto of projetos.ancestraisPendentes) {
|
|
91
|
+
fontes.push({ origem: path.join(projeto, '.orkastery/threads'), ok: false,
|
|
92
|
+
detalhe: 'projeto ancestral não consultado; vínculos globais incompletos' });
|
|
93
|
+
}
|
|
94
|
+
for (const projeto of projetos.raizes) {
|
|
95
|
+
const fonte = { origem: path.join(projeto, '.orkastery/threads'), ok: true, detalhe: '' };
|
|
96
|
+
fontes.push(fonte);
|
|
97
|
+
try {
|
|
98
|
+
for (const id of (0, thread_1.listarIds)(projeto)) {
|
|
99
|
+
try {
|
|
100
|
+
const t = (0, thread_1.lerThread)(projeto, id);
|
|
101
|
+
// O site também usa thread.json para recibos de entrega, sem registro de runtime.
|
|
102
|
+
// Reconhecer o schema explícito não autoriza ignorar threads corrompidas.
|
|
103
|
+
if (t.schema === 'site-delivery/v1' &&
|
|
104
|
+
!('sessoes' in t)) {
|
|
105
|
+
fontes.push({ origem: path.join(fonte.origem, id, 'thread.json'), ok: true,
|
|
106
|
+
detalhe: 'site-delivery/v1: recibo de entrega, sem contrato de registro de sessões' });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (t.id !== id || !Array.isArray(t.sessoes))
|
|
110
|
+
throw new Error('registro inválido');
|
|
111
|
+
for (const s of t.sessoes) {
|
|
112
|
+
if (!s || typeof s.sessionId !== 'string' || s.sessionId.length < 8)
|
|
113
|
+
throw new Error('identidade inválida');
|
|
114
|
+
const runtime = s.runtime ?? 'claude-bg';
|
|
115
|
+
const candidatas = todas.filter(v => v.runtime === runtime &&
|
|
116
|
+
(v.sessionId === s.sessionId || v.sessionId.startsWith(s.sessionId)));
|
|
117
|
+
if (candidatas.length > 1)
|
|
118
|
+
throw new Error('prefixo ambíguo');
|
|
119
|
+
if (candidatas.length === 1) {
|
|
120
|
+
const v = candidatas[0];
|
|
121
|
+
if (!v.vinculos.some(r => r.raiz === projeto && r.thread === id)) {
|
|
122
|
+
v.vinculos.push({ raiz: projeto, thread: id, fase: s.fase, origem: path.join(projeto, '.orkastery/threads', id, 'thread.json') });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
fonte.ok = false;
|
|
129
|
+
fonte.detalhe = 'inventário parcial de registros; consulte os arquivos com erro';
|
|
130
|
+
fontes.push({ origem: path.join(fonte.origem, id, 'thread.json'), ok: false,
|
|
131
|
+
detalhe: 'registro de thread ilegível, inválido ou identidade ambígua' });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
fonte.ok = false;
|
|
137
|
+
fonte.detalhe = 'registro de thread ilegível, inválido ou identidade ambígua';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
fontes.push({ origem: 'projetos dos cwds', ok: false, detalhe: 'não foi possível consultar os registros acessíveis' });
|
|
143
|
+
}
|
|
144
|
+
const sessoes = opcoes.global ? todas : todas.filter(s => {
|
|
145
|
+
try {
|
|
146
|
+
return (0, estado_thread_1.raizDoEstado)(s.cwd) === canonica || s.cwd === canonica || s.cwd.startsWith(canonica + path.sep);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
const ambiguas = sessoes.filter(s => s.vinculos.length > 1).length;
|
|
153
|
+
return {
|
|
154
|
+
ok: fontes.every(f => f.ok) && ambiguas === 0,
|
|
155
|
+
escopo: { usuario: os.userInfo().username, global: !!opcoes.global, historico: !!opcoes.todas, raiz: canonica },
|
|
156
|
+
fontes, sessoes, total: sessoes.length,
|
|
157
|
+
semThread: sessoes.filter(s => s.vinculos.length === 0).length, ambiguas,
|
|
158
|
+
};
|
|
159
|
+
}
|
package/dist/sessoes.js
CHANGED
|
@@ -39,49 +39,30 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
};
|
|
40
40
|
})();
|
|
41
41
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.textoDoInventario = textoDoInventario;
|
|
42
43
|
exports.tabelaDeSessoes = tabelaDeSessoes;
|
|
43
44
|
exports.logsDaSessao = logsDaSessao;
|
|
44
45
|
exports.pararSessao = pararSessao;
|
|
45
46
|
exports.comandoDeAttach = comandoDeAttach;
|
|
46
47
|
const adapter = __importStar(require("./adapters/claude-bg"));
|
|
47
|
-
const
|
|
48
|
+
const sessoes_inventario_1 = require("./sessoes-inventario");
|
|
48
49
|
const util_1 = require("./util");
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const dados = vivas.map((s) => {
|
|
61
|
-
const reg = registradas.get(s.sessionId);
|
|
62
|
-
return [
|
|
63
|
-
(s.id ?? s.sessionId).slice(0, 8),
|
|
64
|
-
s.name ?? '(sem nome)',
|
|
65
|
-
s.kind ?? '?',
|
|
66
|
-
s.state ?? s.status ?? '?',
|
|
67
|
-
reg ? `${reg.thread}/${reg.fase}` : '(fora do ork)',
|
|
68
|
-
];
|
|
69
|
-
});
|
|
70
|
-
linhas.push(dados.length === 0
|
|
71
|
-
? 'Nenhuma sessao ativa sob a raiz do projeto.'
|
|
72
|
-
: (0, util_1.tabela)(['ID', 'NOME', 'TIPO', 'ESTADO', 'THREAD/FASE'], dados));
|
|
73
|
-
const idsVivos = new Set(vivas.map((s) => s.sessionId));
|
|
74
|
-
const sumidas = [...registradas.entries()].filter(([id]) => !idsVivos.has(id));
|
|
75
|
-
if (sumidas.length > 0) {
|
|
76
|
-
linhas.push('');
|
|
77
|
-
linhas.push('Sessoes registradas na thread que nao aparecem no runtime agora:');
|
|
78
|
-
for (const [id, reg] of sumidas) {
|
|
79
|
-
linhas.push(` ${id.slice(0, 8)} ${reg.slug} ${reg.thread}/${reg.fase}`);
|
|
80
|
-
}
|
|
81
|
-
linhas.push(' (use --all para incluir sessoes ja concluidas)');
|
|
82
|
-
}
|
|
50
|
+
function textoDoInventario(r) {
|
|
51
|
+
const linhas = [
|
|
52
|
+
`Inventário ${r.escopo.global ? 'global' : 'do projeto'} da conta ${r.escopo.usuario}; histórico: ${r.escopo.historico ? 'incluído' : 'omitido'}.`,
|
|
53
|
+
`Fontes: ${r.fontes.map(f => `${f.origem} (${f.ok ? 'ok' : 'FALHA'})`).join('; ')}`,
|
|
54
|
+
`Total: ${r.total}; sem thread: ${r.semThread}; ambíguas: ${r.ambiguas}; consulta: ${r.ok ? 'válida' : 'INCOMPLETA'}.`,
|
|
55
|
+
];
|
|
56
|
+
if (r.sessoes.length)
|
|
57
|
+
linhas.push((0, util_1.tabela)(['ID', 'RUNTIME', 'ESTADO', 'THREAD/FASE'], r.sessoes.map(s => [s.sessionId, s.runtime, s.state ?? s.status ?? 'unknown',
|
|
58
|
+
s.vinculos.map(v => `${v.thread}/${v.fase}`).join(', ') || '(fora do ork)'])));
|
|
59
|
+
for (const f of r.fontes.filter(f => !f.ok))
|
|
60
|
+
linhas.push(`Falha: ${f.detalhe}`);
|
|
83
61
|
return linhas.join('\n');
|
|
84
62
|
}
|
|
63
|
+
function tabelaDeSessoes(raiz, todas = false) {
|
|
64
|
+
return textoDoInventario((0, sessoes_inventario_1.inventariarSessoes)(raiz, { todas }));
|
|
65
|
+
}
|
|
85
66
|
/** Logs de uma sessao pelo id curto, id completo ou nome. */
|
|
86
67
|
function logsDaSessao(chave, linhas) {
|
|
87
68
|
const r = adapter.logs(chave, linhas);
|