@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
package/dist/modos.js
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Modos de conducao por #TAG (
|
|
3
|
+
* Modos de conducao por #TAG (guia: docs/guias/modos.md).
|
|
4
4
|
*
|
|
5
5
|
* Regra central, nao negociavel: o modo afrouxa a PAUSA, nunca a VERIFICACAO.
|
|
6
6
|
* Claims, verify, policies e gates tipados rodam identicos em todos os modos;
|
|
7
7
|
* o que muda e se o veredito espera o humano ou segue sozinho com registro no ledger.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.TAG_DE_MODO_DESCONHECIDO = exports.ORDEM_DOS_MODOS = exports.MODOS = exports.INVARIANTES = void 0;
|
|
10
|
+
exports.TAG_DE_MODO_DESCONHECIDO = exports.MOTIVO_MODO_APOSENTADO = exports.ORDEM_DOS_MODOS = exports.MODOS_LEGADOS = exports.MODOS_APOSENTADOS = exports.MODOS = exports.INVARIANTES = void 0;
|
|
11
11
|
exports.slugDasFases = slugDasFases;
|
|
12
|
+
exports.substitutosVivos = substitutosVivos;
|
|
13
|
+
exports.cicloCompleto = cicloCompleto;
|
|
14
|
+
exports.modoAposentado = modoAposentado;
|
|
15
|
+
exports.recusaDeModoAposentado = recusaDeModoAposentado;
|
|
16
|
+
exports.exigirModoVivo = exigirModoVivo;
|
|
12
17
|
exports.parseModo = parseModo;
|
|
13
18
|
exports.extrairTagDoPedido = extrairTagDoPedido;
|
|
19
|
+
exports.extrairTagAposentadaDoPedido = extrairTagAposentadaDoPedido;
|
|
14
20
|
exports.tagDoModo = tagDoModo;
|
|
15
21
|
exports.definicaoDoModo = definicaoDoModo;
|
|
16
22
|
exports.pausasDoModo = pausasDoModo;
|
|
@@ -23,7 +29,7 @@ exports.INVARIANTES = [
|
|
|
23
29
|
'Claims, verify e policies rodam identicos em todos os modos.',
|
|
24
30
|
'Policy `block` pausa qualquer modo, inclusive #Auto.',
|
|
25
31
|
'Escalacao tipada para humano pausa qualquer modo, inclusive #Auto.',
|
|
26
|
-
'
|
|
32
|
+
'Toda entrega fecha com indice derivado do ledger; a nota humana, quando vier, sobrescreve.',
|
|
27
33
|
'Toda decisao autonoma vai ao ledger com quem decidiu, evidencia e razao.',
|
|
28
34
|
];
|
|
29
35
|
/** Monta a parte 3 do slug para um conjunto de fases (visao, secao 3.4). */
|
|
@@ -45,7 +51,14 @@ function bloco(fases, pausaSobre) {
|
|
|
45
51
|
};
|
|
46
52
|
}
|
|
47
53
|
const SEM_PAUSA = '';
|
|
48
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* A matriz dos modos, do mais HITL ao mais autonomo.
|
|
56
|
+
*
|
|
57
|
+
* I-43: ela guarda tambem os aposentados, de proposito. Quem encolhe e
|
|
58
|
+
* `ORDEM_DOS_MODOS`, que alimenta todo ESCRITOR. Se `look` saisse daqui,
|
|
59
|
+
* `tagDoModo` devolveria `#?look` para a thread `ork-smokeb0` de 02/09 e o
|
|
60
|
+
* board passaria a mostrar lixo no lugar da tag de uma thread que existe.
|
|
61
|
+
*/
|
|
49
62
|
exports.MODOS = {
|
|
50
63
|
look: {
|
|
51
64
|
modo: 'look',
|
|
@@ -84,7 +97,7 @@ exports.MODOS = {
|
|
|
84
97
|
bloco(['SHIP', 'MASTER'], SEM_PAUSA),
|
|
85
98
|
],
|
|
86
99
|
pausas: 3,
|
|
87
|
-
recomendadoPara: 'O padrao: premissas delicadas com entrega confiavel
|
|
100
|
+
recomendadoPara: 'O padrao: premissas delicadas com entrega confiavel',
|
|
88
101
|
},
|
|
89
102
|
maestro: {
|
|
90
103
|
modo: 'maestro',
|
|
@@ -95,7 +108,7 @@ exports.MODOS = {
|
|
|
95
108
|
bloco(['MASTER'], SEM_PAUSA),
|
|
96
109
|
],
|
|
97
110
|
pausas: 1,
|
|
98
|
-
recomendadoPara: 'Solucoes claras e ageis, sem muitos riscos ou tradeoffs
|
|
111
|
+
recomendadoPara: 'Solucoes claras e ageis, sem muitos riscos ou tradeoffs',
|
|
99
112
|
},
|
|
100
113
|
auto: {
|
|
101
114
|
modo: 'auto',
|
|
@@ -104,9 +117,101 @@ exports.MODOS = {
|
|
|
104
117
|
pausas: 0,
|
|
105
118
|
recomendadoPara: 'Solucoes menores, docs, estudos, pesquisas, configuracoes, auditorias, migracoes',
|
|
106
119
|
},
|
|
120
|
+
// I-42: uma fase so, a GO, sem cerimonia. Nao autoriza push sozinho (fora de
|
|
121
|
+
// MODOS_QUE_AUTORIZAM_PUSH) e nao escreve contrato publico (ver contrato-publico.ts).
|
|
122
|
+
fast: {
|
|
123
|
+
modo: 'fast',
|
|
124
|
+
tag: '#Fast',
|
|
125
|
+
blocos: [bloco(['GO'], SEM_PAUSA)],
|
|
126
|
+
pausas: 0,
|
|
127
|
+
recomendadoPara: 'Pedido pequeno e claro, de minutos: uma fase so (GO), sem cerimonia; o push pede autorizacao',
|
|
128
|
+
},
|
|
107
129
|
};
|
|
108
|
-
/**
|
|
109
|
-
|
|
130
|
+
/**
|
|
131
|
+
* Os modos APOSENTADOS pela I-43, na ordem do espectro.
|
|
132
|
+
*
|
|
133
|
+
* Domicilio unico da lista. Nenhum outro arquivo repete estes dois literais.
|
|
134
|
+
*/
|
|
135
|
+
exports.MODOS_APOSENTADOS = ['look', 'ork'];
|
|
136
|
+
/**
|
|
137
|
+
* Todos os modos que podem estar GRAVADOS em disco, na ordem do espectro.
|
|
138
|
+
*
|
|
139
|
+
* Domicilio unico do literal de todos. Antes da I-43 ele existia em tres copias
|
|
140
|
+
* (`hitl-contract.ts`, `creation-operation-store.ts` e aqui), e encolher uma sem
|
|
141
|
+
* encolher as outras quebraria recibo historico em silencio. Esta lista NUNCA encolhe.
|
|
142
|
+
*/
|
|
143
|
+
exports.MODOS_LEGADOS = ['look', 'ork', 'classic', 'maestro', 'auto', 'fast'];
|
|
144
|
+
/**
|
|
145
|
+
* Os modos VIVOS na ordem do espectro, do mais HITL ao mais autonomo.
|
|
146
|
+
*
|
|
147
|
+
* E a unica lista que alimenta ESCRITOR: `parseModo`, `extrairTagDoPedido`, a tabela
|
|
148
|
+
* de `ork modos`, a entrevista do `#setup` e o fallback do manifesto. Encolher aqui
|
|
149
|
+
* apaga o modo de toda entrada de uma vez, sem tocar em nenhum leitor. Uma thread que
|
|
150
|
+
* acrescente um modo (a I-42 e `#Fast`) cresce esta mesma lista e mais nada.
|
|
151
|
+
*/
|
|
152
|
+
exports.ORDEM_DOS_MODOS = ['classic', 'maestro', 'auto', 'fast'];
|
|
153
|
+
/**
|
|
154
|
+
* As #TAGs vivas oferecidas como substituto de um modo aposentado (D7).
|
|
155
|
+
*
|
|
156
|
+
* DERIVADA de `ORDEM_DOS_MODOS`, nunca escrita a mao, e essa e a propriedade que
|
|
157
|
+
* importa: no dia em que a I-42 acrescentar `fast` a lista viva, toda mensagem de
|
|
158
|
+
* recusa passa a nomear `#Fast` sozinha, sem uma linha de edicao e sem conflito de
|
|
159
|
+
* merge nessa linha. Nomear um modo que ainda nao existe seria o pecado que o produto
|
|
160
|
+
* combate; derivar a lista e o que garante que isso nunca aconteca.
|
|
161
|
+
*
|
|
162
|
+
* `#Maestro` fica de fora porque ele nao e substituto de `#Look` nem de `#Ork`: e o
|
|
163
|
+
* modo de gate, com bloco e pausa de outra natureza.
|
|
164
|
+
*
|
|
165
|
+
* I-42: so modo de ciclo completo substitui um aposentado. `#Look` e `#Ork` eram os modos
|
|
166
|
+
* de maior vigilancia; oferecer o `#Fast` (so a GO, sem PLAN nem CHECK) no lugar deles
|
|
167
|
+
* trocaria o regime de supervisao pelas costas de quem pediu, que e o defeito que a
|
|
168
|
+
* recusa existe para impedir. A regra e por desenho de ciclo, nao pelo nome do modo.
|
|
169
|
+
*/
|
|
170
|
+
function substitutosVivos() {
|
|
171
|
+
return exports.ORDEM_DOS_MODOS.filter((m) => m !== 'maestro' && cicloCompleto(m)).map((m) => exports.MODOS[m].tag);
|
|
172
|
+
}
|
|
173
|
+
/** O modo percorre as seis fases canonicas? */
|
|
174
|
+
function cicloCompleto(modo) {
|
|
175
|
+
return exports.MODOS[modo].blocos.reduce((n, b) => n + b.fases.length, 0) === types_1.FASES.length;
|
|
176
|
+
}
|
|
177
|
+
/** O modo esta aposentado? (esta gravado em disco, e nao pode mais ser escrito) */
|
|
178
|
+
function modoAposentado(modo) {
|
|
179
|
+
return typeof modo === 'string' && exports.MODOS_APOSENTADOS.includes(modo);
|
|
180
|
+
}
|
|
181
|
+
/** O motivo tipado de quem tentou escrever um modo aposentado (I-43). */
|
|
182
|
+
exports.MOTIVO_MODO_APOSENTADO = 'modo.aposentado';
|
|
183
|
+
/**
|
|
184
|
+
* A recusa tipada de um modo aposentado, no formato `<dominio>.<motivo>` do produto.
|
|
185
|
+
*
|
|
186
|
+
* Ignorar em silencio esta PROIBIDO: e o pecado que o produto inteiro combate, e seria
|
|
187
|
+
* o pior resultado possivel desta aposentadoria (o builder pede `#Look` e recebe `#Auto`
|
|
188
|
+
* sem saber). A recusa nomeia o modo pedido e os substitutos VIVOS.
|
|
189
|
+
*
|
|
190
|
+
* O texto e DERIVADO de `ORDEM_DOS_MODOS` (ver `substitutosVivos`), nunca escrito a mao.
|
|
191
|
+
*/
|
|
192
|
+
function recusaDeModoAposentado(modo) {
|
|
193
|
+
const tag = exports.MODOS[modo].tag;
|
|
194
|
+
return `${exports.MOTIVO_MODO_APOSENTADO}: ${tag} foi aposentado e nao abre trabalho novo. `
|
|
195
|
+
+ `Use ${substitutosVivos().join(' ou ')}. `
|
|
196
|
+
+ `Thread ja gravada em ${tag} continua abrindo normalmente.`;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* O portao de ESCRITA de modo, com recusa tipada em vez de silencio.
|
|
200
|
+
*
|
|
201
|
+
* Devolve o modo vivo, ou lanca: `modo.aposentado` para quem saiu do produto e
|
|
202
|
+
* `modo.desconhecido` para quem nunca existiu. Sao dois erros diferentes de proposito,
|
|
203
|
+
* porque a acao do dono tambem e diferente: um troca a #TAG, o outro corrige um typo.
|
|
204
|
+
*/
|
|
205
|
+
function exigirModoVivo(entrada) {
|
|
206
|
+
const vivo = parseModo(entrada);
|
|
207
|
+
if (vivo)
|
|
208
|
+
return vivo;
|
|
209
|
+
const cru = (entrada ?? '').trim().replace(/^--?modo[= ]/i, '').replace(/^#/, '').toLowerCase();
|
|
210
|
+
if (modoAposentado(cru))
|
|
211
|
+
throw new Error(recusaDeModoAposentado(cru));
|
|
212
|
+
throw new Error(`modo.desconhecido: "${entrada ?? ''}" nao e um modo de conducao. `
|
|
213
|
+
+ `Use um de: ${exports.ORDEM_DOS_MODOS.map((m) => exports.MODOS[m].tag).join(', ')}.`);
|
|
214
|
+
}
|
|
110
215
|
/**
|
|
111
216
|
* Parseia a #TAG de modo de conducao.
|
|
112
217
|
* Aceita `#Auto`, `auto`, `--modo auto`, com ou sem caixa. Retorna null se nao reconhecer.
|
|
@@ -118,14 +223,40 @@ function parseModo(entrada) {
|
|
|
118
223
|
return exports.ORDEM_DOS_MODOS.includes(limpo) ? limpo : null;
|
|
119
224
|
}
|
|
120
225
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
226
|
+
* A primeira #TAG de modo do texto, VIVA OU APOSENTADA, sem julgar qual das duas.
|
|
227
|
+
*
|
|
228
|
+
* A lista e derivada de `MODOS_LEGADOS`: nenhuma lista de modos e escrita a mao aqui.
|
|
229
|
+
* Reconhecer o aposentado e o que permite RECUSAR em vez de ignorar em silencio.
|
|
123
230
|
*/
|
|
124
|
-
function
|
|
125
|
-
const
|
|
231
|
+
function primeiraTagDoPedido(texto) {
|
|
232
|
+
const alternativas = exports.MODOS_LEGADOS.join('|');
|
|
233
|
+
const achadas = texto.match(new RegExp(`#(?:${alternativas})\\b`, 'gi'));
|
|
126
234
|
if (!achadas || achadas.length === 0)
|
|
127
235
|
return null;
|
|
128
|
-
|
|
236
|
+
const cru = achadas[0].slice(1).toLowerCase();
|
|
237
|
+
return exports.MODOS_LEGADOS.includes(cru) ? cru : null;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Extrai a primeira #TAG de modo VIVO presente no texto livre de um pedido do builder.
|
|
241
|
+
* E o caminho usado pelos adaptadores de host antes de chamar `ork thread new --modo`.
|
|
242
|
+
*
|
|
243
|
+
* Uma #TAG aposentada devolve null AQUI e e reconhecida por `extrairTagAposentadaDoPedido`:
|
|
244
|
+
* quem chama decide recusar com motivo, nunca seguir como se nada tivesse sido escrito.
|
|
245
|
+
*/
|
|
246
|
+
function extrairTagDoPedido(texto) {
|
|
247
|
+
const achada = primeiraTagDoPedido(texto);
|
|
248
|
+
return achada && !modoAposentado(achada) ? achada : null;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* A #TAG do pedido nomeia um modo APOSENTADO? E o caminho da recusa tipada da I-43.
|
|
252
|
+
*
|
|
253
|
+
* Devolve o modo aposentado quando ele e a PRIMEIRA tag do texto, que e a mesma regra
|
|
254
|
+
* de precedencia de `extrairTagDoPedido`: um pedido com `#Look` antes de `#Auto` e um
|
|
255
|
+
* pedido em `#Look`, e recusar e diferente de escolher o proximo da fila por conta.
|
|
256
|
+
*/
|
|
257
|
+
function extrairTagAposentadaDoPedido(texto) {
|
|
258
|
+
const achada = primeiraTagDoPedido(texto);
|
|
259
|
+
return achada && modoAposentado(achada) ? achada : null;
|
|
129
260
|
}
|
|
130
261
|
/** Tag mostrada quando a thread em disco nao traz um modo reconhecido. */
|
|
131
262
|
exports.TAG_DE_MODO_DESCONHECIDO = '#?';
|
|
@@ -156,7 +287,12 @@ function tagDoModo(modo) {
|
|
|
156
287
|
}
|
|
157
288
|
return exports.TAG_DE_MODO_DESCONHECIDO;
|
|
158
289
|
}
|
|
159
|
-
/**
|
|
290
|
+
/**
|
|
291
|
+
* Definicao de um modo, com erro tipado quando o modo nao existe.
|
|
292
|
+
*
|
|
293
|
+
* Leitor: aceita modo aposentado, porque `MODOS` mantem os cinco e porque abrir
|
|
294
|
+
* thread antiga nao pode estourar. Quem VALIDA entrada usa `parseModo`.
|
|
295
|
+
*/
|
|
160
296
|
function definicaoDoModo(modo) {
|
|
161
297
|
const def = exports.MODOS[modo];
|
|
162
298
|
if (!def)
|
|
@@ -180,7 +316,7 @@ function fasePausa(modo, fase) {
|
|
|
180
316
|
const b = blocoDaFase(modo, fase);
|
|
181
317
|
return b.pausa && b.fases[b.fases.length - 1] === fase;
|
|
182
318
|
}
|
|
183
|
-
/** Tabela dos
|
|
319
|
+
/** Tabela dos modos VIVOS em texto, usada por `ork modos`. O numero vem da lista. */
|
|
184
320
|
function tabelaDeModos() {
|
|
185
321
|
const linhas = [];
|
|
186
322
|
linhas.push('Modos de conducao (a #TAG vai no proprio pedido ao orquestrador)');
|
|
@@ -0,0 +1,110 @@
|
|
|
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.adquirirLockMonitor = adquirirLockMonitor;
|
|
37
|
+
exports.comLockDaConversa = comLockDaConversa;
|
|
38
|
+
/**
|
|
39
|
+
* Locks dos monitores do projeto (`.orkastery/monitor/`).
|
|
40
|
+
*
|
|
41
|
+
* `adquirirLockMonitor` morava em `pulse-delivery.ts`. I-41 (GO-FIX 1) o trouxe para ca porque o
|
|
42
|
+
* receptor do pulse (`pulse-resposta.ts`) tambem precisa dele, e `pulse-delivery` importa o
|
|
43
|
+
* receptor: um ciclo de modulos em tempo de execucao so aparece como `undefined is not a function`.
|
|
44
|
+
* `pulse-delivery` continua reexportando o nome, para quem ja o importava de la.
|
|
45
|
+
*/
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
/** Lock compartilhado pelos monitores. ESRCH comprova que o dono morreu. */
|
|
49
|
+
function adquirirLockMonitor(lock) {
|
|
50
|
+
const pidFile = path.join(lock, 'pid');
|
|
51
|
+
try {
|
|
52
|
+
try {
|
|
53
|
+
fs.mkdirSync(lock);
|
|
54
|
+
}
|
|
55
|
+
catch (erro) {
|
|
56
|
+
if (erro.code !== 'EEXIST')
|
|
57
|
+
throw erro;
|
|
58
|
+
const pid = Number(fs.readFileSync(pidFile, 'utf8'));
|
|
59
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
60
|
+
throw new Error(`lock sem proprietário válido: ${lock}`);
|
|
61
|
+
try {
|
|
62
|
+
process.kill(pid, 0);
|
|
63
|
+
return { ok: false, ativo: true, detalhe: 'varredura já em andamento' };
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
if (e.code !== 'ESRCH')
|
|
67
|
+
throw e;
|
|
68
|
+
}
|
|
69
|
+
fs.unlinkSync(pidFile);
|
|
70
|
+
fs.rmdirSync(lock);
|
|
71
|
+
fs.mkdirSync(lock);
|
|
72
|
+
}
|
|
73
|
+
fs.writeFileSync(pidFile, String(process.pid), { flag: 'wx' });
|
|
74
|
+
return { ok: true, liberar: () => {
|
|
75
|
+
if (fs.readFileSync(pidFile, 'utf8') !== String(process.pid))
|
|
76
|
+
throw new Error(`lock mudou de proprietário: ${lock}`);
|
|
77
|
+
fs.unlinkSync(pidFile);
|
|
78
|
+
fs.rmdirSync(lock);
|
|
79
|
+
} };
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
return { ok: false, ativo: false, detalhe: `lock ocupado ou ilegível em ${lock}: ${e.message}` };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const pausa = (ms) => { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); };
|
|
86
|
+
/**
|
|
87
|
+
* I-41 (GO-FIX 1): o estado da conversa do pulse (consentimento aberto e lote servido) tem dois
|
|
88
|
+
* escritores: a varredura, que abre o pedido do resumo, e o receptor, que grava o sim e o lote.
|
|
89
|
+
* Sem este lock, um sim chegando no meio de uma varredura podia ser sobrescrito por ela. A espera
|
|
90
|
+
* e curta e limitada: nenhum dos dois segura o lock enquanto fala com o transporte.
|
|
91
|
+
*/
|
|
92
|
+
function comLockDaConversa(dir, executar, esperaMs = 5000) {
|
|
93
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
94
|
+
const lock = path.join(dir, 'pulse-conversa.lock');
|
|
95
|
+
const limite = Date.now() + esperaMs;
|
|
96
|
+
for (;;) {
|
|
97
|
+
const trava = adquirirLockMonitor(lock);
|
|
98
|
+
if (trava.ok) {
|
|
99
|
+
try {
|
|
100
|
+
return executar();
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
trava.liberar();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (Date.now() >= limite)
|
|
107
|
+
throw new Error(`conversa do pulse ocupada: ${trava.detalhe}`);
|
|
108
|
+
pausa(50);
|
|
109
|
+
}
|
|
110
|
+
}
|