@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.
Files changed (242) 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/onboarding.md +21 -0
  7. package/adapters/claude-code/commands/ork.md +99 -27
  8. package/adapters/claude-code/hooks/hooks.json +6 -1
  9. package/adapters/claude-code/hooks/ork-sensor.js +66 -0
  10. package/adapters/codex/skills/ork/SKILL.md +57 -0
  11. package/adapters/hermes/README.md +163 -0
  12. package/adapters/hermes/bin/ork-abrir-thread.sh +2 -0
  13. package/adapters/hermes/bin/ork-brain.sh +4 -0
  14. package/adapters/hermes/bin/ork-hitl-answer.py +82 -0
  15. package/adapters/hermes/bin/ork-maestro.sh +6 -0
  16. package/adapters/hermes/bin/ork-master-enviar.py +84 -0
  17. package/adapters/hermes/bin/ork-objective-message.sh +17 -0
  18. package/adapters/hermes/bin/ork-objective-status.sh +12 -0
  19. package/adapters/hermes/bin/ork-pulse-enviar.py +47 -0
  20. package/adapters/hermes/hermes.plugin.json +26 -4
  21. package/adapters/hermes/hitl-ingress/__init__.py +356 -0
  22. package/adapters/hermes/hitl-ingress/plugin.yaml +4 -0
  23. package/adapters/hermes/skills/orkastery-devmaster/SKILL.md +75 -22
  24. package/adapters/openclaw/README.md +135 -26
  25. package/adapters/openclaw/bin/ork-brain.sh +4 -0
  26. package/adapters/openclaw/construir.sh +19 -0
  27. package/adapters/openclaw/dist/hitl-ingress.js +199 -0
  28. package/adapters/openclaw/dist/index.js +437 -0
  29. package/adapters/openclaw/openclaw.plugin.json +39 -134
  30. package/adapters/openclaw/package.json +26 -0
  31. package/adapters/openclaw/src/hitl-ingress.ts +180 -0
  32. package/adapters/openclaw/src/index.ts +458 -0
  33. package/adapters/openclaw/src/tipos-openclaw.d.ts +58 -0
  34. package/adapters/openclaw/tsconfig.json +15 -0
  35. package/assets/docs/markdownlint-cli2.jsonc +22 -0
  36. package/assets/docs/padroes/documentacao-de-produto.md +133 -0
  37. package/assets/docs/padroes/roadmap-de-produto.md +98 -0
  38. package/assets/docs/produto/README.md +14 -0
  39. package/assets/docs/produto/_modelo-feature.md +59 -0
  40. package/assets/docs/roadmap/README.md +14 -0
  41. package/assets/docs/roadmap/_modelo-item.md +73 -0
  42. package/assets/orkmind-native-schema.json +32 -0
  43. package/assets/orkmind_bridge.py +357 -0
  44. package/assets/orkmind_fixture.py +67 -0
  45. package/assets/orkmind_prospective.py +138 -0
  46. package/assets/reference-tariffs-i07.json +23 -0
  47. package/dist/adapters/claude-bg.js +488 -39
  48. package/dist/adapters/codex-controller-sensor.js +449 -0
  49. package/dist/adapters/codex-controller-worker.js +361 -0
  50. package/dist/adapters/codex-controller.js +252 -0
  51. package/dist/adapters/codex-events.js +205 -0
  52. package/dist/adapters/codex-question.js +26 -0
  53. package/dist/adapters/codex-runner.js +133 -0
  54. package/dist/adapters/codex.js +394 -0
  55. package/dist/agents-md.js +84 -0
  56. package/dist/auditoria.js +11 -8
  57. package/dist/auditrun.js +5 -4
  58. package/dist/board.js +173 -22
  59. package/dist/branch-de-estado.js +136 -0
  60. package/dist/canarios-hitl.js +177 -0
  61. package/dist/canarios-i43.js +543 -0
  62. package/dist/canarios-pulse.js +147 -0
  63. package/dist/canarios-sensores.js +129 -0
  64. package/dist/canarios.js +111 -2
  65. package/dist/catalogo.js +9 -0
  66. package/dist/ci.js +216 -0
  67. package/dist/ciclos.js +2 -1
  68. package/dist/claim-lint.js +64 -0
  69. package/dist/claims.js +60 -0
  70. package/dist/company-brain-capture.js +195 -0
  71. package/dist/company-brain-cli.js +123 -0
  72. package/dist/company-brain-client.js +61 -0
  73. package/dist/company-brain-contract.js +166 -0
  74. package/dist/company-brain-journal.js +192 -0
  75. package/dist/company-brain-mcp.js +33 -0
  76. package/dist/company-brain-migration.js +60 -0
  77. package/dist/company-brain-source.js +177 -0
  78. package/dist/company-brain-worker.js +18 -0
  79. package/dist/conducao-texto.js +61 -0
  80. package/dist/conducao.js +876 -0
  81. package/dist/contrato-publico.js +39 -0
  82. package/dist/creation-operation-store.js +251 -0
  83. package/dist/creation-operation.js +148 -0
  84. package/dist/decisao-autonoma.js +183 -0
  85. package/dist/delegation.js +79 -0
  86. package/dist/demo.js +120 -0
  87. package/dist/docs.js +828 -0
  88. package/dist/doctor.js +183 -24
  89. package/dist/entrega-pr.js +117 -0
  90. package/dist/escopo-escrita.js +71 -0
  91. package/dist/estado-thread.js +222 -0
  92. package/dist/evalrunner.js +12 -0
  93. package/dist/fabrica-estado.js +329 -0
  94. package/dist/fabrica-publicar.js +76 -0
  95. package/dist/fix.js +21 -0
  96. package/dist/gates.js +55 -9
  97. package/dist/handoff.js +39 -23
  98. package/dist/hitl-canais.js +333 -0
  99. package/dist/hitl-classificacao.js +131 -0
  100. package/dist/hitl-contract.js +465 -0
  101. package/dist/hitl-estado.js +136 -0
  102. package/dist/hitl-gates.js +554 -0
  103. package/dist/hitl-ingress-receipt.js +382 -0
  104. package/dist/hitl-local-atestado.js +57 -0
  105. package/dist/hitl-local-receipt.js +328 -0
  106. package/dist/hitl-local.js +143 -0
  107. package/dist/hitl-lock.js +139 -0
  108. package/dist/hitl-lote.js +223 -0
  109. package/dist/hitl-native-offer.js +97 -0
  110. package/dist/hitl-native.js +65 -0
  111. package/dist/hitl-presentation.js +209 -0
  112. package/dist/hitl-public-receipt.js +176 -0
  113. package/dist/hitl-resumo.js +209 -0
  114. package/dist/hitl-sessions.js +475 -0
  115. package/dist/hitl.js +711 -0
  116. package/dist/horario.js +269 -0
  117. package/dist/hosts.js +198 -22
  118. package/dist/index.js +1736 -93
  119. package/dist/indice.js +99 -0
  120. package/dist/init.js +28 -3
  121. package/dist/integracoes-locais.js +17 -0
  122. package/dist/leases.js +65 -21
  123. package/dist/ledger-stats.js +272 -0
  124. package/dist/ledger.js +107 -2
  125. package/dist/licoes.js +215 -0
  126. package/dist/liveness.js +218 -0
  127. package/dist/maestro-actions.js +51 -0
  128. package/dist/maestro-authority.js +152 -0
  129. package/dist/maestro-cli.js +97 -0
  130. package/dist/maestro-contract.js +55 -0
  131. package/dist/maestro-discovery.js +132 -0
  132. package/dist/maestro-runtime.js +268 -0
  133. package/dist/maestro-snapshot.js +86 -0
  134. package/dist/maestro-sources.js +224 -0
  135. package/dist/manifest.js +165 -6
  136. package/dist/maquina.js +102 -0
  137. package/dist/master-audit.js +101 -0
  138. package/dist/master-batch.js +43 -0
  139. package/dist/master-digest.js +149 -0
  140. package/dist/master-migracao.js +155 -0
  141. package/dist/master.js +361 -77
  142. package/dist/mcp-artifacts.js +234 -0
  143. package/dist/mcp-git.js +433 -0
  144. package/dist/mcp-install.js +310 -0
  145. package/dist/mcp-maestro.js +25 -0
  146. package/dist/mcp-server.js +469 -0
  147. package/dist/mcp-ship.js +436 -0
  148. package/dist/mcp-verify.js +173 -0
  149. package/dist/memoria-humana.js +207 -0
  150. package/dist/memoria.js +314 -78
  151. package/dist/memory-migration.js +279 -0
  152. package/dist/memory-prospective.js +148 -0
  153. package/dist/modos-migracao.js +191 -0
  154. package/dist/modos.js +151 -15
  155. package/dist/monitor-lock.js +110 -0
  156. package/dist/objective.js +449 -0
  157. package/dist/ocupacao.js +267 -0
  158. package/dist/onboarding.js +303 -0
  159. package/dist/orkmind.js +389 -90
  160. package/dist/orquestracao.js +96 -69
  161. package/dist/phase.js +596 -150
  162. package/dist/playbook-capabilities.js +150 -0
  163. package/dist/playbook-contracts.js +188 -0
  164. package/dist/portfolio-context.js +61 -0
  165. package/dist/portfolio.js +180 -0
  166. package/dist/preflight.js +207 -0
  167. package/dist/process-audit.js +112 -0
  168. package/dist/project-state.js +93 -0
  169. package/dist/prompts.js +25 -5
  170. package/dist/prova-minima.js +112 -0
  171. package/dist/pulse-cadencia.js +163 -0
  172. package/dist/pulse-consentimento.js +260 -0
  173. package/dist/pulse-delivery.js +323 -0
  174. package/dist/pulse-resposta.js +542 -0
  175. package/dist/pulse.js +262 -0
  176. package/dist/ratelimit.js +35 -2
  177. package/dist/recall.js +80 -3
  178. package/dist/redacao-saida.js +45 -0
  179. package/dist/redacao-url.js +66 -0
  180. package/dist/retry.js +637 -115
  181. package/dist/roadmap-reservas.js +243 -0
  182. package/dist/runtime-ambiente.js +38 -0
  183. package/dist/runtime-context.js +215 -0
  184. package/dist/runtime-profiles.js +869 -0
  185. package/dist/runtimes.js +103 -0
  186. package/dist/sandbox.js +9 -0
  187. package/dist/session-events.js +203 -0
  188. package/dist/session-watcher-claude.js +637 -0
  189. package/dist/session-watcher.js +683 -0
  190. package/dist/sessoes-adopt.js +154 -0
  191. package/dist/sessoes-inventario.js +159 -0
  192. package/dist/sessoes.js +16 -35
  193. package/dist/setup.js +691 -0
  194. package/dist/ship.js +150 -15
  195. package/dist/slug.js +1 -1
  196. package/dist/thread-close.js +115 -0
  197. package/dist/thread.js +142 -28
  198. package/dist/tokens.js +1 -1
  199. package/dist/util.js +4 -2
  200. package/dist/verify-sandbox.js +265 -0
  201. package/dist/verify.js +270 -25
  202. package/dist/versao.js +60 -0
  203. package/dist/worktree.js +31 -2
  204. package/dist/write-activation.js +291 -0
  205. package/dist/yaml.js +2 -0
  206. package/eval/casos/onboarding.json +102 -0
  207. package/eval/casos/orkastery-bootstrap.json +35 -1
  208. package/eval/casos/scope-check-capability-map.json +45 -7
  209. package/eval/casos/ship-release.json +2 -2
  210. package/eval/fixtures/b0-slug-e-modos/caso.json +35 -22
  211. package/eval/fixtures/b2-master-log/caso.json +1 -1
  212. package/eval/fixtures/fx-adapter-editado-detectado/caso.json +19 -0
  213. package/eval/fixtures/fx-auto-quiet/caso.json +11 -0
  214. package/eval/fixtures/fx-blanket-approve/caso.json +10 -0
  215. package/eval/fixtures/fx-check-runtime-cruzado/caso.json +20 -0
  216. package/eval/fixtures/fx-codex-dry/caso.json +18 -0
  217. package/eval/fixtures/fx-donewhen-executavel/caso.json +15 -0
  218. package/eval/fixtures/fx-estado-dividido/caso.json +15 -0
  219. package/eval/fixtures/fx-fase-orfa/caso.json +116 -0
  220. package/eval/fixtures/fx-happy/caso.json +6 -4
  221. package/eval/fixtures/fx-hitl-latency/caso.json +20 -0
  222. package/eval/fixtures/fx-indice-reversao/caso.json +25 -0
  223. package/eval/fixtures/fx-listagem-abertas/caso.json +16 -0
  224. package/eval/fixtures/fx-maestro-bootstrap/caso.json +21 -0
  225. package/eval/fixtures/fx-modo-aposentado-escritor/caso.json +21 -0
  226. package/eval/fixtures/fx-modo-aposentado-leitor/caso.json +16 -0
  227. package/eval/fixtures/fx-objective-oscillation/caso.json +14 -0
  228. package/eval/fixtures/fx-omnicanal/caso.json +17 -0
  229. package/eval/fixtures/fx-sensores-runtime/caso.json +17 -0
  230. package/monitor/company-brain.cjs +17 -0
  231. package/monitor/pulse-scope.cjs +45 -0
  232. package/monitor/pulse.cron +18 -0
  233. package/monitor/varredura-pulse.sh +27 -0
  234. package/package.json +25 -4
  235. package/schemas/claims.schema.json +25 -0
  236. package/schemas/company-brain.schema.json +1158 -0
  237. package/schemas/creation-operation.schema.json +365 -0
  238. package/schemas/maestro-snapshot.schema.json +2716 -0
  239. package/skills/core/onboarding/SKILL.md +50 -0
  240. package/skills/core/orkastery-bootstrap/SKILL.md +95 -65
  241. package/skills/core/thread-state/SKILL.md +3 -1
  242. package/skills/governance/scope-check-capability-map/SKILL.md +17 -7
@@ -0,0 +1,177 @@
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.CYCLE_TYPES = void 0;
37
+ exports.portfolioEntities = portfolioEntities;
38
+ exports.portfolioHistory = portfolioHistory;
39
+ exports.entityEvent = entityEvent;
40
+ exports.readCycle = readCycle;
41
+ exports.readSourceFile = readSourceFile;
42
+ /** D5/D9: deterministic allowlist, references to authoritative sources; no transcript capture. */
43
+ const fs = __importStar(require("node:fs"));
44
+ const node_crypto_1 = require("node:crypto");
45
+ const company_brain_contract_1 = require("./company-brain-contract");
46
+ const company_brain_journal_1 = require("./company-brain-journal");
47
+ exports.CYCLE_TYPES = new Set(['thread_created', 'phase_dispatch', 'phase_dispatch_verified', 'phase_result', 'fase_concluida',
48
+ 'hitl_requested', 'hitl_answered', 'hitl_confirmed', 'hitl_expired', 'human_gate', 'autonomous_decision', 'gate_passed', 'gate_blocked',
49
+ 'claim_added', 'claim_verified', 'claim_withdrawn', 'verify_run', 'artifact_written', 'artifact_delivered', 'phase_artifact_written',
50
+ 'ship_started', 'ship_done', 'ship_blocked', 'push_verified', 'rollback_done', 'postmortem_recorded', 'master_done', 'score_proposto', 'master_score_recorded',
51
+ // I-43 (D3): a aceitacao por default e fato do ciclo de entrega, nao ruido de
52
+ // operacao. Sem ela na allowlist, o registro de que a entrega passou sem revisao
53
+ // ficaria de fora do ciclo, que e exatamente onde ele precisa ser visivel.
54
+ 'aceite_por_omissao',
55
+ 'brain_scope_recorded']);
56
+ const safeId = (v) => typeof v === 'string' && /^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,159}$/.test(v);
57
+ const hash = (v) => typeof v === 'string' && /^[a-f0-9]{64}$/.test(v);
58
+ function portfolioEntities(catalog, scope, observations = {}) {
59
+ if (catalog.schema !== 'ork.portfolio/v1')
60
+ throw Error('brain.source.schema');
61
+ return (0, company_brain_contract_1.validateCatalog)([...catalog.products, ...catalog.projects, ...catalog.initiatives].map(e => {
62
+ const kind = { product: 'prod', project: 'proj', initiative: 'init' }[e.kind];
63
+ return { schema: 'orkmind.company-brain-entity/v1', tenant_id: scope.tenant, id: e.id, kind,
64
+ version: e.version, parent_id: e.kind === 'product' ? null : e.kind === 'project' ? e.productId : e.projectId,
65
+ workspace_ids: e.kind === 'project' ? e.workspaceIds : [], depends_on: e.kind === 'initiative' ? e.dependsOn : [],
66
+ aliases: [{ system: 'ork', instance: scope.instance, id: e.id }], title: e.title, description: e.description,
67
+ status: e.status, acceptance_criteria: e.acceptanceCriteria,
68
+ owner: { raw: e.ownerId, state: e.ownerId === null ? 'unknown' : 'legacy-label', principal: null },
69
+ source: { authority: 'ork', instance: scope.instance, source_ref: `portfolio.json#${e.id}`,
70
+ source_hash: (0, company_brain_contract_1.digest)(e), source_version: e.version, location: `id:${e.id}` },
71
+ // Global updatedAt describes a snapshot, not this entity version. Unknown stays null.
72
+ acl_ref: scope.aclRef, observed_at: observations[`${e.id}:${e.version}`] ?? null, recorded_at: null };
73
+ }));
74
+ }
75
+ /** Confirmed journal snapshots retain intermediate versions. Only an actual change
76
+ * observed by the journal supplies a timestamp; legacy observations stay unknown. */
77
+ function portfolioHistory(catalog, scope, entries = []) {
78
+ const confirmed = new Set(entries.filter(e => e.type === 'confirmed').map(e => e.id));
79
+ const observations = {}, snapshots = [];
80
+ let previous = null;
81
+ const values = (p) => p ? [...p.products, ...p.projects, ...p.initiatives] : [];
82
+ for (const intent of entries.filter(e => e.type === 'intent' && confirmed.has(e.id))) {
83
+ if ((0, company_brain_journal_1.bytesHash)(JSON.stringify(intent.value, null, 2) + '\n') !== intent.afterHash)
84
+ throw Error('brain.journal.source-conflict');
85
+ const before = Object.hasOwn(intent, 'beforeValue') ? intent.beforeValue : previous;
86
+ if (before)
87
+ snapshots.push(before);
88
+ const prior = new Map(values(before).map(e => [e.id, e]));
89
+ for (const e of values(intent.value)) {
90
+ // A legacy first snapshot has no evidence identifying when its versions changed.
91
+ if ((Object.hasOwn(intent, 'beforeValue') || before) && prior.get(e.id)?.version !== e.version)
92
+ observations[`${e.id}:${e.version}`] ??= intent.observedAt;
93
+ }
94
+ snapshots.push(intent.value);
95
+ previous = intent.value;
96
+ }
97
+ snapshots.push(catalog);
98
+ const seen = new Map(), result = [];
99
+ for (const snapshot of snapshots)
100
+ for (const entity of portfolioEntities(snapshot, scope, observations)) {
101
+ const key = `${entity.id}:${entity.version}`, old = seen.get(key);
102
+ if (old && old.source.source_hash === entity.source.source_hash)
103
+ continue;
104
+ seen.set(key, entity);
105
+ result.push(entity);
106
+ }
107
+ return result;
108
+ }
109
+ function entityEvent(entity, sequence) {
110
+ const identity = `portfolio:${entity.source.instance}:${entity.id}:${entity.version}`;
111
+ return (0, company_brain_contract_1.validateContract)({ schema: 'orkmind.company-brain-event/v1', tenant_id: entity.tenant_id,
112
+ id: 'event-' + (0, company_brain_contract_1.digest)(identity), producer_id: 'ork', aggregate_id: entity.id, sequence, source_event_id: 'source-' + (0, company_brain_contract_1.digest)(identity),
113
+ source: entity.source, operation: 'upsert', payload: entity, payload_hash: (0, company_brain_contract_1.digest)(entity), cycle: null,
114
+ evidence_refs: [entity.source.source_ref], occurred_at: null, observed_at: entity.observed_at, acl_ref: entity.acl_ref });
115
+ }
116
+ function readCycle(bytes, scope, after = 0) {
117
+ const end = bytes.lastIndexOf(10) + 1;
118
+ const complete = bytes.subarray(0, end).toString('utf8');
119
+ if (!Buffer.from(complete).equals(bytes.subarray(0, end)))
120
+ throw Error('brain.source.encoding');
121
+ const records = [];
122
+ let offset = 0, line = 0;
123
+ const prefix = (0, node_crypto_1.createHash)('sha256');
124
+ for (const raw of complete.split('\n').slice(0, -1)) {
125
+ line++;
126
+ offset += Buffer.byteLength(raw) + 1;
127
+ prefix.update(raw + '\n');
128
+ if (offset <= after)
129
+ continue;
130
+ let fact;
131
+ try {
132
+ fact = JSON.parse(raw);
133
+ }
134
+ catch {
135
+ throw Error('brain.source.corrupt');
136
+ }
137
+ if (!fact || fact.thread !== scope.thread || typeof fact.tipo !== 'string' || typeof fact.ts !== 'string')
138
+ throw Error('brain.source.scope');
139
+ let event = null;
140
+ if (exports.CYCLE_TYPES.has(fact.tipo)) {
141
+ const sourceId = safeId(fact.eventId) ? fact.eventId : 'legacy-' + (0, company_brain_contract_1.digest)([scope.thread, line, (0, company_brain_journal_1.bytesHash)(raw)]);
142
+ const assertionId = 'fact-' + (0, company_brain_contract_1.digest)([scope.instance, scope.thread, sourceId]);
143
+ const source = { authority: 'ork', instance: scope.instance,
144
+ source_ref: `threads/${scope.thread}/ledger.jsonl#L${line}`, source_hash: (0, company_brain_journal_1.bytesHash)(raw), source_version: line, location: `line:${line}` };
145
+ const fields = {};
146
+ for (const key of ['fase', 'estado', 'classificacao', 'claimId', 'pedidoId', 'sessionId', 'tipo', 'gate', 'commit', 'sha', 'schema', 'acao', 'contrato'])
147
+ if (safeId(fact[key]))
148
+ fields[key] = fact[key];
149
+ for (const key of ['ok', 'repetida'])
150
+ if (typeof fact[key] === 'boolean')
151
+ fields[key] = fact[key];
152
+ // Free text, rationale, question, answer and tool output stay at the source.
153
+ const assertion = { schema: 'orkmind.company-brain-assertion/v1', tenant_id: scope.tenant,
154
+ id: assertionId, version: 1, subject: scope.thread, predicate: fact.tipo, object_id: null,
155
+ value: JSON.stringify(fields), source, producer_id: 'ork', actor_id: null, method: 'deterministic',
156
+ observed_at: fact.ts, recorded_at: null, occurred_at: fact.ts, valid_from: null, valid_to: null,
157
+ precision: 'instant', state: 'accepted', acl_ref: scope.aclRef };
158
+ event = (0, company_brain_contract_1.validateContract)({ schema: 'orkmind.company-brain-event/v1', tenant_id: scope.tenant,
159
+ id: 'event-' + (0, company_brain_contract_1.digest)([scope.instance, sourceId]), producer_id: 'ork', aggregate_id: assertionId, sequence: 1,
160
+ source_event_id: sourceId, source, operation: 'assert', payload: assertion, payload_hash: (0, company_brain_contract_1.digest)(assertion),
161
+ cycle: { thread_id: scope.thread, objective_id: safeId(fact.objectiveId) ? fact.objectiveId : null,
162
+ objective_hash: hash(fact.objectiveHash) ? fact.objectiveHash : null,
163
+ project_id: scope.projectId ?? null, initiative_ids: scope.initiativeIds ?? [],
164
+ phase: ['GOAL', 'PLAN', 'GO', 'CHECK', 'SHIP', 'MASTER'].includes(fact.fase) ? fact.fase : null,
165
+ session_id: safeId(fact.sessionId) ? fact.sessionId : null, context_hash: hash(fact.contextHash) ? fact.contextHash : null },
166
+ evidence_refs: [source.source_ref], occurred_at: fact.ts, observed_at: fact.ts, acl_ref: scope.aclRef });
167
+ }
168
+ records.push({ event, end: offset, prefixHash: prefix.copy().digest('hex') });
169
+ }
170
+ return { records, completeBytes: end, partial: end !== bytes.length };
171
+ }
172
+ function readSourceFile(file, limit = 16 * 1024 * 1024) {
173
+ const stat = fs.lstatSync(file);
174
+ if (!stat.isFile() || stat.size > limit)
175
+ throw Error('brain.source.unavailable');
176
+ return fs.readFileSync(file);
177
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.brainWorker = brainWorker;
4
+ /** Explicit lifecycle; installation never starts the worker. */
5
+ async function brainWorker(sync, signal, intervalMs = 5000) {
6
+ if (!Number.isInteger(intervalMs) || intervalMs < 1000 || intervalMs > 60000)
7
+ throw Error('brain.worker.interval-invalid');
8
+ while (!signal.aborted) {
9
+ sync();
10
+ if (signal.aborted)
11
+ break;
12
+ await new Promise(resolve => {
13
+ const done = () => { clearTimeout(timer); signal.removeEventListener('abort', done); resolve(); };
14
+ const timer = setTimeout(done, intervalMs);
15
+ signal.addEventListener('abort', done, { once: true });
16
+ });
17
+ }
18
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NOME_DA_OPERACAO = void 0;
4
+ exports.conducaoDoLease = conducaoDoLease;
5
+ exports.quemConduz = quemConduz;
6
+ exports.linhaDeConducao = linhaDeConducao;
7
+ /**
8
+ * I-36 (D9): o texto de "quem conduz agora", em UM lugar.
9
+ *
10
+ * Todas as superficies (thread status, board, monitor, pulse, snapshot do Maestro e os quatro
11
+ * hosts) imprimem esta linha e nenhuma a reescreve. Modulo sem dependencia de estado para que o
12
+ * `thread.ts` e o `leases.ts` possam usa-lo sem ciclo de importacao.
13
+ */
14
+ const horario_1 = require("./horario");
15
+ /** O que cada operacao de conducao e, em portugues de gente. */
16
+ exports.NOME_DA_OPERACAO = {
17
+ 'phase.run': 'despacho de fase',
18
+ 'retry.run': 'retomada de fase',
19
+ verify: 'ork verify',
20
+ baseline: 'ork verify --baseline',
21
+ 'fix.open': 'ork fix open',
22
+ 'fix.reverify': 'ork fix reverify',
23
+ 'mcp.verify': 'ork_verify (MCP)',
24
+ handoff: 'reserva de quem assumiu',
25
+ };
26
+ /** O objeto de leitura a partir do lease, sem consultar nada. */
27
+ function conducaoDoLease(lease) {
28
+ const c = lease.conducao;
29
+ if (!c || c.contrato !== 'ork.conducao/v1')
30
+ return null;
31
+ return {
32
+ thread: lease.thread,
33
+ canal: c.canal,
34
+ sessao: c.dono.tipo === 'sessao' ? c.dono.sessionId : null,
35
+ fase: c.fase,
36
+ desde: lease.adquiridoEm,
37
+ promptSha256: c.promptSha256,
38
+ operacao: c.operacao,
39
+ dono: c.dono,
40
+ expiraEm: lease.expiraEm,
41
+ identidade: c.identidade,
42
+ };
43
+ }
44
+ /** Quem segura a conducao, em poucas palavras: a sessao, o processo ou a reserva. */
45
+ function quemConduz(c) {
46
+ if (c.sessao)
47
+ return `sessao ${c.sessao.slice(0, 8)}`;
48
+ if (c.dono.tipo === 'processo')
49
+ return `processo ${c.dono.pid} (${exports.NOME_DA_OPERACAO[c.operacao]})`;
50
+ if (c.dono.tipo === 'reserva')
51
+ return `reserva de ${c.dono.por}`;
52
+ return exports.NOME_DA_OPERACAO[c.operacao];
53
+ }
54
+ /**
55
+ * "conduzido agora por CANAL, sessao ID, fase F, desde HORARIO": a linha unica (CS7). O horario
56
+ * sai no fuso do dono; a legenda do fuso fica com a superficie, uma vez por tela.
57
+ */
58
+ function linhaDeConducao(c, opcoes = {}) {
59
+ return `conduzido agora por ${c.canal}, ${quemConduz(c)}, fase ${c.fase ?? '-'}, ` +
60
+ `desde ${(0, horario_1.formatarDataHora)(c.desde, opcoes.agora ? { agora: opcoes.agora } : {})}`;
61
+ }