0xray 3.5.5 → 4.0.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 (233) hide show
  1. package/.mcp.json +18 -14
  2. package/.opencode/skills/api-design/SKILL.md +1 -1
  3. package/.opencode/skills/architect-tools/SKILL.md +1 -1
  4. package/.opencode/skills/architecture-patterns/SKILL.md +1 -1
  5. package/.opencode/skills/auto-format/SKILL.md +1 -1
  6. package/.opencode/skills/boot-orchestrator/SKILL.md +2 -6
  7. package/.opencode/skills/bug-triage/SKILL.md +1 -1
  8. package/.opencode/skills/code-analyzer/SKILL.md +1 -1
  9. package/.opencode/skills/code-review/SKILL.md +1 -1
  10. package/.opencode/skills/enforcer/SKILL.md +1 -1
  11. package/.opencode/skills/framework-compliance-audit/SKILL.md +1 -1
  12. package/.opencode/skills/git-workflow/SKILL.md +1 -1
  13. package/.opencode/skills/hermes-agent/SKILL.md +36 -36
  14. package/.opencode/skills/inference-improve/SKILL.md +1 -1
  15. package/.opencode/skills/lint/SKILL.md +1 -1
  16. package/.opencode/skills/log-monitor/SKILL.md +1 -1
  17. package/.opencode/skills/model-health-check/SKILL.md +1 -1
  18. package/.opencode/skills/multimodal-looker/SKILL.md +1 -1
  19. package/.opencode/skills/orchestrator/SKILL.md +38 -14
  20. package/.opencode/skills/performance-analysis/SKILL.md +1 -1
  21. package/.opencode/skills/performance-optimization/SKILL.md +1 -1
  22. package/.opencode/skills/processor-pipeline/SKILL.md +1 -1
  23. package/.opencode/skills/project-analysis/SKILL.md +1 -1
  24. package/.opencode/skills/refactoring-strategies/SKILL.md +1 -1
  25. package/.opencode/skills/registry.json +65 -0
  26. package/.opencode/skills/researcher/SKILL.md +18 -5
  27. package/.opencode/skills/security-audit/SKILL.md +1 -1
  28. package/.opencode/skills/security-scan/SKILL.md +1 -1
  29. package/.opencode/skills/session-management/SKILL.md +1 -1
  30. package/.opencode/skills/state-manager/SKILL.md +1 -1
  31. package/.opencode/skills/storyteller/SKILL.md +1 -1
  32. package/.opencode/skills/strategist/SKILL.md +12 -0
  33. package/.opencode/skills/testing-best-practices/SKILL.md +37 -0
  34. package/.opencode/skills/testing-strategy/SKILL.md +14 -3
  35. package/.opencode/skills/ui-ux-design/SKILL.md +1 -1
  36. package/.opencode/skills/xray-orchestrator/index.ts +267 -0
  37. package/.xray/codex.json +12 -3
  38. package/.xray/features.json +28 -6
  39. package/.xray/features.schema.json +31 -0
  40. package/AGENTS-consumer.md +17 -7
  41. package/AGENTS.md +18 -10
  42. package/README.md +30 -27
  43. package/SKILLS.md +2 -2
  44. package/dist/AGENTS.md +18 -10
  45. package/dist/CHANGELOG.md +81 -11
  46. package/dist/README.md +30 -27
  47. package/dist/SKILLS.md +2 -2
  48. package/dist/cli/commands/hermes-install.js +3 -0
  49. package/dist/cli/commands/openclaw-install.js +14 -0
  50. package/dist/cli/index.js +10 -1
  51. package/dist/core/features-config.d.ts +15 -2
  52. package/dist/infrastructure/schemas/cloud-schemas.d.ts +1 -1
  53. package/dist/integrations/grok/grok-cli.d.ts +3 -0
  54. package/dist/integrations/grok/grok-cli.js +92 -4
  55. package/dist/integrations/grok/hooks/grok-hook-utils.js +53 -7
  56. package/dist/integrations/grok/hooks/post-tool-use.js +68 -46
  57. package/dist/integrations/grok/hooks/pre-tool-use.js +14 -31
  58. package/dist/integrations/grok/hooks/session-start.js +86 -4
  59. package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +31 -24
  60. package/dist/integrations/hermes-agent/bridge.mjs +26 -1
  61. package/dist/integrations/hooks/delegation-gate-runtime.mjs +32 -3
  62. package/dist/integrations/hooks/pipeline-hook-runtime.mjs +1 -1
  63. package/dist/integrations/hooks/station-hook-runtime.cjs +421 -0
  64. package/dist/integrations/hooks/station-hook-runtime.mjs +24 -0
  65. package/dist/integrations/hooks/station-memory-ingest.mjs +45 -0
  66. package/dist/integrations/hooks/station-memory-match.mjs +47 -0
  67. package/dist/integrations/openclaw/client.d.ts +5 -1
  68. package/dist/integrations/openclaw/client.js +17 -9
  69. package/dist/integrations/openclaw/config.js +0 -1
  70. package/dist/integrations/openclaw/hooks/pre-tool-gate-runtime.mjs +102 -0
  71. package/dist/integrations/openclaw/index.js +17 -0
  72. package/dist/integrations/openclaw/plugin/xray-pre-tool/index.js +75 -0
  73. package/dist/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +10 -0
  74. package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +12 -0
  75. package/dist/integrations/openclaw/pre-tool-gate.d.ts +19 -0
  76. package/dist/integrations/openclaw/pre-tool-gate.js +39 -0
  77. package/dist/mcps/orchestrator/handlers/complexity-handler.js +2 -2
  78. package/dist/memory-routing/index.d.ts +1 -1
  79. package/dist/memory-routing/index.js +1 -1
  80. package/dist/memory-routing/provider-loader.d.ts +4 -0
  81. package/dist/memory-routing/provider-loader.js +44 -2
  82. package/dist/memory-routing/provider-registry.js +3 -2
  83. package/dist/nucleus/autonomy-kernel.d.ts +2 -2
  84. package/dist/nucleus/autonomy-kernel.js +17 -6
  85. package/dist/nucleus/confer.js +17 -3
  86. package/dist/nucleus/delegation-gate.d.ts +14 -8
  87. package/dist/nucleus/delegation-gate.js +151 -16
  88. package/dist/nucleus/suit-temperament.d.ts +40 -0
  89. package/dist/nucleus/suit-temperament.js +157 -0
  90. package/dist/nucleus/user-aside.js +1 -1
  91. package/dist/plugin/xray-codex-injection.js +14 -3
  92. package/dist/postprocessor/triggers/GitHookTrigger.js +11 -5
  93. package/opencode.json +80 -0
  94. package/package.json +15 -5
  95. package/scripts/hooks/install-hooks.cjs +18 -3
  96. package/scripts/hooks/run-hook.js +67 -3
  97. package/scripts/mjs/run-repertoire-mcp.mjs +39 -0
  98. package/scripts/mjs/verify-confer-core.mjs +1 -1
  99. package/scripts/mjs/verify-delegation-gate-core.mjs +29 -2
  100. package/scripts/mjs/verify-four-floor-compact.mjs +524 -0
  101. package/scripts/mjs/verify-pipeline-facets.mjs +215 -0
  102. package/scripts/mjs/verify-temperament-live.mjs +261 -0
  103. package/scripts/node/bridge-mcp-wiring.cjs +277 -29
  104. package/scripts/node/consumer-install-smoke.mjs +55 -2
  105. package/scripts/node/install-bridges.cjs +195 -33
  106. package/scripts/node/postinstall.cjs +50 -27
  107. package/scripts/node/reconcile-version.mjs +0 -4
  108. package/scripts/node/release-gate.mjs +1 -1
  109. package/scripts/node/release.mjs +2 -2
  110. package/scripts/node/universal-version-manager.js +1 -1
  111. package/scripts/node/validate-release-docs.mjs +20 -33
  112. package/scripts/node/version-manager.mjs +63 -18
  113. package/src/integrations/grok/plugin/0xray/hooks/hooks.json +31 -24
  114. package/src/integrations/openclaw/README.md +134 -0
  115. package/src/integrations/openclaw/plugin/xray-pre-tool/index.js +75 -0
  116. package/src/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +10 -0
  117. package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +12 -0
  118. package/src/mcps/orchestrator/handlers/complexity-handler.ts +2 -1
  119. package/vendor/@0xray/repertoire/AGENTS.md +163 -0
  120. package/vendor/@0xray/repertoire/LICENSE +21 -0
  121. package/vendor/@0xray/repertoire/README.md +120 -0
  122. package/vendor/@0xray/repertoire/data/curated_signals.json +208 -0
  123. package/vendor/@0xray/repertoire/dist/RepertoireService.d.ts +78 -0
  124. package/vendor/@0xray/repertoire/dist/RepertoireService.d.ts.map +1 -0
  125. package/vendor/@0xray/repertoire/dist/RepertoireService.js +153 -0
  126. package/vendor/@0xray/repertoire/dist/RepertoireService.js.map +1 -0
  127. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.d.ts +39 -0
  128. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.d.ts.map +1 -0
  129. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.js +60 -0
  130. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.js.map +1 -0
  131. package/vendor/@0xray/repertoire/dist/index.d.ts +14 -0
  132. package/vendor/@0xray/repertoire/dist/index.d.ts.map +1 -0
  133. package/vendor/@0xray/repertoire/dist/index.js +14 -0
  134. package/vendor/@0xray/repertoire/dist/index.js.map +1 -0
  135. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.d.ts +26 -0
  136. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.d.ts.map +1 -0
  137. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.js +109 -0
  138. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.js.map +1 -0
  139. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.d.ts +18 -0
  140. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.d.ts.map +1 -0
  141. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.js +94 -0
  142. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.js.map +1 -0
  143. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.d.ts +7 -0
  144. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.d.ts.map +1 -0
  145. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.js +18 -0
  146. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.js.map +1 -0
  147. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.d.ts +31 -0
  148. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.d.ts.map +1 -0
  149. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.js +83 -0
  150. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.js.map +1 -0
  151. package/vendor/@0xray/repertoire/dist/mcp/server.d.ts +6 -0
  152. package/vendor/@0xray/repertoire/dist/mcp/server.d.ts.map +1 -0
  153. package/vendor/@0xray/repertoire/dist/mcp/server.js +173 -0
  154. package/vendor/@0xray/repertoire/dist/mcp/server.js.map +1 -0
  155. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.d.ts +27 -0
  156. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.d.ts.map +1 -0
  157. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js +107 -0
  158. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js.map +1 -0
  159. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.d.ts +11 -0
  160. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.d.ts.map +1 -0
  161. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.js +32 -0
  162. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.js.map +1 -0
  163. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.d.ts +9 -0
  164. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.d.ts.map +1 -0
  165. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.js +72 -0
  166. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.js.map +1 -0
  167. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.d.ts +5 -0
  168. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.d.ts.map +1 -0
  169. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.js +18 -0
  170. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.js.map +1 -0
  171. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts +31 -0
  172. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts.map +1 -0
  173. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js +218 -0
  174. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js.map +1 -0
  175. package/vendor/@0xray/repertoire/dist/paths.d.ts +24 -0
  176. package/vendor/@0xray/repertoire/dist/paths.d.ts.map +1 -0
  177. package/vendor/@0xray/repertoire/dist/paths.js +74 -0
  178. package/vendor/@0xray/repertoire/dist/paths.js.map +1 -0
  179. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts +141 -0
  180. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts.map +1 -0
  181. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js +210 -0
  182. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js.map +1 -0
  183. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.d.ts +48 -0
  184. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.d.ts.map +1 -0
  185. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js +221 -0
  186. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js.map +1 -0
  187. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts +11 -0
  188. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts.map +1 -0
  189. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js +43 -0
  190. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js.map +1 -0
  191. package/vendor/@0xray/repertoire/dist/registry/signal-prune.d.ts +15 -0
  192. package/vendor/@0xray/repertoire/dist/registry/signal-prune.d.ts.map +1 -0
  193. package/vendor/@0xray/repertoire/dist/registry/signal-prune.js +35 -0
  194. package/vendor/@0xray/repertoire/dist/registry/signal-prune.js.map +1 -0
  195. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.d.ts +3 -0
  196. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.d.ts.map +1 -0
  197. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.js +24 -0
  198. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.js.map +1 -0
  199. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts +24 -0
  200. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts.map +1 -0
  201. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js +148 -0
  202. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js.map +1 -0
  203. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.d.ts +4 -0
  204. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.d.ts.map +1 -0
  205. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.js +44 -0
  206. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.js.map +1 -0
  207. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.d.ts +22 -0
  208. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.d.ts.map +1 -0
  209. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.js +66 -0
  210. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.js.map +1 -0
  211. package/vendor/@0xray/repertoire/dist/types.d.ts +210 -0
  212. package/vendor/@0xray/repertoire/dist/types.d.ts.map +1 -0
  213. package/vendor/@0xray/repertoire/dist/types.js +2 -0
  214. package/vendor/@0xray/repertoire/dist/types.js.map +1 -0
  215. package/vendor/@0xray/repertoire/docs/MEMORY-ROUTING-PROVIDER.md +54 -0
  216. package/vendor/@0xray/repertoire/hermes-mcp.example.json +20 -0
  217. package/vendor/@0xray/repertoire/mcp-config.example.json +11 -0
  218. package/vendor/@0xray/repertoire/package.json +124 -0
  219. package/vendor/@0xray/repertoire/schemas/curated-signal.schema.json +68 -0
  220. package/vendor/@0xray/repertoire/schemas/inference-log.schema.json +82 -0
  221. package/vendor/@0xray/repertoire/scripts/confirm-suit-all.mjs +253 -0
  222. package/vendor/@0xray/repertoire/scripts/confirm-suit-harness.mjs +220 -0
  223. package/vendor/@0xray/repertoire/scripts/run-live-synthesis-checkpoint.mjs +215 -0
  224. package/vendor/@0xray/repertoire/scripts/suit-bridge-shared.mjs +139 -0
  225. package/vendor/@0xray/repertoire/scripts/verify-grok-suit.mjs +304 -0
  226. package/vendor/@0xray/repertoire/scripts/verify-hermes-suit.mjs +163 -0
  227. package/vendor/@0xray/repertoire/scripts/verify-openclaw-suit.mjs +125 -0
  228. package/vendor/@0xray/repertoire/scripts/verify-opencode-suit.mjs +127 -0
  229. package/vendor/@0xray/repertoire/scripts/verify-synthesis-dogfood.mjs +207 -0
  230. package/vendor/@0xray/repertoire/skills/repertoire-trap-handling/SKILL.md +206 -0
  231. package/xray/codex.json +12 -3
  232. package/xray/features.json +28 -6
  233. package/xray/features.schema.json +31 -0
@@ -0,0 +1,215 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Pipeline facet liveness probe — extends suit wear matrix (Codex 69: script only).
4
+ * Run: npm run verify:pipeline-facets
5
+ */
6
+ import { existsSync, readFileSync } from 'node:fs';
7
+ import { join, resolve } from 'node:path';
8
+ import { createRequire } from 'node:module';
9
+ import { pathToFileURL } from 'node:url';
10
+
11
+ const packageRoot = resolve(import.meta.dirname, '../..');
12
+ const consumerRoot = process.cwd();
13
+ const packageOnly = process.argv.includes('--package-only');
14
+ let failed = 0;
15
+ let passed = 0;
16
+
17
+ function pass(name, detail = '') {
18
+ passed++;
19
+ console.log(`✅ ${name}${detail ? ` — ${detail}` : ''}`);
20
+ }
21
+
22
+ function fail(name, detail = '') {
23
+ failed++;
24
+ console.error(`❌ ${name}${detail ? ` — ${detail}` : ''}`);
25
+ }
26
+
27
+ function readFeatures() {
28
+ const consumerPath = join(consumerRoot, '.xray', 'features.json');
29
+ if (existsSync(consumerPath)) {
30
+ return JSON.parse(readFileSync(consumerPath, 'utf8'));
31
+ }
32
+ const shippedPath = join(packageRoot, 'xray', 'features.json');
33
+ if (existsSync(shippedPath)) {
34
+ return JSON.parse(readFileSync(shippedPath, 'utf8'));
35
+ }
36
+ return null;
37
+ }
38
+
39
+ function xrayPath(...segments) {
40
+ const distSeg = segments[0] === 'src'
41
+ ? ['dist', ...segments.slice(1).map((s) => s.replace(/^src\//, ''))]
42
+ : segments;
43
+ const candidates = [
44
+ join(packageRoot, ...distSeg),
45
+ join(packageRoot, ...segments),
46
+ join(consumerRoot, 'node_modules', '0xray', ...distSeg),
47
+ join(consumerRoot, 'node_modules', '0xray', ...segments),
48
+ join(consumerRoot, '../xray', ...distSeg),
49
+ join(consumerRoot, '../xray', ...segments),
50
+ ];
51
+ return candidates.find((p) => existsSync(p)) ?? null;
52
+ }
53
+
54
+ console.log(`═══ 0xRay Pipeline Facet Verify${packageOnly ? ' (package-only)' : ''} ═══\n`);
55
+
56
+ const features = readFeatures();
57
+ if (!features) {
58
+ fail('.xray/features.json');
59
+ } else {
60
+ pass('.xray/features.json');
61
+ }
62
+
63
+ function skipConsumerFacet(name, detail = 'skipped in package-only mode') {
64
+ passed++;
65
+ console.log(`⏭️ ${name} — ${detail}`);
66
+ }
67
+
68
+ // P0 — governance config
69
+ const ig = features?.inference_governance;
70
+ if (ig?.enabled && (ig.local_mode === true || ig.require_external_dynamo === false)) {
71
+ pass('inference_governance local mode', 'Dynamo optional for dev');
72
+ } else if (ig?.endpoint_url) {
73
+ pass('inference_governance endpoint', ig.endpoint_url);
74
+ } else if (ig?.enabled) {
75
+ pass('inference_governance.enabled', 'set local_mode or endpoint_url for full wire');
76
+ } else if (packageOnly) {
77
+ skipConsumerFacet('inference_governance wiring');
78
+ } else {
79
+ fail('inference_governance wiring', 'enable inference_governance in features.json');
80
+ }
81
+
82
+ // P0 — pipeline hook runtime shipped
83
+ const pipelineRuntime =
84
+ xrayPath('dist/integrations/hooks/pipeline-hook-runtime.mjs')
85
+ ?? xrayPath('src/integrations/hooks/pipeline-hook-runtime.mjs');
86
+ if (pipelineRuntime) {
87
+ pass('pipeline-hook-runtime.mjs', pipelineRuntime);
88
+ } else {
89
+ fail('pipeline-hook-runtime.mjs', 'missing in 0xray package');
90
+ }
91
+
92
+ // P1 — synthesis + reflection config
93
+ if (packageOnly) {
94
+ skipConsumerFacet('synthesis.enabled');
95
+ skipConsumerFacet('synthesis.reflection');
96
+ skipConsumerFacet('autonomous_reporting.enabled');
97
+ skipConsumerFacet('memory_routing.repertoire');
98
+ skipConsumerFacet('lead_dev_mode');
99
+ skipConsumerFacet('user_asides.enabled');
100
+ } else {
101
+ if (features?.synthesis?.enabled === true) {
102
+ pass('synthesis.enabled');
103
+ } else {
104
+ fail('synthesis.enabled');
105
+ }
106
+ if (features?.synthesis?.reflection?.mode) {
107
+ pass('synthesis.reflection.mode', features.synthesis.reflection.mode);
108
+ } else {
109
+ fail('synthesis.reflection');
110
+ }
111
+
112
+ // P1 — autonomous reporting
113
+ if (features?.autonomous_reporting?.enabled === true) {
114
+ pass('autonomous_reporting.enabled');
115
+ } else {
116
+ fail('autonomous_reporting.enabled');
117
+ }
118
+
119
+ // P1 — memory routing (live)
120
+ if (features?.memory_routing?.enabled === true && features.memory_routing.provider === 'repertoire') {
121
+ pass('memory_routing.repertoire');
122
+ } else {
123
+ fail('memory_routing.repertoire');
124
+ }
125
+
126
+ // P1 — lead dev OS
127
+ if (features?.multi_agent_orchestration?.lead_dev_mode === true) {
128
+ pass('lead_dev_mode');
129
+ } else {
130
+ fail('lead_dev_mode');
131
+ }
132
+
133
+ // P2 — user asides
134
+ if (features?.multi_agent_orchestration?.user_asides?.enabled === true) {
135
+ pass('user_asides.enabled');
136
+ } else {
137
+ fail('user_asides.enabled');
138
+ }
139
+ }
140
+
141
+ // Runtime artifacts (optional — created after hook fire)
142
+ const reportsMarker = join(consumerRoot, 'reports', '.autonomous-reporting-scheduled.json');
143
+ if (existsSync(reportsMarker)) {
144
+ pass('autonomous-report marker', reportsMarker);
145
+ } else {
146
+ pass('autonomous-report marker', 'pending first session-start (non-blocking)');
147
+ }
148
+
149
+ const routingOutcomes = join(consumerRoot, 'logs', 'framework', 'routing-outcomes.json');
150
+ if (existsSync(routingOutcomes)) {
151
+ try {
152
+ const arr = JSON.parse(readFileSync(routingOutcomes, 'utf8'));
153
+ if (Array.isArray(arr) && arr.length > 0) {
154
+ pass('routing-outcomes.json', `${arr.length} entries`);
155
+ } else {
156
+ pass('routing-outcomes.json', 'empty — pending orchestrate/Task (non-blocking)');
157
+ }
158
+ } catch {
159
+ fail('routing-outcomes.json', 'invalid JSON');
160
+ }
161
+ } else {
162
+ pass('routing-outcomes.json', 'pending first post-tool (non-blocking)');
163
+ }
164
+
165
+ const activityLog = join(consumerRoot, 'logs', 'framework', 'activity.log');
166
+ if (existsSync(activityLog)) {
167
+ const tail = readFileSync(activityLog, 'utf8').slice(-8000);
168
+ const pipelineActions = ['pipeline-hook', 'reflection-stub', 'routing-outcome', 'autonomous-report', 'inference-improvement'];
169
+ const found = pipelineActions.filter((a) => tail.includes(a));
170
+ if (found.length > 0) {
171
+ pass('activity.log pipeline actions', found.join(', '));
172
+ } else {
173
+ pass('activity.log', 'no pipeline-hook actions yet (run session-start)');
174
+ }
175
+ } else {
176
+ pass('activity.log', 'pending first hook run');
177
+ }
178
+
179
+ // SSOT contract — confer emoji export
180
+ try {
181
+ const conferPath = xrayPath('dist/nucleus/confer.js');
182
+ if (conferPath) {
183
+ const require = createRequire(import.meta.url);
184
+ const confer = require(conferPath);
185
+ const report = confer.formatConferQuorumReport({
186
+ status: 'completed',
187
+ message: 'probe',
188
+ agents: [{ todoId: 's.1', subagent: 'researcher', verdict: 'PASS', receiptRecorded: true, todoCompleted: true }],
189
+ });
190
+ if (report.includes('🔍')) pass('confer emoji panel');
191
+ else fail('confer emoji panel');
192
+ } else {
193
+ fail('confer.js dist', 'build 0xray first');
194
+ }
195
+ } catch (e) {
196
+ fail('confer emoji panel', e.message);
197
+ }
198
+
199
+ // Snapshot
200
+ try {
201
+ const runtimeUrl = pipelineRuntime
202
+ ? pathToFileURL(pipelineRuntime).href
203
+ : null;
204
+ if (runtimeUrl) {
205
+ const { writePipelineFacetSnapshot } = await import(runtimeUrl);
206
+ const snapshotPath = writePipelineFacetSnapshot(consumerRoot, { passed, failed, probe: 'verify-pipeline-facets' });
207
+ pass('PIPELINE-FACET-SNAPSHOT.json', snapshotPath);
208
+ }
209
+ } catch {
210
+ /* snapshot best-effort */
211
+ }
212
+
213
+ console.log(`\nPipeline facets: ${passed} passed, ${failed} failed`);
214
+ if (failed > 0) process.exit(1);
215
+ console.log('✅ Pipeline facet verify PASS');
@@ -0,0 +1,261 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Live 4.0 temperament + host-surface verify.
4
+ * Exercises compiled Grok/Hermes hook binaries, OpenCode SSOT host, OpenClaw gateway.
5
+ * Fixture mjs scripts do not cover temperament (frontier warn vs guided deny) or OpenClaw daemon.
6
+ */
7
+ import { execSync } from 'node:child_process';
8
+ import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';
9
+ import { tmpdir } from 'node:os';
10
+ import { dirname, join } from 'node:path';
11
+ import { fileURLToPath, pathToFileURL } from 'node:url';
12
+ import { createRequire } from 'node:module';
13
+
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const packageRoot = join(__dirname, '../..');
16
+ const require = createRequire(import.meta.url);
17
+ const pkg = require(join(packageRoot, 'package.json'));
18
+
19
+ const grokHook = join(packageRoot, 'dist/integrations/grok/hooks/pre-tool-use.js');
20
+ const grokSession = join(packageRoot, 'dist/integrations/grok/hooks/session-start.js');
21
+ const hermesBridge = join(packageRoot, 'dist/integrations/hermes-agent/bridge.mjs');
22
+ const gateJs = join(packageRoot, 'dist/nucleus/delegation-gate.js');
23
+ const suitJs = join(packageRoot, 'dist/nucleus/suit-temperament.js');
24
+
25
+ let failed = 0;
26
+ function pass(n) {
27
+ console.log(`✅ ${n}`);
28
+ }
29
+ function fail(n, d = '') {
30
+ failed++;
31
+ console.error(`❌ ${n}${d ? ` — ${d}` : ''}`);
32
+ }
33
+
34
+ function seedAuto(tmp) {
35
+ mkdirSync(join(tmp, '.xray', 'state'), { recursive: true });
36
+ writeFileSync(
37
+ join(tmp, '.xray', 'features.json'),
38
+ JSON.stringify({
39
+ version: '4.0.0',
40
+ suit_temperament: { profile: 'auto' },
41
+ multi_agent_orchestration: {
42
+ enabled: true,
43
+ lead_dev_mode: true,
44
+ auto_chain_delegations: true,
45
+ no_new_surface: true,
46
+ },
47
+ }),
48
+ );
49
+ }
50
+
51
+ function runGrokHook(tmp, fixture) {
52
+ const payload = JSON.stringify(fixture);
53
+ const out = execSync(`printf '%s' '${payload.replace(/'/g, "'\\''")}' | node "${grokHook}"`, {
54
+ encoding: 'utf8',
55
+ env: {
56
+ ...process.env,
57
+ GROK_WORKSPACE_ROOT: tmp,
58
+ GROK_SESSION_ID: 'temperament-live',
59
+ },
60
+ });
61
+ return JSON.parse(out.trim().split('\n').filter(Boolean).at(-1));
62
+ }
63
+
64
+ function runGrokSession(tmp) {
65
+ const payload = JSON.stringify({
66
+ hookEventName: 'session_start',
67
+ sessionId: 'temperament-live',
68
+ workspaceRoot: tmp,
69
+ cwd: tmp,
70
+ });
71
+ execSync(`printf '%s' '${payload.replace(/'/g, "'\\''")}' | node "${grokSession}"`, {
72
+ encoding: 'utf8',
73
+ env: {
74
+ ...process.env,
75
+ GROK_WORKSPACE_ROOT: tmp,
76
+ GROK_HOOK_EVENT: 'session_start',
77
+ GROK_SESSION_ID: 'temperament-live',
78
+ },
79
+ });
80
+ }
81
+
82
+ function runHermes(tmp, extra) {
83
+ const json = JSON.stringify({
84
+ command: 'delegation-gate',
85
+ phase: 'pre',
86
+ sessionId: 'temperament-live',
87
+ host: 'hermes',
88
+ ...extra,
89
+ }).replace(/'/g, "'\\''");
90
+ const out = execSync(`node "${hermesBridge}" delegation-gate --cwd "${tmp}" '${json}'`, {
91
+ cwd: tmp,
92
+ encoding: 'utf8',
93
+ env: { ...process.env, XRAY_ROOT: tmp },
94
+ });
95
+ return JSON.parse(out.trim().split('\n').filter(Boolean).at(-1));
96
+ }
97
+
98
+ console.log('═══ 0xRay 4.0 temperament live ═══\n');
99
+
100
+ if (pkg.version !== '4.0.0') fail('package.json is 4.0.0', pkg.version);
101
+ else pass(`package ${pkg.version}`);
102
+
103
+ for (const p of [grokHook, grokSession, hermesBridge, gateJs, suitJs]) {
104
+ if (existsSync(p)) pass(`dist ${p.slice(packageRoot.length + 1)}`);
105
+ else fail('missing dist', p);
106
+ }
107
+
108
+ const tmp = mkdtempSync(join(tmpdir(), 'xray-temp-live-'));
109
+ try {
110
+ seedAuto(tmp);
111
+ const { evaluatePreToolGate, loadDelegationGateFeatures } = await import(
112
+ pathToFileURL(gateJs).href
113
+ );
114
+ const { writeSuitSessionBoot, resolveRuntimeSuitProfile } = await import(
115
+ pathToFileURL(suitJs).href
116
+ );
117
+
118
+ const grokFeat = loadDelegationGateFeatures(tmp, 'grok');
119
+ const hermesFeat = loadDelegationGateFeatures(tmp, 'hermes');
120
+ const ocFeat = loadDelegationGateFeatures(tmp, 'opencode');
121
+ if (grokFeat.suit_profile === 'frontier' && grokFeat.spawn_plan_mode === 'warn') {
122
+ pass('auto+grok → frontier/warn');
123
+ } else fail('grok profile', JSON.stringify(grokFeat));
124
+ if (hermesFeat.suit_profile === 'guided' && hermesFeat.spawn_plan_mode === 'deny') {
125
+ pass('auto+hermes → guided/deny');
126
+ } else fail('hermes profile', JSON.stringify(hermesFeat));
127
+ if (ocFeat.suit_profile === 'guided') pass('auto+opencode → guided');
128
+ else fail('opencode profile', JSON.stringify(ocFeat));
129
+
130
+ const grokAny = runGrokHook(tmp, {
131
+ toolName: 'search_replace',
132
+ workspaceRoot: tmp,
133
+ sessionId: 'temperament-live',
134
+ toolInput: { path: 'src/foo.ts', new_string: 'const x: any = 1' },
135
+ });
136
+ if (grokAny.decision === 'deny' && grokAny.gate === 'codex-11') {
137
+ pass('Grok live hook denies Codex 11');
138
+ } else fail('Grok constitution', JSON.stringify(grokAny));
139
+
140
+ const grokSpawn = runGrokHook(tmp, {
141
+ toolName: 'spawn_subagent',
142
+ workspaceRoot: tmp,
143
+ sessionId: 'temperament-live',
144
+ toolInput: { prompt: 'explore repo', subagent_type: 'explore' },
145
+ });
146
+ if (grokSpawn.decision === 'allow' && grokSpawn.warn === true) {
147
+ pass('Grok live hook warns spawn without plan (frontier)');
148
+ } else fail('Grok frontier spawn', JSON.stringify(grokSpawn));
149
+
150
+ runGrokSession(tmp);
151
+ const boot = JSON.parse(readFileSync(join(tmp, '.xray', 'state', 'session-boot.json'), 'utf8'));
152
+ if (boot.host === 'grok' && boot.suit_profile === 'frontier') {
153
+ pass('Grok session-start writes host=grok frontier boot');
154
+ } else fail('Grok session-boot', JSON.stringify({ host: boot.host, suit_profile: boot.suit_profile }));
155
+ const stationCard = join(tmp, '.xray', 'state', 'STATION.md');
156
+ if (existsSync(stationCard) && readFileSync(stationCard, 'utf8').includes('Do not cold-start')) {
157
+ pass('Grok session-start writes STATION.md');
158
+ } else fail('Grok STATION.md');
159
+
160
+ const hSpawn = runHermes(tmp, {
161
+ tool: 'delegate_task',
162
+ args: { prompt: 'explore repo', subagent_type: 'explore' },
163
+ });
164
+ if (hSpawn.allow === false && hSpawn.gate === 'spawn-plan-missing') {
165
+ pass('Hermes live bridge denies spawn without plan (guided)');
166
+ } else fail('Hermes spawn', JSON.stringify(hSpawn));
167
+
168
+ const hAny = runHermes(tmp, {
169
+ tool: 'write_file',
170
+ args: { path: 'src/foo.ts', content: 'const x: any = 1' },
171
+ });
172
+ if (hAny.allow === false && hAny.gate === 'codex-11') {
173
+ pass('Hermes live bridge denies Codex 11');
174
+ } else fail('Hermes constitution', JSON.stringify(hAny));
175
+
176
+ const ocSpawn = evaluatePreToolGate(
177
+ 'Task',
178
+ { prompt: 'explore repo', subagent_type: 'explore' },
179
+ { projectRoot: tmp, sessionId: 'temperament-live', features: ocFeat, host: 'opencode' },
180
+ );
181
+ if (ocSpawn.allow === false && ocSpawn.gate === 'spawn-plan-missing') {
182
+ pass('OpenCode SSOT denies spawn without plan (guided)');
183
+ } else fail('OpenCode spawn', JSON.stringify(ocSpawn));
184
+
185
+ writeSuitSessionBoot(tmp, 'grok', { source: 'live' });
186
+ if (resolveRuntimeSuitProfile(tmp, 'hermes') === 'guided') {
187
+ pass('Hermes ignores leftover Grok boot');
188
+ } else fail('dual-host boot');
189
+ writeSuitSessionBoot(tmp, 'openclaw', { source: 'live' });
190
+ const clawBoot = JSON.parse(readFileSync(join(tmp, '.xray', 'state', 'session-boot.json'), 'utf8'));
191
+ if (clawBoot.host === 'openclaw' && clawBoot.suit_profile === 'guided') {
192
+ pass('OpenClaw session-boot guided');
193
+ } else fail('OpenClaw boot', JSON.stringify({ host: clawBoot.host, suit_profile: clawBoot.suit_profile }));
194
+
195
+ const clawFeat = loadDelegationGateFeatures(tmp, 'openclaw');
196
+ const clawSpawn = evaluatePreToolGate(
197
+ 'Task',
198
+ { prompt: 'explore repo', subagent_type: 'explore' },
199
+ { projectRoot: tmp, sessionId: 'temperament-live', features: clawFeat, host: 'openclaw' },
200
+ );
201
+ if (!clawSpawn.allow && clawSpawn.gate === 'spawn-plan-missing') {
202
+ pass('OpenClaw SSOT denies spawn without plan (guided)');
203
+ } else fail('OpenClaw spawn', JSON.stringify(clawSpawn));
204
+ const clawAny = evaluatePreToolGate(
205
+ 'write',
206
+ { path: 'src/foo.ts', content: 'const x: any = 1' },
207
+ { projectRoot: tmp, sessionId: 'temperament-live', features: clawFeat, host: 'openclaw' },
208
+ );
209
+ if (!clawAny.allow && clawAny.gate === 'codex-11') {
210
+ pass('OpenClaw SSOT denies Codex 11');
211
+ } else fail('OpenClaw constitution', JSON.stringify(clawAny));
212
+ } finally {
213
+ rmSync(tmp, { recursive: true, force: true });
214
+ }
215
+
216
+ const home = process.env.HOME || '';
217
+ const grokPlugin = join(home, '.grok/plugins/0xray');
218
+ const hermesPlugin = join(home, '.hermes/plugins/xray-hermes');
219
+ const ocBin = join(home, '.opencode/bin/opencode');
220
+ if (existsSync(grokPlugin)) pass(`Grok plugin present ${grokPlugin}`);
221
+ else fail('Grok plugin missing');
222
+ if (existsSync(hermesPlugin)) pass(`Hermes plugin present ${hermesPlugin}`);
223
+ else fail('Hermes plugin missing');
224
+ if (existsSync(ocBin) || existsSync(join(packageRoot, '.opencode'))) pass('OpenCode surface present');
225
+ else fail('OpenCode surface missing');
226
+
227
+ let openclawCli = false;
228
+ try {
229
+ execSync('which openclaw', { stdio: 'ignore' });
230
+ openclawCli = true;
231
+ } catch {
232
+ pass('OpenClaw CLI not on PATH — skip gateway live probe');
233
+ }
234
+ if (openclawCli) {
235
+ try {
236
+ const code = execSync('curl -sS -m 12 -o /dev/null -w %{http_code} http://127.0.0.1:18789/', {
237
+ encoding: 'utf8',
238
+ }).trim();
239
+ if (code === '200') pass('OpenClaw gateway HTTP 200 on :18789');
240
+ else pass(`OpenClaw CLI on PATH; default :18789 returned ${code} (no machine daemon)`);
241
+ } catch {
242
+ pass('OpenClaw CLI on PATH; default gateway :18789 not running (no machine daemon)');
243
+ }
244
+ }
245
+
246
+ if (existsSync(join(home, '.openclaw/skills'))) pass('OpenClaw skills dir present');
247
+ else fail('OpenClaw skills dir missing');
248
+ const clawHook = join(home, '.openclaw/hooks/xray-pre-tool.mjs');
249
+ const clawPlugin = join(packageRoot, 'src/integrations/openclaw/plugin/xray-pre-tool/index.js');
250
+ if (existsSync(clawHook)) pass(`OpenClaw PreToolUse hook installed ${clawHook}`);
251
+ else fail('OpenClaw PreToolUse hook missing — run: node dist/cli/index.js openclaw install --force');
252
+ if (existsSync(clawPlugin)) pass('OpenClaw before_tool_call plugin source present');
253
+ else fail('OpenClaw before_tool_call plugin source missing');
254
+
255
+ console.log('');
256
+ if (failed) {
257
+ console.error(`❌ temperament live failed (${failed})`);
258
+ process.exit(1);
259
+ }
260
+ console.log('🎉 temperament live passed');
261
+ process.exit(0);