@orkastery/cli 0.2.0 → 0.4.1

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.
Files changed (257) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +86 -65
  3. package/adapters/README.md +30 -15
  4. package/adapters/claude-code/.claude-plugin/plugin.json +11 -5
  5. package/adapters/claude-code/README.md +110 -8
  6. package/adapters/claude-code/commands/check.md +4 -3
  7. package/adapters/claude-code/commands/goal.md +3 -2
  8. package/adapters/claude-code/commands/master.md +3 -2
  9. package/adapters/claude-code/commands/onboarding.md +21 -0
  10. package/adapters/claude-code/commands/ork.md +99 -27
  11. package/adapters/claude-code/hooks/hooks.json +6 -1
  12. package/adapters/claude-code/hooks/ork-guard.js +1 -1
  13. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  14. package/adapters/codex/skills/ork/SKILL.md +57 -0
  15. package/adapters/hermes/README.md +161 -0
  16. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  17. package/adapters/hermes/bin/ork-brain.sh +4 -0
  18. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  19. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  20. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  21. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  22. package/adapters/hermes/hermes.plugin.json +24 -4
  23. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  24. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  25. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  26. package/adapters/openclaw/README.md +136 -27
  27. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  28. package/adapters/openclaw/construir.sh +19 -0
  29. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  30. package/adapters/openclaw/dist/index.js +437 -0
  31. package/adapters/openclaw/openclaw.plugin.json +39 -134
  32. package/adapters/openclaw/package.json +26 -0
  33. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  34. package/adapters/openclaw/src/index.ts +460 -0
  35. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  36. package/adapters/openclaw/tsconfig.json +15 -0
  37. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  38. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  39. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  40. package/assets/docs/produto/README.md +14 -0
  41. package/assets/docs/produto/_modelo-feature.md +59 -0
  42. package/assets/docs/roadmap/README.md +14 -0
  43. package/assets/docs/roadmap/_modelo-item.md +73 -0
  44. package/assets/orkmind-native-schema.json +32 -0
  45. package/assets/orkmind_bridge.py +357 -0
  46. package/assets/orkmind_fixture.py +67 -0
  47. package/assets/orkmind_prospective.py +138 -0
  48. package/assets/reference-tariffs-i07.json +23 -0
  49. package/dist/adapters/claude-bg.js +488 -39
  50. package/dist/adapters/codex-controller-sensor.js +449 -0
  51. package/dist/adapters/codex-controller-worker.js +361 -0
  52. package/dist/adapters/codex-controller.js +252 -0
  53. package/dist/adapters/codex-events.js +205 -0
  54. package/dist/adapters/codex-question.js +26 -0
  55. package/dist/adapters/codex-runner.js +133 -0
  56. package/dist/adapters/codex.js +394 -0
  57. package/dist/agents-md.js +84 -0
  58. package/dist/auditoria.js +12 -9
  59. package/dist/auditrun.js +5 -4
  60. package/dist/board.js +174 -23
  61. package/dist/branch-de-estado.js +136 -0
  62. package/dist/canarios-hitl.js +177 -0
  63. package/dist/canarios-i43.js +543 -0
  64. package/dist/canarios-pulse.js +147 -0
  65. package/dist/canarios-sensores.js +129 -0
  66. package/dist/canarios.js +111 -2
  67. package/dist/catalogo.js +9 -0
  68. package/dist/ci.js +223 -0
  69. package/dist/ciclos.js +2 -1
  70. package/dist/claim-lint.js +64 -0
  71. package/dist/claims.js +60 -0
  72. package/dist/company-brain-capture.js +195 -0
  73. package/dist/company-brain-cli.js +123 -0
  74. package/dist/company-brain-client.js +61 -0
  75. package/dist/company-brain-contract.js +166 -0
  76. package/dist/company-brain-journal.js +192 -0
  77. package/dist/company-brain-mcp.js +33 -0
  78. package/dist/company-brain-migration.js +60 -0
  79. package/dist/company-brain-source.js +177 -0
  80. package/dist/company-brain-worker.js +18 -0
  81. package/dist/conducao-texto.js +61 -0
  82. package/dist/conducao.js +876 -0
  83. package/dist/contrato-publico.js +39 -0
  84. package/dist/creation-operation-store.js +251 -0
  85. package/dist/creation-operation.js +148 -0
  86. package/dist/decisao-autonoma.js +183 -0
  87. package/dist/delegation.js +79 -0
  88. package/dist/demo.js +120 -0
  89. package/dist/docs.js +828 -0
  90. package/dist/doctor.js +184 -25
  91. package/dist/entrega-pr.js +117 -0
  92. package/dist/escopo-escrita.js +71 -0
  93. package/dist/estado-thread.js +222 -0
  94. package/dist/evalrunner.js +12 -0
  95. package/dist/fabrica-estado.js +329 -0
  96. package/dist/fabrica-publicar.js +76 -0
  97. package/dist/fix.js +22 -1
  98. package/dist/gates.js +59 -11
  99. package/dist/handoff.js +39 -23
  100. package/dist/hitl-canais.js +333 -0
  101. package/dist/hitl-classificacao.js +131 -0
  102. package/dist/hitl-contract.js +465 -0
  103. package/dist/hitl-estado.js +136 -0
  104. package/dist/hitl-gates.js +554 -0
  105. package/dist/hitl-ingress-receipt.js +382 -0
  106. package/dist/hitl-local-atestado.js +57 -0
  107. package/dist/hitl-local-receipt.js +328 -0
  108. package/dist/hitl-local.js +143 -0
  109. package/dist/hitl-lock.js +139 -0
  110. package/dist/hitl-lote.js +223 -0
  111. package/dist/hitl-native-offer.js +97 -0
  112. package/dist/hitl-native.js +65 -0
  113. package/dist/hitl-presentation.js +209 -0
  114. package/dist/hitl-public-receipt.js +176 -0
  115. package/dist/hitl-resumo.js +209 -0
  116. package/dist/hitl-sessions.js +475 -0
  117. package/dist/hitl.js +711 -0
  118. package/dist/horario.js +269 -0
  119. package/dist/hosts.js +198 -22
  120. package/dist/index.js +1741 -94
  121. package/dist/indice.js +99 -0
  122. package/dist/init.js +28 -3
  123. package/dist/integracoes-locais.js +17 -0
  124. package/dist/leases.js +65 -21
  125. package/dist/ledger-stats.js +272 -0
  126. package/dist/ledger.js +109 -2
  127. package/dist/licoes.js +221 -0
  128. package/dist/liveness.js +218 -0
  129. package/dist/maestro-actions.js +51 -0
  130. package/dist/maestro-authority.js +152 -0
  131. package/dist/maestro-cli.js +97 -0
  132. package/dist/maestro-contract.js +55 -0
  133. package/dist/maestro-discovery.js +132 -0
  134. package/dist/maestro-runtime.js +268 -0
  135. package/dist/maestro-snapshot.js +86 -0
  136. package/dist/maestro-sources.js +224 -0
  137. package/dist/manifest.js +165 -6
  138. package/dist/maquina.js +102 -0
  139. package/dist/master-audit.js +101 -0
  140. package/dist/master-batch.js +43 -0
  141. package/dist/master-digest.js +149 -0
  142. package/dist/master-migracao.js +155 -0
  143. package/dist/master.js +361 -77
  144. package/dist/mcp-artifacts.js +234 -0
  145. package/dist/mcp-git.js +433 -0
  146. package/dist/mcp-install.js +310 -0
  147. package/dist/mcp-maestro.js +25 -0
  148. package/dist/mcp-server.js +469 -0
  149. package/dist/mcp-ship.js +436 -0
  150. package/dist/mcp-verify.js +173 -0
  151. package/dist/memoria-humana.js +207 -0
  152. package/dist/memoria.js +314 -78
  153. package/dist/memory-migration.js +279 -0
  154. package/dist/memory-prospective.js +148 -0
  155. package/dist/modos-migracao.js +191 -0
  156. package/dist/modos.js +151 -15
  157. package/dist/monitor-lock.js +110 -0
  158. package/dist/objective.js +449 -0
  159. package/dist/ocupacao.js +267 -0
  160. package/dist/onboarding.js +303 -0
  161. package/dist/orkmind.js +389 -90
  162. package/dist/orquestracao.js +96 -69
  163. package/dist/phase.js +612 -151
  164. package/dist/playbook-capabilities.js +150 -0
  165. package/dist/playbook-contracts.js +188 -0
  166. package/dist/policies.js +72 -0
  167. package/dist/portfolio-context.js +61 -0
  168. package/dist/portfolio.js +180 -0
  169. package/dist/preflight.js +207 -0
  170. package/dist/process-audit.js +112 -0
  171. package/dist/project-state.js +93 -0
  172. package/dist/prompts.js +25 -5
  173. package/dist/prova-minima.js +112 -0
  174. package/dist/pulse-cadencia.js +163 -0
  175. package/dist/pulse-consentimento.js +260 -0
  176. package/dist/pulse-delivery.js +323 -0
  177. package/dist/pulse-resposta.js +542 -0
  178. package/dist/pulse.js +262 -0
  179. package/dist/ratelimit.js +35 -2
  180. package/dist/recall.js +80 -3
  181. package/dist/redacao-saida.js +45 -0
  182. package/dist/redacao-url.js +66 -0
  183. package/dist/retry.js +640 -118
  184. package/dist/roadmap-reservas.js +243 -0
  185. package/dist/runtime-ambiente.js +38 -0
  186. package/dist/runtime-context.js +215 -0
  187. package/dist/runtime-profiles.js +869 -0
  188. package/dist/runtimes.js +103 -0
  189. package/dist/sandbox.js +9 -0
  190. package/dist/session-events.js +203 -0
  191. package/dist/session-watcher-claude.js +637 -0
  192. package/dist/session-watcher.js +700 -0
  193. package/dist/sessoes-adopt.js +154 -0
  194. package/dist/sessoes-inventario.js +159 -0
  195. package/dist/sessoes.js +16 -35
  196. package/dist/setup.js +691 -0
  197. package/dist/ship.js +168 -19
  198. package/dist/slug.js +1 -1
  199. package/dist/thread-close.js +115 -0
  200. package/dist/thread.js +142 -28
  201. package/dist/tokens.js +1 -1
  202. package/dist/util.js +4 -2
  203. package/dist/verify-sandbox.js +265 -0
  204. package/dist/verify.js +270 -25
  205. package/dist/versao.js +60 -0
  206. package/dist/worktree.js +31 -2
  207. package/dist/write-activation.js +291 -0
  208. package/dist/yaml.js +5 -1
  209. package/eval/casos/master-metrics.json +1 -1
  210. package/eval/casos/onboarding.json +102 -0
  211. package/eval/casos/orkastery-bootstrap.json +37 -3
  212. package/eval/casos/scope-check-capability-map.json +45 -7
  213. package/eval/casos/ship-release.json +3 -3
  214. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  215. package/eval/fixtures/b2-master-log/caso.json +1 -1
  216. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  217. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  218. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  219. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  220. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  221. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  222. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  223. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  224. package/eval/fixtures/fx-happy/caso.json +6 -4
  225. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  226. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  227. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  228. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  229. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  230. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  231. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  232. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  233. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  234. package/monitor/company-brain.cjs +17 -0
  235. package/monitor/pulse-scope.cjs +45 -0
  236. package/monitor/pulse.cron +18 -0
  237. package/monitor/varredura-pulse.sh +27 -0
  238. package/package.json +28 -7
  239. package/references/definition-of-done.md +2 -2
  240. package/schemas/claims.schema.json +25 -0
  241. package/schemas/company-brain.schema.json +1158 -0
  242. package/schemas/creation-operation.schema.json +365 -0
  243. package/schemas/maestro-snapshot.schema.json +2716 -0
  244. package/skills/README.md +3 -3
  245. package/skills/core/onboarding/SKILL.md +50 -0
  246. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  247. package/skills/core/thread-state/SKILL.md +3 -1
  248. package/skills/governance/decision-triage/SKILL.md +4 -4
  249. package/skills/governance/narrative-guardian/SKILL.md +1 -1
  250. package/skills/governance/roadmap-keeper/SKILL.md +1 -1
  251. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
  252. package/skills/observability/thread-tracing/SKILL.md +1 -1
  253. package/skills/phases/check-quality/SKILL.md +2 -2
  254. package/skills/phases/goal-definition/SKILL.md +1 -1
  255. package/skills/phases/master-metrics/SKILL.md +9 -7
  256. package/skills/phases/plan-specification/SKILL.md +1 -1
  257. package/skills/phases/ship-release/SKILL.md +1 -1
@@ -0,0 +1,147 @@
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.CANARIOS_PULSE = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const node_child_process_1 = require("node:child_process");
40
+ const node_perf_hooks_1 = require("node:perf_hooks");
41
+ const sandbox_1 = require("./sandbox");
42
+ const thread_1 = require("./thread");
43
+ const worktree_1 = require("./worktree");
44
+ const estado_thread_1 = require("./estado-thread");
45
+ const ledger_1 = require("./ledger");
46
+ const company_brain_journal_1 = require("./company-brain-journal");
47
+ const node_crypto_1 = require("node:crypto");
48
+ const hitl_gates_1 = require("./hitl-gates");
49
+ const liveness_1 = require("./liveness");
50
+ const hitl_1 = require("./hitl");
51
+ const pulse_1 = require("./pulse");
52
+ const orquestracao_1 = require("./orquestracao");
53
+ const pulse_delivery_1 = require("./pulse-delivery");
54
+ const catalogo_1 = require("./catalogo");
55
+ exports.CANARIOS_PULSE = [
56
+ { id: 'fx-estado-dividido', sobre: '90 eventos na worktree não podem parecer 14 na main', precisaDeGit: true, rodar: () => {
57
+ const s = (0, sandbox_1.sandboxGit)('estado-dividido');
58
+ try {
59
+ const t = (0, thread_1.novaThread)(s.carregado, { nome: 'estado', modo: 'auto' }).thread, wt = (0, worktree_1.garantirWorktree)(s.carregado, t.id).dir;
60
+ const local = path.join(wt, '.orkastery/threads', t.id), main = (0, thread_1.dirThread)(s.dir, t.id);
61
+ fs.unlinkSync(local);
62
+ fs.mkdirSync(local);
63
+ const eventos = Array.from({ length: 90 }, (_, i) => JSON.stringify({ tipo: 'runtime_event', n: i }) + '\n');
64
+ fs.writeFileSync(path.join(main, 'ledger.jsonl'), eventos.slice(0, 14).join(''));
65
+ fs.writeFileSync(path.join(local, 'ledger.jsonl'), eventos.join(''));
66
+ const audit = (0, estado_thread_1.auditarEstado)(s.dir, t.id, wt), sync = (0, worktree_1.sincronizarWorktree)(s.carregado, t.id);
67
+ return { eventosMain: 14, eventosWorktree: 90, auditOk: audit.nivel === 'ok', syncOk: sync.ok,
68
+ copiasPreservadas: fs.readFileSync(path.join(local, 'ledger.jsonl'), 'utf8') === eventos.join('') &&
69
+ fs.readFileSync(path.join(main, 'ledger.jsonl'), 'utf8') === eventos.slice(0, 14).join('') };
70
+ }
71
+ finally {
72
+ s.limpar();
73
+ }
74
+ } },
75
+ { id: 'fx-fase-orfa', sobre: 'replay dos três despachos órfãos de 07/09/2026', precisaDeGit: true, rodar: ctx => {
76
+ const fixture = JSON.parse(fs.readFileSync(path.join(ctx.catalogo, 'eval/fixtures/fx-fase-orfa/caso.json'), 'utf8'));
77
+ const resultados = [];
78
+ for (const caso of fixture.replay) {
79
+ const s = (0, sandbox_1.sandboxGit)('replay-orfa');
80
+ try {
81
+ const t = (0, thread_1.novaThread)(s.carregado, { nome: `replay fixture ${resultados.length + 1}`, modo: 'auto' }).thread;
82
+ // I-41 (GO-FIX 1, D11): a decisao autonoma de 07/09 e linha HISTORICA, anterior ao rastro
83
+ // tipado. O replay a reproduz como estava, sem passar pela exigencia da escrita nova, que e
84
+ // exatamente a promessa de D11: evento antigo continua legivel, nenhuma linha e reescrita.
85
+ for (const e of caso.eventos) {
86
+ if (e.tipo === ledger_1.TIPOS_DE_EVENTO.decisaoAutonoma)
87
+ (0, company_brain_journal_1.durableAppend)((0, ledger_1.caminhoLedger)((0, thread_1.dirThread)(s.dir, t.id)), { ...e, thread: t.id, eventId: (0, node_crypto_1.randomUUID)() });
88
+ else
89
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(s.dir, t.id), t.id, e.tipo, { ...e, thread: t.id });
90
+ }
91
+ resultados.push(...(0, liveness_1.detectarFasesOrfas)(s.carregado, { quando: caso.consultaEm, fontes: () => ({}) }));
92
+ }
93
+ finally {
94
+ s.limpar();
95
+ }
96
+ }
97
+ return { detectadas: resultados.length, latenciaMaxMin: Math.max(0, ...resultados.map(r => r.silencioHaMin)),
98
+ motivos: [...new Set(resultados.map(r => r.motivo))], automaticas: resultados.filter(r => r.retry.automatica).length,
99
+ precisamDeHumano: resultados.filter(r => !r.retry.automatica).length };
100
+ } },
101
+ { id: 'fx-hitl-latency', sobre: 'SIMULADO: alerta I-01 e resposta correlacionada via CLI até human_gate em menos de 60 s', precisaDeGit: true, rodar: ctx => {
102
+ const s = (0, sandbox_1.sandboxGit)('hitl-latency');
103
+ try {
104
+ const consulta = { ok: true, detalhe: '', sessoes: [{ id: 'fake', sessionId: 'fake', state: 'blocked', startedAt: Date.parse('2026-09-07T09:00:00Z') }] };
105
+ const casa = path.join(s.dir, 'host');
106
+ (0, hitl_1.varrerSessoes)({ raiz: s.dir, casa, consulta, semLogs: true, registrar: true, registrarMaquina: true, agora: '2026-09-07T10:01:00Z' });
107
+ const quando = '2026-09-07T10:05:00Z';
108
+ const radar = (0, hitl_1.varrerSessoes)({ raiz: s.dir, casa, consulta, semLogs: true, registrar: true, registrarMaquina: true, agora: quando });
109
+ const pulse = (0, pulse_1.comporPulse)(s.carregado, { radar, monitor: (0, orquestracao_1.montarMonitor)(s.carregado, { agora: quando, estados: new Map() }), batch: [], orfas: [] });
110
+ const sink = path.join(s.dir, 'sink.txt');
111
+ const config = { raiz: s.dir, quando, consultar: () => pulse, transporte: { executavel: process.execPath,
112
+ argumentos: ['-e', 'require("fs").writeFileSync(process.argv[1],process.argv[2])', sink, '{{mensagem}}'] } };
113
+ const primeira = (0, pulse_delivery_1.varrerPulse)(config), segunda = (0, pulse_delivery_1.varrerPulse)(config);
114
+ // Medição real do caminho local, com identidade/chave exclusivamente SIMULADAS.
115
+ // Não mede Telegram nem atesta o ingresso nativo do gateway (T13).
116
+ const t = (0, thread_1.novaThread)(s.carregado, { nome: 'resposta simulada', modo: 'classic' }).thread;
117
+ (0, ledger_1.registrar)((0, thread_1.dirThread)(s.dir, t.id), t.id, 'phase_result', { fase: 'GOAL', evidencia: 'SIMULADO' });
118
+ const pedido = (0, hitl_gates_1.abrirPedidoGate)(s.dir, t.id);
119
+ const chave = 'canario-SIMULADO-sem-credencial-real-000';
120
+ const resposta = { origem: 'telegram', por: 'telegram:42', mensagem: 'telegram:-7:99',
121
+ resposta: '1', recebidoEm: new Date().toISOString() };
122
+ const envelope = { ...resposta, prova: (0, hitl_gates_1.assinaturaDaResposta)(t.id, pedido.id, resposta, chave) };
123
+ const argv = [(0, catalogo_1.cliDoCatalogo)(ctx.catalogo), 'gate', 'answer', t.id, pedido.id,
124
+ '--resposta-stdin', '--origem', 'telegram', '--por', resposta.por, '--mensagem', resposta.mensagem];
125
+ const ambiente = { ...process.env, ORK_HITL_INGRESS_KEY: chave, ORK_HITL_TELEGRAM_USERS: '42', ORK_HITL_TELEGRAM_CHATS: '-7' };
126
+ const enviar = (corpo) => (0, node_child_process_1.spawnSync)(process.execPath, argv, { cwd: s.dir, encoding: 'utf8',
127
+ input: JSON.stringify(corpo), env: ambiente, timeout: 10000, maxBuffer: 65536 });
128
+ const inicio = node_perf_hooks_1.performance.now(), aceita = enviar(envelope);
129
+ const gate = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(s.dir, t.id)).find(e => e.tipo === 'human_gate');
130
+ const latenciaRespostaMs = node_perf_hooks_1.performance.now() - inicio;
131
+ const repetida = enviar(envelope), adulterada = enviar({ ...envelope, resposta: '2' });
132
+ return { latenciaMin: radar.sessoes[0].paradaHaMin, enviadas: primeira.enviadas, repetidas: segunda.enviadas,
133
+ // I-41: o transporte recebe o RESUMO composto pelo nucleo, nao uma mensagem por item. A
134
+ // sonda continua sendo "o texto composto chegou ao sink", e o cabecalho prova composicao
135
+ // porque carrega a data-hora formatada no fuso do dono, nao uma constante do codigo.
136
+ sinkRecebeu: fs.existsSync(sink) && fs.readFileSync(sink, 'utf8').includes('Orkastery, resumo de '),
137
+ simulado: true, respostaRecebida: aceita.status === 0 && gate?.pedidoId === pedido.id && gate?.estado === 'aprovado',
138
+ latenciaRespostaMs, respostaAbaixo60s: !!gate && aceita.status === 0 && latenciaRespostaMs < 60000,
139
+ idempotente: repetida.status === 0 && JSON.parse(repetida.stdout).repetida === true &&
140
+ (0, ledger_1.lerLedger)((0, thread_1.dirThread)(s.dir, t.id)).filter(e => e.tipo === 'human_gate').length === 1,
141
+ adulteradaRecusada: adulterada.status !== 0, conteudoAusente: !!gate && gate.resposta === undefined && gate.prova === undefined };
142
+ }
143
+ finally {
144
+ s.limpar();
145
+ }
146
+ } },
147
+ ];
@@ -0,0 +1,129 @@
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.CANARIO_SENSORES = void 0;
37
+ /** T8: subprocessos, CLI e estado canônico reais; protocolo Codex sintético. */
38
+ const fs = __importStar(require("node:fs"));
39
+ const path = __importStar(require("node:path"));
40
+ const node_child_process_1 = require("node:child_process");
41
+ const sandbox_1 = require("./sandbox");
42
+ const thread_1 = require("./thread");
43
+ const ledger_1 = require("./ledger");
44
+ const codex_runner_1 = require("./adapters/codex-runner");
45
+ const session_watcher_1 = require("./session-watcher");
46
+ const estado_thread_1 = require("./estado-thread");
47
+ const catalogo_1 = require("./catalogo");
48
+ const linha = (e) => JSON.stringify(e) + '\n';
49
+ function esperar(teste) {
50
+ const limite = Date.now() + 5000;
51
+ while (!teste()) {
52
+ if (Date.now() >= limite)
53
+ throw new Error('subprocesso do canário não terminou em 5000 ms');
54
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 10);
55
+ }
56
+ }
57
+ exports.CANARIO_SENSORES = {
58
+ id: 'fx-sensores-runtime', sobre: 'hooks, supervisor e watcher integrados em sandbox Git', precisaDeGit: true,
59
+ rodar: ({ catalogo }) => {
60
+ const s = (0, sandbox_1.sandboxGit)('sensores-runtime');
61
+ try {
62
+ const t = (0, thread_1.novaThread)(s.carregado, { nome: 'sensores', modo: 'auto', criarWorktree: true }).thread;
63
+ const dir = (0, thread_1.dirThread)(s.dir, t.id), wt = t.worktree;
64
+ const iniciadoEm = new Date(Date.now() - 1000).toISOString();
65
+ const sessao = (sessionId, runtime) => {
66
+ t.sessoes.push({ sessionId, runtime, slug: t.slug, fase: 'GO', bloco: 'GO', despachadaEm: iniciadoEm,
67
+ promptPath: '', promptSha256: '', verificada: true });
68
+ (0, thread_1.gravarThread)(s.dir, t);
69
+ };
70
+ sessao('fixture-claude', 'claude-bg');
71
+ const hook = path.join(catalogo, 'adapters/claude-code/hooks/ork-sensor.js');
72
+ const cli = (0, catalogo_1.cliDoCatalogo)(catalogo);
73
+ const start = Date.now();
74
+ const h = (0, node_child_process_1.spawnSync)(process.execPath, [hook], { cwd: wt, encoding: 'utf8', timeout: 5000,
75
+ input: JSON.stringify({ cwd: wt, session_id: 'fixture-claude', hook_event_name: 'PermissionRequest', tool_use_id: 'fixture-tool' }),
76
+ env: { ...process.env, ORK_SENSOR_CLI: cli } });
77
+ if (h.status !== 0 || h.stderr || h.stdout)
78
+ throw new Error('hook/CLI do canário indisponível');
79
+ const hookLatenciaMs = Date.now() - start;
80
+ const bloqueio = (0, ledger_1.lerLedger)(dir).find(e => e.tipo === 'sessao_bloqueada');
81
+ const carimboLatenciaMs = bloqueio ? Date.parse(String(bloqueio.recebidoEm)) - Date.parse(bloqueio.ts) : null;
82
+ const classificacoes = [];
83
+ let duplicatas = 0, subprocessosComRecibo = 0;
84
+ for (const [indice, mensagem] of ['Concluído.', 'Você confirma?', 'Motivo: lease.busy'].entries()) {
85
+ const sid = `fixture-codex-${indice}`;
86
+ sessao(sid, 'codex');
87
+ const log = path.join(dir, 'sessoes', `${sid}.jsonl`);
88
+ const protocolo = linha({ type: 'thread.started', thread_id: sid }) + linha({ type: 'turn.started' }) +
89
+ linha({ type: 'turn.completed', last_agent_message: mensagem, usage: { input_tokens: 10, output_tokens: 2 } });
90
+ const metadados = (0, codex_runner_1.iniciarSupervisor)([process.execPath, '-e', 'process.stdout.write(process.argv[1])', protocolo], wt, log, process.env);
91
+ esperar(() => fs.existsSync(metadados.reciboPath));
92
+ subprocessosComRecibo++;
93
+ (0, ledger_1.registrar)(dir, t.id, 'session_sensor_registered', { sessionId: sid, despachoEm: iniciadoEm, logPath: log, ...metadados });
94
+ const r = (0, session_watcher_1.observarSessao)({ ...s.carregado, raiz: wt }, sid, { rollout: null });
95
+ classificacoes.push(r.classificacao ?? 'unavailable');
96
+ (0, session_watcher_1.observarSessao)({ ...s.carregado, raiz: wt }, sid, { rollout: null });
97
+ duplicatas += Math.abs((0, ledger_1.lerLedger)(dir).filter(e => e.tipo === 'phase_result' && e.sessionId === sid).length - 1);
98
+ }
99
+ // A identidade vem de um processo realmente executado e encerrado, sem recibo.
100
+ const runner = require.resolve('./adapters/codex-runner');
101
+ const morto = (0, node_child_process_1.spawnSync)(process.execPath, ['-e', `console.log(JSON.stringify(require(process.argv[1]).identidadeProcesso(process.pid)))`, runner], { cwd: wt, encoding: 'utf8', timeout: 5000 });
102
+ if (morto.status !== 0)
103
+ throw new Error('processo de morte do canário indisponível');
104
+ const filho = JSON.parse(morto.stdout);
105
+ if ((0, codex_runner_1.estadoProcesso)(filho) !== 'ausente')
106
+ throw new Error('processo ainda não está ausente');
107
+ const sid = 'fixture-morto';
108
+ sessao(sid, 'codex');
109
+ const log = path.join(dir, 'sessoes', `${sid}.jsonl`), inicio = Date.parse(iniciadoEm);
110
+ fs.writeFileSync(log, linha({ type: 'thread.started', thread_id: sid }));
111
+ fs.utimesSync(log, inicio / 1000, inicio / 1000);
112
+ const processo = { schema: 'ork.codex-process/v1', iniciadoEm, supervisor: (0, codex_runner_1.identidadeProcesso)(process.pid), filho };
113
+ fs.writeFileSync(log + '.process.json', JSON.stringify(processo));
114
+ (0, ledger_1.registrar)(dir, t.id, 'session_sensor_registered', { sessionId: sid, despachoEm: iniciadoEm, logPath: log, processoPath: log + '.process.json' });
115
+ const antes = (0, session_watcher_1.observarSessao)(s.carregado, sid, { rollout: null, agoraMs: inicio + session_watcher_1.LIMITE_MORTE_MS - 1 });
116
+ (0, session_watcher_1.observarSessao)(s.carregado, sid, { rollout: null, agoraMs: inicio + session_watcher_1.LIMITE_MORTE_MS });
117
+ const mortes = (0, ledger_1.lerLedger)(dir).filter(e => e.tipo === 'sessao_morta' && e.sessionId === sid);
118
+ return { tipoProva: 'harness isolado; protocolo Codex sintético', classificacoes, subprocessosComRecibo,
119
+ hookLatenciaMs, carimboLatenciaMs, hookAbaixo5s: !!bloqueio && hookLatenciaMs < 5000 && carimboLatenciaMs !== null && carimboLatenciaMs < 5000,
120
+ morteAntesDoLimite: antes.concluido, morteLatenciaMs: mortes[0]?.morteLatenciaMs ?? null,
121
+ mortosSemEvento: mortes.length === 1 ? 0 : 1, duplicatas,
122
+ estadoUnico: (0, estado_thread_1.auditarEstado)(s.dir, t.id, wt).nivel === 'ok' &&
123
+ fs.realpathSync(path.join(wt, '.orkastery/threads', t.id)) === dir };
124
+ }
125
+ finally {
126
+ s.limpar();
127
+ }
128
+ },
129
+ };
package/dist/canarios.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * Os 6 canarios de `ork eval` (bloco B4).
3
+ * Os 7 canarios de `ork eval` (6 do bloco B4 + fx-codex-dry da homologacao do codex).
4
4
  *
5
5
  * Canario nao e teste unitario: e um comportamento inteiro do produto, exercitado ponta a
6
6
  * ponta contra git de verdade, que precisa continuar acontecendo depois de qualquer mudanca.
@@ -61,11 +61,21 @@ const leases_1 = require("./leases");
61
61
  const master_1 = require("./master");
62
62
  const policies_1 = require("./policies");
63
63
  const phase_1 = require("./phase");
64
+ const setup_1 = require("./setup");
64
65
  const sandbox_1 = require("./sandbox");
65
66
  Object.defineProperty(exports, "gitDisponivel", { enumerable: true, get: function () { return sandbox_1.gitDisponivel; } });
66
67
  const thread_1 = require("./thread");
67
68
  const verify_1 = require("./verify");
68
69
  const worktree_1 = require("./worktree");
70
+ const canarios_pulse_1 = require("./canarios-pulse");
71
+ const canarios_sensores_1 = require("./canarios-sensores");
72
+ const canarios_hitl_1 = require("./canarios-hitl");
73
+ const canarios_i43_1 = require("./canarios-i43");
74
+ const objective_1 = require("./objective");
75
+ const maestro_discovery_1 = require("./maestro-discovery");
76
+ const maestro_cli_1 = require("./maestro-cli");
77
+ const maestro_actions_1 = require("./maestro-actions");
78
+ const ledger_1 = require("./ledger");
69
79
  function comSandbox(nome, fn) {
70
80
  const s = (0, sandbox_1.sandboxGit)(nome);
71
81
  try {
@@ -81,7 +91,7 @@ const fxHappy = {
81
91
  sobre: 'thread aberta, fase montada com prompt gravado e claim verificada no HEAD real',
82
92
  precisaDeGit: true,
83
93
  rodar: () => comSandbox('happy', (s) => {
84
- const { thread } = (0, thread_1.novaThread)(s.carregado, { nome: 'checkout', modo: 'ork' });
94
+ const { thread } = (0, thread_1.novaThread)(s.carregado, { nome: 'checkout', modo: 'classic' });
85
95
  const corrida = (0, phase_1.rodarFase)(s.carregado, thread.id, {
86
96
  fase: 'GOAL',
87
97
  prompt: 'Mapear o objetivo do checkout',
@@ -256,6 +266,98 @@ const fxConcurrency = {
256
266
  };
257
267
  }),
258
268
  };
269
+ /**
270
+ * fx-codex-dry: o runtime codex despacha pelo caminho real do setup, sem rede.
271
+ *
272
+ * Nasce da homologacao do segundo runtime (thread ork-homologarcod): um `setup.json`
273
+ * apontando o bloco para o codex tem de mudar o COMANDO que o despacho monta, e o
274
+ * default sem setup tem de continuar saindo pelo claude-bg byte a byte (paridade sem
275
+ * downgrade). Tudo em dry-run: canario nao gasta assinatura de ninguem.
276
+ */
277
+ const fxCodexDry = {
278
+ id: 'fx-codex-dry',
279
+ sobre: 'setup do bloco levando o despacho ao codex, com o claude-bg intacto como padrao',
280
+ precisaDeGit: true,
281
+ rodar: () => comSandbox('codex-dry', (s) => {
282
+ const padrao = (0, thread_1.novaThread)(s.carregado, { nome: 'entrega padrao', modo: 'auto' }).thread;
283
+ const semSetup = (0, phase_1.rodarFase)(s.carregado, padrao.id, {
284
+ fase: 'GOAL',
285
+ prompt: 'Mapear o objetivo',
286
+ dryRun: true,
287
+ });
288
+ (0, setup_1.editarBloco)(s.dir, 'auto', 1, { runtime: 'codex', model: 'gpt-6-astra', effort: 'xhigh' });
289
+ const custom = (0, thread_1.novaThread)(s.carregado, { nome: 'entrega codex', modo: 'auto' }).thread;
290
+ const comSetup = (0, phase_1.rodarFase)(s.carregado, custom.id, {
291
+ fase: 'GOAL',
292
+ prompt: 'Mapear o objetivo',
293
+ dryRun: true,
294
+ });
295
+ return {
296
+ padraoRuntime: semSetup.runtime,
297
+ padraoComando: semSetup.comando[0],
298
+ codexRuntime: comSetup.runtime,
299
+ codexComando: comSetup.comando.slice(0, 2).join(' '),
300
+ codexModel: comSetup.model,
301
+ codexEffort: comSetup.effort,
302
+ codexHeadless: comSetup.comando[1] === 'app-server' && comSetup.comando.includes('--listen') && comSetup.comando.includes('stdio://'),
303
+ nadaDespachado: semSetup.dryRun && comSetup.dryRun,
304
+ };
305
+ }),
306
+ };
307
+ /** fx-objective-oscillation: revisões repetidas pausam o objetivo em vez de rodar para sempre. */
308
+ const fxObjectiveOscillation = {
309
+ id: 'fx-objective-oscillation',
310
+ sobre: 'Objective Envelope revisado três vezes aciona a guarda de oscilação',
311
+ precisaDeGit: true,
312
+ rodar: () => comSandbox('objective-oscillation', (s) => {
313
+ let objective = (0, objective_1.createObjective)(s.carregado, { title: 'checkout premium', request: 'entregar valor', doneWhen: ['prova verde'] });
314
+ for (let revision = 1; revision <= 3; revision++)
315
+ objective = (0, objective_1.reviseObjective)(s.dir, objective.id, `entregar valor v${revision}`);
316
+ return {
317
+ threads: objective.threads.length,
318
+ revisions: objective.revisions,
319
+ state: objective.status,
320
+ reason: objective.pauseReason,
321
+ history: objective.envelopeHistory.length,
322
+ currentVersion: objective.envelope.version,
323
+ };
324
+ }),
325
+ };
326
+ /** Projeto temporário real; nenhum host/humano real é simulado como ativação live. */
327
+ const fxMaestroBootstrap = {
328
+ id: 'fx-maestro-bootstrap',
329
+ sobre: 'SIMULADO: consulta limpa, ação com readback e policy block no modo Auto',
330
+ precisaDeGit: true,
331
+ rodar: () => comSandbox('maestro-bootstrap', s => {
332
+ const before = (0, thread_1.listarIds)(s.dir).length;
333
+ let raw = '';
334
+ const exit = (0, maestro_cli_1.runMaestroCli)(['--json'], s.dir, {}, { out: v => { raw = v; }, err: () => { } });
335
+ const clean = JSON.parse(raw);
336
+ const createsThread = (0, thread_1.listarIds)(s.dir).length !== before;
337
+ const t = (0, thread_1.novaThread)(s.carregado, { nome: 'Canário Maestro', modo: 'auto' }).thread;
338
+ const context = (0, maestro_discovery_1.discoverMaestro)({ cwd: s.dir });
339
+ const snapshot = () => (0, maestro_cli_1.readMaestro)(context, { host: { tools: ['ork_thread_status', 'ork_phase_run'], child: true } });
340
+ const state = snapshot();
341
+ let calls = 0;
342
+ const result = (0, maestro_actions_1.performMaestroAction)(context, { id: `thread.status:${t.id}`, expectedFingerprint: state.fingerprint }, {
343
+ snapshot, receipts: () => null, readback: id => (0, thread_1.lerThread)(s.dir, id),
344
+ operations: { 'thread.status': id => { calls++; return (0, thread_1.lerThread)(s.dir, id); } },
345
+ });
346
+ // A policy real corre antes do despacho e não grava o prompt sensível.
347
+ s.carregado.manifesto.policies = { segredo_em_prompt: 'block' };
348
+ const blocked = (0, phase_1.rodarFase)(s.carregado, t.id, { fase: 'GOAL', dryRun: true,
349
+ prompt: 'FIXTURE sintética ' + 'sk-ant-' + 'x'.repeat(24) });
350
+ const event = (0, ledger_1.lerLedger)((0, thread_1.dirThread)(s.dir, t.id)).find(e => e.tipo === 'gate_blocked' && e.motivo === 'policy.violation');
351
+ return {
352
+ simulado: true, contract: clean.schema, queryExit: exit, createsThread,
353
+ childRedispatch: state.sections.nextActions.items.some(i => i.action?.operation === 'phase' && i.action.available),
354
+ actionCalls: calls, readbackMatches: result.readback.id === t.id && result.receipt.id === t.id,
355
+ autoPolicyBlocked: blocked.bloqueado && blocked.motivo === 'policy.violation' && !!event?.reprovaEmTodoModo,
356
+ noDispatch: !(0, ledger_1.lerLedger)((0, thread_1.dirThread)(s.dir, t.id)).some(e => e.tipo === 'phase_dispatch'),
357
+ promptNotWritten: !fs.existsSync(blocked.promptPath),
358
+ };
359
+ }),
360
+ };
259
361
  /** Os canarios registrados, na ordem em que o `ork eval` os roda. */
260
362
  exports.CANARIOS = [
261
363
  fxHappy,
@@ -264,6 +366,13 @@ exports.CANARIOS = [
264
366
  fxWikiDestroy,
265
367
  fxSchemaDrift,
266
368
  fxConcurrency,
369
+ fxCodexDry,
370
+ fxObjectiveOscillation,
371
+ fxMaestroBootstrap,
372
+ ...canarios_pulse_1.CANARIOS_PULSE,
373
+ canarios_sensores_1.CANARIO_SENSORES,
374
+ ...canarios_hitl_1.CANARIOS_HITL,
375
+ ...canarios_i43_1.CANARIOS_I43,
267
376
  ];
268
377
  /** Um canario por id, ou null quando a fixture aponta para um canario que nao existe. */
269
378
  function canarioPorId(id) {
package/dist/catalogo.js CHANGED
@@ -45,6 +45,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
45
45
  exports.BUCKETS = void 0;
46
46
  exports.raizDoCatalogo = raizDoCatalogo;
47
47
  exports.exigirCatalogo = exigirCatalogo;
48
+ exports.cliDoCatalogo = cliDoCatalogo;
48
49
  exports.skillsDoCatalogo = skillsDoCatalogo;
49
50
  exports.referenciasDoCatalogo = referenciasDoCatalogo;
50
51
  const fs = __importStar(require("node:fs"));
@@ -91,6 +92,14 @@ exports.BUCKETS = [
91
92
  'observability',
92
93
  ];
93
94
  /** Todas as skills do catalogo, varridas do disco (nunca de uma lista escrita a mao). */
95
+ /**
96
+ * O CLI que um canario chama. No repositorio ele fica em `core/dist/`; no pacote npm o catalogo e
97
+ * a propria raiz do pacote e o CLI e o que esta rodando, ao lado deste arquivo compilado.
98
+ */
99
+ function cliDoCatalogo(catalogo) {
100
+ const doRepositorio = path.join(catalogo, 'core', 'dist', 'index.js');
101
+ return fs.existsSync(doRepositorio) ? doRepositorio : path.join(__dirname, 'index.js');
102
+ }
94
103
  function skillsDoCatalogo(raiz) {
95
104
  const achadas = [];
96
105
  for (const bucket of exports.BUCKETS) {